aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetko Manolov <petkan@nucleusys.com>2013-04-25 18:41:21 -0400
committerDavid S. Miller <davem@davemloft.net>2013-04-29 13:57:49 -0400
commit313a58e487ab3eb80e7e1f9baddc75968288aad9 (patch)
tree5dbb435244b98990b1d9286a59622ced4ccfea3a
parent5f5624cf156283687e11ea329c7a0523c677ea0e (diff)
drivers: net: usb: pegasus: remove skb pool
The socket buffer pool for the receive path is now gone. It's existence didn't make much difference (performance-wise) and the code is better off without the spinlocks protecting it. Signed-off-by: Petko Manolov <petkan@nucleusys.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/usb/pegasus.c73
-rw-r--r--drivers/net/usb/pegasus.h3
2 files changed, 9 insertions, 67 deletions
diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c
index 73051d10ead2..ff7b84d4c9fd 100644
--- a/drivers/net/usb/pegasus.c
+++ b/drivers/net/usb/pegasus.c
@@ -575,51 +575,6 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb)
575 return ret; 575 return ret;
576} 576}
577 577
578static void fill_skb_pool(pegasus_t *pegasus)
579{
580 int i;
581
582 for (i = 0; i < RX_SKBS; i++) {
583 if (pegasus->rx_pool[i])
584 continue;
585 pegasus->rx_pool[i] = dev_alloc_skb(PEGASUS_MTU + 2);
586 /*
587 ** we give up if the allocation fail. the tasklet will be
588 ** rescheduled again anyway...
589 */
590 if (pegasus->rx_pool[i] == NULL)
591 return;
592 skb_reserve(pegasus->rx_pool[i], 2);
593 }
594}
595
596static void free_skb_pool(pegasus_t *pegasus)
597{
598 int i;
599
600 for (i = 0; i < RX_SKBS; i++) {
601 if (pegasus->rx_pool[i]) {
602 dev_kfree_skb(pegasus->rx_pool[i]);
603 pegasus->rx_pool[i] = NULL;
604 }
605 }
606}
607
608static inline struct sk_buff *pull_skb(pegasus_t * pegasus)
609{
610 int i;
611 struct sk_buff *skb;
612
613 for (i = 0; i < RX_SKBS; i++) {
614 if (likely(pegasus->rx_pool[i] != NULL)) {
615 skb = pegasus->rx_pool[i];
616 pegasus->rx_pool[i] = NULL;
617 return skb;
618 }
619 }
620 return NULL;
621}
622
623static void read_bulk_callback(struct urb *urb) 578static void read_bulk_callback(struct urb *urb)
624{ 579{
625 pegasus_t *pegasus = urb->context; 580 pegasus_t *pegasus = urb->context;
@@ -704,9 +659,8 @@ static void read_bulk_callback(struct urb *urb)
704 if (pegasus->flags & PEGASUS_UNPLUG) 659 if (pegasus->flags & PEGASUS_UNPLUG)
705 return; 660 return;
706 661
707 spin_lock(&pegasus->rx_pool_lock); 662 pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net, PEGASUS_MTU,
708 pegasus->rx_skb = pull_skb(pegasus); 663 GFP_ATOMIC);
709 spin_unlock(&pegasus->rx_pool_lock);
710 664
711 if (pegasus->rx_skb == NULL) 665 if (pegasus->rx_skb == NULL)
712 goto tl_sched; 666 goto tl_sched;
@@ -734,24 +688,23 @@ tl_sched:
734static void rx_fixup(unsigned long data) 688static void rx_fixup(unsigned long data)
735{ 689{
736 pegasus_t *pegasus; 690 pegasus_t *pegasus;
737 unsigned long flags;
738 int status; 691 int status;
739 692
740 pegasus = (pegasus_t *) data; 693 pegasus = (pegasus_t *) data;
741 if (pegasus->flags & PEGASUS_UNPLUG) 694 if (pegasus->flags & PEGASUS_UNPLUG)
742 return; 695 return;
743 696
744 spin_lock_irqsave(&pegasus->rx_pool_lock, flags);
745 fill_skb_pool(pegasus);
746 if (pegasus->flags & PEGASUS_RX_URB_FAIL) 697 if (pegasus->flags & PEGASUS_RX_URB_FAIL)
747 if (pegasus->rx_skb) 698 if (pegasus->rx_skb)
748 goto try_again; 699 goto try_again;
749 if (pegasus->rx_skb == NULL) 700 if (pegasus->rx_skb == NULL)
750 pegasus->rx_skb = pull_skb(pegasus); 701 pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net,
702 PEGASUS_MTU,
703 GFP_ATOMIC);
751 if (pegasus->rx_skb == NULL) { 704 if (pegasus->rx_skb == NULL) {
752 netif_warn(pegasus, rx_err, pegasus->net, "low on memory\n"); 705 netif_warn(pegasus, rx_err, pegasus->net, "low on memory\n");
753 tasklet_schedule(&pegasus->rx_tl); 706 tasklet_schedule(&pegasus->rx_tl);
754 goto done; 707 return;
755 } 708 }
756 usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb, 709 usb_fill_bulk_urb(pegasus->rx_urb, pegasus->usb,
757 usb_rcvbulkpipe(pegasus->usb, 1), 710 usb_rcvbulkpipe(pegasus->usb, 1),
@@ -767,8 +720,6 @@ try_again:
767 } else { 720 } else {
768 pegasus->flags &= ~PEGASUS_RX_URB_FAIL; 721 pegasus->flags &= ~PEGASUS_RX_URB_FAIL;
769 } 722 }
770done:
771 spin_unlock_irqrestore(&pegasus->rx_pool_lock, flags);
772} 723}
773 724
774static void write_bulk_callback(struct urb *urb) 725static void write_bulk_callback(struct urb *urb)
@@ -1007,10 +958,9 @@ static int pegasus_open(struct net_device *net)
1007 int res; 958 int res;
1008 959
1009 if (pegasus->rx_skb == NULL) 960 if (pegasus->rx_skb == NULL)
1010 pegasus->rx_skb = pull_skb(pegasus); 961 pegasus->rx_skb = __netdev_alloc_skb_ip_align(pegasus->net,
1011 /* 962 PEGASUS_MTU,
1012 ** Note: no point to free the pool. it is empty :-) 963 GFP_KERNEL);
1013 */
1014 if (!pegasus->rx_skb) 964 if (!pegasus->rx_skb)
1015 return -ENOMEM; 965 return -ENOMEM;
1016 966
@@ -1044,7 +994,6 @@ static int pegasus_open(struct net_device *net)
1044 res = -EIO; 994 res = -EIO;
1045 usb_kill_urb(pegasus->rx_urb); 995 usb_kill_urb(pegasus->rx_urb);
1046 usb_kill_urb(pegasus->intr_urb); 996 usb_kill_urb(pegasus->intr_urb);
1047 free_skb_pool(pegasus);
1048 goto exit; 997 goto exit;
1049 } 998 }
1050 set_carrier(net); 999 set_carrier(net);
@@ -1364,7 +1313,6 @@ static int pegasus_probe(struct usb_interface *intf,
1364 pegasus->mii.mdio_write = mdio_write; 1313 pegasus->mii.mdio_write = mdio_write;
1365 pegasus->mii.phy_id_mask = 0x1f; 1314 pegasus->mii.phy_id_mask = 0x1f;
1366 pegasus->mii.reg_num_mask = 0x1f; 1315 pegasus->mii.reg_num_mask = 0x1f;
1367 spin_lock_init(&pegasus->rx_pool_lock);
1368 pegasus->msg_enable = netif_msg_init(msg_level, NETIF_MSG_DRV 1316 pegasus->msg_enable = netif_msg_init(msg_level, NETIF_MSG_DRV
1369 | NETIF_MSG_PROBE | NETIF_MSG_LINK); 1317 | NETIF_MSG_PROBE | NETIF_MSG_LINK);
1370 1318
@@ -1376,7 +1324,6 @@ static int pegasus_probe(struct usb_interface *intf,
1376 goto out2; 1324 goto out2;
1377 } 1325 }
1378 set_ethernet_addr(pegasus); 1326 set_ethernet_addr(pegasus);
1379 fill_skb_pool(pegasus);
1380 if (pegasus->features & PEGASUS_II) { 1327 if (pegasus->features & PEGASUS_II) {
1381 dev_info(&intf->dev, "setup Pegasus II specific registers\n"); 1328 dev_info(&intf->dev, "setup Pegasus II specific registers\n");
1382 setup_pegasus_II(pegasus); 1329 setup_pegasus_II(pegasus);
@@ -1404,7 +1351,6 @@ static int pegasus_probe(struct usb_interface *intf,
1404 1351
1405out3: 1352out3:
1406 usb_set_intfdata(intf, NULL); 1353 usb_set_intfdata(intf, NULL);
1407 free_skb_pool(pegasus);
1408out2: 1354out2:
1409 free_all_urbs(pegasus); 1355 free_all_urbs(pegasus);
1410out1: 1356out1:
@@ -1429,7 +1375,6 @@ static void pegasus_disconnect(struct usb_interface *intf)
1429 unregister_netdev(pegasus->net); 1375 unregister_netdev(pegasus->net);
1430 unlink_all_urbs(pegasus); 1376 unlink_all_urbs(pegasus);
1431 free_all_urbs(pegasus); 1377 free_all_urbs(pegasus);
1432 free_skb_pool(pegasus);
1433 if (pegasus->rx_skb != NULL) { 1378 if (pegasus->rx_skb != NULL) {
1434 dev_kfree_skb(pegasus->rx_skb); 1379 dev_kfree_skb(pegasus->rx_skb);
1435 pegasus->rx_skb = NULL; 1380 pegasus->rx_skb = NULL;
diff --git a/drivers/net/usb/pegasus.h b/drivers/net/usb/pegasus.h
index 65b78b35b73c..00d44e3ff744 100644
--- a/drivers/net/usb/pegasus.h
+++ b/drivers/net/usb/pegasus.h
@@ -13,7 +13,6 @@
13#define HAS_HOME_PNA 0x40000000 13#define HAS_HOME_PNA 0x40000000
14 14
15#define PEGASUS_MTU 1536 15#define PEGASUS_MTU 1536
16#define RX_SKBS 4
17 16
18#define EPROM_WRITE 0x01 17#define EPROM_WRITE 0x01
19#define EPROM_READ 0x02 18#define EPROM_READ 0x02
@@ -97,11 +96,9 @@ typedef struct pegasus {
97 struct tasklet_struct rx_tl; 96 struct tasklet_struct rx_tl;
98 struct delayed_work carrier_check; 97 struct delayed_work carrier_check;
99 struct urb *ctrl_urb, *rx_urb, *tx_urb, *intr_urb; 98 struct urb *ctrl_urb, *rx_urb, *tx_urb, *intr_urb;
100 struct sk_buff *rx_pool[RX_SKBS];
101 struct sk_buff *rx_skb; 99 struct sk_buff *rx_skb;
102 struct usb_ctrlrequest dr; 100 struct usb_ctrlrequest dr;
103 wait_queue_head_t ctrl_wait; 101 wait_queue_head_t ctrl_wait;
104 spinlock_t rx_pool_lock;
105 int chip; 102 int chip;
106 unsigned char intr_buff[8]; 103 unsigned char intr_buff[8];
107 __u8 tx_buff[PEGASUS_MTU]; 104 __u8 tx_buff[PEGASUS_MTU];