diff options
author | Stephen Hemminger <shemminger@osdl.org> | 2005-09-14 19:06:14 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-09-16 02:48:03 -0400 |
commit | 793b883ed12a6ae6e2901ddb5e038b77d6f0c0ac (patch) | |
tree | d485606a0a7f2b70c9ee0d118fbdedf589f89a2c /drivers/net/sky2.h | |
parent | d7f6884ae0ae6e406ec3500fcde16e8f51642460 (diff) |
[PATCH] sky2: driver update.
Here is revised patch against netdev sky2 branch.
It includes whitespace fixes, all the changes from the previous
review as well as some optimizations and timing fixes to
solve some of the hangs.
The stall problem is better but not perfect. It appears that
under stress the chip can't keep up with the bus
and sends a pause frame, then hangs. This version is for
testing, and hopefully other eyes might see the root
cause of the problem.
I don't want to reinvent the ugly watchdog code in the syskonnect
version of sk98lin. If you read it you will see, the original
driver writer and the hardware developer obviously didn't
understand each other.
Dual port support is included, but not tested yet. It did
require small change to NAPI since both ports share same
IRQ.
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/net/sky2.h')
-rw-r--r-- | drivers/net/sky2.h | 112 |
1 files changed, 54 insertions, 58 deletions
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index d2a0ac2c53e7..9256303acf76 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
@@ -209,13 +209,9 @@ enum csr_regs { | |||
209 | Y2_CFG_SPC = 0x1c00, | 209 | Y2_CFG_SPC = 0x1c00, |
210 | }; | 210 | }; |
211 | 211 | ||
212 | /* Access pci config through board I/O */ | ||
213 | #define PCI_C(x) (Y2_CFG_SPC + (x)) | ||
214 | |||
215 | |||
216 | /* B0_CTST 16 bit Control/Status register */ | 212 | /* B0_CTST 16 bit Control/Status register */ |
217 | enum { | 213 | enum { |
218 | Y2_VMAIN_AVAIL = 1<<17, /* VMAIN available (YUKON-2 only) */ | 214 | Y2_VMAIN_AVAIL = 1<<17,/* VMAIN available (YUKON-2 only) */ |
219 | Y2_VAUX_AVAIL = 1<<16,/* VAUX available (YUKON-2 only) */ | 215 | Y2_VAUX_AVAIL = 1<<16,/* VAUX available (YUKON-2 only) */ |
220 | Y2_ASF_ENABLE = 1<<13,/* ASF Unit Enable (YUKON-2 only) */ | 216 | Y2_ASF_ENABLE = 1<<13,/* ASF Unit Enable (YUKON-2 only) */ |
221 | Y2_ASF_DISABLE = 1<<12,/* ASF Unit Disable (YUKON-2 only) */ | 217 | Y2_ASF_DISABLE = 1<<12,/* ASF Unit Disable (YUKON-2 only) */ |
@@ -234,13 +230,17 @@ enum { | |||
234 | CS_MRST_SET = 1<<2, /* Set Master reset */ | 230 | CS_MRST_SET = 1<<2, /* Set Master reset */ |
235 | CS_RST_CLR = 1<<1, /* Clear Software reset */ | 231 | CS_RST_CLR = 1<<1, /* Clear Software reset */ |
236 | CS_RST_SET = 1, /* Set Software reset */ | 232 | CS_RST_SET = 1, /* Set Software reset */ |
233 | }; | ||
237 | 234 | ||
238 | /* B0_LED 8 Bit LED register */ | 235 | /* B0_LED 8 Bit LED register */ |
236 | enum { | ||
239 | /* Bit 7.. 2: reserved */ | 237 | /* Bit 7.. 2: reserved */ |
240 | LED_STAT_ON = 1<<1, /* Status LED on */ | 238 | LED_STAT_ON = 1<<1, /* Status LED on */ |
241 | LED_STAT_OFF = 1, /* Status LED off */ | 239 | LED_STAT_OFF = 1, /* Status LED off */ |
240 | }; | ||
242 | 241 | ||
243 | /* B0_POWER_CTRL 8 Bit Power Control reg (YUKON only) */ | 242 | /* B0_POWER_CTRL 8 Bit Power Control reg (YUKON only) */ |
243 | enum { | ||
244 | PC_VAUX_ENA = 1<<7, /* Switch VAUX Enable */ | 244 | PC_VAUX_ENA = 1<<7, /* Switch VAUX Enable */ |
245 | PC_VAUX_DIS = 1<<6, /* Switch VAUX Disable */ | 245 | PC_VAUX_DIS = 1<<6, /* Switch VAUX Disable */ |
246 | PC_VCC_ENA = 1<<5, /* Switch VCC Enable */ | 246 | PC_VCC_ENA = 1<<5, /* Switch VCC Enable */ |
@@ -336,7 +336,7 @@ enum { | |||
336 | Y2_HWE_L2_MASK = Y2_IS_PAR_RD2 | Y2_IS_PAR_WR2 | Y2_IS_PAR_MAC2 | | 336 | Y2_HWE_L2_MASK = Y2_IS_PAR_RD2 | Y2_IS_PAR_WR2 | Y2_IS_PAR_MAC2 | |
337 | Y2_IS_PAR_RX2 | Y2_IS_TCP_TXS2| Y2_IS_TCP_TXA2, | 337 | Y2_IS_PAR_RX2 | Y2_IS_TCP_TXS2| Y2_IS_TCP_TXA2, |
338 | 338 | ||
339 | Y2_HWE_ALL_MASK = Y2_IS_SENSOR | Y2_IS_MST_ERR | Y2_IS_IRQ_STAT | | 339 | Y2_HWE_ALL_MASK = Y2_IS_TIST_OV | Y2_IS_MST_ERR | Y2_IS_IRQ_STAT | |
340 | Y2_IS_PCI_EXP | Y2_IS_PCI_NEXP | | 340 | Y2_IS_PCI_EXP | Y2_IS_PCI_NEXP | |
341 | Y2_HWE_L1_MASK | Y2_HWE_L2_MASK, | 341 | Y2_HWE_L1_MASK | Y2_HWE_L2_MASK, |
342 | }; | 342 | }; |
@@ -793,11 +793,6 @@ enum { | |||
793 | STAT_ISR_TIMER_CNT = 0x0ed4,/* 32 bit ISR Timer Counter Reg */ | 793 | STAT_ISR_TIMER_CNT = 0x0ed4,/* 32 bit ISR Timer Counter Reg */ |
794 | STAT_ISR_TIMER_CTRL= 0x0ed8,/* 8 bit ISR Timer Control Reg */ | 794 | STAT_ISR_TIMER_CTRL= 0x0ed8,/* 8 bit ISR Timer Control Reg */ |
795 | STAT_ISR_TIMER_TEST= 0x0ed9,/* 8 bit ISR Timer Test Reg */ | 795 | STAT_ISR_TIMER_TEST= 0x0ed9,/* 8 bit ISR Timer Test Reg */ |
796 | |||
797 | ST_LAST_IDX_MASK = 0x007f,/* Last Index Mask */ | ||
798 | ST_TXRP_IDX_MASK = 0x0fff,/* Tx Report Index Mask */ | ||
799 | ST_TXTH_IDX_MASK = 0x0fff,/* Tx Threshold Index Mask */ | ||
800 | ST_WM_IDX_MASK = 0x3f,/* FIFO Watermark Index Mask */ | ||
801 | }; | 796 | }; |
802 | 797 | ||
803 | enum { | 798 | enum { |
@@ -836,6 +831,7 @@ enum { | |||
836 | 831 | ||
837 | /* WOL Pattern Counter Registers (YUKON only) */ | 832 | /* WOL Pattern Counter Registers (YUKON only) */ |
838 | 833 | ||
834 | |||
839 | WOL_PATT_CNT_0 = 0x0f38,/* 32 bit WOL Pattern Counter 3..0 */ | 835 | WOL_PATT_CNT_0 = 0x0f38,/* 32 bit WOL Pattern Counter 3..0 */ |
840 | WOL_PATT_CNT_4 = 0x0f3c,/* 24 bit WOL Pattern Counter 6..4 */ | 836 | WOL_PATT_CNT_4 = 0x0f3c,/* 24 bit WOL Pattern Counter 6..4 */ |
841 | }; | 837 | }; |
@@ -1536,34 +1532,34 @@ enum { | |||
1536 | /* Receive Frame Status Encoding */ | 1532 | /* Receive Frame Status Encoding */ |
1537 | enum { | 1533 | enum { |
1538 | GMR_FS_LEN = 0xffff<<16, /* Bit 31..16: Rx Frame Length */ | 1534 | GMR_FS_LEN = 0xffff<<16, /* Bit 31..16: Rx Frame Length */ |
1539 | GMR_FS_VLAN = 1<<13, /* Bit 13: VLAN Packet */ | 1535 | GMR_FS_VLAN = 1<<13, /* VLAN Packet */ |
1540 | GMR_FS_JABBER = 1<<12, /* Bit 12: Jabber Packet */ | 1536 | GMR_FS_JABBER = 1<<12, /* Jabber Packet */ |
1541 | GMR_FS_UN_SIZE = 1<<11, /* Bit 11: Undersize Packet */ | 1537 | GMR_FS_UN_SIZE = 1<<11, /* Undersize Packet */ |
1542 | GMR_FS_MC = 1<<10, /* Bit 10: Multicast Packet */ | 1538 | GMR_FS_MC = 1<<10, /* Multicast Packet */ |
1543 | GMR_FS_BC = 1<<9, /* Bit 9: Broadcast Packet */ | 1539 | GMR_FS_BC = 1<<9, /* Broadcast Packet */ |
1544 | GMR_FS_RX_OK = 1<<8, /* Bit 8: Receive OK (Good Packet) */ | 1540 | GMR_FS_RX_OK = 1<<8, /* Receive OK (Good Packet) */ |
1545 | GMR_FS_GOOD_FC = 1<<7, /* Bit 7: Good Flow-Control Packet */ | 1541 | GMR_FS_GOOD_FC = 1<<7, /* Good Flow-Control Packet */ |
1546 | GMR_FS_BAD_FC = 1<<6, /* Bit 6: Bad Flow-Control Packet */ | 1542 | GMR_FS_BAD_FC = 1<<6, /* Bad Flow-Control Packet */ |
1547 | GMR_FS_MII_ERR = 1<<5, /* Bit 5: MII Error */ | 1543 | GMR_FS_MII_ERR = 1<<5, /* MII Error */ |
1548 | GMR_FS_LONG_ERR = 1<<4, /* Bit 4: Too Long Packet */ | 1544 | GMR_FS_LONG_ERR = 1<<4, /* Too Long Packet */ |
1549 | GMR_FS_FRAGMENT = 1<<3, /* Bit 3: Fragment */ | 1545 | GMR_FS_FRAGMENT = 1<<3, /* Fragment */ |
1550 | 1546 | ||
1551 | GMR_FS_CRC_ERR = 1<<1, /* Bit 1: CRC Error */ | 1547 | GMR_FS_CRC_ERR = 1<<1, /* CRC Error */ |
1552 | GMR_FS_RX_FF_OV = 1<<0, /* Bit 0: Rx FIFO Overflow */ | 1548 | GMR_FS_RX_FF_OV = 1<<0, /* Rx FIFO Overflow */ |
1553 | 1549 | ||
1554 | /* | ||
1555 | * GMR_FS_ANY_ERR (analogous to XMR_FS_ANY_ERR) | ||
1556 | */ | ||
1557 | GMR_FS_ANY_ERR = GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR | | 1550 | GMR_FS_ANY_ERR = GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR | |
1558 | GMR_FS_FRAGMENT | GMR_FS_LONG_ERR | | 1551 | GMR_FS_FRAGMENT | GMR_FS_LONG_ERR | |
1559 | GMR_FS_MII_ERR | GMR_FS_BAD_FC | GMR_FS_GOOD_FC | | 1552 | GMR_FS_MII_ERR | GMR_FS_BAD_FC | GMR_FS_GOOD_FC | |
1560 | GMR_FS_UN_SIZE | GMR_FS_JABBER, | 1553 | GMR_FS_UN_SIZE | GMR_FS_JABBER, |
1561 | /* Rx GMAC FIFO Flush Mask (default) */ | ||
1562 | RX_FF_FL_DEF_MSK = GMR_FS_ANY_ERR, | ||
1563 | }; | 1554 | }; |
1564 | 1555 | ||
1565 | /* RX_GMF_CTRL_T 32 bit Rx GMAC FIFO Control/Test */ | 1556 | /* RX_GMF_CTRL_T 32 bit Rx GMAC FIFO Control/Test */ |
1566 | enum { | 1557 | enum { |
1558 | RX_TRUNC_ON = 1<<27, /* enable packet truncation */ | ||
1559 | RX_TRUNC_OFF = 1<<26, /* disable packet truncation */ | ||
1560 | RX_VLAN_STRIP_ON = 1<<25, /* enable VLAN stripping */ | ||
1561 | RX_VLAN_STRIP_OFF = 1<<24, /* disable VLAN stripping */ | ||
1562 | |||
1567 | GMF_WP_TST_ON = 1<<14, /* Write Pointer Test On */ | 1563 | GMF_WP_TST_ON = 1<<14, /* Write Pointer Test On */ |
1568 | GMF_WP_TST_OFF = 1<<13, /* Write Pointer Test Off */ | 1564 | GMF_WP_TST_OFF = 1<<13, /* Write Pointer Test Off */ |
1569 | GMF_WP_STEP = 1<<12, /* Write Pointer Step/Increment */ | 1565 | GMF_WP_STEP = 1<<12, /* Write Pointer Step/Increment */ |
@@ -1574,7 +1570,8 @@ enum { | |||
1574 | GMF_RX_F_FL_ON = 1<<7, /* Rx FIFO Flush Mode On */ | 1570 | GMF_RX_F_FL_ON = 1<<7, /* Rx FIFO Flush Mode On */ |
1575 | GMF_RX_F_FL_OFF = 1<<6, /* Rx FIFO Flush Mode Off */ | 1571 | GMF_RX_F_FL_OFF = 1<<6, /* Rx FIFO Flush Mode Off */ |
1576 | GMF_CLI_RX_FO = 1<<5, /* Clear IRQ Rx FIFO Overrun */ | 1572 | GMF_CLI_RX_FO = 1<<5, /* Clear IRQ Rx FIFO Overrun */ |
1577 | GMF_CLI_RX_FC = 1<<4, /* Clear IRQ Rx Frame Complete */ | 1573 | GMF_CLI_RX_C = 1<<4, /* Clear IRQ Rx Frame Complete */ |
1574 | |||
1578 | GMF_OPER_ON = 1<<3, /* Operational Mode On */ | 1575 | GMF_OPER_ON = 1<<3, /* Operational Mode On */ |
1579 | GMF_OPER_OFF = 1<<2, /* Operational Mode Off */ | 1576 | GMF_OPER_OFF = 1<<2, /* Operational Mode Off */ |
1580 | GMF_RST_CLR = 1<<1, /* Clear GMAC FIFO Reset */ | 1577 | GMF_RST_CLR = 1<<1, /* Clear GMAC FIFO Reset */ |
@@ -1586,6 +1583,9 @@ enum { | |||
1586 | 1583 | ||
1587 | /* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test */ | 1584 | /* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test */ |
1588 | enum { | 1585 | enum { |
1586 | TX_VLAN_TAG_ON = 1<<25,/* enable VLAN tagging */ | ||
1587 | TX_VLAN_TAG_OFF = 1<<24,/* disable VLAN tagging */ | ||
1588 | |||
1589 | GMF_WSP_TST_ON = 1<<18,/* Write Shadow Pointer Test On */ | 1589 | GMF_WSP_TST_ON = 1<<18,/* Write Shadow Pointer Test On */ |
1590 | GMF_WSP_TST_OFF = 1<<17,/* Write Shadow Pointer Test Off */ | 1590 | GMF_WSP_TST_OFF = 1<<17,/* Write Shadow Pointer Test Off */ |
1591 | GMF_WSP_STEP = 1<<16,/* Write Shadow Pointer Step/Increment */ | 1591 | GMF_WSP_STEP = 1<<16,/* Write Shadow Pointer Step/Increment */ |
@@ -1679,8 +1679,7 @@ enum { | |||
1679 | GM_IS_RX_FF_OR = 1<<1, /* Receive FIFO Overrun */ | 1679 | GM_IS_RX_FF_OR = 1<<1, /* Receive FIFO Overrun */ |
1680 | GM_IS_RX_COMPL = 1<<0, /* Frame Reception Complete */ | 1680 | GM_IS_RX_COMPL = 1<<0, /* Frame Reception Complete */ |
1681 | 1681 | ||
1682 | #define GMAC_DEF_MSK (GM_IS_TX_CO_OV | GM_IS_RX_CO_OV |\ | 1682 | #define GMAC_DEF_MSK (GM_IS_TX_FF_UR|GM_IS_RX_FF_OR) |
1683 | GM_IS_TX_FF_UR | GM_IS_RX_FF_OR) | ||
1684 | 1683 | ||
1685 | /* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */ | 1684 | /* GMAC_LINK_CTRL 16 bit GMAC Link Control Reg (YUKON only) */ |
1686 | /* Bits 15.. 2: reserved */ | 1685 | /* Bits 15.. 2: reserved */ |
@@ -1761,9 +1760,6 @@ enum { | |||
1761 | OP_RXTIMEVLAN = OP_RXTIMESTAMP | OP_RXVLAN, | 1760 | OP_RXTIMEVLAN = OP_RXTIMESTAMP | OP_RXVLAN, |
1762 | OP_RSS_HASH = 0x65, | 1761 | OP_RSS_HASH = 0x65, |
1763 | OP_TXINDEXLE = 0x68, | 1762 | OP_TXINDEXLE = 0x68, |
1764 | |||
1765 | /* YUKON-2 SPECIAL opcodes defines */ | ||
1766 | OP_PUTIDX = 0x70, | ||
1767 | }; | 1763 | }; |
1768 | 1764 | ||
1769 | /* Yukon 2 hardware interface | 1765 | /* Yukon 2 hardware interface |
@@ -1775,62 +1771,60 @@ struct sky2_tx_le { | |||
1775 | struct { | 1771 | struct { |
1776 | u16 offset; | 1772 | u16 offset; |
1777 | u16 start; | 1773 | u16 start; |
1778 | } csum; | 1774 | } csum __attribute((packed)); |
1779 | struct { | 1775 | struct { |
1780 | u16 size; | 1776 | u16 size; |
1781 | u16 rsvd; | 1777 | u16 rsvd; |
1782 | } tso; | 1778 | } tso __attribute((packed)); |
1783 | } tx; | 1779 | } tx; |
1784 | u16 length; /* also vlan tag or checksum start */ | 1780 | u16 length; /* also vlan tag or checksum start */ |
1785 | u8 ctrl; | 1781 | u8 ctrl; |
1786 | u8 opcode; | 1782 | u8 opcode; |
1787 | }; | 1783 | } __attribute((packed)); |
1788 | 1784 | ||
1789 | struct sky2_rx_le { | 1785 | struct sky2_rx_le { |
1790 | union { | 1786 | u32 addr; |
1791 | u32 addr; | ||
1792 | struct { | ||
1793 | u16 start1; | ||
1794 | u16 start2; | ||
1795 | } csum; | ||
1796 | } rx; | ||
1797 | u16 length; | 1787 | u16 length; |
1798 | u8 ctrl; | 1788 | u8 ctrl; |
1799 | u8 opcode; | 1789 | u8 opcode; |
1800 | }; | 1790 | } __attribute((packed));; |
1801 | 1791 | ||
1802 | struct sky2_status_le { | 1792 | struct sky2_status_le { |
1803 | u32 status; /* also checksum */ | 1793 | u32 status; /* also checksum */ |
1804 | u16 length; /* also vlan tag */ | 1794 | u16 length; /* also vlan tag */ |
1805 | u8 link; | 1795 | u8 link; |
1806 | u8 opcode; | 1796 | u8 opcode; |
1807 | }; | 1797 | } __attribute((packed)); |
1808 | |||
1809 | 1798 | ||
1810 | struct ring_info { | 1799 | struct ring_info { |
1811 | struct sk_buff *skb; | 1800 | struct sk_buff *skb; |
1812 | DECLARE_PCI_UNMAP_ADDR(mapaddr); | 1801 | dma_addr_t mapaddr; |
1813 | DECLARE_PCI_UNMAP_LEN(maplen); | 1802 | u16 maplen; |
1803 | u16 idx; | ||
1814 | }; | 1804 | }; |
1815 | 1805 | ||
1816 | struct sky2_port { | 1806 | struct sky2_port { |
1817 | struct sky2_hw *hw ____cacheline_aligned; | 1807 | struct sky2_hw *hw; |
1818 | struct net_device *netdev; | 1808 | struct net_device *netdev; |
1819 | unsigned port; | 1809 | unsigned port; |
1820 | u32 msg_enable; | 1810 | u32 msg_enable; |
1821 | 1811 | ||
1822 | struct ring_info *tx_ring ____cacheline_aligned; | 1812 | struct ring_info *tx_ring; |
1823 | struct sky2_tx_le *tx_le; | 1813 | struct sky2_tx_le *tx_le; |
1824 | spinlock_t tx_lock; | 1814 | spinlock_t tx_lock; |
1815 | u32 tx_addr64; | ||
1825 | u16 tx_cons; /* next le to check */ | 1816 | u16 tx_cons; /* next le to check */ |
1826 | u16 tx_prod; /* next le to use */ | 1817 | u16 tx_prod; /* next le to use */ |
1818 | u16 tx_pending; | ||
1827 | u16 tx_last_put; | 1819 | u16 tx_last_put; |
1820 | u16 tx_last_mss; | ||
1828 | 1821 | ||
1829 | struct ring_info *rx_ring ____cacheline_aligned; | 1822 | struct ring_info *rx_ring; |
1830 | struct sky2_rx_le *rx_le; | 1823 | struct sky2_rx_le *rx_le; |
1831 | u16 rx_ring_size; | 1824 | u32 rx_addr64; |
1832 | u16 rx_next; /* next re to check */ | 1825 | u16 rx_next; /* next re to check */ |
1833 | u16 rx_put; /* next le index to use */ | 1826 | u16 rx_put; /* next le index to use */ |
1827 | u16 rx_pending; | ||
1834 | u16 rx_last_put; | 1828 | u16 rx_last_put; |
1835 | 1829 | ||
1836 | dma_addr_t rx_le_map; | 1830 | dma_addr_t rx_le_map; |
@@ -1882,12 +1876,14 @@ static inline u8 sky2_read8(const struct sky2_hw *hw, unsigned reg) | |||
1882 | return readb(hw->regs + reg); | 1876 | return readb(hw->regs + reg); |
1883 | } | 1877 | } |
1884 | 1878 | ||
1879 | /* This should probably go away, bus based tweeks suck */ | ||
1885 | static inline int is_pciex(const struct sky2_hw *hw) | 1880 | static inline int is_pciex(const struct sky2_hw *hw) |
1886 | { | 1881 | { |
1887 | return (sky2_read32(hw, PCI_C(PCI_DEV_STATUS)) & PCI_OS_PCI_X) == 0; | 1882 | u32 status; |
1883 | pci_read_config_dword(hw->pdev, PCI_DEV_STATUS, &status); | ||
1884 | return (status & PCI_OS_PCI_X) == 0; | ||
1888 | } | 1885 | } |
1889 | 1886 | ||
1890 | |||
1891 | static inline void sky2_write32(const struct sky2_hw *hw, unsigned reg, u32 val) | 1887 | static inline void sky2_write32(const struct sky2_hw *hw, unsigned reg, u32 val) |
1892 | { | 1888 | { |
1893 | writel(val, hw->regs + reg); | 1889 | writel(val, hw->regs + reg); |