sky2 patches for net-2.6
Subsystems (2)
cover sky2 patches for net-2.6
Includes:
* fix for new NAPI status loop
* use internal net_stats
* fixes for fiber PHY power
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 1/6 sky2: status polling loop
Handle the corner case where budget is exhausted correctly.
drivers/net/sky2.c +20 -18
@@ -2245,15 +2245,13 @@ static inline void sky2_tx_done(struct n }/* Process status response ring */ -static int sky2_status_intr (struct sky2_hw *hw,int to_do) +static int sky2_status_intr (struct sky2_hw *hw,int to_do,u16 idx) {int work_done =0 ;unsigned rx[2 ] = {0 ,0 }; -u16 hwidx =sky2_read16 (hw,STAT_PUT_IDX );rmb (); - -while (hw->st_idx != hwidx) { + do { struct sky2_port *sky2; struct sky2_status_le *le = hw->st_le + hw->st_idx; unsigned port = le->css & CSS_LINK_BIT;
@@ -2364,7 +2362,7 @@ static int sky2_status_intr(struct sky2_ printk(KERN_WARNING PFX "unknown status opcode 0x%x\n", le->opcode); } - } + }while (hw->st_idx != idx);/* Fully processed status ring so clear irq */ sky2_write32 (hw,STAT_CTRL ,SC_STAT_CLR_IRQ );
@@ -2606,7 +2604,8 @@ static int sky2_poll(struct napi_struct { struct sky2_hw *hw = container_of(napi, struct sky2_hw, napi);u32 status =sky2_read32 (hw,B0_Y2_SP_EISR ); -int work_done; +int work_done =0 ; +u16 idx;if (unlikely (status &Y2_IS_ERROR ))sky2_err_intr (hw, status);
@@ -2617,21 +2616,24 @@ static int sky2_poll(struct napi_structif (status &Y2_IS_IRQ_PHY2 )sky2_phy_intr (hw,1 ); - work_done =sky2_status_intr (hw, work_limit); +while ((idx =sky2_read16 (hw,STAT_PUT_IDX )) != hw->st_idx) { + work_done +=sky2_status_intr (hw, work_limit - work_done, idx); -/* More work? */ -if (hw->st_idx ==sky2_read16 (hw,STAT_PUT_IDX )) { -/* Bug/Errata workaround? -* Need to kick the TX irq moderation timer. -*/ -if (sky2_read8 (hw,STAT_TX_TIMER_CTRL ) ==TIM_START ) { -sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_STOP ); -sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_START ); - } +if (work_done >= work_limit) + goto done; + } -napi_complete (napi); -sky2_read32 (hw,B0_Y2_SP_LISR ); +/* Bug/Errata workaround? +* Need to kick the TX irq moderation timer. +*/ +if (sky2_read8 (hw,STAT_TX_TIMER_CTRL ) ==TIM_START ) { +sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_STOP ); +sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_START ); } +napi_complete (napi); +sky2_read32 (hw,B0_Y2_SP_LISR ); +done: +return work_done; }
Signature · 1 line
Stephen Hemminger <[email protected]>
David Miller
maintainerRe: [PATCH 1/6] sky2: status polling loop
From: Stephen Hemminger <[email protected]>
Date: Thu, 11 Oct 2007 18:19:52 -0700
Quoted 3 lines
Handle the corner case where budget is exhausted correctly.
Signed-off-by Stephen Hemminger <[email protected]>
Doesn't apply, I checked in my fixed version of your original patch already.
You had to have some idea I would apply that fix, so this patch series seems a bit premature since it's almost guarenteed to not apply any more.
Re: [PATCH 1/6] sky2: status polling loop
Quoted 5 lines · On Thu, 11 Oct 2007 18:23:58 -0700 (PDT) David Miller <[email protected]>…
From: Stephen Hemminger <[email protected]>
Date: Thu, 11 Oct 2007 18:19:52 -0700Quoted 2 lines
Handle the corner case where budget is exhausted correctly.
Quoted 8 lines
Quoted 1 line
Signed-off-by Stephen Hemminger <[email protected]>Doesn't apply, I checked in my fixed version of your original patch already.
You had to have some idea I would apply that fix, so this patch series seems a bit premature since it's almost guarenteed to not apply any more.
I like to test my signed patches before applying... And if possible send them out from the kernel running the actual code.
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 1/6 sky2: status polling loop (post merge)
In reply to David MillerHandle the corner case where budget is exhausted correctly. And save unnecessary read of index register.
drivers/net/sky2.c +17 -24
@@ -2245,15 +2245,13 @@ static inline void sky2_tx_done(struct n }/* Process status response ring */ -static int sky2_status_intr (struct sky2_hw *hw,int to_do) +static int sky2_status_intr (struct sky2_hw *hw,int to_do,u16 idx) {int work_done =0 ;unsigned rx[2 ] = {0 ,0 }; -u16 hwidx =sky2_read16 (hw,STAT_PUT_IDX );rmb (); - -while (hw->st_idx != hwidx) { + do { struct sky2_port *sky2; struct sky2_status_le *le = hw->st_le + hw->st_idx; unsigned port = le->css & CSS_LINK_BIT;
@@ -2364,7 +2362,7 @@ static int sky2_status_intr(struct sky2_ printk(KERN_WARNING PFX "unknown status opcode 0x%x\n", le->opcode); } - } + }while (hw->st_idx != idx);/* Fully processed status ring so clear irq */ sky2_write32 (hw,STAT_CTRL ,SC_STAT_CLR_IRQ );
@@ -2607,6 +2605,7 @@ static int sky2_poll(struct napi_struct struct sky2_hw *hw = container_of(napi, struct sky2_hw, napi);u32 status =sky2_read32 (hw,B0_Y2_SP_EISR );int work_done =0 ; +u16 idx;if (unlikely (status &Y2_IS_ERROR ))sky2_err_intr (hw, status);
@@ -2617,29 +2616,23 @@ static int sky2_poll(struct napi_structif (status &Y2_IS_IRQ_PHY2 )sky2_phy_intr (hw,1 ); -for (;;) { - work_done +=sky2_status_intr (hw, work_limit); +while ((idx =sky2_read16 (hw,STAT_PUT_IDX )) != hw->st_idx) { + work_done +=sky2_status_intr (hw, work_limit - work_done, idx);if (work_done >= work_limit) -break ; - -/* More work? */ -if (hw->st_idx !=sky2_read16 (hw,STAT_PUT_IDX )) -continue ; - -/* Bug/Errata workaround? -* Need to kick the TX irq moderation timer. -*/ -if (sky2_read8 (hw,STAT_TX_TIMER_CTRL ) ==TIM_START ) { -sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_STOP ); -sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_START ); - } - -napi_complete (napi); -sky2_read32 (hw,B0_Y2_SP_LISR ); -break ; + goto done; + } +/* Bug/Errata workaround? +* Need to kick the TX irq moderation timer. +*/ +if (sky2_read8 (hw,STAT_TX_TIMER_CTRL ) ==TIM_START ) { +sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_STOP ); +sky2_write8 (hw,STAT_TX_TIMER_CTRL ,TIM_START ); } +napi_complete (napi); +sky2_read32 (hw,B0_Y2_SP_LISR ); +done:return work_done; }
Re: [PATCH 1/6] sky2: status polling loop (post merge)
From: Stephen Hemminger <[email protected]>
Date: Thu, 11 Oct 2007 18:29:21 -0700
Quoted 4 lines
Handle the corner case where budget is exhausted correctly. And save unnecessary read of index register.
Signed-off-by Stephen Hemminger <[email protected]>
Applied.
You can submit the rest later, I deleted them since they likely depend upon line offsets and other things in this patch.
Re: [PATCH 1/6] sky2: status polling loop (post merge)
Quoted 6 lines · On Thu, 11 Oct 2007 18:31:46 -0700 (PDT) David Miller <[email protected]>…
From: Stephen Hemminger <[email protected]>
Date: Thu, 11 Oct 2007 18:29:21 -0700Quoted 3 lines
Handle the corner case where budget is exhausted correctly. And save unnecessary read of index register.
Quoted 7 lines
Quoted 1 line
Signed-off-by Stephen Hemminger <[email protected]>Applied.
You can submit the rest later, I deleted them since they likely depend upon line offsets and other things in this patch.
Actually, they are exactly the same...
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 2/6 sky2: ethtool register reserved area blackout
In reply to Stephen HemmingerMake sure and not dump reserved areas of device space. Touching some of these causes machine check exceptions on boards like D-Link DGE-550SX.
Coding note, used a complex switch statement rather than bitmap because it is easier to relate the block values to the documentation rather than looking at a encoded bitmask.
drivers/net/sky2.c +53 -9
@@ -3569,20 +3569,64 @@ static void sky2_get_regs(struct net_dev {const struct sky2_port *sky2 =netdev_priv (dev);const void __iomem *io = sky2->hw->regs; +unsigned int b; regs->version =1 ; -memset (p,0 , regs->len); -memcpy_fromio (p, io,B3_RAM_ADDR ); - -/* skip diagnostic ram region */ -memcpy_fromio (p +B3_RI_WTO_R1 , io +B3_RI_WTO_R1 ,0x2000 -B3_RI_WTO_R1 ); +for (b =0 ; b <128 ; b++) { +/* This complicated switch statement is to make sure and +* only access regions that are unreserved. +* Some blocks are only valid on dual port cards. +* and block 3 has some special diagnostic registers that +* are poison. +*/ +switch (b) { +case 3 : +/* skip diagnostic ram region */ +memcpy_fromio (p +0x10 , io +0x10 ,128 -0x10 ); +break ; -/* copy GMAC registers */ -memcpy_fromio (p +BASE_GMAC_1 , io +BASE_GMAC_1 ,0x1000 ); -if (sky2->hw->ports >1 ) -memcpy_fromio (p +BASE_GMAC_2 , io +BASE_GMAC_2 ,0x1000 ); +/* dual port cards only */ +case 5 :/* Tx Arbiter 2 */ +case 9 :/* RX2 */ + case 14 ... 15: /* TX2 */ +case 17 :case 19 :/* Ram Buffer 2 */ + case 22 ... 23: /* Tx Ram Buffer 2 */ +case 25 :/* Rx MAC Fifo 1 */ +case 27 :/* Tx MAC Fifo 2 */ +case 31 :/* GPHY 2 */ + case 40 ... 47: /* Pattern Ram 2 */ +case 52 :case 54 :/* TCP Segmentation 2 */ + case 112 ... 116: /* GMAC 2 */ +if (sky2->hw->ports ==1 ) + goto reserved; +/* fall through */ +case 0 :/* Control */ +case 2 :/* Mac address */ +case 4 :/* Tx Arbiter 1 */ +case 7 :/* PCI express reg */ +case 8 :/* RX1 */ + case 12 ... 13: /* TX1 */ +case 16 :case 18 :/* Rx Ram Buffer 1 */ + case 20 ... 21: /* Tx Ram Buffer 1 */ +case 24 :/* Rx MAC Fifo 1 */ +case 26 :/* Tx MAC Fifo 1 */ + case 28 ... 29: /* Descriptor and status unit */ +case 30 :/* GPHY 1*/ + case 32 ... 39: /* Pattern Ram 1 */ +case 48 :case 50 :/* TCP Segmentation 1 */ + case 56 ... 60: /* PCI space */ + case 80 ... 84: /* GMAC 1 */ +memcpy_fromio (p, io,128 ); +break ; +default : +reserved: +memset (p,0 ,128 ); + } + p +=128 ; + io +=128 ; + } }/* In order to do Jumbo packets on these chips, need to turn off the
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 3/6 sky2: fix power settings on Yukon XL
In reply to Stephen HemmingerMake sure PCI register for PHY power gets set correctly.
drivers/net/sky2.c +6 -7
@@ -606,20 +606,19 @@ static void sky2_phy_power(struct sky2_h {struct pci_dev *pdev = hw->pdev;u32 reg1; -static const u32 phy_power[] - = {PCI_Y2_PHY1_POWD ,PCI_Y2_PHY2_POWD }; - -/* looks like this XL is back asswards .. */ -if (hw->chip_id ==CHIP_ID_YUKON_XL && hw->chip_rev >1 ) - onoff = !onoff; +static const u32 phy_power[] = {PCI_Y2_PHY1_POWD ,PCI_Y2_PHY2_POWD }; +static const u32 coma_mode[] = {PCI_Y2_PHY1_COMA ,PCI_Y2_PHY2_COMA };pci_read_config_dword (pdev,PCI_DEV_REG1 , ®1); +/* Turn on/off phy power saving */ if (onoff) -/* Turn off phy power saving */ reg1 &= ~phy_power[port];else reg1 |= phy_power[port]; +if (onoff && hw->chip_id ==CHIP_ID_YUKON_XL && hw->chip_rev >1 ) + reg1 |= coma_mode[port]; +pci_write_config_dword (pdev,PCI_DEV_REG1 , reg1);pci_read_config_dword (pdev,PCI_DEV_REG1 , ®1);
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 4/6 sky2: fiber advertise bits initialization (trivial)
In reply to Stephen HemmingerPut initialization in sequential order (same as other constants).
drivers/net/sky2.c +2 -2
@@ -296,10 +296,10 @@ static const u16 copper_fc_adv[] = {/* flow control to advertise bits when using 1000BaseX */ static const u16 fiber_fc_adv[] = { - [FC_BOTH ] =PHY_M_P_BOTH_MD_X , + [FC_NONE ] =PHY_M_P_NO_PAUSE_X , [FC_TX ] =PHY_M_P_ASYM_MD_X , [FC_RX ] =PHY_M_P_SYM_MD_X , - [FC_NONE ] =PHY_M_P_NO_PAUSE_X , + [FC_BOTH ] =PHY_M_P_BOTH_MD_X , };/* flow control to GMA disable bits */
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 5/6 sky2: use netdevice stats struct
In reply to Stephen HemmingerUse builtin statistics structure from net device.
drivers/net/sky2.c +13 -20
@@ -1635,8 +1635,8 @@ static void sky2_tx_complete(struct sky2printk (KERN_DEBUG "%s: tx done %u\n" , dev->name, idx); - sky2->net_stats.tx_packets++; - sky2->net_stats.tx_bytes += re->skb->len; + dev->stats.tx_packets++; + dev->stats.tx_bytes += re->skb->len;dev_kfree_skb_any (re->skb); sky2->tx_next =RING_NEXT (idx,TX_RING_SIZE );
@@ -2204,16 +2204,16 @@ resubmit: len_error:/* Truncation of overlength packets causes PHY length to not match MAC length */ - ++sky2->net_stats.rx_length_errors; + ++dev->stats.rx_length_errors;if (netif_msg_rx_err (sky2) &&net_ratelimit ())pr_info (PFX "%s: rx length error: status %#x length %d\n" , dev->name, status, length); goto resubmit; error: - ++sky2->net_stats.rx_errors; + ++dev->stats.rx_errors;if (status &GMR_FS_RX_FF_OV ) { - sky2->net_stats.rx_over_errors++; + dev->stats.rx_over_errors++; goto resubmit; }
@@ -2222,11 +2222,11 @@ error: dev->name, status, length);if (status & (GMR_FS_LONG_ERR |GMR_FS_UN_SIZE )) - sky2->net_stats.rx_length_errors++; + dev->stats.rx_length_errors++;if (status &GMR_FS_FRAGMENT ) - sky2->net_stats.rx_frame_errors++; + dev->stats.rx_frame_errors++;if (status &GMR_FS_CRC_ERR ) - sky2->net_stats.rx_crc_errors++; + dev->stats.rx_crc_errors++; goto resubmit; }
@@ -2271,7 +2271,7 @@ static int sky2_status_intr(struct sky2_ ++rx[port]; skb =sky2_receive (dev, length, status);if (unlikely (!skb)) { - sky2->net_stats.rx_dropped++; + dev->stats.rx_dropped++;break ; }
@@ -2286,8 +2286,8 @@ static int sky2_status_intr(struct sky2_ } skb->protocol =eth_type_trans (skb, dev); - sky2->net_stats.rx_packets++; - sky2->net_stats.rx_bytes += skb->len; + dev->stats.rx_packets++; + dev->stats.rx_bytes += skb->len; dev->last_rx = jiffies;#ifdef SKY2_VLAN_TAG_USED
@@ -2478,12 +2478,12 @@ static void sky2_mac_intr(struct sky2_hwgma_read16 (hw, port,GM_TX_IRQ_SRC );if (status &GM_IS_RX_FF_OR ) { - ++sky2->net_stats.rx_fifo_errors; + ++dev->stats.rx_fifo_errors;sky2_write8 (hw,SK_REG (port,RX_GMF_CTRL_T ),GMF_CLI_RX_FO ); }if (status &GM_IS_TX_FF_UR ) { - ++sky2->net_stats.tx_fifo_errors; + ++dev->stats.tx_fifo_errors;sky2_write8 (hw,SK_REG (port,TX_GMF_CTRL_T ),GMF_CLI_TX_FU ); } }
@@ -3222,12 +3222,6 @@ static void sky2_get_strings(struct net_ } } -static struct net_device_stats *sky2_get_stats (struct net_device *dev) -{ -struct sky2_port *sky2 =netdev_priv (dev); -return &sky2->net_stats; -} -static int sky2_set_mac_address (struct net_device *dev,void *p) {struct sky2_port *sky2 =netdev_priv (dev);
@@ -3977,7 +3971,6 @@ static __devinit struct net_device *sky2 dev->stop = sky2_down; dev->do_ioctl = sky2_ioctl; dev->hard_start_xmit = sky2_xmit_frame; - dev->get_stats = sky2_get_stats; dev->set_multicast_list = sky2_set_multicast; dev->set_mac_address = sky2_set_mac_address; dev->change_mtu = sky2_change_mtu;
drivers/net/sky2.h +0 -2
@@ -2031,8 +2031,6 @@ struct sky2_port {#ifdef CONFIG_SKY2_DEBUG struct dentry *debugfs;#endif -struct net_device_stats net_stats; - };struct sky2_hw {
Signature · 1 line
Stephen Hemminger <[email protected]>
PATCH 6/6 sky2: version 1.19
In reply to Stephen HemmingerUpdate version to keep track of new changes.
drivers/net/sky2.c +1 -1
@@ -52,7 +52,7 @@#include "sky2.h" #define DRV_NAME "sky2" -#define DRV_VERSION "1.18" +#define DRV_VERSION "1.19"#define PFX DRV_NAME " "/*
Signature · 1 line
Stephen Hemminger <[email protected]>