diff options
| author | Bjørn Mork <bjorn@mork.no> | 2013-11-01 06:16:42 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-11-02 02:02:02 -0400 |
| commit | bed6f762123fc53c63efef386531dd877cba2468 (patch) | |
| tree | 3233a7b19c055a0fdbc4424666f0f793cb00d269 /drivers/net/usb/cdc_ncm.c | |
| parent | ff1632aa8581b7103ac2af1ea3cb4a415eb9d6ad (diff) | |
net: cdc_ncm: remove redundant netdev field
Too many pointers back and forth are likely to confuse developers,
creating subtle bugs whenever we forget to syncronize them all.
As a usbnet driver, we should stick with the standard struct
usbnet fields as much as possible. The netdevice is one such
field.
Cc: Greg Suarez <gsuarez@smithmicro.com>
Cc: Alexey Orishko <alexey.orishko@gmail.com>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb/cdc_ncm.c')
| -rw-r--r-- | drivers/net/usb/cdc_ncm.c | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index a989bd5290a6..e39e7678a798 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
| @@ -80,8 +80,9 @@ cdc_ncm_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info) | |||
| 80 | usb_make_path(dev->udev, info->bus_info, sizeof(info->bus_info)); | 80 | usb_make_path(dev->udev, info->bus_info, sizeof(info->bus_info)); |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | 83 | static u8 cdc_ncm_setup(struct usbnet *dev) |
| 84 | { | 84 | { |
| 85 | struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; | ||
| 85 | u32 val; | 86 | u32 val; |
| 86 | u8 flags; | 87 | u8 flags; |
| 87 | u8 iface_no; | 88 | u8 iface_no; |
| @@ -90,7 +91,6 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
| 90 | u16 ntb_fmt_supported; | 91 | u16 ntb_fmt_supported; |
| 91 | u32 min_dgram_size; | 92 | u32 min_dgram_size; |
| 92 | u32 min_hdr_size; | 93 | u32 min_hdr_size; |
| 93 | struct usbnet *dev = netdev_priv(ctx->netdev); | ||
| 94 | 94 | ||
| 95 | iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber; | 95 | iface_no = ctx->control->cur_altsetting->desc.bInterfaceNumber; |
| 96 | 96 | ||
| @@ -285,8 +285,8 @@ static u8 cdc_ncm_setup(struct cdc_ncm_ctx *ctx) | |||
| 285 | } | 285 | } |
| 286 | 286 | ||
| 287 | max_dgram_err: | 287 | max_dgram_err: |
| 288 | if (ctx->netdev->mtu != (ctx->max_datagram_size - eth_hlen)) | 288 | if (dev->net->mtu != (ctx->max_datagram_size - eth_hlen)) |
| 289 | ctx->netdev->mtu = ctx->max_datagram_size - eth_hlen; | 289 | dev->net->mtu = ctx->max_datagram_size - eth_hlen; |
| 290 | 290 | ||
| 291 | return 0; | 291 | return 0; |
| 292 | } | 292 | } |
| @@ -375,11 +375,10 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ | |||
| 375 | 375 | ||
| 376 | hrtimer_init(&ctx->tx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 376 | hrtimer_init(&ctx->tx_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
| 377 | ctx->tx_timer.function = &cdc_ncm_tx_timer_cb; | 377 | ctx->tx_timer.function = &cdc_ncm_tx_timer_cb; |
| 378 | ctx->bh.data = (unsigned long)ctx; | 378 | ctx->bh.data = (unsigned long)dev; |
| 379 | ctx->bh.func = cdc_ncm_txpath_bh; | 379 | ctx->bh.func = cdc_ncm_txpath_bh; |
| 380 | atomic_set(&ctx->stop, 0); | 380 | atomic_set(&ctx->stop, 0); |
| 381 | spin_lock_init(&ctx->mtx); | 381 | spin_lock_init(&ctx->mtx); |
| 382 | ctx->netdev = dev->net; | ||
| 383 | 382 | ||
| 384 | /* store ctx pointer in device data field */ | 383 | /* store ctx pointer in device data field */ |
| 385 | dev->data[0] = (unsigned long)ctx; | 384 | dev->data[0] = (unsigned long)ctx; |
| @@ -477,7 +476,7 @@ advance: | |||
| 477 | goto error2; | 476 | goto error2; |
| 478 | 477 | ||
| 479 | /* initialize data interface */ | 478 | /* initialize data interface */ |
| 480 | if (cdc_ncm_setup(ctx)) | 479 | if (cdc_ncm_setup(dev)) |
| 481 | goto error2; | 480 | goto error2; |
| 482 | 481 | ||
| 483 | /* configure data interface */ | 482 | /* configure data interface */ |
| @@ -669,9 +668,9 @@ static struct usb_cdc_ncm_ndp16 *cdc_ncm_ndp(struct cdc_ncm_ctx *ctx, struct sk_ | |||
| 669 | } | 668 | } |
| 670 | 669 | ||
| 671 | struct sk_buff * | 670 | struct sk_buff * |
| 672 | cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign) | 671 | cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign) |
| 673 | { | 672 | { |
| 674 | struct usbnet *dev = netdev_priv(ctx->netdev); | 673 | struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; |
| 675 | struct usb_cdc_ncm_nth16 *nth16; | 674 | struct usb_cdc_ncm_nth16 *nth16; |
| 676 | struct usb_cdc_ncm_ndp16 *ndp16; | 675 | struct usb_cdc_ncm_ndp16 *ndp16; |
| 677 | struct sk_buff *skb_out; | 676 | struct sk_buff *skb_out; |
| @@ -695,7 +694,7 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign) | |||
| 695 | if (skb_out == NULL) { | 694 | if (skb_out == NULL) { |
| 696 | if (skb != NULL) { | 695 | if (skb != NULL) { |
| 697 | dev_kfree_skb_any(skb); | 696 | dev_kfree_skb_any(skb); |
| 698 | ctx->netdev->stats.tx_dropped++; | 697 | dev->net->stats.tx_dropped++; |
| 699 | } | 698 | } |
| 700 | goto exit_no_skb; | 699 | goto exit_no_skb; |
| 701 | } | 700 | } |
| @@ -733,12 +732,12 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign) | |||
| 733 | /* won't fit, MTU problem? */ | 732 | /* won't fit, MTU problem? */ |
| 734 | dev_kfree_skb_any(skb); | 733 | dev_kfree_skb_any(skb); |
| 735 | skb = NULL; | 734 | skb = NULL; |
| 736 | ctx->netdev->stats.tx_dropped++; | 735 | dev->net->stats.tx_dropped++; |
| 737 | } else { | 736 | } else { |
| 738 | /* no room for skb - store for later */ | 737 | /* no room for skb - store for later */ |
| 739 | if (ctx->tx_rem_skb != NULL) { | 738 | if (ctx->tx_rem_skb != NULL) { |
| 740 | dev_kfree_skb_any(ctx->tx_rem_skb); | 739 | dev_kfree_skb_any(ctx->tx_rem_skb); |
| 741 | ctx->netdev->stats.tx_dropped++; | 740 | dev->net->stats.tx_dropped++; |
| 742 | } | 741 | } |
| 743 | ctx->tx_rem_skb = skb; | 742 | ctx->tx_rem_skb = skb; |
| 744 | ctx->tx_rem_sign = sign; | 743 | ctx->tx_rem_sign = sign; |
| @@ -771,7 +770,7 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign) | |||
| 771 | if (skb != NULL) { | 770 | if (skb != NULL) { |
| 772 | dev_kfree_skb_any(skb); | 771 | dev_kfree_skb_any(skb); |
| 773 | skb = NULL; | 772 | skb = NULL; |
| 774 | ctx->netdev->stats.tx_dropped++; | 773 | dev->net->stats.tx_dropped++; |
| 775 | } | 774 | } |
| 776 | 775 | ||
| 777 | ctx->tx_curr_frame_num = n; | 776 | ctx->tx_curr_frame_num = n; |
| @@ -814,7 +813,7 @@ cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign) | |||
| 814 | 813 | ||
| 815 | /* return skb */ | 814 | /* return skb */ |
| 816 | ctx->tx_curr_skb = NULL; | 815 | ctx->tx_curr_skb = NULL; |
| 817 | ctx->netdev->stats.tx_packets += ctx->tx_curr_frame_num; | 816 | dev->net->stats.tx_packets += ctx->tx_curr_frame_num; |
| 818 | return skb_out; | 817 | return skb_out; |
| 819 | 818 | ||
| 820 | exit_no_skb: | 819 | exit_no_skb: |
| @@ -846,18 +845,19 @@ static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *timer) | |||
| 846 | 845 | ||
| 847 | static void cdc_ncm_txpath_bh(unsigned long param) | 846 | static void cdc_ncm_txpath_bh(unsigned long param) |
| 848 | { | 847 | { |
| 849 | struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)param; | 848 | struct usbnet *dev = (struct usbnet *)param; |
| 849 | struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; | ||
| 850 | 850 | ||
| 851 | spin_lock_bh(&ctx->mtx); | 851 | spin_lock_bh(&ctx->mtx); |
| 852 | if (ctx->tx_timer_pending != 0) { | 852 | if (ctx->tx_timer_pending != 0) { |
| 853 | ctx->tx_timer_pending--; | 853 | ctx->tx_timer_pending--; |
| 854 | cdc_ncm_tx_timeout_start(ctx); | 854 | cdc_ncm_tx_timeout_start(ctx); |
| 855 | spin_unlock_bh(&ctx->mtx); | 855 | spin_unlock_bh(&ctx->mtx); |
| 856 | } else if (ctx->netdev != NULL) { | 856 | } else if (dev->net != NULL) { |
| 857 | spin_unlock_bh(&ctx->mtx); | 857 | spin_unlock_bh(&ctx->mtx); |
| 858 | netif_tx_lock_bh(ctx->netdev); | 858 | netif_tx_lock_bh(dev->net); |
| 859 | usbnet_start_xmit(NULL, ctx->netdev); | 859 | usbnet_start_xmit(NULL, dev->net); |
| 860 | netif_tx_unlock_bh(ctx->netdev); | 860 | netif_tx_unlock_bh(dev->net); |
| 861 | } else { | 861 | } else { |
| 862 | spin_unlock_bh(&ctx->mtx); | 862 | spin_unlock_bh(&ctx->mtx); |
| 863 | } | 863 | } |
| @@ -880,7 +880,7 @@ cdc_ncm_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | |||
| 880 | goto error; | 880 | goto error; |
| 881 | 881 | ||
| 882 | spin_lock_bh(&ctx->mtx); | 882 | spin_lock_bh(&ctx->mtx); |
| 883 | skb_out = cdc_ncm_fill_tx_frame(ctx, skb, cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN)); | 883 | skb_out = cdc_ncm_fill_tx_frame(dev, skb, cpu_to_le32(USB_CDC_NCM_NDP16_NOCRC_SIGN)); |
| 884 | spin_unlock_bh(&ctx->mtx); | 884 | spin_unlock_bh(&ctx->mtx); |
| 885 | return skb_out; | 885 | return skb_out; |
| 886 | 886 | ||
| @@ -1047,9 +1047,10 @@ error: | |||
| 1047 | } | 1047 | } |
| 1048 | 1048 | ||
| 1049 | static void | 1049 | static void |
| 1050 | cdc_ncm_speed_change(struct cdc_ncm_ctx *ctx, | 1050 | cdc_ncm_speed_change(struct usbnet *dev, |
| 1051 | struct usb_cdc_speed_change *data) | 1051 | struct usb_cdc_speed_change *data) |
| 1052 | { | 1052 | { |
| 1053 | struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0]; | ||
| 1053 | uint32_t rx_speed = le32_to_cpu(data->DLBitRRate); | 1054 | uint32_t rx_speed = le32_to_cpu(data->DLBitRRate); |
| 1054 | uint32_t tx_speed = le32_to_cpu(data->ULBitRate); | 1055 | uint32_t tx_speed = le32_to_cpu(data->ULBitRate); |
| 1055 | 1056 | ||
| @@ -1063,18 +1064,18 @@ cdc_ncm_speed_change(struct cdc_ncm_ctx *ctx, | |||
| 1063 | 1064 | ||
| 1064 | if ((tx_speed > 1000000) && (rx_speed > 1000000)) { | 1065 | if ((tx_speed > 1000000) && (rx_speed > 1000000)) { |
| 1065 | printk(KERN_INFO KBUILD_MODNAME | 1066 | printk(KERN_INFO KBUILD_MODNAME |
| 1066 | ": %s: %u mbit/s downlink " | 1067 | ": %s: %u mbit/s downlink " |
| 1067 | "%u mbit/s uplink\n", | 1068 | "%u mbit/s uplink\n", |
| 1068 | ctx->netdev->name, | 1069 | dev->net->name, |
| 1069 | (unsigned int)(rx_speed / 1000000U), | 1070 | (unsigned int)(rx_speed / 1000000U), |
| 1070 | (unsigned int)(tx_speed / 1000000U)); | 1071 | (unsigned int)(tx_speed / 1000000U)); |
| 1071 | } else { | 1072 | } else { |
| 1072 | printk(KERN_INFO KBUILD_MODNAME | 1073 | printk(KERN_INFO KBUILD_MODNAME |
| 1073 | ": %s: %u kbit/s downlink " | 1074 | ": %s: %u kbit/s downlink " |
| 1074 | "%u kbit/s uplink\n", | 1075 | "%u kbit/s uplink\n", |
| 1075 | ctx->netdev->name, | 1076 | dev->net->name, |
| 1076 | (unsigned int)(rx_speed / 1000U), | 1077 | (unsigned int)(rx_speed / 1000U), |
| 1077 | (unsigned int)(tx_speed / 1000U)); | 1078 | (unsigned int)(tx_speed / 1000U)); |
| 1078 | } | 1079 | } |
| 1079 | } | 1080 | } |
| 1080 | } | 1081 | } |
| @@ -1091,7 +1092,7 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) | |||
| 1091 | 1092 | ||
| 1092 | /* test for split data in 8-byte chunks */ | 1093 | /* test for split data in 8-byte chunks */ |
| 1093 | if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) { | 1094 | if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) { |
| 1094 | cdc_ncm_speed_change(ctx, | 1095 | cdc_ncm_speed_change(dev, |
| 1095 | (struct usb_cdc_speed_change *)urb->transfer_buffer); | 1096 | (struct usb_cdc_speed_change *)urb->transfer_buffer); |
| 1096 | return; | 1097 | return; |
| 1097 | } | 1098 | } |
| @@ -1108,8 +1109,8 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) | |||
| 1108 | ctx->connected = le16_to_cpu(event->wValue); | 1109 | ctx->connected = le16_to_cpu(event->wValue); |
| 1109 | 1110 | ||
| 1110 | printk(KERN_INFO KBUILD_MODNAME ": %s: network connection:" | 1111 | printk(KERN_INFO KBUILD_MODNAME ": %s: network connection:" |
| 1111 | " %sconnected\n", | 1112 | " %sconnected\n", |
| 1112 | ctx->netdev->name, ctx->connected ? "" : "dis"); | 1113 | dev->net->name, ctx->connected ? "" : "dis"); |
| 1113 | 1114 | ||
| 1114 | usbnet_link_change(dev, ctx->connected, 0); | 1115 | usbnet_link_change(dev, ctx->connected, 0); |
| 1115 | if (!ctx->connected) | 1116 | if (!ctx->connected) |
| @@ -1121,8 +1122,8 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) | |||
| 1121 | sizeof(struct usb_cdc_speed_change))) | 1122 | sizeof(struct usb_cdc_speed_change))) |
| 1122 | set_bit(EVENT_STS_SPLIT, &dev->flags); | 1123 | set_bit(EVENT_STS_SPLIT, &dev->flags); |
| 1123 | else | 1124 | else |
| 1124 | cdc_ncm_speed_change(ctx, | 1125 | cdc_ncm_speed_change(dev, |
| 1125 | (struct usb_cdc_speed_change *) &event[1]); | 1126 | (struct usb_cdc_speed_change *)&event[1]); |
| 1126 | break; | 1127 | break; |
| 1127 | 1128 | ||
| 1128 | default: | 1129 | default: |
