@@ -40,8 +40,6 @@ static int atl1c_stop_mac(struct atl1c_hw *hw);
4040static void atl1c_disable_l0s_l1 (struct atl1c_hw * hw );
4141static void atl1c_set_aspm (struct atl1c_hw * hw , u16 link_speed );
4242static void atl1c_start_mac (struct atl1c_adapter * adapter );
43- static void atl1c_clean_rx_irq (struct atl1c_adapter * adapter ,
44- int * work_done , int work_to_do );
4543static int atl1c_up (struct atl1c_adapter * adapter );
4644static void atl1c_down (struct atl1c_adapter * adapter );
4745static int atl1c_reset_mac (struct atl1c_hw * hw );
@@ -770,7 +768,7 @@ static int atl1c_sw_init(struct atl1c_adapter *adapter)
770768 adapter -> link_speed = SPEED_0 ;
771769 adapter -> link_duplex = FULL_DUPLEX ;
772770 adapter -> tpd_ring [0 ].count = 1024 ;
773- adapter -> rfd_ring .count = 512 ;
771+ adapter -> rfd_ring [ 0 ] .count = 512 ;
774772
775773 hw -> vendor_id = pdev -> vendor ;
776774 hw -> device_id = pdev -> device ;
@@ -878,8 +876,8 @@ static void atl1c_clean_tx_ring(struct atl1c_adapter *adapter,
878876 */
879877static void atl1c_clean_rx_ring (struct atl1c_adapter * adapter )
880878{
881- struct atl1c_rfd_ring * rfd_ring = & adapter -> rfd_ring ;
882- struct atl1c_rrd_ring * rrd_ring = & adapter -> rrd_ring ;
879+ struct atl1c_rfd_ring * rfd_ring = adapter -> rfd_ring ;
880+ struct atl1c_rrd_ring * rrd_ring = adapter -> rrd_ring ;
883881 struct atl1c_buffer * buffer_info ;
884882 struct pci_dev * pdev = adapter -> pdev ;
885883 int j ;
@@ -902,8 +900,8 @@ static void atl1c_clean_rx_ring(struct atl1c_adapter *adapter)
902900static void atl1c_init_ring_ptrs (struct atl1c_adapter * adapter )
903901{
904902 struct atl1c_tpd_ring * tpd_ring = adapter -> tpd_ring ;
905- struct atl1c_rfd_ring * rfd_ring = & adapter -> rfd_ring ;
906- struct atl1c_rrd_ring * rrd_ring = & adapter -> rrd_ring ;
903+ struct atl1c_rfd_ring * rfd_ring = adapter -> rfd_ring ;
904+ struct atl1c_rrd_ring * rrd_ring = adapter -> rrd_ring ;
907905 struct atl1c_buffer * buffer_info ;
908906 int i , j ;
909907
@@ -945,9 +943,9 @@ static void atl1c_free_ring_resources(struct atl1c_adapter *adapter)
945943 kfree (adapter -> tpd_ring [0 ].buffer_info );
946944 adapter -> tpd_ring [0 ].buffer_info = NULL ;
947945 }
948- if (adapter -> rx_page ) {
949- put_page (adapter -> rx_page );
950- adapter -> rx_page = NULL ;
946+ if (adapter -> rrd_ring [ 0 ]. rx_page ) {
947+ put_page (adapter -> rrd_ring [ 0 ]. rx_page );
948+ adapter -> rrd_ring [ 0 ]. rx_page = NULL ;
951949 }
952950}
953951
@@ -961,8 +959,8 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
961959{
962960 struct pci_dev * pdev = adapter -> pdev ;
963961 struct atl1c_tpd_ring * tpd_ring = adapter -> tpd_ring ;
964- struct atl1c_rfd_ring * rfd_ring = & adapter -> rfd_ring ;
965- struct atl1c_rrd_ring * rrd_ring = & adapter -> rrd_ring ;
962+ struct atl1c_rfd_ring * rfd_ring = adapter -> rfd_ring ;
963+ struct atl1c_rrd_ring * rrd_ring = adapter -> rrd_ring ;
966964 struct atl1c_ring_header * ring_header = & adapter -> ring_header ;
967965 int size ;
968966 int i ;
@@ -1030,6 +1028,8 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
10301028 offset += roundup (rfd_ring -> size , 8 );
10311029
10321030 /* init RRD ring */
1031+ rrd_ring -> adapter = adapter ;
1032+ rrd_ring -> num = 0 ;
10331033 rrd_ring -> dma = ring_header -> dma + offset ;
10341034 rrd_ring -> desc = (u8 * ) ring_header -> desc + offset ;
10351035 rrd_ring -> size = sizeof (struct atl1c_recv_ret_status ) *
@@ -1046,10 +1046,9 @@ static int atl1c_setup_ring_resources(struct atl1c_adapter *adapter)
10461046static void atl1c_configure_des_ring (struct atl1c_adapter * adapter )
10471047{
10481048 struct atl1c_hw * hw = & adapter -> hw ;
1049- struct atl1c_rfd_ring * rfd_ring = & adapter -> rfd_ring ;
1050- struct atl1c_rrd_ring * rrd_ring = & adapter -> rrd_ring ;
1051- struct atl1c_tpd_ring * tpd_ring = (struct atl1c_tpd_ring * )
1052- adapter -> tpd_ring ;
1049+ struct atl1c_rfd_ring * rfd_ring = adapter -> rfd_ring ;
1050+ struct atl1c_rrd_ring * rrd_ring = adapter -> rrd_ring ;
1051+ struct atl1c_tpd_ring * tpd_ring = adapter -> tpd_ring ;
10531052
10541053 /* TPD */
10551054 AT_WRITE_REG (hw , REG_TX_BASE_ADDR_HI ,
@@ -1608,12 +1607,12 @@ static irqreturn_t atl1c_intr(int irq, void *data)
16081607 /* Ack ISR */
16091608 AT_WRITE_REG (hw , REG_ISR , status | ISR_DIS_INT );
16101609 if (status & ISR_RX_PKT ) {
1611- if (likely ( napi_schedule_prep (& adapter -> napi ) )) {
1610+ if (napi_schedule_prep (& adapter -> rrd_ring [ 0 ]. napi )) {
16121611 spin_lock (& hw -> intr_mask_lock );
16131612 hw -> intr_mask &= ~ISR_RX_PKT ;
16141613 AT_WRITE_REG (hw , REG_IMR , hw -> intr_mask );
16151614 spin_unlock (& hw -> intr_mask_lock );
1616- __napi_schedule (& adapter -> napi );
1615+ __napi_schedule (& adapter -> rrd_ring [ 0 ]. napi );
16171616 }
16181617 }
16191618 if (status & ISR_TX_PKT ) {
@@ -1677,33 +1676,35 @@ static inline void atl1c_rx_checksum(struct atl1c_adapter *adapter,
16771676static struct sk_buff * atl1c_alloc_skb (struct atl1c_adapter * adapter ,
16781677 bool napi_mode )
16791678{
1679+ struct atl1c_rrd_ring * rrd_ring = & adapter -> rrd_ring [0 ];
16801680 struct sk_buff * skb ;
16811681 struct page * page ;
16821682
16831683 if (adapter -> rx_frag_size > PAGE_SIZE ) {
16841684 if (likely (napi_mode ))
1685- return napi_alloc_skb (& adapter -> napi ,
1685+ return napi_alloc_skb (& rrd_ring -> napi ,
16861686 adapter -> rx_buffer_len );
16871687 else
16881688 return netdev_alloc_skb_ip_align (adapter -> netdev ,
16891689 adapter -> rx_buffer_len );
16901690 }
16911691
1692- page = adapter -> rx_page ;
1692+ page = rrd_ring -> rx_page ;
16931693 if (!page ) {
1694- adapter -> rx_page = page = alloc_page (GFP_ATOMIC );
1694+ page = alloc_page (GFP_ATOMIC );
16951695 if (unlikely (!page ))
16961696 return NULL ;
1697- adapter -> rx_page_offset = 0 ;
1697+ rrd_ring -> rx_page = page ;
1698+ rrd_ring -> rx_page_offset = 0 ;
16981699 }
16991700
1700- skb = build_skb (page_address (page ) + adapter -> rx_page_offset ,
1701+ skb = build_skb (page_address (page ) + rrd_ring -> rx_page_offset ,
17011702 adapter -> rx_frag_size );
17021703 if (likely (skb )) {
17031704 skb_reserve (skb , NET_SKB_PAD + NET_IP_ALIGN );
1704- adapter -> rx_page_offset += adapter -> rx_frag_size ;
1705- if (adapter -> rx_page_offset >= PAGE_SIZE )
1706- adapter -> rx_page = NULL ;
1705+ rrd_ring -> rx_page_offset += adapter -> rx_frag_size ;
1706+ if (rrd_ring -> rx_page_offset >= PAGE_SIZE )
1707+ rrd_ring -> rx_page = NULL ;
17071708 else
17081709 get_page (page );
17091710 }
@@ -1712,7 +1713,7 @@ static struct sk_buff *atl1c_alloc_skb(struct atl1c_adapter *adapter,
17121713
17131714static int atl1c_alloc_rx_buffer (struct atl1c_adapter * adapter , bool napi_mode )
17141715{
1715- struct atl1c_rfd_ring * rfd_ring = & adapter -> rfd_ring ;
1716+ struct atl1c_rfd_ring * rfd_ring = adapter -> rfd_ring ;
17161717 struct pci_dev * pdev = adapter -> pdev ;
17171718 struct atl1c_buffer * buffer_info , * next_info ;
17181719 struct sk_buff * skb ;
@@ -1812,22 +1813,34 @@ static void atl1c_clean_rfd(struct atl1c_rfd_ring *rfd_ring,
18121813 rfd_ring -> next_to_clean = rfd_index ;
18131814}
18141815
1815- static void atl1c_clean_rx_irq (struct atl1c_adapter * adapter ,
1816- int * work_done , int work_to_do )
1816+ /**
1817+ * atl1c_clean_rx - NAPI Rx polling callback
1818+ * @napi: napi info
1819+ * @budget: limit of packets to clean
1820+ */
1821+ static int atl1c_clean_rx (struct napi_struct * napi , int budget )
18171822{
1823+ struct atl1c_rrd_ring * rrd_ring =
1824+ container_of (napi , struct atl1c_rrd_ring , napi );
1825+ struct atl1c_adapter * adapter = rrd_ring -> adapter ;
18181826 u16 rfd_num , rfd_index ;
18191827 u16 count = 0 ;
18201828 u16 length ;
18211829 struct pci_dev * pdev = adapter -> pdev ;
18221830 struct net_device * netdev = adapter -> netdev ;
1823- struct atl1c_rfd_ring * rfd_ring = & adapter -> rfd_ring ;
1824- struct atl1c_rrd_ring * rrd_ring = & adapter -> rrd_ring ;
1831+ struct atl1c_rfd_ring * rfd_ring = & adapter -> rfd_ring [rrd_ring -> num ];
18251832 struct sk_buff * skb ;
18261833 struct atl1c_recv_ret_status * rrs ;
18271834 struct atl1c_buffer * buffer_info ;
1835+ int work_done = 0 ;
1836+ unsigned long flags ;
1837+
1838+ /* Keep link state information with original netdev */
1839+ if (!netif_carrier_ok (adapter -> netdev ))
1840+ goto quit_polling ;
18281841
18291842 while (1 ) {
1830- if (* work_done >= work_to_do )
1843+ if (work_done >= budget )
18311844 break ;
18321845 rrs = ATL1C_RRD_DESC (rrd_ring , rrd_ring -> next_to_clean );
18331846 if (likely (RRS_RXD_IS_VALID (rrs -> word3 ))) {
@@ -1881,32 +1894,13 @@ static void atl1c_clean_rx_irq(struct atl1c_adapter *adapter,
18811894 vlan = le16_to_cpu (vlan );
18821895 __vlan_hwaccel_put_tag (skb , htons (ETH_P_8021Q ), vlan );
18831896 }
1884- napi_gro_receive (& adapter -> napi , skb );
1897+ napi_gro_receive (napi , skb );
18851898
1886- ( * work_done ) ++ ;
1899+ work_done ++ ;
18871900 count ++ ;
18881901 }
18891902 if (count )
18901903 atl1c_alloc_rx_buffer (adapter , true);
1891- }
1892-
1893- /**
1894- * atl1c_clean - NAPI Rx polling callback
1895- * @napi: napi info
1896- * @budget: limit of packets to clean
1897- */
1898- static int atl1c_clean (struct napi_struct * napi , int budget )
1899- {
1900- struct atl1c_adapter * adapter =
1901- container_of (napi , struct atl1c_adapter , napi );
1902- int work_done = 0 ;
1903- unsigned long flags ;
1904-
1905- /* Keep link state information with original netdev */
1906- if (!netif_carrier_ok (adapter -> netdev ))
1907- goto quit_polling ;
1908- /* just enable one RXQ */
1909- atl1c_clean_rx_irq (adapter , & work_done , budget );
19101904
19111905 if (work_done < budget ) {
19121906quit_polling :
@@ -2355,7 +2349,7 @@ static int atl1c_up(struct atl1c_adapter *adapter)
23552349
23562350 atl1c_check_link_status (adapter );
23572351 clear_bit (__AT_DOWN , & adapter -> flags );
2358- napi_enable (& adapter -> napi );
2352+ napi_enable (& adapter -> rrd_ring [ 0 ]. napi );
23592353 napi_enable (& adapter -> tpd_ring [0 ].napi );
23602354 atl1c_irq_enable (adapter );
23612355 netif_start_queue (netdev );
@@ -2376,7 +2370,7 @@ static void atl1c_down(struct atl1c_adapter *adapter)
23762370 * reschedule our watchdog timer */
23772371 set_bit (__AT_DOWN , & adapter -> flags );
23782372 netif_carrier_off (netdev );
2379- napi_disable (& adapter -> napi );
2373+ napi_disable (& adapter -> rrd_ring [ 0 ]. napi );
23802374 napi_disable (& adapter -> tpd_ring [0 ].napi );
23812375 atl1c_irq_disable (adapter );
23822376 atl1c_free_irq (adapter );
@@ -2633,7 +2627,7 @@ static int atl1c_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
26332627 adapter -> mii .phy_id_mask = 0x1f ;
26342628 adapter -> mii .reg_num_mask = MDIO_CTRL_REG_MASK ;
26352629 dev_set_threaded (netdev , true);
2636- netif_napi_add (netdev , & adapter -> napi , atl1c_clean , 64 );
2630+ netif_napi_add (netdev , & adapter -> rrd_ring [ 0 ]. napi , atl1c_clean_rx , 64 );
26372631 netif_napi_add (netdev , & adapter -> tpd_ring [0 ].napi , atl1c_clean_tx , 64 );
26382632 timer_setup (& adapter -> phy_config_timer , atl1c_phy_config , 0 );
26392633 /* setup the private structure */
0 commit comments