X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fnet%2Fusb%2Fdm9601.c;h=f7319d326912ffc91330fe722ee4e77eddf661a1;hb=564820d42aaa55e6ce60a59c0f60832e1330c58b;hp=1ffdd106f4c49a898f61f8a6d5be98da4c1a4d95;hpb=03bbe082cffc4533f6557bf23f0c672307067246;p=linux-2.6 diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 1ffdd106f4..f7319d3269 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c @@ -20,8 +20,7 @@ #include #include #include - -#include "usbnet.h" +#include /* datasheet: http://www.davicom.com.tw/big5/download/Data%20Sheet/DM9601-DS-P01-930914.pdf @@ -101,17 +100,16 @@ static void dm_write_async_callback(struct urb *urb) usb_free_urb(urb); } -static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data) +static void dm_write_async_helper(struct usbnet *dev, u8 reg, u8 value, + u16 length, void *data) { struct usb_ctrlrequest *req; struct urb *urb; int status; - devdbg(dev, "dm_write_async() reg=0x%02x length=%d", reg, length); - urb = usb_alloc_urb(0, GFP_ATOMIC); if (!urb) { - deverr(dev, "Error allocating URB in dm_write_async!"); + deverr(dev, "Error allocating URB in dm_write_async_helper!"); return; } @@ -123,8 +121,8 @@ static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data) } req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; - req->bRequest = DM_WRITE_REGS; - req->wValue = 0; + req->bRequest = length ? DM_WRITE_REGS : DM_WRITE_REG; + req->wValue = cpu_to_le16(value); req->wIndex = cpu_to_le16(reg); req->wLength = cpu_to_le16(length); @@ -142,48 +140,22 @@ static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data) } } -static void dm_write_reg_async(struct usbnet *dev, u8 reg, u8 value) +static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data) { - struct usb_ctrlrequest *req; - struct urb *urb; - int status; + devdbg(dev, "dm_write_async() reg=0x%02x length=%d", reg, length); + dm_write_async_helper(dev, reg, 0, length, data); +} + +static void dm_write_reg_async(struct usbnet *dev, u8 reg, u8 value) +{ devdbg(dev, "dm_write_reg_async() reg=0x%02x value=0x%02x", reg, value); - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - deverr(dev, "Error allocating URB in dm_write_async!"); - return; - } - - req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC); - if (!req) { - deverr(dev, "Failed to allocate memory for control request"); - usb_free_urb(urb); - return; - } - - req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; - req->bRequest = DM_WRITE_REG; - req->wValue = cpu_to_le16(value); - req->wIndex = cpu_to_le16(reg); - req->wLength = 0; - - usb_fill_control_urb(urb, dev->udev, - usb_sndctrlpipe(dev->udev, 0), - (void *)req, NULL, 0, dm_write_async_callback, req); - - status = usb_submit_urb(urb, GFP_ATOMIC); - if (status < 0) { - deverr(dev, "Error submitting the control message: status=%d", - status); - kfree(req); - usb_free_urb(urb); - } + dm_write_async_helper(dev, reg, value, 0, NULL); } -static int dm_read_shared_word(struct usbnet *dev, int phy, u8 reg, u16 *value) +static int dm_read_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 *value) { int ret, i; @@ -222,7 +194,7 @@ static int dm_read_shared_word(struct usbnet *dev, int phy, u8 reg, u16 *value) return ret; } -static int dm_write_shared_word(struct usbnet *dev, int phy, u8 reg, u16 value) +static int dm_write_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 value) { int ret, i; @@ -277,7 +249,7 @@ static int dm9601_get_eeprom(struct net_device *net, struct ethtool_eeprom *eeprom, u8 * data) { struct usbnet *dev = netdev_priv(net); - u16 *ebuf = (u16 *) data; + __le16 *ebuf = (__le16 *) data; int i; /* access is 16bit */ @@ -296,7 +268,7 @@ static int dm9601_mdio_read(struct net_device *netdev, int phy_id, int loc) { struct usbnet *dev = netdev_priv(netdev); - u16 res; + __le16 res; if (phy_id) { devdbg(dev, "Only internal phy supported"); @@ -316,7 +288,7 @@ static void dm9601_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) { struct usbnet *dev = netdev_priv(netdev); - u16 res = cpu_to_le16(val); + __le16 res = cpu_to_le16(val); if (phy_id) { devdbg(dev, "Only internal phy supported"); @@ -369,7 +341,7 @@ static void dm9601_set_multicast(struct net_device *net) /* We use the 20 byte dev->data for our 8 byte filter buffer * to avoid allocating memory that is tricky to free later */ u8 *hashes = (u8 *) & dev->data; - u8 rx_ctl = 0x01; + u8 rx_ctl = 0x31; memset(hashes, 0x00, DM_MCAST_SIZE); hashes[DM_MCAST_SIZE - 1] |= 0x80; /* broadcast address */ @@ -382,7 +354,7 @@ static void dm9601_set_multicast(struct net_device *net) struct dev_mc_list *mc_list = net->mc_list; int i; - for (i = 0; i < net->mc_count; i++) { + for (i = 0; i < net->mc_count; i++, mc_list = mc_list->next) { u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26; hashes[crc >> 3] |= 1 << (crc & 0x7); } @@ -590,6 +562,10 @@ static const struct usb_device_id products[] = { USB_DEVICE(0x0a46, 0x8515), /* ADMtek ADM8515 USB NIC */ .driver_info = (unsigned long)&dm9601_info, }, + { + USB_DEVICE(0x0a47, 0x9601), /* Hirose USB-100 */ + .driver_info = (unsigned long)&dm9601_info, + }, {}, // END };