Commit 9a5ff1f2 authored by David S. Miller's avatar David S. Miller

[TG3]: Initial implementation of 5705 support.

parent 23a29063
...@@ -81,6 +81,7 @@ ...@@ -81,6 +81,7 @@
/* hardware minimum and maximum for a single frame's data payload */ /* hardware minimum and maximum for a single frame's data payload */
#define TG3_MIN_MTU 60 #define TG3_MIN_MTU 60
#define TG3_MAX_MTU 9000 #define TG3_MAX_MTU 9000
#define TG3_MAX_MTU_5705 1500
/* These numbers seem to be hard coded in the NIC firmware somehow. /* These numbers seem to be hard coded in the NIC firmware somehow.
* You can't change the ring sizes, but you can change where you place * You can't change the ring sizes, but you can change where you place
...@@ -90,7 +91,17 @@ ...@@ -90,7 +91,17 @@
#define TG3_DEF_RX_RING_PENDING 200 #define TG3_DEF_RX_RING_PENDING 200
#define TG3_RX_JUMBO_RING_SIZE 256 #define TG3_RX_JUMBO_RING_SIZE 256
#define TG3_DEF_RX_JUMBO_RING_PENDING 100 #define TG3_DEF_RX_JUMBO_RING_PENDING 100
#define TG3_RX_RCB_RING_SIZE 1024
/* Do not place this n-ring entries value into the tp struct itself,
* we really want to expose these constants to GCC so that modulo et
* al. operations are done with shifts and masks instead of with
* hw multiply/modulo instructions. Another solution would be to
* replace things like '% foo' with '& (foo - 1)'.
*/
#define TG3_RX_RCB_RING_SIZE(tp) \
(GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 ? \
512 : 1024)
#define TG3_TX_RING_SIZE 512 #define TG3_TX_RING_SIZE 512
#define TG3_DEF_TX_RING_PENDING (TG3_TX_RING_SIZE - 1) #define TG3_DEF_TX_RING_PENDING (TG3_TX_RING_SIZE - 1)
...@@ -98,8 +109,8 @@ ...@@ -98,8 +109,8 @@
TG3_RX_RING_SIZE) TG3_RX_RING_SIZE)
#define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \ #define TG3_RX_JUMBO_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \
TG3_RX_JUMBO_RING_SIZE) TG3_RX_JUMBO_RING_SIZE)
#define TG3_RX_RCB_RING_BYTES (sizeof(struct tg3_rx_buffer_desc) * \ #define TG3_RX_RCB_RING_BYTES(tp) (sizeof(struct tg3_rx_buffer_desc) * \
TG3_RX_RCB_RING_SIZE) TG3_RX_RCB_RING_SIZE(tp))
#define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \ #define TG3_TX_RING_BYTES (sizeof(struct tg3_tx_buffer_desc) * \
TG3_TX_RING_SIZE) TG3_TX_RING_SIZE)
#define TX_RING_GAP(TP) \ #define TX_RING_GAP(TP) \
...@@ -140,6 +151,10 @@ static struct pci_device_id tg3_pci_tbl[] = { ...@@ -140,6 +151,10 @@ static struct pci_device_id tg3_pci_tbl[] = {
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702FE,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5705M,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5702X,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
{ PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X, { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_TIGON3_5703X,
...@@ -288,17 +303,28 @@ static inline void tg3_netif_start(struct tg3 *tp) ...@@ -288,17 +303,28 @@ static inline void tg3_netif_start(struct tg3 *tp)
static void tg3_switch_clocks(struct tg3 *tp) static void tg3_switch_clocks(struct tg3 *tp)
{ {
if (tr32(TG3PCI_CLOCK_CTRL) & CLOCK_CTRL_44MHZ_CORE) { u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL);
u32 orig_clock_ctrl;
orig_clock_ctrl = clock_ctrl;
clock_ctrl &= (CLOCK_CTRL_FORCE_CLKRUN |
CLOCK_CTRL_CLKRUN_OENABLE |
0x1f);
tp->pci_clock_ctrl = clock_ctrl;
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705 &&
(orig_clock_ctrl & CLOCK_CTRL_44MHZ_CORE) != 0) {
tw32(TG3PCI_CLOCK_CTRL, tw32(TG3PCI_CLOCK_CTRL,
clock_ctrl |
(CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK)); (CLOCK_CTRL_44MHZ_CORE | CLOCK_CTRL_ALTCLK));
tr32(TG3PCI_CLOCK_CTRL); tr32(TG3PCI_CLOCK_CTRL);
udelay(40); udelay(40);
tw32(TG3PCI_CLOCK_CTRL, tw32(TG3PCI_CLOCK_CTRL,
(CLOCK_CTRL_ALTCLK)); clock_ctrl | (CLOCK_CTRL_ALTCLK));
tr32(TG3PCI_CLOCK_CTRL); tr32(TG3PCI_CLOCK_CTRL);
udelay(40); udelay(40);
} }
tw32(TG3PCI_CLOCK_CTRL, 0); tw32(TG3PCI_CLOCK_CTRL, clock_ctrl);
tr32(TG3PCI_CLOCK_CTRL); tr32(TG3PCI_CLOCK_CTRL);
udelay(40); udelay(40);
} }
...@@ -444,6 +470,92 @@ static int tg3_phy_reset(struct tg3 *tp, int force) ...@@ -444,6 +470,92 @@ static int tg3_phy_reset(struct tg3 *tp, int force)
return -EBUSY; return -EBUSY;
} }
static void tg3_frob_aux_power(struct tg3 *tp)
{
struct tg3 *tp_peer = tp;
if ((tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) != 0)
return;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
tp_peer = pci_get_drvdata(tp->pdev_peer);
if (!tp_peer)
BUG();
}
if ((tp->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0 ||
(tp_peer->tg3_flags & TG3_FLAG_WOL_ENABLE) != 0) {
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
(GRC_LCLCTRL_GPIO_OE0 |
GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OE2 |
GRC_LCLCTRL_GPIO_OUTPUT0 |
GRC_LCLCTRL_GPIO_OUTPUT1));
tr32(GRC_LOCAL_CTRL);
udelay(100);
} else {
if (tp_peer != tp &&
(tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
return;
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
(GRC_LCLCTRL_GPIO_OE0 |
GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OE2 |
GRC_LCLCTRL_GPIO_OUTPUT1 |
GRC_LCLCTRL_GPIO_OUTPUT2));
tr32(GRC_LOCAL_CTRL);
udelay(100);
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
(GRC_LCLCTRL_GPIO_OE0 |
GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OE2 |
GRC_LCLCTRL_GPIO_OUTPUT0 |
GRC_LCLCTRL_GPIO_OUTPUT1 |
GRC_LCLCTRL_GPIO_OUTPUT2));
tr32(GRC_LOCAL_CTRL);
udelay(100);
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
(GRC_LCLCTRL_GPIO_OE0 |
GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OE2 |
GRC_LCLCTRL_GPIO_OUTPUT0 |
GRC_LCLCTRL_GPIO_OUTPUT1));
tr32(GRC_LOCAL_CTRL);
udelay(100);
}
} else {
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) {
if (tp_peer != tp &&
(tp_peer->tg3_flags & TG3_FLAG_INIT_COMPLETE) != 0)
return;
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
(GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OUTPUT1));
tr32(GRC_LOCAL_CTRL);
udelay(100);
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
(GRC_LCLCTRL_GPIO_OE1));
tr32(GRC_LOCAL_CTRL);
udelay(100);
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl |
(GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OUTPUT1));
tr32(GRC_LOCAL_CTRL);
udelay(100);
}
}
}
static int tg3_setup_phy(struct tg3 *); static int tg3_setup_phy(struct tg3 *);
static int tg3_set_power_state(struct tg3 *tp, int state) static int tg3_set_power_state(struct tg3 *tp, int state)
...@@ -547,89 +659,65 @@ static int tg3_set_power_state(struct tg3 *tp, int state) ...@@ -547,89 +659,65 @@ static int tg3_set_power_state(struct tg3 *tp, int state)
udelay(10); udelay(10);
} }
if (tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) { if (!(tp->tg3_flags & TG3_FLAG_WOL_SPEED_100MB) &&
(GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
u32 base_val; u32 base_val;
base_val = 0; base_val = tp->pci_clock_ctrl;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || base_val |= (CLOCK_CTRL_RXCLK_DISABLE |
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) CLOCK_CTRL_TXCLK_DISABLE);
base_val |= (CLOCK_CTRL_RXCLK_DISABLE |
CLOCK_CTRL_TXCLK_DISABLE);
tw32(TG3PCI_CLOCK_CTRL, base_val |
CLOCK_CTRL_ALTCLK);
tr32(TG3PCI_CLOCK_CTRL);
udelay(40);
tw32(TG3PCI_CLOCK_CTRL, base_val | tw32(TG3PCI_CLOCK_CTRL, base_val |
CLOCK_CTRL_ALTCLK | CLOCK_CTRL_ALTCLK |
CLOCK_CTRL_44MHZ_CORE); CLOCK_CTRL_PWRDOWN_PLL133);
tr32(TG3PCI_CLOCK_CTRL);
udelay(40);
tw32(TG3PCI_CLOCK_CTRL, base_val |
CLOCK_CTRL_44MHZ_CORE);
tr32(TG3PCI_CLOCK_CTRL); tr32(TG3PCI_CLOCK_CTRL);
udelay(40); udelay(40);
} else { } else {
u32 base_val; u32 newbits1, newbits2;
base_val = 0;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
base_val |= (CLOCK_CTRL_RXCLK_DISABLE | newbits1 = (CLOCK_CTRL_RXCLK_DISABLE |
CLOCK_CTRL_TXCLK_DISABLE); CLOCK_CTRL_TXCLK_DISABLE |
CLOCK_CTRL_ALTCLK);
newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
} else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
newbits1 = CLOCK_CTRL_625_CORE;
newbits2 = newbits1 | CLOCK_CTRL_ALTCLK;
} else {
newbits1 = CLOCK_CTRL_ALTCLK;
newbits2 = newbits1 | CLOCK_CTRL_44MHZ_CORE;
}
tw32(TG3PCI_CLOCK_CTRL, base_val | tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits1);
CLOCK_CTRL_ALTCLK |
CLOCK_CTRL_PWRDOWN_PLL133);
tr32(TG3PCI_CLOCK_CTRL); tr32(TG3PCI_CLOCK_CTRL);
udelay(40); udelay(40);
}
if (!(tp->tg3_flags & TG3_FLAG_EEPROM_WRITE_PROT) && tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits2);
(tp->tg3_flags & TG3_FLAG_WOL_ENABLE)) { tr32(TG3PCI_CLOCK_CTRL);
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 || udelay(40);
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
tw32(GRC_LOCAL_CTRL,
(GRC_LCLCTRL_GPIO_OE0 |
GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OE2 |
GRC_LCLCTRL_GPIO_OUTPUT0 |
GRC_LCLCTRL_GPIO_OUTPUT1));
tr32(GRC_LOCAL_CTRL);
udelay(100);
} else {
tw32(GRC_LOCAL_CTRL,
(GRC_LCLCTRL_GPIO_OE0 |
GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OE2 |
GRC_LCLCTRL_GPIO_OUTPUT1 |
GRC_LCLCTRL_GPIO_OUTPUT2));
tr32(GRC_LOCAL_CTRL);
udelay(100);
tw32(GRC_LOCAL_CTRL, if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
(GRC_LCLCTRL_GPIO_OE0 | u32 newbits3;
GRC_LCLCTRL_GPIO_OE1 |
GRC_LCLCTRL_GPIO_OE2 |
GRC_LCLCTRL_GPIO_OUTPUT0 |
GRC_LCLCTRL_GPIO_OUTPUT1 |
GRC_LCLCTRL_GPIO_OUTPUT2));
tr32(GRC_LOCAL_CTRL);
udelay(100);
tw32(GRC_LOCAL_CTRL, if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
(GRC_LCLCTRL_GPIO_OE0 | GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701) {
GRC_LCLCTRL_GPIO_OE1 | newbits3 = (CLOCK_CTRL_RXCLK_DISABLE |
GRC_LCLCTRL_GPIO_OE2 | CLOCK_CTRL_TXCLK_DISABLE |
GRC_LCLCTRL_GPIO_OUTPUT0 | CLOCK_CTRL_44MHZ_CORE);
GRC_LCLCTRL_GPIO_OUTPUT1)); } else {
tr32(GRC_LOCAL_CTRL); newbits3 = CLOCK_CTRL_44MHZ_CORE;
udelay(100); }
tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl | newbits3);
tr32(TG3PCI_CLOCK_CTRL);
udelay(40);
} }
} }
tg3_frob_aux_power(tp);
/* Finally, set the new power state. */ /* Finally, set the new power state. */
pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control); pci_write_config_word(tp->pdev, pm + PCI_PM_CTRL, power_control);
...@@ -948,11 +1036,10 @@ static int tg3_setup_copper_phy(struct tg3 *tp) ...@@ -948,11 +1036,10 @@ static int tg3_setup_copper_phy(struct tg3 *tp)
/* Some third-party PHYs need to be reset on link going /* Some third-party PHYs need to be reset on link going
* down. * down.
*
* XXX 5705 note: This workaround also applies to 5705_a0
*/ */
if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 || if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) && GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
tp->pci_chip_rev_id == CHIPREV_ID_5705_A0) &&
netif_carrier_ok(tp->dev)) { netif_carrier_ok(tp->dev)) {
tg3_readphy(tp, MII_BMSR, &bmsr); tg3_readphy(tp, MII_BMSR, &bmsr);
tg3_readphy(tp, MII_BMSR, &bmsr); tg3_readphy(tp, MII_BMSR, &bmsr);
...@@ -1942,7 +2029,7 @@ static int tg3_rx(struct tg3 *tp, int budget) ...@@ -1942,7 +2029,7 @@ static int tg3_rx(struct tg3 *tp, int budget)
int received; int received;
hw_idx = tp->hw_status->idx[0].rx_producer; hw_idx = tp->hw_status->idx[0].rx_producer;
sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE; sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
work_mask = 0; work_mask = 0;
received = 0; received = 0;
while (sw_idx != hw_idx && budget > 0) { while (sw_idx != hw_idx && budget > 0) {
...@@ -2043,13 +2130,13 @@ static int tg3_rx(struct tg3 *tp, int budget) ...@@ -2043,13 +2130,13 @@ static int tg3_rx(struct tg3 *tp, int budget)
(*post_ptr)++; (*post_ptr)++;
next_pkt_nopost: next_pkt_nopost:
rx_rcb_ptr++; rx_rcb_ptr++;
sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE; sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
} }
/* ACK the status ring. */ /* ACK the status ring. */
tp->rx_rcb_ptr = rx_rcb_ptr; tp->rx_rcb_ptr = rx_rcb_ptr;
tw32_mailbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, tw32_mailbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW,
(rx_rcb_ptr % TG3_RX_RCB_RING_SIZE)); (rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp)));
if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER) if (tp->tg3_flags & TG3_FLAG_MBOX_WRITE_REORDER)
tr32(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW); tr32(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW);
...@@ -2701,6 +2788,10 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu) ...@@ -2701,6 +2788,10 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu)
if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU) if (new_mtu < TG3_MIN_MTU || new_mtu > TG3_MAX_MTU)
return -EINVAL; return -EINVAL;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
new_mtu > TG3_MAX_MTU_5705)
return -EINVAL;
if (!netif_running(dev)) { if (!netif_running(dev)) {
/* We'll just catch it later when the /* We'll just catch it later when the
* device is up'd. * device is up'd.
...@@ -2816,7 +2907,7 @@ static void tg3_init_rings(struct tg3 *tp) ...@@ -2816,7 +2907,7 @@ static void tg3_init_rings(struct tg3 *tp)
/* Zero out all descriptors. */ /* Zero out all descriptors. */
memset(tp->rx_std, 0, TG3_RX_RING_BYTES); memset(tp->rx_std, 0, TG3_RX_RING_BYTES);
memset(tp->rx_jumbo, 0, TG3_RX_JUMBO_RING_BYTES); memset(tp->rx_jumbo, 0, TG3_RX_JUMBO_RING_BYTES);
memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES); memset(tp->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
if (tp->tg3_flags & TG3_FLAG_HOST_TXDS) { if (tp->tg3_flags & TG3_FLAG_HOST_TXDS) {
memset(tp->tx_ring, 0, TG3_TX_RING_BYTES); memset(tp->tx_ring, 0, TG3_TX_RING_BYTES);
...@@ -2899,7 +2990,7 @@ static void tg3_free_consistent(struct tg3 *tp) ...@@ -2899,7 +2990,7 @@ static void tg3_free_consistent(struct tg3 *tp)
tp->rx_jumbo = NULL; tp->rx_jumbo = NULL;
} }
if (tp->rx_rcb) { if (tp->rx_rcb) {
pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES, pci_free_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
tp->rx_rcb, tp->rx_rcb_mapping); tp->rx_rcb, tp->rx_rcb_mapping);
tp->rx_rcb = NULL; tp->rx_rcb = NULL;
} }
...@@ -2957,7 +3048,7 @@ static int tg3_alloc_consistent(struct tg3 *tp) ...@@ -2957,7 +3048,7 @@ static int tg3_alloc_consistent(struct tg3 *tp)
if (!tp->rx_jumbo) if (!tp->rx_jumbo)
goto err_out; goto err_out;
tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES, tp->rx_rcb = pci_alloc_consistent(tp->pdev, TG3_RX_RCB_RING_BYTES(tp),
&tp->rx_rcb_mapping); &tp->rx_rcb_mapping);
if (!tp->rx_rcb) if (!tp->rx_rcb)
goto err_out; goto err_out;
...@@ -3004,6 +3095,23 @@ static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit) ...@@ -3004,6 +3095,23 @@ static int tg3_stop_block(struct tg3 *tp, unsigned long ofs, u32 enable_bit)
unsigned int i; unsigned int i;
u32 val; u32 val;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
switch (ofs) {
case RCVLSC_MODE:
case DMAC_MODE:
case MBFREE_MODE:
case BUFMGR_MODE:
case MEMARB_MODE:
/* We can't enable/disable these bits of the
* 5705, just say success.
*/
return 0;
default:
break;
};
}
val = tr32(ofs); val = tr32(ofs);
val &= ~enable_bit; val &= ~enable_bit;
tw32(ofs, val); tw32(ofs, val);
...@@ -3127,7 +3235,10 @@ static void tg3_chip_reset(struct tg3 *tp) ...@@ -3127,7 +3235,10 @@ static void tg3_chip_reset(struct tg3 *tp)
tp->tg3_flags &= ~TG3_FLAG_5701_REG_WRITE_BUG; tp->tg3_flags &= ~TG3_FLAG_5701_REG_WRITE_BUG;
/* do the reset */ /* do the reset */
tw32(GRC_MISC_CFG, GRC_MISC_CFG_CORECLK_RESET); val = GRC_MISC_CFG_CORECLK_RESET;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
val |= GRC_MISC_CFG_KEEP_GPHY_POWER;
tw32(GRC_MISC_CFG, val);
/* restore 5701 hardware bug workaround flag */ /* restore 5701 hardware bug workaround flag */
tp->tg3_flags = flags_save; tp->tg3_flags = flags_save;
...@@ -3163,6 +3274,13 @@ static void tg3_chip_reset(struct tg3 *tp) ...@@ -3163,6 +3274,13 @@ static void tg3_chip_reset(struct tg3 *tp)
tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); tw32(MEMARB_MODE, MEMARB_MODE_ENABLE);
if ((tp->nic_sram_data_cfg & NIC_SRAM_DATA_CFG_MINI_PCI) != 0 &&
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
tp->pci_clock_ctrl |=
(CLOCK_CTRL_FORCE_CLKRUN | CLOCK_CTRL_CLKRUN_OENABLE);
tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
}
tw32(TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl); tw32(TG3PCI_MISC_HOST_CTRL, tp->misc_host_ctrl);
} }
...@@ -3362,6 +3480,10 @@ static int tg3_reset_cpu(struct tg3 *tp, u32 offset) ...@@ -3362,6 +3480,10 @@ static int tg3_reset_cpu(struct tg3 *tp, u32 offset)
{ {
int i; int i;
if (offset == TX_CPU_BASE &&
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
BUG();
tw32(offset + CPU_STATE, 0xffffffff); tw32(offset + CPU_STATE, 0xffffffff);
tw32(offset + CPU_MODE, CPU_MODE_RESET); tw32(offset + CPU_MODE, CPU_MODE_RESET);
if (offset == RX_CPU_BASE) { if (offset == RX_CPU_BASE) {
...@@ -3412,6 +3534,14 @@ static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_b ...@@ -3412,6 +3534,14 @@ static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_b
int err, i; int err, i;
u32 orig_tg3_flags = tp->tg3_flags; u32 orig_tg3_flags = tp->tg3_flags;
if (cpu_base == TX_CPU_BASE &&
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
printk(KERN_ERR PFX "tg3_load_firmware_cpu: Trying to load "
"TX cpu firmware on %s which is 5705.\n",
tp->dev->name);
return -EINVAL;
}
/* Force use of PCI config space for indirect register /* Force use of PCI config space for indirect register
* write calls. * write calls.
*/ */
...@@ -3791,6 +3921,9 @@ static int tg3_load_tso_firmware(struct tg3 *tp) ...@@ -3791,6 +3921,9 @@ static int tg3_load_tso_firmware(struct tg3 *tp)
struct fw_info info; struct fw_info info;
int err, i; int err, i;
/* XXX 5705 note: Need different firmware here, and load it onto
* XXX RX cpu instead of TX cpu as 5705 lacks the latter.
*/
info.text_base = TG3_TSO_FW_TEXT_ADDR; info.text_base = TG3_TSO_FW_TEXT_ADDR;
info.text_len = TG3_TSO_FW_TEXT_LEN; info.text_len = TG3_TSO_FW_TEXT_LEN;
info.text_data = &tg3TsoFwText[0]; info.text_data = &tg3TsoFwText[0];
...@@ -3860,6 +3993,15 @@ static void __tg3_set_mac_addr(struct tg3 *tp) ...@@ -3860,6 +3993,15 @@ static void __tg3_set_mac_addr(struct tg3 *tp)
tw32(MAC_ADDR_0_LOW + (i * 8), addr_low); tw32(MAC_ADDR_0_LOW + (i * 8), addr_low);
} }
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701 &&
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
for (i = 0; i < 12; i++) {
tw32(MAC_EXTADDR_0_HIGH + (i * 8), addr_high);
tw32(MAC_EXTADDR_0_LOW + (i * 8), addr_low);
}
}
addr_high = (tp->dev->dev_addr[0] + addr_high = (tp->dev->dev_addr[0] +
tp->dev->dev_addr[1] + tp->dev->dev_addr[1] +
tp->dev->dev_addr[2] + tp->dev->dev_addr[2] +
...@@ -3918,7 +4060,7 @@ static void __tg3_set_rx_mode(struct net_device *); ...@@ -3918,7 +4060,7 @@ static void __tg3_set_rx_mode(struct net_device *);
static int tg3_reset_hw(struct tg3 *tp) static int tg3_reset_hw(struct tg3 *tp)
{ {
u32 val; u32 val;
int i, err; int i, err, limit;
tg3_disable_ints(tp); tg3_disable_ints(tp);
...@@ -3970,9 +4112,8 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -3970,9 +4112,8 @@ static int tg3_reset_hw(struct tg3 *tp)
* B3 tigon3 silicon. This bit has no effect on any * B3 tigon3 silicon. This bit has no effect on any
* other revision. * other revision.
*/ */
val = tr32(TG3PCI_CLOCK_CTRL); tp->pci_clock_ctrl |= CLOCK_CTRL_DELAY_PCI_GRANT;
val |= CLOCK_CTRL_DELAY_PCI_GRANT; tw32(TG3PCI_CLOCK_CTRL, tp->pci_clock_ctrl);
tw32(TG3PCI_CLOCK_CTRL, val);
tr32(TG3PCI_CLOCK_CTRL); tr32(TG3PCI_CLOCK_CTRL);
if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 && if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0 &&
...@@ -4025,13 +4166,34 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4025,13 +4166,34 @@ static int tg3_reset_hw(struct tg3 *tp)
(65 << GRC_MISC_CFG_PRESCALAR_SHIFT)); (65 << GRC_MISC_CFG_PRESCALAR_SHIFT));
/* Initialize MBUF/DESC pool. */ /* Initialize MBUF/DESC pool. */
tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE); if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE);
tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64); if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
else tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE64);
tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96); else
tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE); tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE96);
tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE); tw32(BUFMGR_DMA_DESC_POOL_ADDR, NIC_SRAM_DMA_DESC_POOL_BASE);
tw32(BUFMGR_DMA_DESC_POOL_SIZE, NIC_SRAM_DMA_DESC_POOL_SIZE);
}
#if TG3_DO_TSO != 0
else if (tp->dev->features & NETIF_F_TSO) {
/* XXX TSO note: Ok, there will be two sets of firmware.
* XXX One for non-5705 and one for 5705 chips.
* XXX Once that is implemented we need to size
* XXX that 5705-specific firmware and use it
* XXX to calculate the proper BUFMGR_MB_POOL_ADDR
* XXX size (NIC_SRAM_MBUF_POOL_BASE5705 + 5705fw_len)
* XXX and BUFMGR_MB_POOL_SIZE value
* XXX (NIC_SRAM_MBUF_POOL_SIZE5705 - 5705fw_len - 0xa00)
*/
#if 0
fw_len = tg3_tso_fw_len(tp);
fw_len = (fw_len + (0x80 - 1)) & ~(0x80 - 1);
tw32(BUFMGR_MB_POOL_ADDR, NIC_SRAM_MBUF_POOL_BASE5705 + fw_len);
tw32(BUFMGR_MB_POOL_SIZE, NIC_SRAM_MBUF_POOL_SIZE5705 - fw_len - 0xa00);
#endif
}
#endif
if (!(tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE)) { if (!(tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE)) {
tw32(BUFMGR_MB_RDMA_LOW_WATER, tw32(BUFMGR_MB_RDMA_LOW_WATER,
...@@ -4104,30 +4266,41 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4104,30 +4266,41 @@ static int tg3_reset_hw(struct tg3 *tp)
tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR, tw32(RCVDBDI_STD_BD + TG3_BDINFO_NIC_ADDR,
NIC_SRAM_RX_BUFFER_DESC); NIC_SRAM_RX_BUFFER_DESC);
tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS, /* Don't even try to program the JUMBO/MINI buffer descriptor
BDINFO_FLAGS_DISABLED); * configs on 5705.
*/
if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) { if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH, tw32(RCVDBDI_MINI_BD + TG3_BDINFO_MAXLEN_FLAGS,
((u64) tp->rx_jumbo_mapping >> 32));
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
((u64) tp->rx_jumbo_mapping & 0xffffffff));
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR,
NIC_SRAM_RX_JUMBO_BUFFER_DESC);
} else {
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
BDINFO_FLAGS_DISABLED); BDINFO_FLAGS_DISABLED);
if (tp->tg3_flags & TG3_FLAG_JUMBO_ENABLE) {
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_HIGH,
((u64) tp->rx_jumbo_mapping >> 32));
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_HOST_ADDR + TG3_64BIT_REG_LOW,
((u64) tp->rx_jumbo_mapping & 0xffffffff));
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
RX_JUMBO_MAX_SIZE << BDINFO_FLAGS_MAXLEN_SHIFT);
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_NIC_ADDR,
NIC_SRAM_RX_JUMBO_BUFFER_DESC);
} else {
tw32(RCVDBDI_JUMBO_BD + TG3_BDINFO_MAXLEN_FLAGS,
BDINFO_FLAGS_DISABLED);
}
} }
/* Setup replenish thresholds. */ /* Setup replenish thresholds. */
tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8); tw32(RCVBDI_STD_THRESH, tp->rx_pending / 8);
tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8); tw32(RCVBDI_JUMBO_THRESH, tp->rx_jumbo_pending / 8);
/* Clear out send RCB ring in SRAM. */ /* There is only one send ring on 5705, no need to explicitly
for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE) * disable the others.
tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS, BDINFO_FLAGS_DISABLED); */
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
/* Clear out send RCB ring in SRAM. */
for (i = NIC_SRAM_SEND_RCB; i < NIC_SRAM_RCV_RET_RCB; i += TG3_BDINFO_SIZE)
tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
BDINFO_FLAGS_DISABLED);
}
tp->tx_prod = 0; tp->tx_prod = 0;
tp->tx_cons = 0; tp->tx_cons = 0;
...@@ -4149,9 +4322,15 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4149,9 +4322,15 @@ static int tg3_reset_hw(struct tg3 *tp)
NIC_SRAM_TX_BUFFER_DESC); NIC_SRAM_TX_BUFFER_DESC);
} }
for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK; i += TG3_BDINFO_SIZE) { /* There is only one receive return ring on 5705, no need to explicitly
tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS, * disable the others.
BDINFO_FLAGS_DISABLED); */
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
for (i = NIC_SRAM_RCV_RET_RCB; i < NIC_SRAM_STATS_BLK;
i += TG3_BDINFO_SIZE) {
tg3_write_mem(tp, i + TG3_BDINFO_MAXLEN_FLAGS,
BDINFO_FLAGS_DISABLED);
}
} }
tp->rx_rcb_ptr = 0; tp->rx_rcb_ptr = 0;
...@@ -4161,7 +4340,7 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4161,7 +4340,7 @@ static int tg3_reset_hw(struct tg3 *tp)
tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB, tg3_set_bdinfo(tp, NIC_SRAM_RCV_RET_RCB,
tp->rx_rcb_mapping, tp->rx_rcb_mapping,
(TG3_RX_RCB_RING_SIZE << (TG3_RX_RCB_RING_SIZE(tp) <<
BDINFO_FLAGS_MAXLEN_SHIFT), BDINFO_FLAGS_MAXLEN_SHIFT),
0); 0);
...@@ -4216,32 +4395,40 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4216,32 +4395,40 @@ static int tg3_reset_hw(struct tg3 *tp)
tw32(HOSTCC_RXCOL_TICKS, 0); tw32(HOSTCC_RXCOL_TICKS, 0);
tw32(HOSTCC_RXMAX_FRAMES, 1); tw32(HOSTCC_RXMAX_FRAMES, 1);
tw32(HOSTCC_RXCOAL_TICK_INT, 0); if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705)
tw32(HOSTCC_RXCOAL_TICK_INT, 0);
tw32(HOSTCC_RXCOAL_MAXF_INT, 1); tw32(HOSTCC_RXCOAL_MAXF_INT, 1);
tw32(HOSTCC_TXCOL_TICKS, LOW_TXCOL_TICKS); tw32(HOSTCC_TXCOL_TICKS, LOW_TXCOL_TICKS);
tw32(HOSTCC_TXMAX_FRAMES, LOW_RXMAX_FRAMES); tw32(HOSTCC_TXMAX_FRAMES, LOW_RXMAX_FRAMES);
tw32(HOSTCC_TXCOAL_TICK_INT, 0); if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705)
tw32(HOSTCC_TXCOAL_TICK_INT, 0);
tw32(HOSTCC_TXCOAL_MAXF_INT, 0); tw32(HOSTCC_TXCOAL_MAXF_INT, 0);
tw32(HOSTCC_STAT_COAL_TICKS,
DEFAULT_STAT_COAL_TICKS); if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
/* Status/statistics block address. See tg3_timer,
/* Status/statistics block address. */ * the tg3_periodic_fetch_stats call there, and
tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, * tg3_get_stats to see how this works for 5705 chips.
((u64) tp->stats_mapping >> 32)); */
tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, tw32(HOSTCC_STAT_COAL_TICKS,
((u64) tp->stats_mapping & 0xffffffff)); DEFAULT_STAT_COAL_TICKS);
tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH, tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
((u64) tp->status_mapping >> 32)); ((u64) tp->stats_mapping >> 32));
tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW, tw32(HOSTCC_STATS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
((u64) tp->status_mapping & 0xffffffff)); ((u64) tp->stats_mapping & 0xffffffff));
tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK); tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_HIGH,
tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK); ((u64) tp->status_mapping >> 32));
tw32(HOSTCC_STATUS_BLK_HOST_ADDR + TG3_64BIT_REG_LOW,
((u64) tp->status_mapping & 0xffffffff));
tw32(HOSTCC_STATS_BLK_NIC_ADDR, NIC_SRAM_STATS_BLK);
tw32(HOSTCC_STATUS_BLK_NIC_ADDR, NIC_SRAM_STATUS_BLK);
}
tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode); tw32(HOSTCC_MODE, HOSTCC_MODE_ENABLE | tp->coalesce_mode);
tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE); tw32(RCVCC_MODE, RCVCC_MODE_ENABLE | RCVCC_MODE_ATTN_ENABLE);
tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE); tw32(RCVLPC_MODE, RCVLPC_MODE_ENABLE);
tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE); if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705)
tw32(RCVLSC_MODE, RCVLSC_MODE_ENABLE | RCVLSC_MODE_ATTN_ENABLE);
tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE |
MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE;
...@@ -4260,26 +4447,36 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4260,26 +4447,36 @@ static int tg3_reset_hw(struct tg3 *tp)
tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0); tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0);
tr32(MAILBOX_INTERRUPT_0); tr32(MAILBOX_INTERRUPT_0);
tw32(DMAC_MODE, DMAC_MODE_ENABLE); if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705) {
tr32(DMAC_MODE); tw32(DMAC_MODE, DMAC_MODE_ENABLE);
udelay(40); tr32(DMAC_MODE);
udelay(40);
}
tw32(WDMAC_MODE, (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB | val = (WDMAC_MODE_ENABLE | WDMAC_MODE_TGTABORT_ENAB |
WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB | WDMAC_MODE_MSTABORT_ENAB | WDMAC_MODE_PARITYERR_ENAB |
WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB | WDMAC_MODE_ADDROFLOW_ENAB | WDMAC_MODE_FIFOOFLOW_ENAB |
WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB | WDMAC_MODE_FIFOURUN_ENAB | WDMAC_MODE_FIFOOREAD_ENAB |
WDMAC_MODE_LNGREAD_ENAB)); WDMAC_MODE_LNGREAD_ENAB);
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 &&
(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) != 0)
val |= WDMAC_MODE_RX_ACCEL;
tw32(WDMAC_MODE, val);
tr32(WDMAC_MODE); tr32(WDMAC_MODE);
udelay(40); udelay(40);
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 && if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) != 0) {
(tp->tg3_flags & TG3_FLAG_PCIX_MODE)) {
val = tr32(TG3PCI_X_CAPS); val = tr32(TG3PCI_X_CAPS);
val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK); if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703) {
val |= (PCIX_CAPS_MAX_BURST_5704 << PCIX_CAPS_BURST_SHIFT); val &= ~PCIX_CAPS_BURST_MASK;
if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
val |= (tp->split_mode_max_reqs << } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) {
PCIX_CAPS_SPLIT_SHIFT); val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK);
val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT);
if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
val |= (tp->split_mode_max_reqs <<
PCIX_CAPS_SPLIT_SHIFT);
}
tw32(TG3PCI_X_CAPS, val); tw32(TG3PCI_X_CAPS, val);
} }
...@@ -4290,12 +4487,25 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4290,12 +4487,25 @@ static int tg3_reset_hw(struct tg3 *tp)
RDMAC_MODE_LNGREAD_ENAB); RDMAC_MODE_LNGREAD_ENAB);
if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE)
val |= RDMAC_MODE_SPLIT_ENABLE; val |= RDMAC_MODE_SPLIT_ENABLE;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
if (tp->pci_chip_rev_id != CHIPREV_ID_5705_A0) {
#if TG3_DO_TSO != 0
if (tp->dev->features & NETIF_F_TSO) {
val |= RDMAC_MODE_FIFO_SIZE_128;
} else
#endif
if (!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH)) {
val |= RDMAC_MODE_FIFO_LONG_BURST;
}
}
}
tw32(RDMAC_MODE, val); tw32(RDMAC_MODE, val);
tr32(RDMAC_MODE); tr32(RDMAC_MODE);
udelay(40); udelay(40);
tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE); tw32(RCVDCC_MODE, RCVDCC_MODE_ENABLE | RCVDCC_MODE_ATTN_ENABLE);
tw32(MBFREE_MODE, MBFREE_MODE_ENABLE); if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5705)
tw32(MBFREE_MODE, MBFREE_MODE_ENABLE);
tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE); tw32(SNDDATAC_MODE, SNDDATAC_MODE_ENABLE);
tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE); tw32(SNDBDC_MODE, SNDBDC_MODE_ENABLE | SNDBDC_MODE_ATTN_ENABLE);
tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB); tw32(RCVBDI_MODE, RCVBDI_MODE_ENABLE | RCVBDI_MODE_RCB_ATTN_ENAB);
...@@ -4378,22 +4588,48 @@ static int tg3_reset_hw(struct tg3 *tp) ...@@ -4378,22 +4588,48 @@ static int tg3_reset_hw(struct tg3 *tp)
tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK); tw32(MAC_RCV_VALUE_0, 0xffffffff & RCV_RULE_DISABLE_MASK);
tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK); tw32(MAC_RCV_RULE_1, 0x86000004 & RCV_RULE_DISABLE_MASK);
tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK); tw32(MAC_RCV_VALUE_1, 0xffffffff & RCV_RULE_DISABLE_MASK);
#if 0
tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); limit = 8;
#endif else
tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0); limit = 16;
tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0); if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF)
tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0); limit -= 4;
tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0); switch (limit) {
tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0); case 16:
tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0); tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0);
tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0); case 15:
tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0); tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0);
tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0); case 14:
tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0); tw32(MAC_RCV_RULE_13, 0); tw32(MAC_RCV_VALUE_13, 0);
tw32(MAC_RCV_RULE_14, 0); tw32(MAC_RCV_VALUE_14, 0); case 13:
tw32(MAC_RCV_RULE_15, 0); tw32(MAC_RCV_VALUE_15, 0); tw32(MAC_RCV_RULE_12, 0); tw32(MAC_RCV_VALUE_12, 0);
case 12:
tw32(MAC_RCV_RULE_11, 0); tw32(MAC_RCV_VALUE_11, 0);
case 11:
tw32(MAC_RCV_RULE_10, 0); tw32(MAC_RCV_VALUE_10, 0);
case 10:
tw32(MAC_RCV_RULE_9, 0); tw32(MAC_RCV_VALUE_9, 0);
case 9:
tw32(MAC_RCV_RULE_8, 0); tw32(MAC_RCV_VALUE_8, 0);
case 8:
tw32(MAC_RCV_RULE_7, 0); tw32(MAC_RCV_VALUE_7, 0);
case 7:
tw32(MAC_RCV_RULE_6, 0); tw32(MAC_RCV_VALUE_6, 0);
case 6:
tw32(MAC_RCV_RULE_5, 0); tw32(MAC_RCV_VALUE_5, 0);
case 5:
tw32(MAC_RCV_RULE_4, 0); tw32(MAC_RCV_VALUE_4, 0);
case 4:
/* tw32(MAC_RCV_RULE_3, 0); tw32(MAC_RCV_VALUE_3, 0); */
case 3:
/* tw32(MAC_RCV_RULE_2, 0); tw32(MAC_RCV_VALUE_2, 0); */
case 2:
case 1:
default:
break;
};
if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE) if (tp->tg3_flags & TG3_FLAG_INIT_COMPLETE)
tg3_enable_ints(tp); tg3_enable_ints(tp);
...@@ -4423,6 +4659,50 @@ static int tg3_init_hw(struct tg3 *tp) ...@@ -4423,6 +4659,50 @@ static int tg3_init_hw(struct tg3 *tp)
return err; return err;
} }
#define TG3_STAT_ADD32(PSTAT, REG) \
do { u32 __val = tr32(REG); \
(PSTAT)->low += __val; \
if ((PSTAT)->low < __val) \
(PSTAT)->high += 1; \
} while (0)
static void tg3_periodic_fetch_stats(struct tg3 *tp)
{
struct tg3_hw_stats *sp = tp->hw_stats;
if (!netif_carrier_ok(tp->dev))
return;
TG3_STAT_ADD32(&sp->tx_octets, MAC_TX_STATS_OCTETS);
TG3_STAT_ADD32(&sp->tx_collisions, MAC_TX_STATS_COLLISIONS);
TG3_STAT_ADD32(&sp->tx_xon_sent, MAC_TX_STATS_XON_SENT);
TG3_STAT_ADD32(&sp->tx_xoff_sent, MAC_TX_STATS_XOFF_SENT);
TG3_STAT_ADD32(&sp->tx_mac_errors, MAC_TX_STATS_MAC_ERRORS);
TG3_STAT_ADD32(&sp->tx_single_collisions, MAC_TX_STATS_SINGLE_COLLISIONS);
TG3_STAT_ADD32(&sp->tx_mult_collisions, MAC_TX_STATS_MULT_COLLISIONS);
TG3_STAT_ADD32(&sp->tx_deferred, MAC_TX_STATS_DEFERRED);
TG3_STAT_ADD32(&sp->tx_excessive_collisions, MAC_TX_STATS_EXCESSIVE_COL);
TG3_STAT_ADD32(&sp->tx_late_collisions, MAC_TX_STATS_LATE_COL);
TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST);
TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST);
TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST);
TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS);
TG3_STAT_ADD32(&sp->rx_fragments, MAC_RX_STATS_FRAGMENTS);
TG3_STAT_ADD32(&sp->rx_ucast_packets, MAC_RX_STATS_UCAST);
TG3_STAT_ADD32(&sp->rx_mcast_packets, MAC_RX_STATS_MCAST);
TG3_STAT_ADD32(&sp->rx_bcast_packets, MAC_RX_STATS_BCAST);
TG3_STAT_ADD32(&sp->rx_fcs_errors, MAC_RX_STATS_FCS_ERRORS);
TG3_STAT_ADD32(&sp->rx_align_errors, MAC_RX_STATS_ALIGN_ERRORS);
TG3_STAT_ADD32(&sp->rx_xon_pause_rcvd, MAC_RX_STATS_XON_PAUSE_RECVD);
TG3_STAT_ADD32(&sp->rx_xoff_pause_rcvd, MAC_RX_STATS_XOFF_PAUSE_RECVD);
TG3_STAT_ADD32(&sp->rx_mac_ctrl_rcvd, MAC_RX_STATS_MAC_CTRL_RECVD);
TG3_STAT_ADD32(&sp->rx_xoff_entered, MAC_RX_STATS_XOFF_ENTERED);
TG3_STAT_ADD32(&sp->rx_frame_too_long_errors, MAC_RX_STATS_FRAME_TOO_LONG);
TG3_STAT_ADD32(&sp->rx_jabbers, MAC_RX_STATS_JABBERS);
TG3_STAT_ADD32(&sp->rx_undersize_packets, MAC_RX_STATS_UNDERSIZE);
}
static void tg3_timer(unsigned long __opaque) static void tg3_timer(unsigned long __opaque)
{ {
struct tg3 *tp = (struct tg3 *) __opaque; struct tg3 *tp = (struct tg3 *) __opaque;
...@@ -4451,6 +4731,9 @@ static void tg3_timer(unsigned long __opaque) ...@@ -4451,6 +4731,9 @@ static void tg3_timer(unsigned long __opaque)
return; return;
} }
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
tg3_periodic_fetch_stats(tp);
/* This part only runs once per second. */ /* This part only runs once per second. */
if (!--tp->timer_counter) { if (!--tp->timer_counter) {
if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) { if (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) {
...@@ -4902,6 +5185,13 @@ static struct net_device_stats *tg3_get_stats(struct net_device *dev) ...@@ -4902,6 +5185,13 @@ static struct net_device_stats *tg3_get_stats(struct net_device *dev)
if (!hw_stats) if (!hw_stats)
return old_stats; return old_stats;
/* On the 5705 we can't DMA the stats to memory, thus
* a timer simply keeps tp->stats uptodate with direct
* periodic reads of the statistics registers via a timer.
*/
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
return stats;
stats->rx_packets = old_stats->rx_packets + stats->rx_packets = old_stats->rx_packets +
get_stat64(&hw_stats->rx_ucast_packets) + get_stat64(&hw_stats->rx_ucast_packets) +
get_stat64(&hw_stats->rx_mcast_packets) + get_stat64(&hw_stats->rx_mcast_packets) +
...@@ -5279,6 +5569,13 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e ...@@ -5279,6 +5569,13 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
spin_lock(&tp->tx_lock); spin_lock(&tp->tx_lock);
tp->rx_pending = ering->rx_pending; tp->rx_pending = ering->rx_pending;
if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 &&
#if TG3_DO_TSO != 0
!(dev->features & NETIF_F_TSO) &&
#endif
!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH) &&
tp->rx_pending > 64)
tp->rx_pending = 64;
tp->rx_jumbo_pending = ering->rx_jumbo_pending; tp->rx_jumbo_pending = ering->rx_jumbo_pending;
tp->tx_pending = ering->tx_pending; tp->tx_pending = ering->tx_pending;
...@@ -5669,6 +5966,7 @@ static int __devinit tg3_phy_probe(struct tg3 *tp) ...@@ -5669,6 +5966,7 @@ static int __devinit tg3_phy_probe(struct tg3 *tp)
u32 nic_cfg; u32 nic_cfg;
tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg); tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg);
tp->nic_sram_data_cfg = nic_cfg;
eeprom_signature_found = 1; eeprom_signature_found = 1;
...@@ -6142,7 +6440,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) ...@@ -6142,7 +6440,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
/* Determine if TX descriptors will reside in /* Determine if TX descriptors will reside in
* main memory or in the chip SRAM. * main memory or in the chip SRAM.
*/ */
if (tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) if ((tp->tg3_flags & TG3_FLAG_PCIX_TARGET_HWBUG) != 0 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
tp->tg3_flags |= TG3_FLAG_HOST_TXDS; tp->tg3_flags |= TG3_FLAG_HOST_TXDS;
grc_misc_cfg = tr32(GRC_MISC_CFG); grc_misc_cfg = tr32(GRC_MISC_CFG);
...@@ -6154,8 +6453,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) ...@@ -6154,8 +6453,9 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
tp->split_mode_max_reqs = SPLIT_MODE_5704_MAX_REQ; tp->split_mode_max_reqs = SPLIT_MODE_5704_MAX_REQ;
} }
/* this one is limited to 10/100 only */ /* these are limited to 10/100 only */
if (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5702FE) if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 &&
(grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000))
tp->tg3_flags |= TG3_FLAG_10_100_ONLY; tp->tg3_flags |= TG3_FLAG_10_100_ONLY;
err = tg3_phy_probe(tp); err = tg3_phy_probe(tp);
...@@ -6414,8 +6714,6 @@ static int __devinit tg3_test_dma(struct tg3 *tp) ...@@ -6414,8 +6714,6 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
goto out_nofree; goto out_nofree;
} }
tw32(TG3PCI_CLOCK_CTRL, 0);
if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) == 0) { if ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) == 0) {
tp->dma_rwctrl = tp->dma_rwctrl =
(0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) | (0x7 << DMA_RWCTRL_PCI_WRITE_CMD_SHIFT) |
...@@ -6423,7 +6721,9 @@ static int __devinit tg3_test_dma(struct tg3 *tp) ...@@ -6423,7 +6721,9 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
(0x7 << DMA_RWCTRL_WRITE_WATER_SHIFT) | (0x7 << DMA_RWCTRL_WRITE_WATER_SHIFT) |
(0x7 << DMA_RWCTRL_READ_WATER_SHIFT) | (0x7 << DMA_RWCTRL_READ_WATER_SHIFT) |
(0x0f << DMA_RWCTRL_MIN_DMA_SHIFT); (0x0f << DMA_RWCTRL_MIN_DMA_SHIFT);
/* XXX 5705 note: set MIN_DMA to zero here */ if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
tp->dma_rwctrl &= ~(DMA_RWCTRL_MIN_DMA
<< DMA_RWCTRL_MIN_DMA_SHIFT);
} else { } else {
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
tp->dma_rwctrl = tp->dma_rwctrl =
...@@ -6526,6 +6826,11 @@ static int __devinit tg3_test_dma(struct tg3 *tp) ...@@ -6526,6 +6826,11 @@ static int __devinit tg3_test_dma(struct tg3 *tp)
tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl); tw32(TG3PCI_DMA_RW_CTRL, tp->dma_rwctrl);
#if 0
/* Unneeded, already done by tg3_get_invariants. */
tg3_switch_clocks(tp);
#endif
ret = 0; ret = 0;
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 && if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5700 &&
GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701) GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701)
...@@ -6630,12 +6935,35 @@ static char * __devinit tg3_phy_string(struct tg3 *tp) ...@@ -6630,12 +6935,35 @@ static char * __devinit tg3_phy_string(struct tg3 *tp)
case PHY_ID_BCM5701: return "5701"; case PHY_ID_BCM5701: return "5701";
case PHY_ID_BCM5703: return "5703"; case PHY_ID_BCM5703: return "5703";
case PHY_ID_BCM5704: return "5704"; case PHY_ID_BCM5704: return "5704";
case PHY_ID_BCM5705: return "5705";
case PHY_ID_BCM8002: return "8002"; case PHY_ID_BCM8002: return "8002";
case PHY_ID_SERDES: return "serdes"; case PHY_ID_SERDES: return "serdes";
default: return "unknown"; default: return "unknown";
}; };
} }
static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp)
{
struct pci_dev *peer = NULL;
unsigned int func;
for (func = 0; func < 7; func++) {
unsigned int devfn = tp->pdev->devfn;
devfn &= ~7;
devfn |= func;
if (devfn == tp->pdev->devfn)
continue;
peer = pci_find_slot(tp->pdev->bus->number, devfn);
if (peer)
break;
}
if (!peer || peer == tp->pdev)
BUG();
return peer;
}
static int __devinit tg3_init_one(struct pci_dev *pdev, static int __devinit tg3_init_one(struct pci_dev *pdev,
const struct pci_device_id *ent) const struct pci_device_id *ent)
{ {
...@@ -6794,6 +7122,38 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, ...@@ -6794,6 +7122,38 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
goto err_out_iounmap; goto err_out_iounmap;
} }
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
tp->bufmgr_config.mbuf_read_dma_low_water =
DEFAULT_MB_RDMA_LOW_WATER_5705;
tp->bufmgr_config.mbuf_mac_rx_low_water =
DEFAULT_MB_MACRX_LOW_WATER_5705;
tp->bufmgr_config.mbuf_high_water =
DEFAULT_MB_HIGH_WATER_5705;
}
#if TG3_DO_TSO != 0
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701 ||
tp->pci_chip_rev_id == CHIPREV_ID_5705_A0 ||
(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0)
dev->features &= ~NETIF_F_TSO;
#if 1 /* Kill this when 5705 TSO firmware added. */
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705)
dev->features &= ~NETIF_F_TSO;
#endif
#endif
if (tp->pci_chip_rev_id == CHIPREV_ID_5705_A1 &&
#if TG3_DO_TSO != 0
!(dev->features & NETIF_F_TSO) &&
#endif
!(tr32(TG3PCI_PCISTATE) & PCISTATE_BUS_SPEED_HIGH))
tp->rx_pending = 64;
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704)
tp->pdev_peer = tg3_find_5704_peer(tp);
err = tg3_get_device_address(tp); err = tg3_get_device_address(tp);
if (err) { if (err) {
printk(KERN_ERR PFX "Could not obtain valid ethernet address, " printk(KERN_ERR PFX "Could not obtain valid ethernet address, "
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
#define PCIX_CAPS_SPLIT_SHIFT 20 #define PCIX_CAPS_SPLIT_SHIFT 20
#define PCIX_CAPS_BURST_MASK 0x000c0000 #define PCIX_CAPS_BURST_MASK 0x000c0000
#define PCIX_CAPS_BURST_SHIFT 18 #define PCIX_CAPS_BURST_SHIFT 18
#define PCIX_CAPS_MAX_BURST_5704 2 #define PCIX_CAPS_MAX_BURST_CPIOB 2
#define TG3PCI_PM_CAP_PTR 0x00000041 #define TG3PCI_PM_CAP_PTR 0x00000041
#define TG3PCI_X_COMMAND 0x00000042 #define TG3PCI_X_COMMAND 0x00000042
#define TG3PCI_X_STATUS 0x00000044 #define TG3PCI_X_STATUS 0x00000044
...@@ -115,11 +115,14 @@ ...@@ -115,11 +115,14 @@
#define CHIPREV_ID_5704_A0 0x2000 #define CHIPREV_ID_5704_A0 0x2000
#define CHIPREV_ID_5704_A1 0x2001 #define CHIPREV_ID_5704_A1 0x2001
#define CHIPREV_ID_5704_A2 0x2002 #define CHIPREV_ID_5704_A2 0x2002
#define CHIPREV_ID_5705_A0 0x3000
#define CHIPREV_ID_5705_A1 0x3001
#define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12) #define GET_ASIC_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 12)
#define ASIC_REV_5700 0x07 #define ASIC_REV_5700 0x07
#define ASIC_REV_5701 0x00 #define ASIC_REV_5701 0x00
#define ASIC_REV_5703 0x01 #define ASIC_REV_5703 0x01
#define ASIC_REV_5704 0x02 #define ASIC_REV_5704 0x02
#define ASIC_REV_5705 0x03
#define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8) #define GET_CHIP_REV(CHIP_REV_ID) ((CHIP_REV_ID) >> 8)
#define CHIPREV_5700_AX 0x70 #define CHIPREV_5700_AX 0x70
#define CHIPREV_5700_BX 0x71 #define CHIPREV_5700_BX 0x71
...@@ -180,6 +183,9 @@ ...@@ -180,6 +183,9 @@
#define CLOCK_CTRL_ALTCLK 0x00001000 #define CLOCK_CTRL_ALTCLK 0x00001000
#define CLOCK_CTRL_PWRDOWN_PLL133 0x00008000 #define CLOCK_CTRL_PWRDOWN_PLL133 0x00008000
#define CLOCK_CTRL_44MHZ_CORE 0x00040000 #define CLOCK_CTRL_44MHZ_CORE 0x00040000
#define CLOCK_CTRL_625_CORE 0x00100000
#define CLOCK_CTRL_FORCE_CLKRUN 0x00200000
#define CLOCK_CTRL_CLKRUN_OENABLE 0x00400000
#define CLOCK_CTRL_DELAY_PCI_GRANT 0x80000000 #define CLOCK_CTRL_DELAY_PCI_GRANT 0x80000000
#define TG3PCI_REG_BASE_ADDR 0x00000078 #define TG3PCI_REG_BASE_ADDR 0x00000078
#define TG3PCI_MEM_WIN_BASE_ADDR 0x0000007c #define TG3PCI_MEM_WIN_BASE_ADDR 0x0000007c
...@@ -457,17 +463,89 @@ ...@@ -457,17 +463,89 @@
#define MAC_RCV_RULE_CFG 0x00000500 #define MAC_RCV_RULE_CFG 0x00000500
#define RCV_RULE_CFG_DEFAULT_CLASS 0x00000008 #define RCV_RULE_CFG_DEFAULT_CLASS 0x00000008
#define MAC_LOW_WMARK_MAX_RX_FRAME 0x00000504 #define MAC_LOW_WMARK_MAX_RX_FRAME 0x00000504
/* 0x504 --> 0x590 unused */ /* 0x508 --> 0x520 unused */
#define MAC_HASHREGU_0 0x00000520
#define MAC_HASHREGU_1 0x00000524
#define MAC_HASHREGU_2 0x00000528
#define MAC_HASHREGU_3 0x0000052c
#define MAC_EXTADDR_0_HIGH 0x00000530
#define MAC_EXTADDR_0_LOW 0x00000534
#define MAC_EXTADDR_1_HIGH 0x00000538
#define MAC_EXTADDR_1_LOW 0x0000053c
#define MAC_EXTADDR_2_HIGH 0x00000540
#define MAC_EXTADDR_2_LOW 0x00000544
#define MAC_EXTADDR_3_HIGH 0x00000548
#define MAC_EXTADDR_3_LOW 0x0000054c
#define MAC_EXTADDR_4_HIGH 0x00000550
#define MAC_EXTADDR_4_LOW 0x00000554
#define MAC_EXTADDR_5_HIGH 0x00000558
#define MAC_EXTADDR_5_LOW 0x0000055c
#define MAC_EXTADDR_6_HIGH 0x00000560
#define MAC_EXTADDR_6_LOW 0x00000564
#define MAC_EXTADDR_7_HIGH 0x00000568
#define MAC_EXTADDR_7_LOW 0x0000056c
#define MAC_EXTADDR_8_HIGH 0x00000570
#define MAC_EXTADDR_8_LOW 0x00000574
#define MAC_EXTADDR_9_HIGH 0x00000578
#define MAC_EXTADDR_9_LOW 0x0000057c
#define MAC_EXTADDR_10_HIGH 0x00000580
#define MAC_EXTADDR_10_LOW 0x00000584
#define MAC_EXTADDR_11_HIGH 0x00000588
#define MAC_EXTADDR_11_LOW 0x0000058c
#define MAC_SERDES_CFG 0x00000590 #define MAC_SERDES_CFG 0x00000590
#define MAC_SERDES_STAT 0x00000594 #define MAC_SERDES_STAT 0x00000594
/* 0x598 --> 0x600 unused */ /* 0x598 --> 0x600 unused */
#define MAC_TX_MAC_STATE_BASE 0x00000600 /* 16 bytes */ #define MAC_TX_MAC_STATE_BASE 0x00000600 /* 16 bytes */
#define MAC_RX_MAC_STATE_BASE 0x00000610 /* 20 bytes */ #define MAC_RX_MAC_STATE_BASE 0x00000610 /* 20 bytes */
/* 0x624 --> 0x800 unused */ /* 0x624 --> 0x800 unused */
#define MAC_RX_STATS_BASE 0x00000800 /* 26 32-bit words */ #define MAC_TX_STATS_OCTETS 0x00000800
/* 0x868 --> 0x880 unused */ #define MAC_TX_STATS_RESV1 0x00000804
#define MAC_TX_STATS_BASE 0x00000880 /* 28 32-bit words */ #define MAC_TX_STATS_COLLISIONS 0x00000808
/* 0x8f0 --> 0xc00 unused */ #define MAC_TX_STATS_XON_SENT 0x0000080c
#define MAC_TX_STATS_XOFF_SENT 0x00000810
#define MAC_TX_STATS_RESV2 0x00000814
#define MAC_TX_STATS_MAC_ERRORS 0x00000818
#define MAC_TX_STATS_SINGLE_COLLISIONS 0x0000081c
#define MAC_TX_STATS_MULT_COLLISIONS 0x00000820
#define MAC_TX_STATS_DEFERRED 0x00000824
#define MAC_TX_STATS_RESV3 0x00000828
#define MAC_TX_STATS_EXCESSIVE_COL 0x0000082c
#define MAC_TX_STATS_LATE_COL 0x00000830
#define MAC_TX_STATS_RESV4_1 0x00000834
#define MAC_TX_STATS_RESV4_2 0x00000838
#define MAC_TX_STATS_RESV4_3 0x0000083c
#define MAC_TX_STATS_RESV4_4 0x00000840
#define MAC_TX_STATS_RESV4_5 0x00000844
#define MAC_TX_STATS_RESV4_6 0x00000848
#define MAC_TX_STATS_RESV4_7 0x0000084c
#define MAC_TX_STATS_RESV4_8 0x00000850
#define MAC_TX_STATS_RESV4_9 0x00000854
#define MAC_TX_STATS_RESV4_10 0x00000858
#define MAC_TX_STATS_RESV4_11 0x0000085c
#define MAC_TX_STATS_RESV4_12 0x00000860
#define MAC_TX_STATS_RESV4_13 0x00000864
#define MAC_TX_STATS_RESV4_14 0x00000868
#define MAC_TX_STATS_UCAST 0x0000086c
#define MAC_TX_STATS_MCAST 0x00000870
#define MAC_TX_STATS_BCAST 0x00000874
#define MAC_TX_STATS_RESV5_1 0x00000878
#define MAC_TX_STATS_RESV5_2 0x0000087c
#define MAC_RX_STATS_OCTETS 0x00000880
#define MAC_RX_STATS_RESV1 0x00000884
#define MAC_RX_STATS_FRAGMENTS 0x00000888
#define MAC_RX_STATS_UCAST 0x0000088c
#define MAC_RX_STATS_MCAST 0x00000890
#define MAC_RX_STATS_BCAST 0x00000894
#define MAC_RX_STATS_FCS_ERRORS 0x00000898
#define MAC_RX_STATS_ALIGN_ERRORS 0x0000089c
#define MAC_RX_STATS_XON_PAUSE_RECVD 0x000008a0
#define MAC_RX_STATS_XOFF_PAUSE_RECVD 0x000008a4
#define MAC_RX_STATS_MAC_CTRL_RECVD 0x000008a8
#define MAC_RX_STATS_XOFF_ENTERED 0x000008ac
#define MAC_RX_STATS_FRAME_TOO_LONG 0x000008b0
#define MAC_RX_STATS_JABBERS 0x000008b4
#define MAC_RX_STATS_UNDERSIZE 0x000008b8
/* 0x8bc --> 0xc00 unused */
/* Send data initiator control registers */ /* Send data initiator control registers */
#define SNDDATAI_MODE 0x00000c00 #define SNDDATAI_MODE 0x00000c00
...@@ -812,13 +890,16 @@ ...@@ -812,13 +890,16 @@
#define BUFMGR_MB_POOL_ADDR 0x00004408 #define BUFMGR_MB_POOL_ADDR 0x00004408
#define BUFMGR_MB_POOL_SIZE 0x0000440c #define BUFMGR_MB_POOL_SIZE 0x0000440c
#define BUFMGR_MB_RDMA_LOW_WATER 0x00004410 #define BUFMGR_MB_RDMA_LOW_WATER 0x00004410
#define DEFAULT_MB_RDMA_LOW_WATER 0x00000040 #define DEFAULT_MB_RDMA_LOW_WATER 0x00000050
#define DEFAULT_MB_RDMA_LOW_WATER_5705 0x00000000
#define DEFAULT_MB_RDMA_LOW_WATER_JUMBO 0x00000130 #define DEFAULT_MB_RDMA_LOW_WATER_JUMBO 0x00000130
#define BUFMGR_MB_MACRX_LOW_WATER 0x00004414 #define BUFMGR_MB_MACRX_LOW_WATER 0x00004414
#define DEFAULT_MB_MACRX_LOW_WATER 0x00000020 #define DEFAULT_MB_MACRX_LOW_WATER 0x00000020
#define DEFAULT_MB_MACRX_LOW_WATER_5705 0x00000010
#define DEFAULT_MB_MACRX_LOW_WATER_JUMBO 0x00000098 #define DEFAULT_MB_MACRX_LOW_WATER_JUMBO 0x00000098
#define BUFMGR_MB_HIGH_WATER 0x00004418 #define BUFMGR_MB_HIGH_WATER 0x00004418
#define DEFAULT_MB_HIGH_WATER 0x00000060 #define DEFAULT_MB_HIGH_WATER 0x00000060
#define DEFAULT_MB_HIGH_WATER_5705 0x00000060
#define DEFAULT_MB_HIGH_WATER_JUMBO 0x0000017c #define DEFAULT_MB_HIGH_WATER_JUMBO 0x0000017c
#define BUFMGR_RX_MB_ALLOC_REQ 0x0000441c #define BUFMGR_RX_MB_ALLOC_REQ 0x0000441c
#define BUFMGR_MB_ALLOC_BIT 0x10000000 #define BUFMGR_MB_ALLOC_BIT 0x10000000
...@@ -854,6 +935,8 @@ ...@@ -854,6 +935,8 @@
#define RDMAC_MODE_LNGREAD_ENAB 0x00000200 #define RDMAC_MODE_LNGREAD_ENAB 0x00000200
#define RDMAC_MODE_SPLIT_ENABLE 0x00000800 #define RDMAC_MODE_SPLIT_ENABLE 0x00000800
#define RDMAC_MODE_SPLIT_RESET 0x00001000 #define RDMAC_MODE_SPLIT_RESET 0x00001000
#define RDMAC_MODE_FIFO_SIZE_128 0x00020000
#define RDMAC_MODE_FIFO_LONG_BURST 0x00030000
#define RDMAC_STATUS 0x00004804 #define RDMAC_STATUS 0x00004804
#define RDMAC_STATUS_TGTABORT 0x00000004 #define RDMAC_STATUS_TGTABORT 0x00000004
#define RDMAC_STATUS_MSTABORT 0x00000008 #define RDMAC_STATUS_MSTABORT 0x00000008
...@@ -877,6 +960,7 @@ ...@@ -877,6 +960,7 @@
#define WDMAC_MODE_FIFOURUN_ENAB 0x00000080 #define WDMAC_MODE_FIFOURUN_ENAB 0x00000080
#define WDMAC_MODE_FIFOOREAD_ENAB 0x00000100 #define WDMAC_MODE_FIFOOREAD_ENAB 0x00000100
#define WDMAC_MODE_LNGREAD_ENAB 0x00000200 #define WDMAC_MODE_LNGREAD_ENAB 0x00000200
#define WDMAC_MODE_RX_ACCEL 0x00000400
#define WDMAC_STATUS 0x00004c04 #define WDMAC_STATUS 0x00004c04
#define WDMAC_STATUS_TGTABORT 0x00000004 #define WDMAC_STATUS_TGTABORT 0x00000004
#define WDMAC_STATUS_MSTABORT 0x00000008 #define WDMAC_STATUS_MSTABORT 0x00000008
...@@ -1141,6 +1225,7 @@ ...@@ -1141,6 +1225,7 @@
#define GRC_MISC_CFG_BOARD_ID_5704CIOBE 0x00004000 #define GRC_MISC_CFG_BOARD_ID_5704CIOBE 0x00004000
#define GRC_MISC_CFG_BOARD_ID_5704_A2 0x00008000 #define GRC_MISC_CFG_BOARD_ID_5704_A2 0x00008000
#define GRC_MISC_CFG_BOARD_ID_AC91002A1 0x00018000 #define GRC_MISC_CFG_BOARD_ID_AC91002A1 0x00018000
#define GRC_MISC_CFG_KEEP_GPHY_POWER 0x04000000
#define GRC_LOCAL_CTRL 0x00006808 #define GRC_LOCAL_CTRL 0x00006808
#define GRC_LCLCTRL_INT_ACTIVE 0x00000001 #define GRC_LCLCTRL_INT_ACTIVE 0x00000001
#define GRC_LCLCTRL_CLEARINT 0x00000002 #define GRC_LCLCTRL_CLEARINT 0x00000002
...@@ -1275,6 +1360,7 @@ ...@@ -1275,6 +1360,7 @@
#define NIC_SRAM_DATA_CFG_WOL_ENABLE 0x00000040 #define NIC_SRAM_DATA_CFG_WOL_ENABLE 0x00000040
#define NIC_SRAM_DATA_CFG_ASF_ENABLE 0x00000080 #define NIC_SRAM_DATA_CFG_ASF_ENABLE 0x00000080
#define NIC_SRAM_DATA_CFG_EEPROM_WP 0x00000100 #define NIC_SRAM_DATA_CFG_EEPROM_WP 0x00000100
#define NIC_SRAM_DATA_CFG_MINI_PCI 0x00001000
#define NIC_SRAM_DATA_CFG_FIBER_WOL 0x00004000 #define NIC_SRAM_DATA_CFG_FIBER_WOL 0x00004000
#define NIC_SRAM_DATA_PHY_ID 0x00000b74 #define NIC_SRAM_DATA_PHY_ID 0x00000b74
...@@ -1312,6 +1398,8 @@ ...@@ -1312,6 +1398,8 @@
#define NIC_SRAM_MBUF_POOL_BASE 0x00008000 #define NIC_SRAM_MBUF_POOL_BASE 0x00008000
#define NIC_SRAM_MBUF_POOL_SIZE96 0x00018000 #define NIC_SRAM_MBUF_POOL_SIZE96 0x00018000
#define NIC_SRAM_MBUF_POOL_SIZE64 0x00010000 #define NIC_SRAM_MBUF_POOL_SIZE64 0x00010000
#define NIC_SRAM_MBUF_POOL_BASE5705 0x00010000
#define NIC_SRAM_MBUF_POOL_SIZE5705 0x0000e000
/* Currently this is fixed. */ /* Currently this is fixed. */
#define PHY_ADDR 0x01 #define PHY_ADDR 0x01
...@@ -1868,6 +1956,7 @@ struct tg3 { ...@@ -1868,6 +1956,7 @@ struct tg3 {
#define PHY_ID_BCM5701 0x60008110 #define PHY_ID_BCM5701 0x60008110
#define PHY_ID_BCM5703 0x60008160 #define PHY_ID_BCM5703 0x60008160
#define PHY_ID_BCM5704 0x60008190 #define PHY_ID_BCM5704 0x60008190
#define PHY_ID_BCM5705 0x600081a0
#define PHY_ID_BCM8002 0x60010140 #define PHY_ID_BCM8002 0x60010140
#define PHY_ID_SERDES 0xfeedbee0 #define PHY_ID_SERDES 0xfeedbee0
#define PHY_ID_INVALID 0xffffffff #define PHY_ID_INVALID 0xffffffff
...@@ -1880,6 +1969,9 @@ struct tg3 { ...@@ -1880,6 +1969,9 @@ struct tg3 {
enum phy_led_mode led_mode; enum phy_led_mode led_mode;
char board_part_number[24]; char board_part_number[24];
u32 nic_sram_data_cfg;
u32 pci_clock_ctrl;
struct pci_dev *pdev_peer;
/* This macro assumes the passed PHY ID is already masked /* This macro assumes the passed PHY ID is already masked
* with PHY_ID_MASK. * with PHY_ID_MASK.
...@@ -1888,6 +1980,7 @@ struct tg3 { ...@@ -1888,6 +1980,7 @@ struct tg3 {
((X) == PHY_ID_BCM5400 || (X) == PHY_ID_BCM5401 || \ ((X) == PHY_ID_BCM5400 || (X) == PHY_ID_BCM5401 || \
(X) == PHY_ID_BCM5411 || (X) == PHY_ID_BCM5701 || \ (X) == PHY_ID_BCM5411 || (X) == PHY_ID_BCM5701 || \
(X) == PHY_ID_BCM5703 || (X) == PHY_ID_BCM5704 || \ (X) == PHY_ID_BCM5703 || (X) == PHY_ID_BCM5704 || \
(X) == PHY_ID_BCM5705 || \
(X) == PHY_ID_BCM8002 || (X) == PHY_ID_SERDES) (X) == PHY_ID_BCM8002 || (X) == PHY_ID_SERDES)
struct tg3_hw_stats *hw_stats; struct tg3_hw_stats *hw_stats;
......
...@@ -1758,6 +1758,8 @@ ...@@ -1758,6 +1758,8 @@
#define PCI_DEVICE_ID_TIGON3_5703 0x1647 #define PCI_DEVICE_ID_TIGON3_5703 0x1647
#define PCI_DEVICE_ID_TIGON3_5704 0x1648 #define PCI_DEVICE_ID_TIGON3_5704 0x1648
#define PCI_DEVICE_ID_TIGON3_5702FE 0x164d #define PCI_DEVICE_ID_TIGON3_5702FE 0x164d
#define PCI_DEVICE_ID_TIGON3_5705 0x1653
#define PCI_DEVICE_ID_TIGON3_5705M 0x165d
#define PCI_DEVICE_ID_TIGON3_5702X 0x16a6 #define PCI_DEVICE_ID_TIGON3_5702X 0x16a6
#define PCI_DEVICE_ID_TIGON3_5703X 0x16a7 #define PCI_DEVICE_ID_TIGON3_5703X 0x16a7
#define PCI_DEVICE_ID_TIGON3_5704S 0x16a8 #define PCI_DEVICE_ID_TIGON3_5704S 0x16a8
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment