Commit 597db13e authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://linuxusb.bkbits.net/linus-2.5

into penguin.transmeta.com:/home/penguin/torvalds/repositories/kernel/linux
parents c1d630b5 d348f4e3
...@@ -1914,13 +1914,13 @@ S: Santa Clara, CA 95052 ...@@ -1914,13 +1914,13 @@ S: Santa Clara, CA 95052
S: USA S: USA
N: Petko Manolov N: Petko Manolov
E: petkan@dce.bg E: petkan@users.sourceforge.net
D: USB ethernet (pegasus) driver D: USB ethernet pegasus/pegasus-II driver
D: optimizing i[45]86 string routines D: optimizing i[45]86 string routines
D: i386 task swithing hacks D: i386 task switching hacks
S: 5, Vrah Mancho str. S: 482 Shadowgraph Dr.
S: 1324 Sofia S: San Jose, CA 95110
S: Bulgaria S: USA
N: Martin Mares N: Martin Mares
E: mj@ucw.cz E: mj@ucw.cz
......
...@@ -1657,7 +1657,7 @@ S: Maintained ...@@ -1657,7 +1657,7 @@ S: Maintained
USB PEGASUS DRIVER USB PEGASUS DRIVER
P: Petko Manolov P: Petko Manolov
M: petkan@dce.bg M: petkan@users.sourceforge.net
L: linux-usb-users@lists.sourceforge.net L: linux-usb-users@lists.sourceforge.net
L: linux-usb-devel@lists.sourceforge.net L: linux-usb-devel@lists.sourceforge.net
S: Maintained S: Maintained
......
...@@ -170,6 +170,18 @@ CONFIG_USB_AUDIO ...@@ -170,6 +170,18 @@ CONFIG_USB_AUDIO
The module will be called audio.o. If you want to compile it as a The module will be called audio.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>. module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_EMI26
This driver loads firmware to Emagic EMI 2|6 low latency USB
Audio interface.
After firmware load the device is handled with standard linux
USB Audio driver.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called audio.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_ACM CONFIG_USB_ACM
This driver supports USB modems and ISDN adapters which support the This driver supports USB modems and ISDN adapters which support the
Communication Device Class Abstract Control Model interface. Communication Device Class Abstract Control Model interface.
...@@ -316,12 +328,12 @@ CONFIG_USB_VICAM ...@@ -316,12 +328,12 @@ CONFIG_USB_VICAM
module, say M here and read <file:Documentation/modules.txt>. module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_PEGASUS CONFIG_USB_PEGASUS
Say Y here if you know you have Pegasus or Pegasus II based adapter. Say Y here if you know you have Pegasus or Pegasus-II based adapter.
If in doubt then look at linux/drivers/usb/pegasus.h for the complete If in doubt then look at linux/drivers/usb/pegasus.h for the complete
list of supported devices. list of supported devices.
If your particular adapter is not in the list and you are _sure_ it If your particular adapter is not in the list and you are _sure_ it
is Pegasus or Pegasus II based then send me (pmanolov@lnxw.com) vendor is Pegasus or Pegasus II based then send me (pmanolov@users.sourceforge.net)
and device IDs. vendor and device IDs.
This code is also available as a module ( = code which can be This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want). inserted in and removed from the running kernel whenever you want).
......
...@@ -31,6 +31,7 @@ if [ "$CONFIG_USB" = "y" -o "$CONFIG_USB" = "m" ]; then ...@@ -31,6 +31,7 @@ if [ "$CONFIG_USB" = "y" -o "$CONFIG_USB" = "m" ]; then
comment 'USB Device Class drivers' comment 'USB Device Class drivers'
dep_tristate ' USB Audio support' CONFIG_USB_AUDIO $CONFIG_USB $CONFIG_SOUND dep_tristate ' USB Audio support' CONFIG_USB_AUDIO $CONFIG_USB $CONFIG_SOUND
dep_tristate ' EMI 2|6 USB Audio interface support' CONFIG_USB_EMI26 $CONFIG_USB_AUDIO
dep_tristate ' USB Bluetooth support (EXPERIMENTAL)' CONFIG_USB_BLUETOOTH $CONFIG_USB $CONFIG_EXPERIMENTAL dep_tristate ' USB Bluetooth support (EXPERIMENTAL)' CONFIG_USB_BLUETOOTH $CONFIG_USB $CONFIG_EXPERIMENTAL
if [ "$CONFIG_SCSI" = "n" ]; then if [ "$CONFIG_SCSI" = "n" ]; then
comment ' SCSI support is needed for USB Storage' comment ' SCSI support is needed for USB Storage'
...@@ -86,7 +87,7 @@ if [ "$CONFIG_USB" = "y" -o "$CONFIG_USB" = "m" ]; then ...@@ -86,7 +87,7 @@ if [ "$CONFIG_USB" = "y" -o "$CONFIG_USB" = "m" ]; then
if [ "$CONFIG_NET" = "n" ]; then if [ "$CONFIG_NET" = "n" ]; then
comment ' Networking support is needed for USB Networking device support' comment ' Networking support is needed for USB Networking device support'
else else
dep_tristate ' USB ADMtek Pegasus-based ethernet device support (EXPERIMENTAL)' CONFIG_USB_PEGASUS $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL dep_tristate ' USB Pegasus/Pegasus-II based ethernet device support (EXPERIMENTAL)' CONFIG_USB_PEGASUS $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
dep_tristate ' USB KLSI KL5USB101-based ethernet device support (EXPERIMENTAL)' CONFIG_USB_KAWETH $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL dep_tristate ' USB KLSI KL5USB101-based ethernet device support (EXPERIMENTAL)' CONFIG_USB_KAWETH $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
dep_tristate ' USB CATC NetMate-based Ethernet device support (EXPERIMENTAL)' CONFIG_USB_CATC $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL dep_tristate ' USB CATC NetMate-based Ethernet device support (EXPERIMENTAL)' CONFIG_USB_CATC $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
dep_tristate ' USB Communication Class Ethernet device support (EXPERIMENTAL)' CONFIG_USB_CDCETHER $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL dep_tristate ' USB Communication Class Ethernet device support (EXPERIMENTAL)' CONFIG_USB_CDCETHER $CONFIG_USB $CONFIG_NET $CONFIG_EXPERIMENTAL
......
...@@ -63,6 +63,7 @@ obj-$(CONFIG_USB_SCANNER) += scanner.o ...@@ -63,6 +63,7 @@ obj-$(CONFIG_USB_SCANNER) += scanner.o
obj-$(CONFIG_USB_ACM) += acm.o obj-$(CONFIG_USB_ACM) += acm.o
obj-$(CONFIG_USB_PRINTER) += printer.o obj-$(CONFIG_USB_PRINTER) += printer.o
obj-$(CONFIG_USB_AUDIO) += audio.o obj-$(CONFIG_USB_AUDIO) += audio.o
obj-$(CONFIG_USB_EMI26) += emi26.o
obj-$(CONFIG_USB_IBMCAM) += ibmcam.o usbvideo.o ultracam.o obj-$(CONFIG_USB_IBMCAM) += ibmcam.o usbvideo.o ultracam.o
obj-$(CONFIG_USB_KONICAWC) += konicawc.o usbvideo.o obj-$(CONFIG_USB_KONICAWC) += konicawc.o usbvideo.o
obj-$(CONFIG_USB_PWC) += pwc.o obj-$(CONFIG_USB_PWC) += pwc.o
......
/*
* Emagic EMI 2|6 usb audio interface firmware loader.
* Copyright (C) 2002
* Tapio Laxstrm (tapio.laxstrom@iptime.fi)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, as published by
* the Free Software Foundation, version 2.
*
* emi26.c,v 1.13 2002/03/08 13:10:26 tapio Exp
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/usb.h>
#define MAX_INTEL_HEX_RECORD_LENGTH 16
typedef struct _INTEL_HEX_RECORD
{
__u32 length;
__u32 address;
__u32 type;
__u8 data[MAX_INTEL_HEX_RECORD_LENGTH];
} INTEL_HEX_RECORD, *PINTEL_HEX_RECORD;
/* include firmware (variables) */
#include "emi26_fw.h"
#define EMI26_VENDOR_ID 0x086a /* Emagic Soft-und Hardware GmBH */
#define EMI26_PRODUCT_ID 0x0100 /* EMI 2|6 without firmware */
#define ANCHOR_LOAD_INTERNAL 0xA0 /* Vendor specific request code for Anchor Upload/Download (This one is implemented in the core) */
#define ANCHOR_LOAD_EXTERNAL 0xA3 /* This command is not implemented in the core. Requires firmware */
#define ANCHOR_LOAD_FPGA 0xA5 /* This command is not implemented in the core. Requires firmware. Emagic extension */
#define MAX_INTERNAL_ADDRESS 0x1B3F /* This is the highest internal RAM address for the AN2131Q */
#define CPUCS_REG 0x7F92 /* EZ-USB Control and Status Register. Bit 0 controls 8051 reset */
#define INTERNAL_RAM(address) (address <= MAX_INTERNAL_ADDRESS)
static int emi26_writememory( struct usb_device *dev, int address, unsigned char *data, int length, __u8 bRequest);
static int emi26_set_reset(struct usb_device *dev, unsigned char reset_bit);
static int emi26_load_firmware (struct usb_device *dev);
static void *emi26_probe(struct usb_device *dev, unsigned int if_num, const struct usb_device_id *id);
static void emi26_disconnect(struct usb_device *dev, void *drv_context);
static int __init emi26_init (void);
static void __exit emi26_exit (void);
/* thanks to drivers/usb/serial/keyspan_pda.c code */
static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request)
{
int result;
unsigned char *buffer = kmalloc (length, GFP_KERNEL);
if (!buffer) {
printk(KERN_ERR "emi26: kmalloc(%d) failed.", length);
return -ENOMEM;
}
memcpy (buffer, data, length);
/* Note: usb_control_msg returns negative value on error or length of the
* data that was written! */
result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300);
kfree (buffer);
return result;
}
/* thanks to drivers/usb/serial/keyspan_pda.c code */
static int emi26_set_reset (struct usb_device *dev, unsigned char reset_bit)
{
int response;
printk(KERN_INFO "%s - %d", __FUNCTION__, reset_bit);
/* printk(KERN_DEBUG "%s - %d", __FUNCTION__, reset_bit); */
response = emi26_writememory (dev, CPUCS_REG, &reset_bit, 1, 0xa0);
if (response < 0) {
printk(KERN_ERR "emi26: set_reset (%d) failed", reset_bit);
}
return response;
}
static int emi26_load_firmware (struct usb_device *dev)
{
int err;
int i;
int pos = 0; /* Position in hex record */
__u32 addr; /* Address to write */
__u8 buf[1023];
/* Assert reset (stop the CPU in the EMI) */
err = emi26_set_reset(dev,1);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* 1. We need to put the loader for the FPGA into the EZ-USB */
for (i=0; g_Loader[i].type == 0; i++) {
err = emi26_writememory(dev, g_Loader[i].address, g_Loader[i].data, g_Loader[i].length, ANCHOR_LOAD_INTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
/* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0);
/* 2. We upload the FPGA firmware into the EMI
* Note: collect up to 1023 (yes!) bytes and send them with
* a single request. This is _much_ faster! */
do {
i = 0;
addr = g_bitstream[pos].address;
/* intel hex records are terminated with type 0 element */
while ((g_bitstream[pos].type == 0) && (i + g_bitstream[pos].length < sizeof(buf))) {
memcpy(buf + i, g_bitstream[pos].data, g_bitstream[pos].length);
i += g_bitstream[pos].length;
pos++;
}
err = emi26_writememory(dev, addr, buf, i, ANCHOR_LOAD_FPGA);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
} while (i > 0);
/* Assert reset (stop the CPU in the EMI) */
err = emi26_set_reset(dev,1);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* 3. We need to put the loader for the firmware into the EZ-USB (again...) */
for (i=0; g_Loader[i].type == 0; i++) {
err = emi26_writememory(dev, g_Loader[i].address, g_Loader[i].data, g_Loader[i].length, ANCHOR_LOAD_INTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
/* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* 4. We put the part of the firmware that lies in the external RAM into the EZ-USB */
for (i=0; g_Firmware[i].type == 0; i++) {
if (!INTERNAL_RAM(g_Firmware[i].address)) {
err = emi26_writememory(dev, g_Firmware[i].address, g_Firmware[i].data, g_Firmware[i].length, ANCHOR_LOAD_EXTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
}
/* Assert reset (stop the CPU in the EMI) */
err = emi26_set_reset(dev,1);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
for (i=0; g_Firmware[i].type == 0; i++) {
if (INTERNAL_RAM(g_Firmware[i].address)) {
err = emi26_writememory(dev, g_Firmware[i].address, g_Firmware[i].data, g_Firmware[i].length, ANCHOR_LOAD_INTERNAL);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
}
}
/* De-assert reset (let the CPU run) */
err = emi26_set_reset(dev,0);
if (err < 0) {
printk(KERN_ERR "%s - error loading firmware: error = %d", __FUNCTION__, err);
return err;
}
/* return 1 to fail the driver inialization
* and give real driver change to load */
return 1;
}
static __devinitdata struct usb_device_id id_table [] = {
{ USB_DEVICE(EMI26_VENDOR_ID, EMI26_PRODUCT_ID) },
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, id_table);
static void * emi26_probe(struct usb_device *dev, unsigned int if_num, const struct usb_device_id *id)
{
printk(KERN_INFO "%s start", __FUNCTION__);
if((dev->descriptor.idVendor == EMI26_VENDOR_ID) && (dev->descriptor.idProduct == EMI26_PRODUCT_ID)) {
emi26_load_firmware(dev);
}
/* do not return the driver context, let real audio driver do that */
return 0;
}
static void emi26_disconnect(struct usb_device *dev, void *drv_context)
{
}
struct usb_driver emi26_driver = {
name: "emi26 - firmware loader",
probe: emi26_probe,
disconnect: emi26_disconnect,
id_table: NULL,
};
static int __init emi26_init (void)
{
usb_register (&emi26_driver);
return 0;
}
static void __exit emi26_exit (void)
{
usb_deregister (&emi26_driver);
}
module_init(emi26_init);
module_exit(emi26_exit);
MODULE_AUTHOR("tapio laxstrm");
MODULE_DESCRIPTION("Emagic EMI 2|6 firmware loader.");
MODULE_LICENSE("GPL");
/* vi:ai:syntax=c:sw=8:ts=8:tw=80
*/
This diff is collapsed.
...@@ -464,12 +464,16 @@ static inline int reset_mac( pegasus_t *pegasus ) ...@@ -464,12 +464,16 @@ static inline int reset_mac( pegasus_t *pegasus )
if ( i == REG_TIMEOUT ) if ( i == REG_TIMEOUT )
return 1; return 1;
if ( usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS || if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_LINKSYS ||
usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK ) { usb_dev_id[pegasus->dev_index].vendor == VENDOR_DLINK) {
__u16 auxmode; __u16 auxmode;
read_mii_word(pegasus, 1, MII_TPISTATUS, &auxmode);
read_mii_word( pegasus, 0, MII_TPISTATUS, &auxmode ); write_mii_word(pegasus, 1, MII_TPISTATUS, auxmode | 4);
write_mii_word( pegasus, 0, MII_TPISTATUS, auxmode | 4 ); }
if (usb_dev_id[pegasus->dev_index].vendor == VENDOR_ELCON) {
__u16 auxmode;
read_mii_word(pegasus, 3, 0x1b, &auxmode);
write_mii_word(pegasus, 3, 0x1b, auxmode | 4);
} }
return 0; return 0;
......
...@@ -66,7 +66,6 @@ ...@@ -66,7 +66,6 @@
#define PEGASUS_REQ_GET_REGS 0xf0 #define PEGASUS_REQ_GET_REGS 0xf0
#define PEGASUS_REQ_SET_REGS 0xf1 #define PEGASUS_REQ_SET_REGS 0xf1
#define PEGASUS_REQ_SET_REG PEGASUS_REQ_SET_REGS #define PEGASUS_REQ_SET_REG PEGASUS_REQ_SET_REGS
#define ALIGN(x) x __attribute__((aligned(L1_CACHE_BYTES)))
enum pegasus_registers { enum pegasus_registers {
EthCtrl0 = 0, EthCtrl0 = 0,
...@@ -103,9 +102,9 @@ typedef struct pegasus { ...@@ -103,9 +102,9 @@ typedef struct pegasus {
struct usb_ctrlrequest dr; struct usb_ctrlrequest dr;
wait_queue_head_t ctrl_wait; wait_queue_head_t ctrl_wait;
struct semaphore ctrl_sem; struct semaphore ctrl_sem;
unsigned char ALIGN(rx_buff[PEGASUS_MAX_MTU]); unsigned char rx_buff[PEGASUS_MAX_MTU];
unsigned char ALIGN(tx_buff[PEGASUS_MAX_MTU]); unsigned char tx_buff[PEGASUS_MAX_MTU];
unsigned char ALIGN(intr_buff[8]); unsigned char intr_buff[8];
__u8 eth_regs[4]; __u8 eth_regs[4];
__u8 phy; __u8 phy;
__u8 gpio_res; __u8 gpio_res;
...@@ -129,6 +128,7 @@ struct usb_eth_dev { ...@@ -129,6 +128,7 @@ struct usb_eth_dev {
#define VENDOR_COMPAQ 0x049f #define VENDOR_COMPAQ 0x049f
#define VENDOR_COREGA 0x07aa #define VENDOR_COREGA 0x07aa
#define VENDOR_DLINK 0x2001 #define VENDOR_DLINK 0x2001
#define VENDOR_ELCON 0x0db7
#define VENDOR_ELSA 0x05cc #define VENDOR_ELSA 0x05cc
#define VENDOR_HAWKING 0x0e66 #define VENDOR_HAWKING 0x0e66
#define VENDOR_IODATA 0x04bb #define VENDOR_IODATA 0x04bb
...@@ -208,6 +208,8 @@ PEGASUS_DEV( "D-Link DSB-650TX(PNA)", VENDOR_DLINK, 0x4003, ...@@ -208,6 +208,8 @@ PEGASUS_DEV( "D-Link DSB-650TX(PNA)", VENDOR_DLINK, 0x4003,
DEFAULT_GPIO_RESET | HAS_HOME_PNA ) DEFAULT_GPIO_RESET | HAS_HOME_PNA )
PEGASUS_DEV( "D-Link DSB-650", VENDOR_DLINK, 0xabc1, PEGASUS_DEV( "D-Link DSB-650", VENDOR_DLINK, 0xabc1,
DEFAULT_GPIO_RESET ) DEFAULT_GPIO_RESET )
PEGASUS_DEV( "ELCON EPLC10Mi USB to Powerline Adapter", VENDOR_ELCON, 0x0002,
DEFAULT_GPIO_RESET | PEGASUS_II | HAS_HOME_PNA )
PEGASUS_DEV( "Elsa Micolink USB2Ethernet", VENDOR_ELSA, 0x3000, PEGASUS_DEV( "Elsa Micolink USB2Ethernet", VENDOR_ELSA, 0x3000,
DEFAULT_GPIO_RESET ) DEFAULT_GPIO_RESET )
PEGASUS_DEV( "Hawking UF100 10/100 Ethernet", VENDOR_HAWKING, 0x400c, PEGASUS_DEV( "Hawking UF100 10/100 Ethernet", VENDOR_HAWKING, 0x400c,
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* Edgeport USB Serial Converter driver * Edgeport USB Serial Converter driver
* *
* Copyright(c) 2000 Inside Out Networks, All rights reserved. * Copyright(c) 2000 Inside Out Networks, All rights reserved.
* Copyright(c) 2001 Greg Kroah-Hartman <greg@kroah.com> * Copyright(c) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -25,6 +25,9 @@ ...@@ -25,6 +25,9 @@
* *
* Version history: * Version history:
* *
* 2.3 2002_03_08 greg kroah-hartman
* - fixed bug when multiple devices were attached at the same time.
*
* 2.2 2001_11_14 greg kroah-hartman * 2.2 2001_11_14 greg kroah-hartman
* - fixed bug in edge_close that kept the port from being used more * - fixed bug in edge_close that kept the port from being used more
* than once. * than once.
...@@ -1438,8 +1441,8 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge ...@@ -1438,8 +1441,8 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, struct edge
edge_port->write_in_progress = FALSE; edge_port->write_in_progress = FALSE;
return; return;
} }
buffer[0] = IOSP_BUILD_DATA_HDR1 (edge_port->port->number, count); buffer[0] = IOSP_BUILD_DATA_HDR1 (edge_port->port->number - edge_port->port->serial->minor, count);
buffer[1] = IOSP_BUILD_DATA_HDR2 (edge_port->port->number, count); buffer[1] = IOSP_BUILD_DATA_HDR2 (edge_port->port->number - edge_port->port->serial->minor, count);
/* now copy our data */ /* now copy our data */
bytesleft = fifo->size - fifo->tail; bytesleft = fifo->size - fifo->tail;
...@@ -2436,7 +2439,9 @@ static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u ...@@ -2436,7 +2439,9 @@ static int send_iosp_ext_cmd (struct edgeport_port *edge_port, __u8 command, __u
currentCommand = buffer; currentCommand = buffer;
MAKE_CMD_EXT_CMD( &currentCommand, &length, edge_port->port->number, command, param); MAKE_CMD_EXT_CMD (&currentCommand, &length,
edge_port->port->number - edge_port->port->serial->minor,
command, param);
status = write_cmd_usb (edge_port, buffer, length); status = write_cmd_usb (edge_port, buffer, length);
if (status) { if (status) {
...@@ -2516,9 +2521,9 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa ...@@ -2516,9 +2521,9 @@ static int send_cmd_write_baud_rate (struct edgeport_port *edge_port, int baudRa
int cmdLen = 0; int cmdLen = 0;
int divisor; int divisor;
int status; int status;
unsigned char number = edge_port->port->number; unsigned char number = edge_port->port->number - edge_port->port->serial->minor;
dbg(__FUNCTION__" - port = %d, baud = %d", number, baudRate); dbg(__FUNCTION__" - port = %d, baud = %d", edge_port->port->number, baudRate);
status = calc_baud_rate_divisor (baudRate, &divisor); status = calc_baud_rate_divisor (baudRate, &divisor);
if (status) { if (status) {
...@@ -2621,7 +2626,9 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r ...@@ -2621,7 +2626,9 @@ static int send_cmd_write_uart_register (struct edgeport_port *edge_port, __u8 r
currCmd = cmdBuffer; currCmd = cmdBuffer;
// Build a cmd in the buffer to write the given register // Build a cmd in the buffer to write the given register
MAKE_CMD_WRITE_REG(&currCmd, &cmdLen, edge_port->port->number, regNum, regValue); MAKE_CMD_WRITE_REG (&currCmd, &cmdLen,
edge_port->port->number - edge_port->port->serial->minor,
regNum, regValue);
status = write_cmd_usb(edge_port, cmdBuffer, cmdLen); status = write_cmd_usb(edge_port, cmdBuffer, cmdLen);
if (status) { if (status) {
......
...@@ -9,6 +9,16 @@ ...@@ -9,6 +9,16 @@
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* (8/3/2002) ganesh
* The ipaq sometimes emits a '\0' before the CLIENT string. At this
* point of time, the ppp ldisc is not yet attached to the tty, so
* n_tty echoes "^ " to the ipaq, which messes up the chat. In 2.5.6-pre2
* this causes a panic because echo_char() tries to sleep in interrupt
* context.
* The fix is to tell the upper layers that this is a raw device so that
* echoing is suppressed. Thanks to Lyle Lindholm for a detailed bug
* report.
*
* (25/2/2002) ganesh * (25/2/2002) ganesh
* Added support for the HP Jornada 548 and 568. Completely untested. * Added support for the HP Jornada 548 and 568. Completely untested.
* Thanks to info from Heath Robinson and Arieh Davidoff. * Thanks to info from Heath Robinson and Arieh Davidoff.
...@@ -148,6 +158,8 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp) ...@@ -148,6 +158,8 @@ static int ipaq_open(struct usb_serial_port *port, struct file *filp)
*/ */
port->tty->low_latency = 1; port->tty->low_latency = 1;
port->tty->raw = 1;
port->tty->real_raw = 1;
/* /*
* Lose the small buffers usbserial provides. Make larger ones. * Lose the small buffers usbserial provides. Make larger ones.
......
...@@ -2614,7 +2614,7 @@ static void __exit usb_exit(void) ...@@ -2614,7 +2614,7 @@ static void __exit usb_exit(void)
usb_hub_cleanup(); usb_hub_cleanup();
} }
module_init(usb_init); subsys_initcall(usb_init);
module_exit(usb_exit); module_exit(usb_exit);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment