diff options
Diffstat (limited to 'drivers/net/usb')
-rw-r--r-- | drivers/net/usb/asix.c | 53 | ||||
-rw-r--r-- | drivers/net/usb/catc.c | 6 | ||||
-rw-r--r-- | drivers/net/usb/cdc_ether.c | 113 | ||||
-rw-r--r-- | drivers/net/usb/dm9601.c | 9 | ||||
-rw-r--r-- | drivers/net/usb/hso.c | 4 | ||||
-rw-r--r-- | drivers/net/usb/ipheth.c | 24 | ||||
-rw-r--r-- | drivers/net/usb/kaweth.c | 13 | ||||
-rw-r--r-- | drivers/net/usb/mcs7830.c | 10 | ||||
-rw-r--r-- | drivers/net/usb/pegasus.c | 9 | ||||
-rw-r--r-- | drivers/net/usb/pegasus.h | 2 | ||||
-rw-r--r-- | drivers/net/usb/rndis_host.c | 18 | ||||
-rw-r--r-- | drivers/net/usb/smsc75xx.c | 6 | ||||
-rw-r--r-- | drivers/net/usb/smsc95xx.c | 6 | ||||
-rw-r--r-- | drivers/net/usb/usbnet.c | 15 |
14 files changed, 137 insertions, 151 deletions
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 35f56fc82803..31b73310ec77 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
@@ -224,10 +224,9 @@ static int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | |||
224 | cmd, value, index, size); | 224 | cmd, value, index, size); |
225 | 225 | ||
226 | if (data) { | 226 | if (data) { |
227 | buf = kmalloc(size, GFP_KERNEL); | 227 | buf = kmemdup(data, size, GFP_KERNEL); |
228 | if (!buf) | 228 | if (!buf) |
229 | goto out; | 229 | goto out; |
230 | memcpy(buf, data, size); | ||
231 | } | 230 | } |
232 | 231 | ||
233 | err = usb_control_msg( | 232 | err = usb_control_msg( |
@@ -322,8 +321,29 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
322 | /* get the packet length */ | 321 | /* get the packet length */ |
323 | size = (u16) (header & 0x0000ffff); | 322 | size = (u16) (header & 0x0000ffff); |
324 | 323 | ||
325 | if ((skb->len) - ((size + 1) & 0xfffe) == 0) | 324 | if ((skb->len) - ((size + 1) & 0xfffe) == 0) { |
325 | u8 alignment = (u32)skb->data & 0x3; | ||
326 | if (alignment != 0x2) { | ||
327 | /* | ||
328 | * not 16bit aligned so use the room provided by | ||
329 | * the 32 bit header to align the data | ||
330 | * | ||
331 | * note we want 16bit alignment as MAC header is | ||
332 | * 14bytes thus ip header will be aligned on | ||
333 | * 32bit boundary so accessing ipheader elements | ||
334 | * using a cast to struct ip header wont cause | ||
335 | * an unaligned accesses. | ||
336 | */ | ||
337 | u8 realignment = (alignment + 2) & 0x3; | ||
338 | memmove(skb->data - realignment, | ||
339 | skb->data, | ||
340 | size); | ||
341 | skb->data -= realignment; | ||
342 | skb_set_tail_pointer(skb, size); | ||
343 | } | ||
326 | return 2; | 344 | return 2; |
345 | } | ||
346 | |||
327 | if (size > ETH_FRAME_LEN) { | 347 | if (size > ETH_FRAME_LEN) { |
328 | netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n", | 348 | netdev_err(dev->net, "asix_rx_fixup() Bad RX Length %d\n", |
329 | size); | 349 | size); |
@@ -331,7 +351,18 @@ static int asix_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
331 | } | 351 | } |
332 | ax_skb = skb_clone(skb, GFP_ATOMIC); | 352 | ax_skb = skb_clone(skb, GFP_ATOMIC); |
333 | if (ax_skb) { | 353 | if (ax_skb) { |
354 | u8 alignment = (u32)packet & 0x3; | ||
334 | ax_skb->len = size; | 355 | ax_skb->len = size; |
356 | |||
357 | if (alignment != 0x2) { | ||
358 | /* | ||
359 | * not 16bit aligned use the room provided by | ||
360 | * the 32 bit header to align the data | ||
361 | */ | ||
362 | u8 realignment = (alignment + 2) & 0x3; | ||
363 | memmove(packet - realignment, packet, size); | ||
364 | packet -= realignment; | ||
365 | } | ||
335 | ax_skb->data = packet; | 366 | ax_skb->data = packet; |
336 | skb_set_tail_pointer(ax_skb, size); | 367 | skb_set_tail_pointer(ax_skb, size); |
337 | usbnet_skb_return(dev, ax_skb); | 368 | usbnet_skb_return(dev, ax_skb); |
@@ -558,16 +589,14 @@ static void asix_set_multicast(struct net_device *net) | |||
558 | * for our 8 byte filter buffer | 589 | * for our 8 byte filter buffer |
559 | * to avoid allocating memory that | 590 | * to avoid allocating memory that |
560 | * is tricky to free later */ | 591 | * is tricky to free later */ |
561 | struct dev_mc_list *mc_list; | 592 | struct netdev_hw_addr *ha; |
562 | u32 crc_bits; | 593 | u32 crc_bits; |
563 | 594 | ||
564 | memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE); | 595 | memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE); |
565 | 596 | ||
566 | /* Build the multicast hash filter. */ | 597 | /* Build the multicast hash filter. */ |
567 | netdev_for_each_mc_addr(mc_list, net) { | 598 | netdev_for_each_mc_addr(ha, net) { |
568 | crc_bits = | 599 | crc_bits = ether_crc(ETH_ALEN, ha->addr) >> 26; |
569 | ether_crc(ETH_ALEN, | ||
570 | mc_list->dmi_addr) >> 26; | ||
571 | data->multi_filter[crc_bits >> 3] |= | 600 | data->multi_filter[crc_bits >> 3] |= |
572 | 1 << (crc_bits & 7); | 601 | 1 << (crc_bits & 7); |
573 | } | 602 | } |
@@ -794,16 +823,14 @@ static void ax88172_set_multicast(struct net_device *net) | |||
794 | * for our 8 byte filter buffer | 823 | * for our 8 byte filter buffer |
795 | * to avoid allocating memory that | 824 | * to avoid allocating memory that |
796 | * is tricky to free later */ | 825 | * is tricky to free later */ |
797 | struct dev_mc_list *mc_list; | 826 | struct netdev_hw_addr *ha; |
798 | u32 crc_bits; | 827 | u32 crc_bits; |
799 | 828 | ||
800 | memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE); | 829 | memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE); |
801 | 830 | ||
802 | /* Build the multicast hash filter. */ | 831 | /* Build the multicast hash filter. */ |
803 | netdev_for_each_mc_addr(mc_list, net) { | 832 | netdev_for_each_mc_addr(ha, net) { |
804 | crc_bits = | 833 | crc_bits = ether_crc(ETH_ALEN, ha->addr) >> 26; |
805 | ether_crc(ETH_ALEN, | ||
806 | mc_list->dmi_addr) >> 26; | ||
807 | data->multi_filter[crc_bits >> 3] |= | 834 | data->multi_filter[crc_bits >> 3] |= |
808 | 1 << (crc_bits & 7); | 835 | 1 << (crc_bits & 7); |
809 | } | 836 | } |
diff --git a/drivers/net/usb/catc.c b/drivers/net/usb/catc.c index 602e123b2741..97687d335903 100644 --- a/drivers/net/usb/catc.c +++ b/drivers/net/usb/catc.c | |||
@@ -629,7 +629,7 @@ static void catc_multicast(unsigned char *addr, u8 *multicast) | |||
629 | static void catc_set_multicast_list(struct net_device *netdev) | 629 | static void catc_set_multicast_list(struct net_device *netdev) |
630 | { | 630 | { |
631 | struct catc *catc = netdev_priv(netdev); | 631 | struct catc *catc = netdev_priv(netdev); |
632 | struct dev_mc_list *mc; | 632 | struct netdev_hw_addr *ha; |
633 | u8 broadcast[6]; | 633 | u8 broadcast[6]; |
634 | u8 rx = RxEnable | RxPolarity | RxMultiCast; | 634 | u8 rx = RxEnable | RxPolarity | RxMultiCast; |
635 | 635 | ||
@@ -647,8 +647,8 @@ static void catc_set_multicast_list(struct net_device *netdev) | |||
647 | if (netdev->flags & IFF_ALLMULTI) { | 647 | if (netdev->flags & IFF_ALLMULTI) { |
648 | memset(catc->multicast, 0xff, 64); | 648 | memset(catc->multicast, 0xff, 64); |
649 | } else { | 649 | } else { |
650 | netdev_for_each_mc_addr(mc, netdev) { | 650 | netdev_for_each_mc_addr(ha, netdev) { |
651 | u32 crc = ether_crc_le(6, mc->dmi_addr); | 651 | u32 crc = ether_crc_le(6, ha->addr); |
652 | if (!catc->is_f5u011) { | 652 | if (!catc->is_f5u011) { |
653 | catc->multicast[(crc >> 3) & 0x3f] |= 1 << (crc & 7); | 653 | catc->multicast[(crc >> 3) & 0x3f] |= 1 << (crc & 7); |
654 | } else { | 654 | } else { |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 3547cf13d219..b3fe0de40469 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
@@ -64,6 +64,11 @@ static int is_wireless_rndis(struct usb_interface_descriptor *desc) | |||
64 | 64 | ||
65 | #endif | 65 | #endif |
66 | 66 | ||
67 | static const u8 mbm_guid[16] = { | ||
68 | 0xa3, 0x17, 0xa8, 0x8b, 0x04, 0x5e, 0x4f, 0x01, | ||
69 | 0xa6, 0x07, 0xc0, 0xff, 0xcb, 0x7e, 0x39, 0x2a, | ||
70 | }; | ||
71 | |||
67 | /* | 72 | /* |
68 | * probes control interface, claims data interface, collects the bulk | 73 | * probes control interface, claims data interface, collects the bulk |
69 | * endpoints, activates data interface (if needed), maybe sets MTU. | 74 | * endpoints, activates data interface (if needed), maybe sets MTU. |
@@ -79,6 +84,8 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) | |||
79 | int status; | 84 | int status; |
80 | int rndis; | 85 | int rndis; |
81 | struct usb_driver *driver = driver_of(intf); | 86 | struct usb_driver *driver = driver_of(intf); |
87 | struct usb_cdc_mdlm_desc *desc = NULL; | ||
88 | struct usb_cdc_mdlm_detail_desc *detail = NULL; | ||
82 | 89 | ||
83 | if (sizeof dev->data < sizeof *info) | 90 | if (sizeof dev->data < sizeof *info) |
84 | return -EDOM; | 91 | return -EDOM; |
@@ -229,6 +236,34 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) | |||
229 | * side link address we were given. | 236 | * side link address we were given. |
230 | */ | 237 | */ |
231 | break; | 238 | break; |
239 | case USB_CDC_MDLM_TYPE: | ||
240 | if (desc) { | ||
241 | dev_dbg(&intf->dev, "extra MDLM descriptor\n"); | ||
242 | goto bad_desc; | ||
243 | } | ||
244 | |||
245 | desc = (void *)buf; | ||
246 | |||
247 | if (desc->bLength != sizeof(*desc)) | ||
248 | goto bad_desc; | ||
249 | |||
250 | if (memcmp(&desc->bGUID, mbm_guid, 16)) | ||
251 | goto bad_desc; | ||
252 | break; | ||
253 | case USB_CDC_MDLM_DETAIL_TYPE: | ||
254 | if (detail) { | ||
255 | dev_dbg(&intf->dev, "extra MDLM detail descriptor\n"); | ||
256 | goto bad_desc; | ||
257 | } | ||
258 | |||
259 | detail = (void *)buf; | ||
260 | |||
261 | if (detail->bGuidDescriptorType == 0) { | ||
262 | if (detail->bLength < (sizeof(*detail) + 1)) | ||
263 | goto bad_desc; | ||
264 | } else | ||
265 | goto bad_desc; | ||
266 | break; | ||
232 | } | 267 | } |
233 | next_desc: | 268 | next_desc: |
234 | len -= buf [0]; /* bLength */ | 269 | len -= buf [0]; /* bLength */ |
@@ -543,80 +578,10 @@ static const struct usb_device_id products [] = { | |||
543 | USB_CDC_PROTO_NONE), | 578 | USB_CDC_PROTO_NONE), |
544 | .driver_info = (unsigned long) &cdc_info, | 579 | .driver_info = (unsigned long) &cdc_info, |
545 | }, { | 580 | }, { |
546 | /* Ericsson F3507g */ | 581 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, |
547 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM, | 582 | USB_CDC_PROTO_NONE), |
548 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | 583 | .driver_info = (unsigned long)&mbm_info, |
549 | .driver_info = (unsigned long) &mbm_info, | 584 | |
550 | }, { | ||
551 | /* Ericsson F3507g ver. 2 */ | ||
552 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1902, USB_CLASS_COMM, | ||
553 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
554 | .driver_info = (unsigned long) &mbm_info, | ||
555 | }, { | ||
556 | /* Ericsson F3607gw */ | ||
557 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1904, USB_CLASS_COMM, | ||
558 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
559 | .driver_info = (unsigned long) &mbm_info, | ||
560 | }, { | ||
561 | /* Ericsson F3607gw ver 2 */ | ||
562 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1905, USB_CLASS_COMM, | ||
563 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
564 | .driver_info = (unsigned long) &mbm_info, | ||
565 | }, { | ||
566 | /* Ericsson F3607gw ver 3 */ | ||
567 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1906, USB_CLASS_COMM, | ||
568 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
569 | .driver_info = (unsigned long) &mbm_info, | ||
570 | }, { | ||
571 | /* Ericsson F3307 */ | ||
572 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190a, USB_CLASS_COMM, | ||
573 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
574 | .driver_info = (unsigned long) &mbm_info, | ||
575 | }, { | ||
576 | /* Ericsson F3307 ver 2 */ | ||
577 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1909, USB_CLASS_COMM, | ||
578 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
579 | .driver_info = (unsigned long) &mbm_info, | ||
580 | }, { | ||
581 | /* Ericsson C3607w */ | ||
582 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1049, USB_CLASS_COMM, | ||
583 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
584 | .driver_info = (unsigned long) &mbm_info, | ||
585 | }, { | ||
586 | /* Ericsson C3607w ver 2 */ | ||
587 | USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x190b, USB_CLASS_COMM, | ||
588 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
589 | .driver_info = (unsigned long) &mbm_info, | ||
590 | }, { | ||
591 | /* Toshiba F3507g */ | ||
592 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130b, USB_CLASS_COMM, | ||
593 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
594 | .driver_info = (unsigned long) &mbm_info, | ||
595 | }, { | ||
596 | /* Toshiba F3607gw */ | ||
597 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x130c, USB_CLASS_COMM, | ||
598 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
599 | .driver_info = (unsigned long) &mbm_info, | ||
600 | }, { | ||
601 | /* Toshiba F3607gw ver 2 */ | ||
602 | USB_DEVICE_AND_INTERFACE_INFO(0x0930, 0x1311, USB_CLASS_COMM, | ||
603 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
604 | .driver_info = (unsigned long) &mbm_info, | ||
605 | }, { | ||
606 | /* Dell F3507g */ | ||
607 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8147, USB_CLASS_COMM, | ||
608 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
609 | .driver_info = (unsigned long) &mbm_info, | ||
610 | }, { | ||
611 | /* Dell F3607gw */ | ||
612 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8183, USB_CLASS_COMM, | ||
613 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
614 | .driver_info = (unsigned long) &mbm_info, | ||
615 | }, { | ||
616 | /* Dell F3607gw ver 2 */ | ||
617 | USB_DEVICE_AND_INTERFACE_INFO(0x413c, 0x8184, USB_CLASS_COMM, | ||
618 | USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), | ||
619 | .driver_info = (unsigned long) &mbm_info, | ||
620 | }, | 585 | }, |
621 | { }, // END | 586 | { }, // END |
622 | }; | 587 | }; |
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 5dfed9297b22..02b622e3b9fb 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c | |||
@@ -93,10 +93,9 @@ static int dm_write(struct usbnet *dev, u8 reg, u16 length, void *data) | |||
93 | netdev_dbg(dev->net, "dm_write() reg=0x%02x, length=%d\n", reg, length); | 93 | netdev_dbg(dev->net, "dm_write() reg=0x%02x, length=%d\n", reg, length); |
94 | 94 | ||
95 | if (data) { | 95 | if (data) { |
96 | buf = kmalloc(length, GFP_KERNEL); | 96 | buf = kmemdup(data, length, GFP_KERNEL); |
97 | if (!buf) | 97 | if (!buf) |
98 | goto out; | 98 | goto out; |
99 | memcpy(buf, data, length); | ||
100 | } | 99 | } |
101 | 100 | ||
102 | err = usb_control_msg(dev->udev, | 101 | err = usb_control_msg(dev->udev, |
@@ -387,10 +386,10 @@ static void dm9601_set_multicast(struct net_device *net) | |||
387 | netdev_mc_count(net) > DM_MAX_MCAST) { | 386 | netdev_mc_count(net) > DM_MAX_MCAST) { |
388 | rx_ctl |= 0x04; | 387 | rx_ctl |= 0x04; |
389 | } else if (!netdev_mc_empty(net)) { | 388 | } else if (!netdev_mc_empty(net)) { |
390 | struct dev_mc_list *mc_list; | 389 | struct netdev_hw_addr *ha; |
391 | 390 | ||
392 | netdev_for_each_mc_addr(mc_list, net) { | 391 | netdev_for_each_mc_addr(ha, net) { |
393 | u32 crc = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26; | 392 | u32 crc = ether_crc(ETH_ALEN, ha->addr) >> 26; |
394 | hashes[crc >> 3] |= 1 << (crc & 0x7); | 393 | hashes[crc >> 3] |= 1 << (crc & 0x7); |
395 | } | 394 | } |
396 | } | 395 | } |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index be0cc99e881a..9964df199511 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -834,8 +834,6 @@ static netdev_tx_t hso_net_start_xmit(struct sk_buff *skb, | |||
834 | } else { | 834 | } else { |
835 | net->stats.tx_packets++; | 835 | net->stats.tx_packets++; |
836 | net->stats.tx_bytes += skb->len; | 836 | net->stats.tx_bytes += skb->len; |
837 | /* And tell the kernel when the last transmit started. */ | ||
838 | net->trans_start = jiffies; | ||
839 | } | 837 | } |
840 | dev_kfree_skb(skb); | 838 | dev_kfree_skb(skb); |
841 | /* we're done */ | 839 | /* we're done */ |
@@ -1474,7 +1472,6 @@ static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
1474 | spin_unlock_irqrestore(&serial->serial_lock, flags); | 1472 | spin_unlock_irqrestore(&serial->serial_lock, flags); |
1475 | 1473 | ||
1476 | /* done */ | 1474 | /* done */ |
1477 | return; | ||
1478 | } | 1475 | } |
1479 | 1476 | ||
1480 | /* how many characters in the buffer */ | 1477 | /* how many characters in the buffer */ |
@@ -1994,7 +1991,6 @@ static void hso_std_serial_write_bulk_callback(struct urb *urb) | |||
1994 | hso_kick_transmit(serial); | 1991 | hso_kick_transmit(serial); |
1995 | 1992 | ||
1996 | D1(" "); | 1993 | D1(" "); |
1997 | return; | ||
1998 | } | 1994 | } |
1999 | 1995 | ||
2000 | /* called for writing diag or CS serial port */ | 1996 | /* called for writing diag or CS serial port */ |
diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c index 418825d26f90..197c352c47fb 100644 --- a/drivers/net/usb/ipheth.c +++ b/drivers/net/usb/ipheth.c | |||
@@ -128,17 +128,13 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone) | |||
128 | if (rx_urb == NULL) | 128 | if (rx_urb == NULL) |
129 | goto free_tx_urb; | 129 | goto free_tx_urb; |
130 | 130 | ||
131 | tx_buf = usb_buffer_alloc(iphone->udev, | 131 | tx_buf = usb_alloc_coherent(iphone->udev, IPHETH_BUF_SIZE, |
132 | IPHETH_BUF_SIZE, | 132 | GFP_KERNEL, &tx_urb->transfer_dma); |
133 | GFP_KERNEL, | ||
134 | &tx_urb->transfer_dma); | ||
135 | if (tx_buf == NULL) | 133 | if (tx_buf == NULL) |
136 | goto free_rx_urb; | 134 | goto free_rx_urb; |
137 | 135 | ||
138 | rx_buf = usb_buffer_alloc(iphone->udev, | 136 | rx_buf = usb_alloc_coherent(iphone->udev, IPHETH_BUF_SIZE, |
139 | IPHETH_BUF_SIZE, | 137 | GFP_KERNEL, &rx_urb->transfer_dma); |
140 | GFP_KERNEL, | ||
141 | &rx_urb->transfer_dma); | ||
142 | if (rx_buf == NULL) | 138 | if (rx_buf == NULL) |
143 | goto free_tx_buf; | 139 | goto free_tx_buf; |
144 | 140 | ||
@@ -150,8 +146,8 @@ static int ipheth_alloc_urbs(struct ipheth_device *iphone) | |||
150 | return 0; | 146 | return 0; |
151 | 147 | ||
152 | free_tx_buf: | 148 | free_tx_buf: |
153 | usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, tx_buf, | 149 | usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, tx_buf, |
154 | tx_urb->transfer_dma); | 150 | tx_urb->transfer_dma); |
155 | free_rx_urb: | 151 | free_rx_urb: |
156 | usb_free_urb(rx_urb); | 152 | usb_free_urb(rx_urb); |
157 | free_tx_urb: | 153 | free_tx_urb: |
@@ -162,10 +158,10 @@ error_nomem: | |||
162 | 158 | ||
163 | static void ipheth_free_urbs(struct ipheth_device *iphone) | 159 | static void ipheth_free_urbs(struct ipheth_device *iphone) |
164 | { | 160 | { |
165 | usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, iphone->rx_buf, | 161 | usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, iphone->rx_buf, |
166 | iphone->rx_urb->transfer_dma); | 162 | iphone->rx_urb->transfer_dma); |
167 | usb_buffer_free(iphone->udev, IPHETH_BUF_SIZE, iphone->tx_buf, | 163 | usb_free_coherent(iphone->udev, IPHETH_BUF_SIZE, iphone->tx_buf, |
168 | iphone->tx_urb->transfer_dma); | 164 | iphone->tx_urb->transfer_dma); |
169 | usb_free_urb(iphone->rx_urb); | 165 | usb_free_urb(iphone->rx_urb); |
170 | usb_free_urb(iphone->tx_urb); | 166 | usb_free_urb(iphone->tx_urb); |
171 | } | 167 | } |
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index c4c334d9770f..d6078b8c4273 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
@@ -856,7 +856,6 @@ skip: | |||
856 | { | 856 | { |
857 | kaweth->stats.tx_packets++; | 857 | kaweth->stats.tx_packets++; |
858 | kaweth->stats.tx_bytes += skb->len; | 858 | kaweth->stats.tx_bytes += skb->len; |
859 | net->trans_start = jiffies; | ||
860 | } | 859 | } |
861 | 860 | ||
862 | spin_unlock_irq(&kaweth->device_lock); | 861 | spin_unlock_irq(&kaweth->device_lock); |
@@ -1156,13 +1155,13 @@ err_fw: | |||
1156 | if (!kaweth->irq_urb) | 1155 | if (!kaweth->irq_urb) |
1157 | goto err_tx_and_rx; | 1156 | goto err_tx_and_rx; |
1158 | 1157 | ||
1159 | kaweth->intbuffer = usb_buffer_alloc( kaweth->dev, | 1158 | kaweth->intbuffer = usb_alloc_coherent( kaweth->dev, |
1160 | INTBUFFERSIZE, | 1159 | INTBUFFERSIZE, |
1161 | GFP_KERNEL, | 1160 | GFP_KERNEL, |
1162 | &kaweth->intbufferhandle); | 1161 | &kaweth->intbufferhandle); |
1163 | if (!kaweth->intbuffer) | 1162 | if (!kaweth->intbuffer) |
1164 | goto err_tx_and_rx_and_irq; | 1163 | goto err_tx_and_rx_and_irq; |
1165 | kaweth->rx_buf = usb_buffer_alloc( kaweth->dev, | 1164 | kaweth->rx_buf = usb_alloc_coherent( kaweth->dev, |
1166 | KAWETH_BUF_SIZE, | 1165 | KAWETH_BUF_SIZE, |
1167 | GFP_KERNEL, | 1166 | GFP_KERNEL, |
1168 | &kaweth->rxbufferhandle); | 1167 | &kaweth->rxbufferhandle); |
@@ -1203,9 +1202,9 @@ err_fw: | |||
1203 | 1202 | ||
1204 | err_intfdata: | 1203 | err_intfdata: |
1205 | usb_set_intfdata(intf, NULL); | 1204 | usb_set_intfdata(intf, NULL); |
1206 | usb_buffer_free(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle); | 1205 | usb_free_coherent(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle); |
1207 | err_all_but_rxbuf: | 1206 | err_all_but_rxbuf: |
1208 | usb_buffer_free(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle); | 1207 | usb_free_coherent(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle); |
1209 | err_tx_and_rx_and_irq: | 1208 | err_tx_and_rx_and_irq: |
1210 | usb_free_urb(kaweth->irq_urb); | 1209 | usb_free_urb(kaweth->irq_urb); |
1211 | err_tx_and_rx: | 1210 | err_tx_and_rx: |
@@ -1242,8 +1241,8 @@ static void kaweth_disconnect(struct usb_interface *intf) | |||
1242 | usb_free_urb(kaweth->tx_urb); | 1241 | usb_free_urb(kaweth->tx_urb); |
1243 | usb_free_urb(kaweth->irq_urb); | 1242 | usb_free_urb(kaweth->irq_urb); |
1244 | 1243 | ||
1245 | usb_buffer_free(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle); | 1244 | usb_free_coherent(kaweth->dev, KAWETH_BUF_SIZE, (void *)kaweth->rx_buf, kaweth->rxbufferhandle); |
1246 | usb_buffer_free(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle); | 1245 | usb_free_coherent(kaweth->dev, INTBUFFERSIZE, (void *)kaweth->intbuffer, kaweth->intbufferhandle); |
1247 | 1246 | ||
1248 | free_netdev(netdev); | 1247 | free_netdev(netdev); |
1249 | } | 1248 | } |
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index 9f24e3f871e1..a6281e3987b5 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c | |||
@@ -142,12 +142,10 @@ static int mcs7830_set_reg(struct usbnet *dev, u16 index, u16 size, const void * | |||
142 | int ret; | 142 | int ret; |
143 | void *buffer; | 143 | void *buffer; |
144 | 144 | ||
145 | buffer = kmalloc(size, GFP_NOIO); | 145 | buffer = kmemdup(data, size, GFP_NOIO); |
146 | if (buffer == NULL) | 146 | if (buffer == NULL) |
147 | return -ENOMEM; | 147 | return -ENOMEM; |
148 | 148 | ||
149 | memcpy(buffer, data, size); | ||
150 | |||
151 | ret = usb_control_msg(xdev, usb_sndctrlpipe(xdev, 0), MCS7830_WR_BREQ, | 149 | ret = usb_control_msg(xdev, usb_sndctrlpipe(xdev, 0), MCS7830_WR_BREQ, |
152 | MCS7830_WR_BMREQ, 0x0000, index, buffer, | 150 | MCS7830_WR_BMREQ, 0x0000, index, buffer, |
153 | size, MCS7830_CTRL_TIMEOUT); | 151 | size, MCS7830_CTRL_TIMEOUT); |
@@ -453,12 +451,12 @@ static void mcs7830_data_set_multicast(struct net_device *net) | |||
453 | * for our 8 byte filter buffer | 451 | * for our 8 byte filter buffer |
454 | * to avoid allocating memory that | 452 | * to avoid allocating memory that |
455 | * is tricky to free later */ | 453 | * is tricky to free later */ |
456 | struct dev_mc_list *mc_list; | 454 | struct netdev_hw_addr *ha; |
457 | u32 crc_bits; | 455 | u32 crc_bits; |
458 | 456 | ||
459 | /* Build the multicast hash filter. */ | 457 | /* Build the multicast hash filter. */ |
460 | netdev_for_each_mc_addr(mc_list, net) { | 458 | netdev_for_each_mc_addr(ha, net) { |
461 | crc_bits = ether_crc(ETH_ALEN, mc_list->dmi_addr) >> 26; | 459 | crc_bits = ether_crc(ETH_ALEN, ha->addr) >> 26; |
462 | data->multi_filter[crc_bits >> 3] |= 1 << (crc_bits & 7); | 460 | data->multi_filter[crc_bits >> 3] |= 1 << (crc_bits & 7); |
463 | } | 461 | } |
464 | } | 462 | } |
diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c index 41838773b568..974d17f0263e 100644 --- a/drivers/net/usb/pegasus.c +++ b/drivers/net/usb/pegasus.c | |||
@@ -203,13 +203,12 @@ static int set_registers(pegasus_t * pegasus, __u16 indx, __u16 size, | |||
203 | char *buffer; | 203 | char *buffer; |
204 | DECLARE_WAITQUEUE(wait, current); | 204 | DECLARE_WAITQUEUE(wait, current); |
205 | 205 | ||
206 | buffer = kmalloc(size, GFP_KERNEL); | 206 | buffer = kmemdup(data, size, GFP_KERNEL); |
207 | if (!buffer) { | 207 | if (!buffer) { |
208 | netif_warn(pegasus, drv, pegasus->net, | 208 | netif_warn(pegasus, drv, pegasus->net, |
209 | "out of memory in %s\n", __func__); | 209 | "out of memory in %s\n", __func__); |
210 | return -ENOMEM; | 210 | return -ENOMEM; |
211 | } | 211 | } |
212 | memcpy(buffer, data, size); | ||
213 | 212 | ||
214 | add_wait_queue(&pegasus->ctrl_wait, &wait); | 213 | add_wait_queue(&pegasus->ctrl_wait, &wait); |
215 | set_current_state(TASK_UNINTERRUPTIBLE); | 214 | set_current_state(TASK_UNINTERRUPTIBLE); |
@@ -255,13 +254,12 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data) | |||
255 | char *tmp; | 254 | char *tmp; |
256 | DECLARE_WAITQUEUE(wait, current); | 255 | DECLARE_WAITQUEUE(wait, current); |
257 | 256 | ||
258 | tmp = kmalloc(1, GFP_KERNEL); | 257 | tmp = kmemdup(&data, 1, GFP_KERNEL); |
259 | if (!tmp) { | 258 | if (!tmp) { |
260 | netif_warn(pegasus, drv, pegasus->net, | 259 | netif_warn(pegasus, drv, pegasus->net, |
261 | "out of memory in %s\n", __func__); | 260 | "out of memory in %s\n", __func__); |
262 | return -ENOMEM; | 261 | return -ENOMEM; |
263 | } | 262 | } |
264 | memcpy(tmp, &data, 1); | ||
265 | add_wait_queue(&pegasus->ctrl_wait, &wait); | 263 | add_wait_queue(&pegasus->ctrl_wait, &wait); |
266 | set_current_state(TASK_UNINTERRUPTIBLE); | 264 | set_current_state(TASK_UNINTERRUPTIBLE); |
267 | while (pegasus->flags & ETH_REGS_CHANGED) | 265 | while (pegasus->flags & ETH_REGS_CHANGED) |
@@ -808,7 +806,7 @@ static void write_bulk_callback(struct urb *urb) | |||
808 | break; | 806 | break; |
809 | } | 807 | } |
810 | 808 | ||
811 | net->trans_start = jiffies; | 809 | net->trans_start = jiffies; /* prevent tx timeout */ |
812 | netif_wake_queue(net); | 810 | netif_wake_queue(net); |
813 | } | 811 | } |
814 | 812 | ||
@@ -909,7 +907,6 @@ static netdev_tx_t pegasus_start_xmit(struct sk_buff *skb, | |||
909 | } else { | 907 | } else { |
910 | pegasus->stats.tx_packets++; | 908 | pegasus->stats.tx_packets++; |
911 | pegasus->stats.tx_bytes += skb->len; | 909 | pegasus->stats.tx_bytes += skb->len; |
912 | net->trans_start = jiffies; | ||
913 | } | 910 | } |
914 | dev_kfree_skb(skb); | 911 | dev_kfree_skb(skb); |
915 | 912 | ||
diff --git a/drivers/net/usb/pegasus.h b/drivers/net/usb/pegasus.h index b90d8766ab74..29f5211e645b 100644 --- a/drivers/net/usb/pegasus.h +++ b/drivers/net/usb/pegasus.h | |||
@@ -256,7 +256,7 @@ PEGASUS_DEV( "IO DATA USB ET/TX", VENDOR_IODATA, 0x0904, | |||
256 | DEFAULT_GPIO_RESET ) | 256 | DEFAULT_GPIO_RESET ) |
257 | PEGASUS_DEV( "IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913, | 257 | PEGASUS_DEV( "IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913, |
258 | DEFAULT_GPIO_RESET | PEGASUS_II ) | 258 | DEFAULT_GPIO_RESET | PEGASUS_II ) |
259 | PEGASUS_DEV( "IO DATA USB ETX-US2", VENDOR_IODATA, 0x092a, | 259 | PEGASUS_DEV( "IO DATA USB ETX-US2", VENDOR_IODATA, 0x093a, |
260 | DEFAULT_GPIO_RESET | PEGASUS_II ) | 260 | DEFAULT_GPIO_RESET | PEGASUS_II ) |
261 | PEGASUS_DEV( "Kingston KNU101TX Ethernet", VENDOR_KINGSTON, 0x000a, | 261 | PEGASUS_DEV( "Kingston KNU101TX Ethernet", VENDOR_KINGSTON, 0x000a, |
262 | DEFAULT_GPIO_RESET) | 262 | DEFAULT_GPIO_RESET) |
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index dd8a4adf48ca..28d3ee175e7b 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c | |||
@@ -104,8 +104,10 @@ static void rndis_msg_indicate(struct usbnet *dev, struct rndis_indicate *msg, | |||
104 | int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) | 104 | int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) |
105 | { | 105 | { |
106 | struct cdc_state *info = (void *) &dev->data; | 106 | struct cdc_state *info = (void *) &dev->data; |
107 | struct usb_cdc_notification notification; | ||
107 | int master_ifnum; | 108 | int master_ifnum; |
108 | int retval; | 109 | int retval; |
110 | int partial; | ||
109 | unsigned count; | 111 | unsigned count; |
110 | __le32 rsp; | 112 | __le32 rsp; |
111 | u32 xid = 0, msg_len, request_id; | 113 | u32 xid = 0, msg_len, request_id; |
@@ -133,13 +135,17 @@ int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf, int buflen) | |||
133 | if (unlikely(retval < 0 || xid == 0)) | 135 | if (unlikely(retval < 0 || xid == 0)) |
134 | return retval; | 136 | return retval; |
135 | 137 | ||
136 | // FIXME Seems like some devices discard responses when | 138 | /* Some devices don't respond on the control channel until |
137 | // we time out and cancel our "get response" requests... | 139 | * polled on the status channel, so do that first. */ |
138 | // so, this is fragile. Probably need to poll for status. | 140 | retval = usb_interrupt_msg( |
141 | dev->udev, | ||
142 | usb_rcvintpipe(dev->udev, dev->status->desc.bEndpointAddress), | ||
143 | ¬ification, sizeof(notification), &partial, | ||
144 | RNDIS_CONTROL_TIMEOUT_MS); | ||
145 | if (unlikely(retval < 0)) | ||
146 | return retval; | ||
139 | 147 | ||
140 | /* ignore status endpoint, just poll the control channel; | 148 | /* Poll the control channel; the request probably completed immediately */ |
141 | * the request probably completed immediately | ||
142 | */ | ||
143 | rsp = buf->msg_type | RNDIS_MSG_COMPLETION; | 149 | rsp = buf->msg_type | RNDIS_MSG_COMPLETION; |
144 | for (count = 0; count < 10; count++) { | 150 | for (count = 0; count < 10; count++) { |
145 | memset(buf, 0, CONTROL_BUFFER_SIZE); | 151 | memset(buf, 0, CONTROL_BUFFER_SIZE); |
diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c index 35b98b1b79e4..753ee6eb7edd 100644 --- a/drivers/net/usb/smsc75xx.c +++ b/drivers/net/usb/smsc75xx.c | |||
@@ -445,14 +445,14 @@ static void smsc75xx_set_multicast(struct net_device *netdev) | |||
445 | netif_dbg(dev, drv, dev->net, "receive all multicast enabled"); | 445 | netif_dbg(dev, drv, dev->net, "receive all multicast enabled"); |
446 | pdata->rfe_ctl |= RFE_CTL_AM | RFE_CTL_DPF; | 446 | pdata->rfe_ctl |= RFE_CTL_AM | RFE_CTL_DPF; |
447 | } else if (!netdev_mc_empty(dev->net)) { | 447 | } else if (!netdev_mc_empty(dev->net)) { |
448 | struct dev_mc_list *mc_list; | 448 | struct netdev_hw_addr *ha; |
449 | 449 | ||
450 | netif_dbg(dev, drv, dev->net, "receive multicast hash filter"); | 450 | netif_dbg(dev, drv, dev->net, "receive multicast hash filter"); |
451 | 451 | ||
452 | pdata->rfe_ctl |= RFE_CTL_MHF | RFE_CTL_DPF; | 452 | pdata->rfe_ctl |= RFE_CTL_MHF | RFE_CTL_DPF; |
453 | 453 | ||
454 | netdev_for_each_mc_addr(mc_list, netdev) { | 454 | netdev_for_each_mc_addr(ha, netdev) { |
455 | u32 bitnum = smsc75xx_hash(mc_list->dmi_addr); | 455 | u32 bitnum = smsc75xx_hash(ha->addr); |
456 | pdata->multicast_hash_table[bitnum / 32] |= | 456 | pdata->multicast_hash_table[bitnum / 32] |= |
457 | (1 << (bitnum % 32)); | 457 | (1 << (bitnum % 32)); |
458 | } | 458 | } |
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index 3135af63d378..12a3c88c5282 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c | |||
@@ -385,13 +385,13 @@ static void smsc95xx_set_multicast(struct net_device *netdev) | |||
385 | pdata->mac_cr |= MAC_CR_MCPAS_; | 385 | pdata->mac_cr |= MAC_CR_MCPAS_; |
386 | pdata->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_HPFILT_); | 386 | pdata->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_HPFILT_); |
387 | } else if (!netdev_mc_empty(dev->net)) { | 387 | } else if (!netdev_mc_empty(dev->net)) { |
388 | struct dev_mc_list *mc_list; | 388 | struct netdev_hw_addr *ha; |
389 | 389 | ||
390 | pdata->mac_cr |= MAC_CR_HPFILT_; | 390 | pdata->mac_cr |= MAC_CR_HPFILT_; |
391 | pdata->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_); | 391 | pdata->mac_cr &= ~(MAC_CR_PRMS_ | MAC_CR_MCPAS_); |
392 | 392 | ||
393 | netdev_for_each_mc_addr(mc_list, netdev) { | 393 | netdev_for_each_mc_addr(ha, netdev) { |
394 | u32 bitnum = smsc95xx_hash(mc_list->dmi_addr); | 394 | u32 bitnum = smsc95xx_hash(ha->addr); |
395 | u32 mask = 0x01 << (bitnum & 0x1F); | 395 | u32 mask = 0x01 << (bitnum & 0x1F); |
396 | if (bitnum & 0x20) | 396 | if (bitnum & 0x20) |
397 | hash_hi |= mask; | 397 | hash_hi |= mask; |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 7177abc78dc6..a95c73de5824 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -1069,12 +1069,15 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, | |||
1069 | * NOTE: strictly conforming cdc-ether devices should expect | 1069 | * NOTE: strictly conforming cdc-ether devices should expect |
1070 | * the ZLP here, but ignore the one-byte packet. | 1070 | * the ZLP here, but ignore the one-byte packet. |
1071 | */ | 1071 | */ |
1072 | if (!(info->flags & FLAG_SEND_ZLP) && (length % dev->maxpacket) == 0) { | 1072 | if (length % dev->maxpacket == 0) { |
1073 | urb->transfer_buffer_length++; | 1073 | if (!(info->flags & FLAG_SEND_ZLP)) { |
1074 | if (skb_tailroom(skb)) { | 1074 | urb->transfer_buffer_length++; |
1075 | skb->data[skb->len] = 0; | 1075 | if (skb_tailroom(skb)) { |
1076 | __skb_put(skb, 1); | 1076 | skb->data[skb->len] = 0; |
1077 | } | 1077 | __skb_put(skb, 1); |
1078 | } | ||
1079 | } else | ||
1080 | urb->transfer_flags |= URB_ZERO_PACKET; | ||
1078 | } | 1081 | } |
1079 | 1082 | ||
1080 | spin_lock_irqsave(&dev->txq.lock, flags); | 1083 | spin_lock_irqsave(&dev->txq.lock, flags); |