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 | |
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>
-rw-r--r-- | drivers/net/usb/cdc_mbim.c | 2 | ||||
-rw-r--r-- | drivers/net/usb/cdc_ncm.c | 73 | ||||
-rw-r--r-- | include/linux/usb/cdc_ncm.h | 3 |
3 files changed, 39 insertions, 39 deletions
diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c index 253472a8a983..af76aaf08b6b 100644 --- a/drivers/net/usb/cdc_mbim.c +++ b/drivers/net/usb/cdc_mbim.c | |||
@@ -175,7 +175,7 @@ static struct sk_buff *cdc_mbim_tx_fixup(struct usbnet *dev, struct sk_buff *skb | |||
175 | } | 175 | } |
176 | 176 | ||
177 | spin_lock_bh(&ctx->mtx); | 177 | spin_lock_bh(&ctx->mtx); |
178 | skb_out = cdc_ncm_fill_tx_frame(ctx, skb, sign); | 178 | skb_out = cdc_ncm_fill_tx_frame(dev, skb, sign); |
179 | spin_unlock_bh(&ctx->mtx); | 179 | spin_unlock_bh(&ctx->mtx); |
180 | return skb_out; | 180 | return skb_out; |
181 | 181 | ||
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: |
diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h index 36e1e153ca2d..5c47bd9620d5 100644 --- a/include/linux/usb/cdc_ncm.h +++ b/include/linux/usb/cdc_ncm.h | |||
@@ -98,7 +98,6 @@ struct cdc_ncm_ctx { | |||
98 | const struct usb_cdc_union_desc *union_desc; | 98 | const struct usb_cdc_union_desc *union_desc; |
99 | const struct usb_cdc_ether_desc *ether_desc; | 99 | const struct usb_cdc_ether_desc *ether_desc; |
100 | 100 | ||
101 | struct net_device *netdev; | ||
102 | struct usb_device *udev; | 101 | struct usb_device *udev; |
103 | struct usb_interface *control; | 102 | struct usb_interface *control; |
104 | struct usb_interface *data; | 103 | struct usb_interface *data; |
@@ -129,7 +128,7 @@ struct cdc_ncm_ctx { | |||
129 | extern u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf); | 128 | extern u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf); |
130 | extern int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting); | 129 | extern int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting); |
131 | extern void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf); | 130 | extern void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf); |
132 | extern struct sk_buff *cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign); | 131 | extern struct sk_buff *cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign); |
133 | extern int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in); | 132 | extern int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in); |
134 | extern int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset); | 133 | extern int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset); |
135 | 134 | ||