iPXE
Enumerations | Functions | Variables
skge.c File Reference
#include <stdint.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/iobuf.h>
#include <ipxe/malloc.h>
#include <ipxe/pci.h>
#include "skge.h"

Go to the source code of this file.

Enumerations

enum  led_mode {
  LED_MODE_OFF, LED_MODE_ON, LED_MODE_TST, MO_LED_NORM = 0,
  MO_LED_BLINK = 1, MO_LED_OFF = 2, MO_LED_ON = 3
}
 

Functions

 FILE_LICENCE (GPL2_ONLY)
 
static int skge_up (struct net_device *dev)
 
static void skge_down (struct net_device *dev)
 
static void skge_tx_clean (struct net_device *dev)
 
static int xm_phy_write (struct skge_hw *hw, int port, u16 reg, u16 val)
 
static int gm_phy_write (struct skge_hw *hw, int port, u16 reg, u16 val)
 
static void yukon_init (struct skge_hw *hw, int port)
 
static void genesis_mac_init (struct skge_hw *hw, int port)
 
static void genesis_link_up (struct skge_port *skge)
 
static void skge_phyirq (struct skge_hw *hw)
 
static void skge_poll (struct net_device *dev)
 
static int skge_xmit_frame (struct net_device *dev, struct io_buffer *iob)
 
static void skge_net_irq (struct net_device *dev, int enable)
 
static void skge_rx_refill (struct net_device *dev)
 
static u32 skge_supported_modes (const struct skge_hw *hw)
 
static u32 hwkhz (const struct skge_hw *hw)
 
static u32 skge_usecs2clk (const struct skge_hw *hw, u32 usec)
 
static void skge_led (struct skge_port *skge, enum led_mode mode)
 
static int skge_ring_alloc (struct skge_ring *ring, void *vaddr, u32 base, size_t num)
 
static void skge_rx_setup (struct skge_port *skge __unused, struct skge_element *e, struct io_buffer *iob, unsigned int bufsize)
 
static void skge_rx_reuse (struct skge_element *e, unsigned int size)
 
static void skge_rx_clean (struct skge_port *skge)
 
static void skge_link_up (struct skge_port *skge)
 
static void skge_link_down (struct skge_port *skge)
 
static void xm_link_down (struct skge_hw *hw, int port)
 
static int __xm_phy_read (struct skge_hw *hw, int port, u16 reg, u16 *val)
 
static u16 xm_phy_read (struct skge_hw *hw, int port, u16 reg)
 
static void genesis_init (struct skge_hw *hw)
 
static void genesis_reset (struct skge_hw *hw, int port)
 
static void bcom_check_link (struct skge_hw *hw, int port)
 
static void bcom_phy_init (struct skge_port *skge)
 
static void xm_phy_init (struct skge_port *skge)
 
static int xm_check_link (struct net_device *dev)
 
static void xm_link_timer (struct skge_port *skge)
 
static void genesis_stop (struct skge_port *skge)
 
static void bcom_phy_intr (struct skge_port *skge)
 
static int __gm_phy_read (struct skge_hw *hw, int port, u16 reg, u16 *val)
 
static u16 gm_phy_read (struct skge_hw *hw, int port, u16 reg)
 
static void yukon_reset (struct skge_hw *hw, int port)
 
static int is_yukon_lite_a0 (struct skge_hw *hw)
 
static void yukon_mac_init (struct skge_hw *hw, int port)
 
static void yukon_suspend (struct skge_hw *hw, int port)
 
static void yukon_stop (struct skge_port *skge)
 
static u16 yukon_speed (const struct skge_hw *hw __unused, u16 aux)
 
static void yukon_link_up (struct skge_port *skge)
 
static void yukon_link_down (struct skge_port *skge)
 
static void yukon_phy_intr (struct skge_port *skge)
 
static void skge_ramset (struct skge_hw *hw, u16 q, u32 start, size_t len)
 
static void skge_qset (struct skge_port *skge, u16 q, const struct skge_element *e)
 
void skge_free (struct net_device *dev)
 
static void skge_rx_stop (struct skge_hw *hw, int port)
 
static int skge_tx_avail (const struct skge_ring *ring)
 
static u16 phy_length (const struct skge_hw *hw, u32 status)
 
static int bad_phy_status (const struct skge_hw *hw, u32 status)
 
static void skge_tx_done (struct net_device *dev)
 
static void skge_rx_done (struct net_device *dev)
 
static const char * skge_board_name (const struct skge_hw *hw)
 
static int skge_reset (struct skge_hw *hw)
 
static struct net_deviceskge_devinit (struct skge_hw *hw, int port, int highmem __unused)
 
static void skge_show_addr (struct net_device *dev)
 
static int skge_probe (struct pci_device *pdev)
 
static void skge_remove (struct pci_device *pdev)
 

Variables

static struct pci_device_id skge_id_table []
 
static struct net_device_operations skge_operations
 
static const int txqaddr [] = { Q_XA1, Q_XA2 }
 
static const int rxqaddr [] = { Q_R1, Q_R2 }
 
static const u32 portmask [] = { IS_PORT_1, IS_PORT_2 }
 
static const u16 phy_pause_map []
 
static const u16 fiber_pause_map []
 
struct {
   u8   id
 
   const char *   name
 
skge_chips []
 
struct pci_driver skge_driver __pci_driver
 

Enumeration Type Documentation

◆ led_mode

enum led_mode
Enumerator
LED_MODE_OFF 
LED_MODE_ON 
LED_MODE_TST 
MO_LED_NORM 
MO_LED_BLINK 
MO_LED_OFF 
MO_LED_ON 

Definition at line 132 of file skge.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_ONLY  )

◆ skge_up()

static int skge_up ( struct net_device dev)
static

Definition at line 1707 of file skge.c.

1708 {
1709  struct skge_port *skge = dev->priv;
1710  struct skge_hw *hw = skge->hw;
1711  int port = skge->port;
1712  u32 chunk, ram_addr;
1713  int err;
1714 
1715  DBG2(PFX "%s: enabling interface\n", dev->name);
1716 
1718  skge->dma = virt_to_bus(skge->mem);
1719  if (!skge->mem)
1720  return -ENOMEM;
1721  memset(skge->mem, 0, RING_SIZE);
1722 
1723  assert(!(skge->dma & 7));
1724 
1725  /* FIXME: find out whether 64 bit iPXE will be loaded > 4GB */
1726  if ((u64)skge->dma >> 32 != ((u64) skge->dma + RING_SIZE) >> 32) {
1727  DBG(PFX "pci_alloc_consistent region crosses 4G boundary\n");
1728  err = -EINVAL;
1729  goto err;
1730  }
1731 
1732  err = skge_ring_alloc(&skge->rx_ring, skge->mem, skge->dma, NUM_RX_DESC);
1733  if (err)
1734  goto err;
1735 
1736  /* this call relies on e->iob and d->control to be 0
1737  * This is assured by calling memset() on skge->mem and using zalloc()
1738  * for the skge_element structures.
1739  */
1741 
1742  err = skge_ring_alloc(&skge->tx_ring, skge->mem + RX_RING_SIZE,
1743  skge->dma + RX_RING_SIZE, NUM_TX_DESC);
1744  if (err)
1745  goto err;
1746 
1747  /* Initialize MAC */
1748  if (hw->chip_id == CHIP_ID_GENESIS)
1750  else
1752 
1753  /* Configure RAMbuffers - equally between ports and tx/rx */
1754  chunk = (hw->ram_size - hw->ram_offset) / (hw->ports * 2);
1755  ram_addr = hw->ram_offset + 2 * chunk * port;
1756 
1757  skge_ramset(hw, rxqaddr[port], ram_addr, chunk);
1758  skge_qset(skge, rxqaddr[port], skge->rx_ring.to_clean);
1759 
1760  assert(!(skge->tx_ring.to_use != skge->tx_ring.to_clean));
1761  skge_ramset(hw, txqaddr[port], ram_addr+chunk, chunk);
1762  skge_qset(skge, txqaddr[port], skge->tx_ring.to_use);
1763 
1764  /* Start receiver BMU */
1765  wmb();
1767  skge_led(skge, LED_MODE_ON);
1768 
1769  hw->intr_mask |= portmask[port];
1770  skge_write32(hw, B0_IMSK, hw->intr_mask);
1771 
1772  return 0;
1773 
1774  err:
1775  skge_rx_clean(skge);
1776  skge_free(dev);
1777 
1778  return err;
1779 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
int port
Definition: skge.h:2498
wmb()
static const u32 portmask[]
Definition: skge.c:87
struct net_device * dev[2]
Definition: skge.h:2464
static void yukon_mac_init(struct skge_hw *hw, int port)
Definition: skge.c:1326
static void *__malloc malloc_phys(size_t size, size_t phys_align)
Allocate memory with specified physical alignment.
Definition: malloc.h:62
struct skge_ring tx_ring
Definition: skge.h:2500
Definition: skge.h:523
#define SKGE_RING_ALIGN
Definition: skge.h:26
Definition: hw.c:16
#define NUM_RX_DESC
Definition: igbvf.h:281
struct skge_hw * hw
Definition: skge.h:2496
u32 dma
Definition: skge.h:2511
#define ENOMEM
Not enough space.
Definition: errno.h:534
Definition: skge.h:82
u8 port
Port number.
Definition: CIB_PRM.h:31
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
void * priv
Driver private data.
Definition: netdevice.h:431
uint64_t u64
Definition: stdint.h:25
#define RING_SIZE
Definition: skge.h:32
#define PFX
Definition: sis190.h:34
static void skge_rx_clean(struct skge_port *skge)
Definition: skge.c:378
static const int rxqaddr[]
Definition: skge.c:86
struct skge_element * to_clean
Definition: skge.h:2454
Definition: skge.h:2460
static void skge_qset(struct skge_port *skge, u16 q, const struct skge_element *e)
Definition: skge.c:1675
struct skge_ring rx_ring
Definition: skge.h:2501
#define RX_RING_SIZE
Definition: 3c515.c:87
static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, size_t len)
Definition: skge.c:1644
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u32 base, size_t num)
Definition: skge.c:311
void skge_free(struct net_device *dev)
Definition: skge.c:1692
void * mem
Definition: skge.h:2510
#define Q_ADDR(reg, offs)
Definition: skge.h:534
static const int txqaddr[]
Definition: skge.c:85
static void skge_rx_refill(struct net_device *dev)
Definition: skge.c:1962
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
static void skge_led(struct skge_port *skge, enum led_mode mode)
Definition: skge.c:133
#define NUM_TX_DESC
Definition: igbvf.h:280
struct skge_element * to_use
Definition: skge.h:2455
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
uint32_t u32
Definition: stdint.h:23
static void genesis_mac_init(struct skge_hw *hw, int port)
Definition: skge.c:852
#define DBG2(...)
Definition: compiler.h:515
void * memset(void *dest, int character, size_t len) __nonnull
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References assert(), B0_IMSK, CHIP_ID_GENESIS, CSR_IRQ_CL_F, CSR_START, DBG, DBG2, skge_hw::dev, skge_port::dma, EINVAL, ENOMEM, genesis_mac_init(), skge_port::hw, LED_MODE_ON, malloc_phys(), skge_port::mem, memset(), net_device::name, NUM_RX_DESC, NUM_TX_DESC, PFX, port, skge_port::port, portmask, net_device::priv, Q_ADDR, Q_CSR, RING_SIZE, skge_port::rx_ring, RX_RING_SIZE, rxqaddr, skge_free(), skge_led(), skge_qset(), skge_ramset(), SKGE_RING_ALIGN, skge_ring_alloc(), skge_rx_clean(), skge_rx_refill(), skge_write32(), skge_write8(), skge_ring::to_clean, skge_ring::to_use, skge_port::tx_ring, txqaddr, virt_to_bus(), wmb(), and yukon_mac_init().

◆ skge_down()

static void skge_down ( struct net_device dev)
static

Definition at line 1790 of file skge.c.

1791 {
1792  struct skge_port *skge = dev->priv;
1793  struct skge_hw *hw = skge->hw;
1794  int port = skge->port;
1795 
1796  if (skge->mem == NULL)
1797  return;
1798 
1799  DBG2(PFX "%s: disabling interface\n", dev->name);
1800 
1801  if (hw->chip_id == CHIP_ID_GENESIS && hw->phy_type == SK_PHY_XMAC)
1802  skge->use_xm_link_timer = 0;
1803 
1805 
1806  hw->intr_mask &= ~portmask[port];
1807  skge_write32(hw, B0_IMSK, hw->intr_mask);
1808 
1809  skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG), LED_OFF);
1810  if (hw->chip_id == CHIP_ID_GENESIS)
1811  genesis_stop(skge);
1812  else
1813  yukon_stop(skge);
1814 
1815  /* Stop transmitter */
1819 
1820 
1821  /* Disable Force Sync bit and Enable Alloc bit */
1824 
1825  /* Stop Interval Timer and Limit Counter of Tx Arbiter */
1828 
1829  /* Reset PCI FIFO */
1832 
1833  /* Reset the RAM Buffer async Tx queue */
1835 
1836  skge_rx_stop(hw, port);
1837 
1838  if (hw->chip_id == CHIP_ID_GENESIS) {
1841  } else {
1844  }
1845 
1846  skge_led(skge, LED_MODE_OFF);
1847 
1848  skge_tx_clean(dev);
1849 
1850  skge_rx_clean(skge);
1851 
1852  skge_free(dev);
1853  return;
1854 }
int port
Definition: skge.h:2498
static const u32 portmask[]
Definition: skge.c:87
struct net_device * dev[2]
Definition: skge.h:2464
Definition: skge.h:550
int use_xm_link_timer
Definition: skge.h:2512
static void yukon_stop(struct skge_port *skge)
Definition: skge.c:1492
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:230
Definition: skge.h:523
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
Definition: skge.h:782
#define RB_ADDR(offs, queue)
Definition: skge.h:590
Definition: skge.h:82
u8 port
Port number.
Definition: CIB_PRM.h:31
void * priv
Driver private data.
Definition: netdevice.h:431
Definition: skge.h:496
#define PFX
Definition: sis190.h:34
static void skge_rx_clean(struct skge_port *skge)
Definition: skge.c:378
Definition: skge.h:2460
#define SK_REG(port, reg)
Definition: skge.h:2548
static void skge_rx_stop(struct skge_hw *hw, int port)
Definition: skge.c:1782
static void genesis_stop(struct skge_port *skge)
Definition: skge.c:998
Definition: skge.h:560
static void skge_tx_clean(struct net_device *dev)
Definition: skge.c:1909
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
void skge_free(struct net_device *dev)
Definition: skge.c:1692
void * mem
Definition: skge.h:2510
#define Q_ADDR(reg, offs)
Definition: skge.h:534
static const int txqaddr[]
Definition: skge.c:85
Definition: skge.h:719
Definition: skge.h:562
#define CSR_SET_RESET
Definition: skge.h:790
static void skge_led(struct skge_port *skge, enum led_mode mode)
Definition: skge.c:133
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
#define DBG2(...)
Definition: compiler.h:515
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References B0_IMSK, CHIP_ID_GENESIS, CSR_SET_RESET, CSR_STOP, DBG2, skge_hw::dev, genesis_stop(), GMF_RST_SET, skge_port::hw, LED_MODE_OFF, LED_OFF, LNK_LED_REG, skge_port::mem, MFF_RST_SET, net_device::name, netdev_link_down(), NULL, PFX, port, skge_port::port, portmask, net_device::priv, Q_ADDR, Q_CSR, Q_XA1, Q_XA2, RB_ADDR, RB_CTRL, RB_DIS_OP_MD, RB_RST_SET, RX_GMF_CTRL_T, RX_MFF_CTRL2, SK_PHY_XMAC, SK_REG, skge_free(), skge_led(), skge_rx_clean(), skge_rx_stop(), skge_tx_clean(), skge_write32(), skge_write8(), TX_GMF_CTRL_T, TX_MFF_CTRL2, TXA_CTRL, TXA_DIS_ALLOC, TXA_DIS_FSYNC, TXA_ITI_INI, TXA_LIM_INI, TXA_STOP_RC, txqaddr, skge_port::use_xm_link_timer, and yukon_stop().

◆ skge_tx_clean()

static void skge_tx_clean ( struct net_device dev)
static

Definition at line 1909 of file skge.c.

1910 {
1911  struct skge_port *skge = dev->priv;
1912  struct skge_element *e;
1913 
1914  for (e = skge->tx_ring.to_clean; e != skge->tx_ring.to_use; e = e->next) {
1915  struct skge_tx_desc *td = e->desc;
1916  td->control = 0;
1917  }
1918 
1919  skge->tx_ring.to_clean = e;
1920 }
struct skge_ring tx_ring
Definition: skge.h:2500
uint32_t e
Definition: sha1.c:32
void * priv
Driver private data.
Definition: netdevice.h:431
struct skge_element * to_clean
Definition: skge.h:2454
struct skge_element * to_use
Definition: skge.h:2455
u32 control
Definition: skge.h:2436

References skge_tx_desc::control, e, net_device::priv, skge_ring::to_clean, skge_ring::to_use, and skge_port::tx_ring.

Referenced by skge_down().

◆ xm_phy_write()

static int xm_phy_write ( struct skge_hw hw,
int  port,
u16  reg,
u16  val 
)
static

Definition at line 458 of file skge.c.

459 {
460  int i;
461 
462  xm_write16(hw, port, XM_PHY_ADDR, reg | hw->phy_addr);
463  for (i = 0; i < PHY_RETRIES; i++) {
465  goto ready;
466  udelay(1);
467  }
468  return -EIO;
469 
470  ready:
472  for (i = 0; i < PHY_RETRIES; i++) {
474  return 0;
475  udelay(1);
476  }
477  return -ETIMEDOUT;
478 }
static u16 xm_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2560
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static unsigned int unsigned int reg
Definition: myson.h:162
#define PHY_RETRIES
Definition: skge.h:28
Definition: hw.c:16
u8 port
Port number.
Definition: CIB_PRM.h:31
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:60
void __asmcall int val
Definition: setjmp.h:28
#define EIO
Input/output error.
Definition: errno.h:433
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References EIO, ETIMEDOUT, PHY_RETRIES, port, reg, udelay(), val, XM_MMU_CMD, XM_MMU_PHY_BUSY, XM_PHY_ADDR, XM_PHY_DATA, xm_read16(), and xm_write16().

Referenced by bcom_phy_init(), bcom_phy_intr(), genesis_link_up(), skge_led(), and xm_phy_init().

◆ gm_phy_write()

static int gm_phy_write ( struct skge_hw hw,
int  port,
u16  reg,
u16  val 
)
static

Definition at line 1159 of file skge.c.

1160 {
1161  int i;
1162 
1165  GM_SMI_CT_PHY_AD(hw->phy_addr) | GM_SMI_CT_REG_AD(reg));
1166  for (i = 0; i < PHY_RETRIES; i++) {
1167  udelay(1);
1168 
1170  return 0;
1171  }
1172 
1173  DBG(PFX "%s: phy write timeout port %x reg %x val %x\n",
1174  hw->dev[port]->name,
1175  port, reg, val);
1176  return -EIO;
1177 }
static void gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2607
static unsigned int unsigned int reg
Definition: myson.h:162
#define GM_SMI_CT_PHY_AD(x)
Definition: skge.h:1869
#define PHY_RETRIES
Definition: skge.h:28
Definition: hw.c:16
u8 port
Port number.
Definition: CIB_PRM.h:31
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:60
#define PFX
Definition: sis190.h:34
void __asmcall int val
Definition: setjmp.h:28
static u16 gma_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2596
#define EIO
Input/output error.
Definition: errno.h:433
#define GM_SMI_CT_REG_AD(x)
Definition: skge.h:1870
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References DBG, EIO, GM_SMI_CT_BUSY, GM_SMI_CT_PHY_AD, GM_SMI_CT_REG_AD, GM_SMI_CTRL, GM_SMI_DATA, gma_read16(), gma_write16(), PFX, PHY_RETRIES, port, reg, udelay(), and val.

Referenced by skge_led(), yukon_init(), yukon_link_down(), yukon_link_up(), yukon_reset(), and yukon_suspend().

◆ yukon_init()

static void yukon_init ( struct skge_hw hw,
int  port 
)
static

Definition at line 1210 of file skge.c.

1211 {
1212  struct skge_port *skge = hw->dev[port]->priv;
1213  u16 ctrl, ct1000, adv;
1214 
1215  if (skge->autoneg == AUTONEG_ENABLE) {
1217 
1218  ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK |
1221 
1222  ectrl |= PHY_M_EC_M_DSC(0) | PHY_M_EC_S_DSC(1);
1223 
1225  }
1226 
1228  if (skge->autoneg == AUTONEG_DISABLE)
1229  ctrl &= ~PHY_CT_ANE;
1230 
1231  ctrl |= PHY_CT_RESET;
1233 
1234  ctrl = 0;
1235  ct1000 = 0;
1236  adv = PHY_AN_CSMA;
1237 
1238  if (skge->autoneg == AUTONEG_ENABLE) {
1239  if (hw->copper) {
1241  ct1000 |= PHY_M_1000C_AFD;
1243  ct1000 |= PHY_M_1000C_AHD;
1245  adv |= PHY_M_AN_100_FD;
1247  adv |= PHY_M_AN_100_HD;
1249  adv |= PHY_M_AN_10_FD;
1251  adv |= PHY_M_AN_10_HD;
1252 
1253  /* Set Flow-control capabilities */
1254  adv |= phy_pause_map[skge->flow_control];
1255  } else {
1257  adv |= PHY_M_AN_1000X_AFD;
1259  adv |= PHY_M_AN_1000X_AHD;
1260 
1261  adv |= fiber_pause_map[skge->flow_control];
1262  }
1263 
1264  /* Restart Auto-negotiation */
1266  } else {
1267  /* forced speed/duplex settings */
1268  ct1000 = PHY_M_1000C_MSE;
1269 
1270  if (skge->duplex == DUPLEX_FULL)
1271  ctrl |= PHY_CT_DUP_MD;
1272 
1273  switch (skge->speed) {
1274  case SPEED_1000:
1275  ctrl |= PHY_CT_SP1000;
1276  break;
1277  case SPEED_100:
1278  ctrl |= PHY_CT_SP100;
1279  break;
1280  }
1281 
1282  ctrl |= PHY_CT_RESET;
1283  }
1284 
1286 
1289 
1290  /* Enable phy interrupt on autonegotiation complete (or link up) */
1291  if (skge->autoneg == AUTONEG_ENABLE)
1293  else
1295 }
#define SPEED_1000
Definition: atl1e.h:52
uint16_t u16
Definition: stdint.h:21
u32 advertising
Definition: skge.h:2508
#define ADVERTISED_100baseT_Half
Definition: bnx2.h:44
#define AUTONEG_ENABLE
Definition: bnx2.h:4584
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
#define ADVERTISED_1000baseT_Half
Definition: bnx2.h:46
#define SPEED_100
Definition: atl1e.h:51
u8 port
Port number.
Definition: CIB_PRM.h:31
static const u16 fiber_pause_map[]
Definition: skge.c:544
#define PHY_M_EC_M_DSC(x)
Definition: skge.h:1504
#define PHY_M_EC_S_DSC(x)
Definition: skge.h:1505
#define DUPLEX_FULL
Definition: bnx2.h:111
u8 autoneg
Definition: skge.h:2505
static u16 gm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:1199
enum pause_control flow_control
Definition: skge.h:2503
u8 ctrl
Definition: sky2.h:10
static int gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:1159
#define ADVERTISED_10baseT_Full
Definition: bnx2.h:43
#define AUTONEG_DISABLE
Definition: bnx2.h:4583
#define PHY_M_EC_MAC_S(x)
Definition: skge.h:1506
u16 speed
Definition: skge.h:2507
#define ADVERTISED_1000baseT_Full
Definition: bnx2.h:47
#define ADVERTISED_100baseT_Full
Definition: bnx2.h:45
#define ADVERTISED_10baseT_Half
Definition: bnx2.h:42
static const u16 phy_pause_map[]
Definition: skge.c:536

References ADVERTISED_1000baseT_Full, ADVERTISED_1000baseT_Half, ADVERTISED_100baseT_Full, ADVERTISED_100baseT_Half, ADVERTISED_10baseT_Full, ADVERTISED_10baseT_Half, skge_port::advertising, skge_port::autoneg, AUTONEG_DISABLE, AUTONEG_ENABLE, ctrl, skge_port::duplex, DUPLEX_FULL, fiber_pause_map, skge_port::flow_control, gm_phy_read(), gm_phy_write(), MAC_TX_CLK_25_MHZ, PHY_AN_CSMA, PHY_CT_ANE, PHY_CT_DUP_MD, PHY_CT_RE_CFG, PHY_CT_RESET, PHY_CT_SP100, PHY_CT_SP1000, PHY_M_1000C_AFD, PHY_M_1000C_AHD, PHY_M_1000C_MSE, PHY_M_AN_1000X_AFD, PHY_M_AN_1000X_AHD, PHY_M_AN_100_FD, PHY_M_AN_100_HD, PHY_M_AN_10_FD, PHY_M_AN_10_HD, PHY_M_EC_M_DSC, PHY_M_EC_M_DSC_MSK, PHY_M_EC_MAC_S, PHY_M_EC_MAC_S_MSK, PHY_M_EC_S_DSC, PHY_M_EC_S_DSC_MSK, PHY_M_IS_AN_MSK, PHY_M_IS_DEF_MSK, PHY_MARV_1000T_CTRL, PHY_MARV_AUNE_ADV, PHY_MARV_CTRL, PHY_MARV_EXT_CTRL, PHY_MARV_INT_MASK, phy_pause_map, port, skge_port::speed, SPEED_100, and SPEED_1000.

Referenced by yukon_link_down(), and yukon_mac_init().

◆ genesis_mac_init()

static void genesis_mac_init ( struct skge_hw hw,
int  port 
)
static

Definition at line 852 of file skge.c.

853 {
854  struct net_device *dev = hw->dev[port];
855  struct skge_port *skge = dev->priv;
856  int i;
857  u32 r;
858  const u8 zero[6] = { 0 };
859 
860  for (i = 0; i < 10; i++) {
864  goto reset_ok;
865  udelay(1);
866  }
867 
868  DBG(PFX "%s: genesis reset failed\n", dev->name);
869 
870  reset_ok:
871  /* Unreset the XMAC. */
873 
874  /*
875  * Perform additional initialization for external PHYs,
876  * namely for the 1000baseTX cards that use the XMAC's
877  * GMII mode.
878  */
879  if (hw->phy_type != SK_PHY_XMAC) {
880  /* Take external Phy out of reset */
881  r = skge_read32(hw, B2_GP_IO);
882  if (port == 0)
883  r |= GP_DIR_0|GP_IO_0;
884  else
885  r |= GP_DIR_2|GP_IO_2;
886 
888 
889  /* Enable GMII interface */
891  }
892 
893 
894  switch(hw->phy_type) {
895  case SK_PHY_XMAC:
896  xm_phy_init(skge);
897  break;
898  case SK_PHY_BCOM:
899  bcom_phy_init(skge);
901  }
902 
903  /* Set Station Address */
904  xm_outaddr(hw, port, XM_SA, dev->ll_addr);
905 
906  /* We don't use match addresses so clear */
907  for (i = 1; i < 16; i++)
908  xm_outaddr(hw, port, XM_EXM(i), zero);
909 
910  /* Clear MIB counters */
913  /* Clear two times according to Errata #3 */
916 
917  /* configure Rx High Water Mark (XM_RX_HI_WM) */
918  xm_write16(hw, port, XM_RX_HI_WM, 1450);
919 
920  /* We don't need the FCS appended to the packet. */
922 
923  if (skge->duplex == DUPLEX_HALF) {
924  /*
925  * If in manual half duplex mode the other side might be in
926  * full duplex mode, so ignore if a carrier extension is not seen
927  * on frames received
928  */
929  r |= XM_RX_DIS_CEXT;
930  }
932 
933  /* We want short frames padded to 60 bytes. */
935 
936  xm_write16(hw, port, XM_TX_THR, 512);
937 
938  /*
939  * Enable the reception of all error frames. This is is
940  * a necessary evil due to the design of the XMAC. The
941  * XMAC's receive FIFO is only 8K in size, however jumbo
942  * frames can be up to 9000 bytes in length. When bad
943  * frame filtering is enabled, the XMAC's RX FIFO operates
944  * in 'store and forward' mode. For this to work, the
945  * entire frame has to fit into the FIFO, but that means
946  * that jumbo frames larger than 8192 bytes will be
947  * truncated. Disabling all bad frame filtering causes
948  * the RX FIFO to operate in streaming mode, in which
949  * case the XMAC will start transferring frames out of the
950  * RX FIFO as soon as the FIFO threshold is reached.
951  */
953 
954 
955  /*
956  * Initialize the Receive Counter Event Mask (XM_RX_EV_MSK)
957  * - Enable all bits excepting 'Octets Rx OK Low CntOv'
958  * and 'Octets Rx OK Hi Cnt Ov'.
959  */
961 
962  /*
963  * Initialize the Transmit Counter Event Mask (XM_TX_EV_MSK)
964  * - Enable all bits excepting 'Octets Tx OK Low CntOv'
965  * and 'Octets Tx OK Hi Cnt Ov'.
966  */
968 
969  /* Configure MAC arbiter */
971 
972  /* configure timeout values */
977 
982 
983  /* Configure Rx MAC FIFO */
987 
988  /* Configure Tx MAC FIFO */
992 
993  /* enable timeout timers */
995  (port == 0) ? PA_ENA_TO_TX1 : PA_ENA_TO_TX2);
996 }
Definition: skge.h:2094
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static void xm_write32(const struct skge_hw *hw, int port, int r, u32 v)
Definition: skge.h:2565
u8 duplex
Definition: skge.h:2506
uint32_t zero
Must be zero.
Definition: ntlm.h:24
static void bcom_check_link(struct skge_hw *hw, int port)
Definition: skge.c:553
Definition: hw.c:16
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
u8 port
Port number.
Definition: CIB_PRM.h:31
Definition: skge.h:367
void * priv
Driver private data.
Definition: netdevice.h:431
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:60
static void bcom_phy_init(struct skge_port *skge)
Definition: skge.c:621
#define PFX
Definition: sis190.h:34
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
#define XMR_DEF_MSK
Definition: skge.h:2386
A network device.
Definition: netdevice.h:352
static void xm_outaddr(const struct skge_hw *hw, int port, int reg, const u8 *addr)
Definition: skge.h:2585
#define SK_REG(port, reg)
Definition: skge.h:2548
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
Definition: skge.h:358
Definition: skge.h:2100
Definition: skge.h:369
#define XM_EXM(reg)
Definition: skge.h:2089
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
Definition: skge.h:356
#define XM_DEF_MODE
Definition: skge.h:2337
Definition: skge.h:128
static void xm_phy_init(struct skge_port *skge)
Definition: skge.c:718
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:387
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
uint8_t u8
Definition: stdint.h:19
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
uint32_t u32
Definition: stdint.h:23
static u16 skge_read16(const struct skge_hw *hw, int reg)
Definition: skge.h:2522
#define DUPLEX_HALF
Definition: bnx2.h:110
#define XMT_DEF_MSK
Definition: skge.h:2420
static const uint8_t r[3][4]
MD4 shift amounts.
Definition: md4.c:53
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References B2_GP_IO, B3_MA_RCINI_RX1, B3_MA_RCINI_RX2, B3_MA_RCINI_TX1, B3_MA_RCINI_TX2, B3_MA_TO_CTRL, B3_MA_TOINI_RX1, B3_MA_TOINI_RX2, B3_MA_TOINI_TX1, B3_MA_TOINI_TX2, B3_PA_CTRL, bcom_check_link(), bcom_phy_init(), DBG, net_device::dev, skge_port::duplex, DUPLEX_HALF, GP_DIR_0, GP_DIR_2, GP_IO_0, GP_IO_2, net_device::ll_addr, MA_RST_CLR, MFF_CLR_MAC_RST, MFF_ENA_OP_MD, MFF_ENA_TIM_PAT, MFF_RST_CLR, MFF_SET_MAC_RST, MFF_TX_CTRL_DEF, net_device::name, PA_ENA_TO_TX1, PA_ENA_TO_TX2, PFX, port, net_device::priv, r, RX_MFF_CTRL1, RX_MFF_CTRL2, SK_PHY_BCOM, SK_PHY_XMAC, SK_REG, skge_read16(), skge_read32(), skge_write16(), skge_write32(), skge_write8(), TX_MFF_CTRL1, TX_MFF_CTRL2, udelay(), XM_DEF_MODE, XM_EXM, XM_HW_CFG, XM_HW_GMII_MD, XM_MODE, xm_outaddr(), xm_phy_init(), XM_RX_CMD, XM_RX_DIS_CEXT, XM_RX_EV_MSK, XM_RX_HI_WM, XM_RX_LENERR_OK, XM_RX_STRIP_FCS, XM_SA, XM_SC_CLR_RXC, XM_SC_CLR_TXC, XM_STAT_CMD, XM_TX_AUTO_PAD, XM_TX_CMD, XM_TX_EV_MSK, XM_TX_THR, xm_write16(), xm_write32(), XMR_DEF_MSK, XMT_DEF_MSK, and zero.

Referenced by skge_up().

◆ genesis_link_up()

static void genesis_link_up ( struct skge_port skge)
static

Definition at line 1045 of file skge.c.

1046 {
1047  struct skge_hw *hw = skge->hw;
1048  int port = skge->port;
1049  u16 cmd, msk;
1050  u32 mode;
1051 
1053 
1054  /*
1055  * enabling pause frame reception is required for 1000BT
1056  * because the XMAC is not reset if the link is going down
1057  */
1058  if (skge->flow_status == FLOW_STAT_NONE ||
1060  /* Disable Pause Frame Reception */
1061  cmd |= XM_MMU_IGN_PF;
1062  else
1063  /* Enable Pause Frame Reception */
1064  cmd &= ~XM_MMU_IGN_PF;
1065 
1067 
1068  mode = xm_read32(hw, port, XM_MODE);
1069  if (skge->flow_status== FLOW_STAT_SYMMETRIC ||
1070  skge->flow_status == FLOW_STAT_LOC_SEND) {
1071  /*
1072  * Configure Pause Frame Generation
1073  * Use internal and external Pause Frame Generation.
1074  * Sending pause frames is edge triggered.
1075  * Send a Pause frame with the maximum pause time if
1076  * internal oder external FIFO full condition occurs.
1077  * Send a zero pause time frame to re-start transmission.
1078  */
1079  /* XM_PAUSE_DA = '010000C28001' (default) */
1080  /* XM_MAC_PTIME = 0xffff (maximum) */
1081  /* remember this value is defined in big endian (!) */
1082  xm_write16(hw, port, XM_MAC_PTIME, 0xffff);
1083 
1084  mode |= XM_PAUSE_MODE;
1086  } else {
1087  /*
1088  * disable pause frame generation is required for 1000BT
1089  * because the XMAC is not reset if the link is going down
1090  */
1091  /* Disable Pause Mode in Mode Register */
1092  mode &= ~XM_PAUSE_MODE;
1093 
1095  }
1096 
1097  xm_write32(hw, port, XM_MODE, mode);
1098 
1099  /* Turn on detection of Tx underrun */
1100  msk = xm_read16(hw, port, XM_IMSK);
1101  msk &= ~XM_IS_TXF_UR;
1102  xm_write16(hw, port, XM_IMSK, msk);
1103 
1104  xm_read16(hw, port, XM_ISRC);
1105 
1106  /* get MMU Command Reg. */
1108  if (hw->phy_type != SK_PHY_XMAC && skge->duplex == DUPLEX_FULL)
1109  cmd |= XM_MMU_GMII_FD;
1110 
1111  /*
1112  * Workaround BCOM Errata (#10523) for all BCom Phys
1113  * Enable Power Management after link up
1114  */
1115  if (hw->phy_type == SK_PHY_BCOM) {
1118  & ~PHY_B_AC_DIS_PM);
1120  }
1121 
1122  /* enable Rx/Tx */
1125  skge_link_up(skge);
1126 }
#define XM_PAUSE_MODE
Definition: skge.h:2336
uint16_t u16
Definition: stdint.h:21
static u16 xm_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2560
int port
Definition: skge.h:2498
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static void xm_write32(const struct skge_hw *hw, int port, int r, u32 v)
Definition: skge.h:2565
#define PHY_B_DEF_MSK
Definition: skge.h:1328
Definition: skge.h:2076
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
Definition: skge.h:2075
u8 port
Port number.
Definition: CIB_PRM.h:31
enum pause_status flow_status
Definition: skge.h:2504
static int xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:458
static u32 xm_read32(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2552
#define DUPLEX_FULL
Definition: bnx2.h:111
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
static void skge_link_up(struct skge_port *skge)
Definition: skge.c:394
Definition: skge.h:2460
#define SK_REG(port, reg)
Definition: skge.h:2548
Definition: skge.h:2100
static u16 xm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:449
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
uint32_t u32
Definition: stdint.h:23

References cmd, skge_port::duplex, DUPLEX_FULL, FLOW_STAT_LOC_SEND, FLOW_STAT_NONE, FLOW_STAT_SYMMETRIC, skge_port::flow_status, skge_port::hw, MFF_DIS_PAUSE, MFF_ENA_PAUSE, PHY_B_AC_DIS_PM, PHY_B_DEF_MSK, PHY_BCOM_AUX_CTRL, PHY_BCOM_INT_MASK, port, skge_port::port, RX_MFF_CTRL1, SK_PHY_BCOM, SK_PHY_XMAC, SK_REG, skge_link_up(), skge_write16(), XM_IMSK, XM_IS_TXF_UR, XM_ISRC, XM_MAC_PTIME, XM_MMU_CMD, XM_MMU_ENA_RX, XM_MMU_ENA_TX, XM_MMU_GMII_FD, XM_MMU_IGN_PF, XM_MODE, XM_PAUSE_MODE, xm_phy_read(), xm_phy_write(), xm_read16(), xm_read32(), xm_write16(), and xm_write32().

Referenced by bcom_check_link(), and xm_check_link().

◆ skge_phyirq()

static void skge_phyirq ( struct skge_hw hw)
static

Definition at line 2082 of file skge.c.

2083 {
2084  int port;
2085 
2086  for (port = 0; port < hw->ports; port++) {
2087  struct net_device *dev = hw->dev[port];
2088  struct skge_port *skge = dev->priv;
2089 
2090  if (hw->chip_id != CHIP_ID_GENESIS)
2091  yukon_phy_intr(skge);
2092  else if (hw->phy_type == SK_PHY_BCOM)
2093  bcom_phy_intr(skge);
2094  }
2095 
2096  hw->intr_mask |= IS_EXT_REG;
2097  skge_write32(hw, B0_IMSK, hw->intr_mask);
2099 }
static void yukon_phy_intr(struct skge_port *skge)
Definition: skge.c:1567
Definition: hw.c:16
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
Definition: skge.h:82
u8 port
Port number.
Definition: CIB_PRM.h:31
void * priv
Driver private data.
Definition: netdevice.h:431
A network device.
Definition: netdevice.h:352
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
static void bcom_phy_intr(struct skge_port *skge)
Definition: skge.c:1129
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532

References B0_IMSK, bcom_phy_intr(), CHIP_ID_GENESIS, net_device::dev, IS_EXT_REG, port, net_device::priv, SK_PHY_BCOM, skge_read32(), skge_write32(), and yukon_phy_intr().

Referenced by skge_poll().

◆ skge_poll()

static void skge_poll ( struct net_device dev)
static

Definition at line 2051 of file skge.c.

2052 {
2053  struct skge_port *skge = dev->priv;
2054  struct skge_hw *hw = skge->hw;
2055  u32 status;
2056 
2057  /* reading this register ACKs interrupts */
2059 
2060  /* Link event? */
2061  if (status & IS_EXT_REG) {
2062  skge_phyirq(hw);
2063  if (skge->use_xm_link_timer)
2064  xm_link_timer(skge);
2065  }
2066 
2067  skge_tx_done(dev);
2068 
2070 
2071  skge_rx_done(dev);
2072 
2073  /* restart receiver */
2074  wmb();
2076 
2078 
2079  return;
2080 }
int port
Definition: skge.h:2498
wmb()
static void xm_link_timer(struct skge_port *skge)
Definition: skge.c:827
struct net_device * dev[2]
Definition: skge.h:2464
int use_xm_link_timer
Definition: skge.h:2512
static void skge_phyirq(struct skge_hw *hw)
Definition: skge.c:2082
Definition: skge.h:523
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
uint8_t status
Status.
Definition: ena.h:16
Definition: skge.h:82
void * priv
Driver private data.
Definition: netdevice.h:431
static void skge_tx_done(struct net_device *dev)
Definition: skge.c:1940
static const int rxqaddr[]
Definition: skge.c:86
Definition: skge.h:2460
#define Q_ADDR(reg, offs)
Definition: skge.h:534
static void skge_rx_done(struct net_device *dev)
Definition: skge.c:2004
uint32_t u32
Definition: stdint.h:23
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References B0_IMSK, B0_SP_ISRC, CSR_IRQ_CL_F, CSR_START, skge_hw::dev, skge_port::hw, IS_EXT_REG, skge_port::port, net_device::priv, Q_ADDR, Q_CSR, rxqaddr, skge_phyirq(), skge_read32(), skge_rx_done(), skge_tx_done(), skge_write8(), status, skge_port::use_xm_link_timer, wmb(), and xm_link_timer().

◆ skge_xmit_frame()

static int skge_xmit_frame ( struct net_device dev,
struct io_buffer iob 
)
static

Definition at line 1863 of file skge.c.

1864 {
1865  struct skge_port *skge = dev->priv;
1866  struct skge_hw *hw = skge->hw;
1867  struct skge_element *e;
1868  struct skge_tx_desc *td;
1869  u32 control, len;
1870  u64 map;
1871 
1872  if (skge_tx_avail(&skge->tx_ring) < 1)
1873  return -EBUSY;
1874 
1875  e = skge->tx_ring.to_use;
1876  td = e->desc;
1877  assert(!(td->control & BMU_OWN));
1878  e->iob = iob;
1879  len = iob_len(iob);
1880  map = virt_to_bus(iob->data);
1881 
1882  td->dma_lo = map;
1883  td->dma_hi = map >> 32;
1884 
1885  control = BMU_CHECK;
1886 
1888  /* Make sure all the descriptors written */
1889  wmb();
1890  td->control = BMU_OWN | BMU_SW | BMU_STF | control | len;
1891  wmb();
1892 
1894 
1895  DBGIO(PFX "%s: tx queued, slot %td, len %d\n",
1896  dev->name, e - skge->tx_ring.start, (unsigned int)len);
1897 
1898  skge->tx_ring.to_use = e->next;
1899  wmb();
1900 
1901  if (skge_tx_avail(&skge->tx_ring) <= 1) {
1902  DBG(PFX "%s: transmit queue full\n", dev->name);
1903  }
1904 
1905  return 0;
1906 }
u32 dma_lo
Definition: skge.h:2438
int port
Definition: skge.h:2498
wmb()
#define EBUSY
Device or resource busy.
Definition: errno.h:338
struct skge_ring tx_ring
Definition: skge.h:2500
Definition: skge.h:523
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
uint32_t e
Definition: sha1.c:32
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
Definition: skge.h:377
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
struct skge_element * start
Definition: skge.h:2456
void * priv
Driver private data.
Definition: netdevice.h:431
uint64_t u64
Definition: stdint.h:25
#define PFX
Definition: sis190.h:34
#define DBGIO(...)
Definition: compiler.h:549
Definition: skge.h:384
Definition: skge.h:2460
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:155
uint32_t control
Control.
Definition: myson.h:14
static int skge_tx_avail(const struct skge_ring *ring)
Definition: skge.c:1856
Definition: skge.h:378
static __always_inline int struct dma_mapping * map
Definition: dma.h:181
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
Definition: skge.h:376
uint32_t len
Length.
Definition: ena.h:14
void * data
Start of data.
Definition: iobuf.h:48
#define Q_ADDR(reg, offs)
Definition: skge.h:534
u32 dma_hi
Definition: skge.h:2439
static const int txqaddr[]
Definition: skge.c:85
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
struct skge_element * to_use
Definition: skge.h:2455
u32 control
Definition: skge.h:2436
uint32_t u32
Definition: stdint.h:23
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References assert(), BMU_CHECK, BMU_EOF, BMU_IRQ_EOF, BMU_OWN, BMU_STF, BMU_SW, control, skge_tx_desc::control, CSR_START, io_buffer::data, DBG, DBGIO, skge_tx_desc::dma_hi, skge_tx_desc::dma_lo, e, EBUSY, skge_port::hw, iob_len(), len, map, net_device::name, PFX, skge_port::port, net_device::priv, Q_ADDR, Q_CSR, skge_tx_avail(), skge_write8(), skge_ring::start, skge_ring::to_use, skge_port::tx_ring, txqaddr, virt_to_bus(), and wmb().

◆ skge_net_irq()

static void skge_net_irq ( struct net_device dev,
int  enable 
)
static

Definition at line 2448 of file skge.c.

2448  {
2449  struct skge_port *skge = dev->priv;
2450  struct skge_hw *hw = skge->hw;
2451 
2452  if (enable)
2453  hw->intr_mask |= portmask[skge->port];
2454  else
2455  hw->intr_mask &= ~portmask[skge->port];
2456  skge_write32(hw, B0_IMSK, hw->intr_mask);
2457 }
int port
Definition: skge.h:2498
static const u32 portmask[]
Definition: skge.c:87
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
Definition: skge.h:82
void * priv
Driver private data.
Definition: netdevice.h:431
Definition: skge.h:2460
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532

References B0_IMSK, skge_port::hw, skge_port::port, portmask, net_device::priv, and skge_write32().

◆ skge_rx_refill()

static void skge_rx_refill ( struct net_device dev)
static

Definition at line 1962 of file skge.c.

1963 {
1964  struct skge_port *skge = dev->priv;
1965  struct skge_ring *ring = &skge->rx_ring;
1966  struct skge_element *e;
1967  struct io_buffer *iob;
1968  struct skge_rx_desc *rd;
1969  u32 control;
1970  int i;
1971 
1972  for (i = 0; i < NUM_RX_DESC; i++) {
1973  e = ring->to_clean;
1974  rd = e->desc;
1975  iob = e->iob;
1976  control = rd->control;
1977 
1978  /* nothing to do here */
1979  if (iob || (control & BMU_OWN))
1980  continue;
1981 
1982  DBG2("refilling rx desc %zd: ", (ring->to_clean - ring->start));
1983 
1984  iob = alloc_iob(RX_BUF_SIZE);
1985  if (iob) {
1986  skge_rx_setup(skge, e, iob, RX_BUF_SIZE);
1987  } else {
1988  DBG("descr %zd: alloc_iob() failed\n",
1989  (ring->to_clean - ring->start));
1990  /* We pass the descriptor to the NIC even if the
1991  * allocation failed. The card will stop as soon as it
1992  * encounters a descriptor with the OWN bit set to 0,
1993  * thus never getting to the next descriptor that might
1994  * contain a valid io_buffer. This would effectively
1995  * stall the receive.
1996  */
1997  skge_rx_setup(skge, e, NULL, 0);
1998  }
1999 
2000  ring->to_clean = e->next;
2001  }
2002 }
#define RX_BUF_SIZE
Definition: 3c90x.h:269
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:129
#define NUM_RX_DESC
Definition: igbvf.h:281
u32 control
Definition: skge.h:2423
uint32_t e
Definition: sha1.c:32
struct skge_element * start
Definition: skge.h:2456
void * priv
Driver private data.
Definition: netdevice.h:431
struct skge_element * to_clean
Definition: skge.h:2454
uint32_t control
Control.
Definition: myson.h:14
struct skge_ring rx_ring
Definition: skge.h:2501
static void skge_rx_setup(struct skge_port *skge __unused, struct skge_element *e, struct io_buffer *iob, unsigned int bufsize)
Definition: skge.c:338
Definition: skge.h:376
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
uint32_t u32
Definition: stdint.h:23
#define DBG2(...)
Definition: compiler.h:515
A persistent I/O buffer.
Definition: iobuf.h:33

References alloc_iob(), BMU_OWN, control, skge_rx_desc::control, DBG, DBG2, e, NULL, NUM_RX_DESC, net_device::priv, RX_BUF_SIZE, skge_port::rx_ring, skge_rx_setup(), skge_ring::start, and skge_ring::to_clean.

Referenced by skge_rx_done(), and skge_up().

◆ skge_supported_modes()

static u32 skge_supported_modes ( const struct skge_hw hw)
static

Definition at line 92 of file skge.c.

93 {
94  u32 supported;
95 
96  if (hw->copper) {
104 
105  if (hw->chip_id == CHIP_ID_GENESIS)
110 
111  else if (hw->chip_id == CHIP_ID_YUKON)
113  } else
116 
117  return supported;
118 }
#define SUPPORTED_1000baseT_Half
Definition: skge.h:62
#define SUPPORTED_Autoneg
Definition: skge.h:64
#define SUPPORTED_100baseT_Full
Definition: skge.h:61
Definition: hw.c:16
#define SUPPORTED_10baseT_Half
Definition: skge.h:58
#define SUPPORTED_TP
Definition: skge.h:65
#define SUPPORTED_10baseT_Full
Definition: skge.h:59
#define SUPPORTED_100baseT_Half
Definition: skge.h:60
#define SUPPORTED_FIBRE
Definition: skge.h:66
#define SUPPORTED_1000baseT_Full
Definition: skge.h:63
uint32_t supported
Bitmask of supported AENQ groups (device -> host)
Definition: ena.h:12
uint32_t u32
Definition: stdint.h:23

References CHIP_ID_GENESIS, CHIP_ID_YUKON, supported, SUPPORTED_1000baseT_Full, SUPPORTED_1000baseT_Half, SUPPORTED_100baseT_Full, SUPPORTED_100baseT_Half, SUPPORTED_10baseT_Full, SUPPORTED_10baseT_Half, SUPPORTED_Autoneg, SUPPORTED_FIBRE, and SUPPORTED_TP.

Referenced by skge_devinit().

◆ hwkhz()

static u32 hwkhz ( const struct skge_hw hw)
inlinestatic

Definition at line 121 of file skge.c.

122 {
123  return (hw->chip_id == CHIP_ID_GENESIS) ? 53125 : 78125;
124 }
Definition: hw.c:16

References CHIP_ID_GENESIS.

Referenced by skge_usecs2clk().

◆ skge_usecs2clk()

static u32 skge_usecs2clk ( const struct skge_hw hw,
u32  usec 
)
inlinestatic

Definition at line 127 of file skge.c.

128 {
129  return hwkhz(hw) * usec / 1000;
130 }
static u32 hwkhz(const struct skge_hw *hw)
Definition: skge.c:121
Definition: hw.c:16

References hwkhz().

Referenced by skge_reset().

◆ skge_led()

static void skge_led ( struct skge_port skge,
enum led_mode  mode 
)
static

Definition at line 133 of file skge.c.

134 {
135  struct skge_hw *hw = skge->hw;
136  int port = skge->port;
137 
138  if (hw->chip_id == CHIP_ID_GENESIS) {
139  switch (mode) {
140  case LED_MODE_OFF:
141  if (hw->phy_type == SK_PHY_BCOM)
143  else {
146  }
150  break;
151 
152  case LED_MODE_ON:
155 
158 
159  break;
160 
161  case LED_MODE_TST:
165 
166  if (hw->phy_type == SK_PHY_BCOM)
168  else {
172  }
173 
174  }
175  } else {
176  switch (mode) {
177  case LED_MODE_OFF:
185  break;
186  case LED_MODE_ON:
192 
195  (skge->speed == SPEED_100 ?
197  break;
198  case LED_MODE_TST:
206  }
207  }
208 }
int port
Definition: skge.h:2498
#define PHY_M_LED_MO_RX(x)
Definition: skge.h:1567
#define PHY_M_LED_MO_DUP(x)
Definition: skge.h:1563
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
#define SPEED_100
Definition: atl1e.h:51
u8 port
Port number.
Definition: CIB_PRM.h:31
#define PHY_M_LED_BLINK_RT(x)
Definition: skge.h:1528
static int xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:458
#define PHY_M_LED_PULS_DUR(x)
Definition: skge.h:1527
Definition: skge.h:2460
#define SK_REG(port, reg)
Definition: skge.h:2548
#define PHY_M_LED_MO_1000(x)
Definition: skge.h:1566
static int gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:1159
#define PHY_M_LED_MO_10(x)
Definition: skge.h:1564
#define PHY_M_LED_MO_100(x)
Definition: skge.h:1565
u16 speed
Definition: skge.h:2507
Definition: skge.h:707
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References BLINK_84MS, CHIP_ID_GENESIS, gm_phy_write(), skge_port::hw, LED_MODE_OFF, LED_MODE_ON, LED_MODE_TST, LED_START, LED_T_OFF, LED_T_ON, LINKLED_LINKSYNC_ON, LINKLED_OFF, LINKLED_ON, LNK_LED_REG, MO_LED_OFF, MO_LED_ON, PHY_B_PEC_LED_OFF, PHY_B_PEC_LED_ON, PHY_BCOM_P_EXT_CTRL, PHY_M_LED_BLINK_RT, PHY_M_LED_MO_10, PHY_M_LED_MO_100, PHY_M_LED_MO_1000, PHY_M_LED_MO_DUP, PHY_M_LED_MO_RX, PHY_M_LED_PULS_DUR, PHY_M_LEDC_DP_CTRL, PHY_M_LEDC_TX_CTRL, PHY_MARV_LED_CTRL, PHY_MARV_LED_OVER, port, skge_port::port, PULS_170MS, RX_LED_CTRL, RX_LED_TST, RX_LED_VAL, SK_PHY_BCOM, SK_REG, skge_write32(), skge_write8(), skge_port::speed, SPEED_100, TX_LED_CTRL, TX_LED_TST, TX_LED_VAL, and xm_phy_write().

Referenced by skge_down(), and skge_up().

◆ skge_ring_alloc()

static int skge_ring_alloc ( struct skge_ring ring,
void *  vaddr,
u32  base,
size_t  num 
)
static

Definition at line 311 of file skge.c.

313 {
314  struct skge_tx_desc *d;
315  struct skge_element *e;
316  unsigned int i;
317 
318  ring->start = zalloc(num*sizeof(*e));
319  if (!ring->start)
320  return -ENOMEM;
321 
322  for (i = 0, e = ring->start, d = vaddr; i < num; i++, e++, d++) {
323  e->desc = d;
324  if (i == num - 1) {
325  e->next = ring->start;
326  d->next_offset = base;
327  } else {
328  e->next = e + 1;
329  d->next_offset = base + (i+1) * sizeof(*d);
330  }
331  }
332  ring->to_use = ring->to_clean = ring->start;
333 
334  return 0;
335 }
static const void * base
Base address.
Definition: crypto.h:335
#define ENOMEM
Not enough space.
Definition: errno.h:534
uint32_t e
Definition: sha1.c:32
struct skge_element * start
Definition: skge.h:2456
char unsigned long * num
Definition: xenstore.h:17
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
struct skge_element * to_clean
Definition: skge.h:2454
uint32_t d
Definition: md4.c:31
struct skge_element * to_use
Definition: skge.h:2455

References base, d, e, ENOMEM, num, skge_ring::start, skge_ring::to_clean, skge_ring::to_use, and zalloc().

Referenced by skge_up().

◆ skge_rx_setup()

static void skge_rx_setup ( struct skge_port *skge  __unused,
struct skge_element e,
struct io_buffer iob,
unsigned int  bufsize 
)
static

Definition at line 338 of file skge.c.

341 {
342  struct skge_rx_desc *rd = e->desc;
343  u64 map;
344 
345  map = ( iob != NULL ) ? virt_to_bus(iob->data) : 0;
346 
347  rd->dma_lo = map;
348  rd->dma_hi = map >> 32;
349  e->iob = iob;
350  rd->csum1_start = ETH_HLEN;
351  rd->csum2_start = ETH_HLEN;
352  rd->csum1 = 0;
353  rd->csum2 = 0;
354 
355  wmb();
356 
358 }
wmb()
u16 csum1_start
Definition: skge.h:2432
u32 control
Definition: skge.h:2423
uint32_t e
Definition: sha1.c:32
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
Definition: skge.h:377
#define ETH_HLEN
Definition: if_ether.h:9
u16 csum2_start
Definition: skge.h:2431
uint64_t u64
Definition: stdint.h:25
u32 dma_hi
Definition: skge.h:2426
u16 csum2
Definition: skge.h:2429
static __always_inline int struct dma_mapping * map
Definition: dma.h:181
u16 csum1
Definition: skge.h:2430
Definition: skge.h:376
void * data
Start of data.
Definition: iobuf.h:48
u32 dma_lo
Definition: skge.h:2425
uint8_t bufsize
Size of the packet, in bytes.
Definition: int13.h:12
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References BMU_IRQ_EOF, BMU_OWN, BMU_STF, BMU_TCP_CHECK, bufsize, skge_rx_desc::control, skge_rx_desc::csum1, skge_rx_desc::csum1_start, skge_rx_desc::csum2, skge_rx_desc::csum2_start, io_buffer::data, skge_rx_desc::dma_hi, skge_rx_desc::dma_lo, e, ETH_HLEN, map, NULL, virt_to_bus(), and wmb().

Referenced by skge_rx_refill().

◆ skge_rx_reuse()

static void skge_rx_reuse ( struct skge_element e,
unsigned int  size 
)
inlinestatic

Definition at line 364 of file skge.c.

365 {
366  struct skge_rx_desc *rd = e->desc;
367 
368  rd->csum2 = 0;
369  rd->csum2_start = ETH_HLEN;
370 
371  wmb();
372 
374 }
wmb()
u32 control
Definition: skge.h:2423
uint32_t e
Definition: sha1.c:32
Definition: skge.h:377
#define ETH_HLEN
Definition: if_ether.h:9
u16 csum2_start
Definition: skge.h:2431
u16 csum2
Definition: skge.h:2429
Definition: skge.h:376
uint8_t size
Entry size (in 32-bit words)
Definition: ena.h:16

References BMU_IRQ_EOF, BMU_OWN, BMU_STF, BMU_TCP_CHECK, skge_rx_desc::control, skge_rx_desc::csum2, skge_rx_desc::csum2_start, e, ETH_HLEN, size, and wmb().

◆ skge_rx_clean()

static void skge_rx_clean ( struct skge_port skge)
static

Definition at line 378 of file skge.c.

379 {
380  struct skge_ring *ring = &skge->rx_ring;
381  struct skge_element *e;
382 
383  e = ring->start;
384  do {
385  struct skge_rx_desc *rd = e->desc;
386  rd->control = 0;
387  if (e->iob) {
388  free_iob(e->iob);
389  e->iob = NULL;
390  }
391  } while ((e = e->next) != ring->start);
392 }
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:146
u32 control
Definition: skge.h:2423
uint32_t e
Definition: sha1.c:32
struct skge_element * start
Definition: skge.h:2456
struct skge_ring rx_ring
Definition: skge.h:2501
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References skge_rx_desc::control, e, free_iob(), NULL, skge_port::rx_ring, and skge_ring::start.

Referenced by skge_down(), and skge_up().

◆ skge_link_up()

static void skge_link_up ( struct skge_port skge)
static

Definition at line 394 of file skge.c.

395 {
396  skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG),
398 
399  netdev_link_up(skge->netdev);
400 
401  DBG2(PFX "%s: Link is up at %d Mbps, %s duplex\n",
402  skge->netdev->name, skge->speed,
403  skge->duplex == DUPLEX_FULL ? "full" : "half");
404 }
int port
Definition: skge.h:2498
u8 duplex
Definition: skge.h:2506
struct skge_hw * hw
Definition: skge.h:2496
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:774
#define DUPLEX_FULL
Definition: bnx2.h:111
#define PFX
Definition: sis190.h:34
#define SK_REG(port, reg)
Definition: skge.h:2548
struct net_device * netdev
Definition: skge.h:2497
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
Definition: skge.h:718
u16 speed
Definition: skge.h:2507
#define DBG2(...)
Definition: compiler.h:515
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References DBG2, skge_port::duplex, DUPLEX_FULL, skge_port::hw, LED_BLK_OFF, LED_ON, LED_SYNC_OFF, LNK_LED_REG, net_device::name, skge_port::netdev, netdev_link_up(), PFX, skge_port::port, SK_REG, skge_write8(), and skge_port::speed.

Referenced by genesis_link_up(), and yukon_link_up().

◆ skge_link_down()

static void skge_link_down ( struct skge_port skge)
static

Definition at line 406 of file skge.c.

407 {
408  skge_write8(skge->hw, SK_REG(skge->port, LNK_LED_REG), LED_OFF);
409  netdev_link_down(skge->netdev);
410 
411  DBG2(PFX "%s: Link is down.\n", skge->netdev->name);
412 }
int port
Definition: skge.h:2498
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:230
struct skge_hw * hw
Definition: skge.h:2496
#define PFX
Definition: sis190.h:34
#define SK_REG(port, reg)
Definition: skge.h:2548
struct net_device * netdev
Definition: skge.h:2497
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
Definition: skge.h:719
#define DBG2(...)
Definition: compiler.h:515
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References DBG2, skge_port::hw, LED_OFF, LNK_LED_REG, net_device::name, skge_port::netdev, netdev_link_down(), PFX, skge_port::port, SK_REG, and skge_write8().

Referenced by xm_link_down(), and yukon_link_down().

◆ xm_link_down()

static void xm_link_down ( struct skge_hw hw,
int  port 
)
static

Definition at line 415 of file skge.c.

416 {
417  struct net_device *dev = hw->dev[port];
418  struct skge_port *skge = dev->priv;
419 
421 
422  if (netdev_link_ok(dev))
423  skge_link_down(skge);
424 }
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static void skge_link_down(struct skge_port *skge)
Definition: skge.c:406
Definition: hw.c:16
Definition: skge.h:2075
u8 port
Port number.
Definition: CIB_PRM.h:31
void * priv
Driver private data.
Definition: netdevice.h:431
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:636
A network device.
Definition: netdevice.h:352
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364

References net_device::dev, netdev_link_ok(), port, net_device::priv, skge_link_down(), XM_IMSK, XM_IMSK_DISABLE, and xm_write16().

Referenced by bcom_check_link(), and xm_check_link().

◆ __xm_phy_read()

static int __xm_phy_read ( struct skge_hw hw,
int  port,
u16  reg,
u16 val 
)
static

Definition at line 426 of file skge.c.

427 {
428  int i;
429 
430  xm_write16(hw, port, XM_PHY_ADDR, reg | hw->phy_addr);
432 
433  if (hw->phy_type == SK_PHY_XMAC)
434  goto ready;
435 
436  for (i = 0; i < PHY_RETRIES; i++) {
438  goto ready;
439  udelay(1);
440  }
441 
442  return -ETIMEDOUT;
443  ready:
445 
446  return 0;
447 }
static u16 xm_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2560
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static unsigned int unsigned int reg
Definition: myson.h:162
#define PHY_RETRIES
Definition: skge.h:28
Definition: hw.c:16
u8 port
Port number.
Definition: CIB_PRM.h:31
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:60
void __asmcall int val
Definition: setjmp.h:28
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References ETIMEDOUT, PHY_RETRIES, port, reg, SK_PHY_XMAC, udelay(), val, XM_MMU_CMD, XM_MMU_PHY_RDY, XM_PHY_ADDR, XM_PHY_DATA, xm_read16(), and xm_write16().

Referenced by xm_phy_read().

◆ xm_phy_read()

static u16 xm_phy_read ( struct skge_hw hw,
int  port,
u16  reg 
)
static

Definition at line 449 of file skge.c.

450 {
451  u16 v = 0;
452  if (__xm_phy_read(hw, port, reg, &v))
453  DBG(PFX "%s: phy read timed out\n",
454  hw->dev[port]->name);
455  return v;
456 }
uint16_t u16
Definition: stdint.h:21
static unsigned int unsigned int reg
Definition: myson.h:162
Definition: hw.c:16
u8 port
Port number.
Definition: CIB_PRM.h:31
#define PFX
Definition: sis190.h:34
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
static int __xm_phy_read(struct skge_hw *hw, int port, u16 reg, u16 *val)
Definition: skge.c:426

References __xm_phy_read(), DBG, PFX, port, and reg.

Referenced by bcom_check_link(), bcom_phy_init(), bcom_phy_intr(), genesis_link_up(), and xm_check_link().

◆ genesis_init()

static void genesis_init ( struct skge_hw hw)
static

Definition at line 480 of file skge.c.

481 {
482  /* set blink source counter */
485 
486  /* configure mac arbiter */
488 
489  /* configure mac arbiter timeout values */
494 
499 
500  /* configure packet arbiter timeout */
506 }
Definition: hw.c:16
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
#define SK_PKT_TO_MAX
Definition: skge.h:441
#define SK_FACT_53
Definition: skge.h:865
#define SK_BLK_DUR
Definition: skge.h:857
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
#define SK_MAC_TO_53
Definition: skge.h:439
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References B2_BSC_CTRL, B2_BSC_INI, B3_MA_RCINI_RX1, B3_MA_RCINI_RX2, B3_MA_RCINI_TX1, B3_MA_RCINI_TX2, B3_MA_TO_CTRL, B3_MA_TOINI_RX1, B3_MA_TOINI_RX2, B3_MA_TOINI_TX1, B3_MA_TOINI_TX2, B3_PA_CTRL, B3_PA_TOINI_RX1, B3_PA_TOINI_RX2, B3_PA_TOINI_TX1, B3_PA_TOINI_TX2, BSC_START, MA_RST_CLR, PA_RST_CLR, SK_BLK_DUR, SK_FACT_53, SK_MAC_TO_53, SK_PKT_TO_MAX, skge_write16(), skge_write32(), and skge_write8().

Referenced by skge_reset().

◆ genesis_reset()

static void genesis_reset ( struct skge_hw hw,
int  port 
)
static

Definition at line 508 of file skge.c.

509 {
510  const u8 zero[8] = { 0 };
511  u32 reg;
512 
514 
515  /* reset the statistics module */
518  xm_write32(hw, port, XM_MODE, 0); /* clear Mode Reg */
519  xm_write16(hw, port, XM_TX_CMD, 0); /* reset TX CMD Reg */
520  xm_write16(hw, port, XM_RX_CMD, 0); /* reset RX CMD Reg */
521 
522  /* disable Broadcom PHY IRQ */
523  if (hw->phy_type == SK_PHY_BCOM)
524  xm_write16(hw, port, PHY_BCOM_INT_MASK, 0xffff);
525 
527 
528  /* Flush TX and RX fifo */
529  reg = xm_read32(hw, port, XM_MODE);
532 }
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static unsigned int unsigned int reg
Definition: myson.h:162
static void xm_write32(const struct skge_hw *hw, int port, int r, u32 v)
Definition: skge.h:2565
Definition: skge.h:2095
uint32_t zero
Must be zero.
Definition: ntlm.h:24
Definition: hw.c:16
Definition: skge.h:2075
u8 port
Port number.
Definition: CIB_PRM.h:31
static void xm_outhash(const struct skge_hw *hw, int port, int reg, const u8 *hash)
Definition: skge.h:2576
static u32 xm_read32(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2552
#define SK_REG(port, reg)
Definition: skge.h:2548
Definition: skge.h:2100
uint8_t u8
Definition: stdint.h:19
uint32_t u32
Definition: stdint.h:23
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References GMAC_IRQ_MSK, PHY_BCOM_INT_MASK, port, reg, SK_PHY_BCOM, SK_REG, skge_write8(), XM_GP_PORT, XM_GP_RES_STAT, XM_HSM, XM_IMSK, XM_IMSK_DISABLE, XM_MD_FRF, XM_MD_FTF, XM_MODE, xm_outhash(), xm_read32(), XM_RX_CMD, XM_TX_CMD, xm_write16(), xm_write32(), and zero.

Referenced by genesis_stop(), and skge_reset().

◆ bcom_check_link()

static void bcom_check_link ( struct skge_hw hw,
int  port 
)
static

Definition at line 553 of file skge.c.

554 {
555  struct net_device *dev = hw->dev[port];
556  struct skge_port *skge = dev->priv;
557  u16 status;
558 
559  /* read twice because of latch */
562 
563  if ((status & PHY_ST_LSYNC) == 0) {
564  xm_link_down(hw, port);
565  return;
566  }
567 
568  if (skge->autoneg == AUTONEG_ENABLE) {
569  u16 lpa, aux;
570 
571  if (!(status & PHY_ST_AN_OVER))
572  return;
573 
575  if (lpa & PHY_B_AN_RF) {
576  DBG(PFX "%s: remote fault\n",
577  dev->name);
578  return;
579  }
580 
582 
583  /* Check Duplex mismatch */
584  switch (aux & PHY_B_AS_AN_RES_MSK) {
585  case PHY_B_RES_1000FD:
586  skge->duplex = DUPLEX_FULL;
587  break;
588  case PHY_B_RES_1000HD:
589  skge->duplex = DUPLEX_HALF;
590  break;
591  default:
592  DBG(PFX "%s: duplex mismatch\n",
593  dev->name);
594  return;
595  }
596 
597  /* We are using IEEE 802.3z/D5.0 Table 37-4 */
598  switch (aux & PHY_B_AS_PAUSE_MSK) {
599  case PHY_B_AS_PAUSE_MSK:
601  break;
602  case PHY_B_AS_PRR:
604  break;
605  case PHY_B_AS_PRT:
607  break;
608  default:
609  skge->flow_status = FLOW_STAT_NONE;
610  }
611  skge->speed = SPEED_1000;
612  }
613 
614  if (!netdev_link_ok(dev))
615  genesis_link_up(skge);
616 }
#define SPEED_1000
Definition: atl1e.h:52
uint16_t u16
Definition: stdint.h:21
static void xm_link_down(struct skge_hw *hw, int port)
Definition: skge.c:415
#define AUTONEG_ENABLE
Definition: bnx2.h:4584
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
uint8_t status
Status.
Definition: ena.h:16
u8 port
Port number.
Definition: CIB_PRM.h:31
enum pause_status flow_status
Definition: skge.h:2504
#define PHY_B_AS_PAUSE_MSK
Definition: skge.h:1307
void * priv
Driver private data.
Definition: netdevice.h:431
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:636
#define DUPLEX_FULL
Definition: bnx2.h:111
u8 autoneg
Definition: skge.h:2505
#define PFX
Definition: sis190.h:34
A network device.
Definition: netdevice.h:352
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
static u16 xm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:449
static void genesis_link_up(struct skge_port *skge)
Definition: skge.c:1045
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
u16 speed
Definition: skge.h:2507
#define DUPLEX_HALF
Definition: bnx2.h:110

References skge_port::autoneg, AUTONEG_ENABLE, DBG, net_device::dev, skge_port::duplex, DUPLEX_FULL, DUPLEX_HALF, FLOW_STAT_LOC_SEND, FLOW_STAT_NONE, FLOW_STAT_REM_SEND, FLOW_STAT_SYMMETRIC, skge_port::flow_status, genesis_link_up(), net_device::name, netdev_link_ok(), PFX, PHY_B_AN_RF, PHY_B_AS_AN_RES_MSK, PHY_B_AS_PAUSE_MSK, PHY_B_AS_PRR, PHY_B_AS_PRT, PHY_B_RES_1000FD, PHY_B_RES_1000HD, PHY_BCOM_AUX_STAT, PHY_BCOM_STAT, PHY_ST_AN_OVER, PHY_ST_LSYNC, PHY_XMAC_AUNE_LP, port, net_device::priv, skge_port::speed, SPEED_1000, status, xm_link_down(), and xm_phy_read().

Referenced by bcom_phy_intr(), and genesis_mac_init().

◆ bcom_phy_init()

static void bcom_phy_init ( struct skge_port skge)
static

Definition at line 621 of file skge.c.

622 {
623  struct skge_hw *hw = skge->hw;
624  int port = skge->port;
625  unsigned int i;
626  u16 id1, r, ext, ctl;
627 
628  /* magic workaround patterns for Broadcom */
629  static const struct {
630  u16 reg;
631  u16 val;
632  } A1hack[] = {
633  { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1104 },
634  { 0x17, 0x0013 }, { 0x15, 0x0404 }, { 0x17, 0x8006 },
635  { 0x15, 0x0132 }, { 0x17, 0x8006 }, { 0x15, 0x0232 },
636  { 0x17, 0x800D }, { 0x15, 0x000F }, { 0x18, 0x0420 },
637  }, C0hack[] = {
638  { 0x18, 0x0c20 }, { 0x17, 0x0012 }, { 0x15, 0x1204 },
639  { 0x17, 0x0013 }, { 0x15, 0x0A04 }, { 0x18, 0x0420 },
640  };
641 
642  /* read Id from external PHY (all have the same address) */
643  id1 = xm_phy_read(hw, port, PHY_XMAC_ID1);
644 
645  /* Optimize MDIO transfer by suppressing preamble. */
647  r |= XM_MMU_NO_PRE;
649 
650  switch (id1) {
651  case PHY_BCOM_ID1_C0:
652  /*
653  * Workaround BCOM Errata for the C0 type.
654  * Write magic patterns to reserved registers.
655  */
656  for (i = 0; i < ARRAY_SIZE(C0hack); i++)
658  C0hack[i].reg, C0hack[i].val);
659 
660  break;
661  case PHY_BCOM_ID1_A1:
662  /*
663  * Workaround BCOM Errata for the A1 type.
664  * Write magic patterns to reserved registers.
665  */
666  for (i = 0; i < ARRAY_SIZE(A1hack); i++)
668  A1hack[i].reg, A1hack[i].val);
669  break;
670  }
671 
672  /*
673  * Workaround BCOM Errata (#10523) for all BCom PHYs.
674  * Disable Power Management after reset.
675  */
677  r |= PHY_B_AC_DIS_PM;
679 
680  /* Dummy read */
682 
683  ext = PHY_B_PEC_EN_LTR; /* enable tx led */
684  ctl = PHY_CT_SP1000; /* always 1000mbit */
685 
686  if (skge->autoneg == AUTONEG_ENABLE) {
687  /*
688  * Workaround BCOM Errata #1 for the C5 type.
689  * 1000Base-T Link Acquisition Failure in Slave Mode
690  * Set Repeater/DTE bit 10 of the 1000Base-T Control Register
691  */
692  u16 adv = PHY_B_1000C_RD;
694  adv |= PHY_B_1000C_AHD;
696  adv |= PHY_B_1000C_AFD;
698 
699  ctl |= PHY_CT_ANE | PHY_CT_RE_CFG;
700  } else {
701  if (skge->duplex == DUPLEX_FULL)
702  ctl |= PHY_CT_DUP_MD;
703  /* Force to slave */
705  }
706 
707  /* Set autonegotiation pause parameters */
710 
713 
714  /* Use link status change interrupt */
716 }
uint16_t u16
Definition: stdint.h:21
static u16 xm_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2560
int port
Definition: skge.h:2498
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static unsigned int unsigned int reg
Definition: myson.h:162
#define PHY_B_DEF_MSK
Definition: skge.h:1328
u32 advertising
Definition: skge.h:2508
Definition: skge.h:2076
#define AUTONEG_ENABLE
Definition: bnx2.h:4584
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
#define ADVERTISED_1000baseT_Half
Definition: bnx2.h:46
u8 port
Port number.
Definition: CIB_PRM.h:31
static int xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:458
#define DUPLEX_FULL
Definition: bnx2.h:111
u8 autoneg
Definition: skge.h:2505
Definition: skge.h:2460
#define ARRAY_SIZE(x)
Definition: efx_common.h:43
void __asmcall int val
Definition: setjmp.h:28
uint16_t ext
Extended status.
Definition: ena.h:20
enum pause_control flow_control
Definition: skge.h:2503
static u16 xm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:449
#define ADVERTISED_1000baseT_Full
Definition: bnx2.h:47
static const u16 phy_pause_map[]
Definition: skge.c:536
static const uint8_t r[3][4]
MD4 shift amounts.
Definition: md4.c:53

References ADVERTISED_1000baseT_Full, ADVERTISED_1000baseT_Half, skge_port::advertising, ARRAY_SIZE, skge_port::autoneg, AUTONEG_ENABLE, skge_port::duplex, DUPLEX_FULL, ext, skge_port::flow_control, skge_port::hw, PHY_AN_CSMA, PHY_B_1000C_AFD, PHY_B_1000C_AHD, PHY_B_1000C_MSE, PHY_B_1000C_RD, PHY_B_AC_DIS_PM, PHY_B_DEF_MSK, PHY_B_PEC_EN_LTR, PHY_BCOM_1000T_CTRL, PHY_BCOM_AUNE_ADV, PHY_BCOM_AUX_CTRL, PHY_BCOM_CTRL, PHY_BCOM_ID1_A1, PHY_BCOM_ID1_C0, PHY_BCOM_INT_MASK, PHY_BCOM_P_EXT_CTRL, PHY_CT_ANE, PHY_CT_DUP_MD, PHY_CT_RE_CFG, PHY_CT_SP1000, phy_pause_map, PHY_XMAC_ID1, port, skge_port::port, r, reg, val, XM_ISRC, XM_MMU_CMD, XM_MMU_NO_PRE, xm_phy_read(), xm_phy_write(), xm_read16(), and xm_write16().

Referenced by genesis_mac_init().

◆ xm_phy_init()

static void xm_phy_init ( struct skge_port skge)
static

Definition at line 718 of file skge.c.

719 {
720  struct skge_hw *hw = skge->hw;
721  int port = skge->port;
722  u16 ctrl = 0;
723 
724  if (skge->autoneg == AUTONEG_ENABLE) {
726  ctrl |= PHY_X_AN_HD;
728  ctrl |= PHY_X_AN_FD;
729 
731 
733 
734  /* Restart Auto-negotiation */
736  } else {
737  /* Set DuplexMode in Config register */
738  if (skge->duplex == DUPLEX_FULL)
739  ctrl |= PHY_CT_DUP_MD;
740  /*
741  * Do NOT enable Auto-negotiation here. This would hold
742  * the link down because no IDLEs are transmitted
743  */
744  }
745 
747 
748  /* Poll PHY for status changes */
749  skge->use_xm_link_timer = 1;
750 }
uint16_t u16
Definition: stdint.h:21
int port
Definition: skge.h:2498
u32 advertising
Definition: skge.h:2508
#define AUTONEG_ENABLE
Definition: bnx2.h:4584
int use_xm_link_timer
Definition: skge.h:2512
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
#define ADVERTISED_1000baseT_Half
Definition: bnx2.h:46
u8 port
Port number.
Definition: CIB_PRM.h:31
static const u16 fiber_pause_map[]
Definition: skge.c:544
static int xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:458
#define DUPLEX_FULL
Definition: bnx2.h:111
u8 autoneg
Definition: skge.h:2505
Definition: skge.h:2460
enum pause_control flow_control
Definition: skge.h:2503
u8 ctrl
Definition: sky2.h:10
#define ADVERTISED_1000baseT_Full
Definition: bnx2.h:47

References ADVERTISED_1000baseT_Full, ADVERTISED_1000baseT_Half, skge_port::advertising, skge_port::autoneg, AUTONEG_ENABLE, ctrl, skge_port::duplex, DUPLEX_FULL, fiber_pause_map, skge_port::flow_control, skge_port::hw, PHY_CT_ANE, PHY_CT_DUP_MD, PHY_CT_RE_CFG, PHY_X_AN_FD, PHY_X_AN_HD, PHY_XMAC_AUNE_ADV, PHY_XMAC_CTRL, port, skge_port::port, skge_port::use_xm_link_timer, and xm_phy_write().

Referenced by genesis_mac_init().

◆ xm_check_link()

static int xm_check_link ( struct net_device dev)
static

Definition at line 752 of file skge.c.

753 {
754  struct skge_port *skge = dev->priv;
755  struct skge_hw *hw = skge->hw;
756  int port = skge->port;
757  u16 status;
758 
759  /* read twice because of latch */
762 
763  if ((status & PHY_ST_LSYNC) == 0) {
764  xm_link_down(hw, port);
765  return 0;
766  }
767 
768  if (skge->autoneg == AUTONEG_ENABLE) {
769  u16 lpa, res;
770 
771  if (!(status & PHY_ST_AN_OVER))
772  return 0;
773 
775  if (lpa & PHY_B_AN_RF) {
776  DBG(PFX "%s: remote fault\n",
777  dev->name);
778  return 0;
779  }
780 
782 
783  /* Check Duplex mismatch */
784  switch (res & (PHY_X_RS_HD | PHY_X_RS_FD)) {
785  case PHY_X_RS_FD:
786  skge->duplex = DUPLEX_FULL;
787  break;
788  case PHY_X_RS_HD:
789  skge->duplex = DUPLEX_HALF;
790  break;
791  default:
792  DBG(PFX "%s: duplex mismatch\n",
793  dev->name);
794  return 0;
795  }
796 
797  /* We are using IEEE 802.3z/D5.0 Table 37-4 */
798  if ((skge->flow_control == FLOW_MODE_SYMMETRIC ||
800  (lpa & PHY_X_P_SYM_MD))
802  else if (skge->flow_control == FLOW_MODE_SYM_OR_REM &&
803  (lpa & PHY_X_RS_PAUSE) == PHY_X_P_ASYM_MD)
804  /* Enable PAUSE receive, disable PAUSE transmit */
806  else if (skge->flow_control == FLOW_MODE_LOC_SEND &&
807  (lpa & PHY_X_RS_PAUSE) == PHY_X_P_BOTH_MD)
808  /* Disable PAUSE receive, enable PAUSE transmit */
810  else
811  skge->flow_status = FLOW_STAT_NONE;
812 
813  skge->speed = SPEED_1000;
814  }
815 
816  if (!netdev_link_ok(dev))
817  genesis_link_up(skge);
818  return 1;
819 }
#define SPEED_1000
Definition: atl1e.h:52
uint16_t u16
Definition: stdint.h:21
int port
Definition: skge.h:2498
struct net_device * dev[2]
Definition: skge.h:2464
static void xm_link_down(struct skge_hw *hw, int port)
Definition: skge.c:415
#define AUTONEG_ENABLE
Definition: bnx2.h:4584
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
uint8_t status
Status.
Definition: ena.h:16
u8 port
Port number.
Definition: CIB_PRM.h:31
enum pause_status flow_status
Definition: skge.h:2504
void * priv
Driver private data.
Definition: netdevice.h:431
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:636
#define DUPLEX_FULL
Definition: bnx2.h:111
u8 autoneg
Definition: skge.h:2505
#define PFX
Definition: sis190.h:34
Definition: skge.h:2460
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
enum pause_control flow_control
Definition: skge.h:2503
static u16 xm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:449
static void genesis_link_up(struct skge_port *skge)
Definition: skge.c:1045
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
u16 speed
Definition: skge.h:2507
#define DUPLEX_HALF
Definition: bnx2.h:110

References skge_port::autoneg, AUTONEG_ENABLE, DBG, skge_hw::dev, skge_port::duplex, DUPLEX_FULL, DUPLEX_HALF, skge_port::flow_control, FLOW_MODE_LOC_SEND, FLOW_MODE_SYM_OR_REM, FLOW_MODE_SYMMETRIC, FLOW_STAT_LOC_SEND, FLOW_STAT_NONE, FLOW_STAT_REM_SEND, FLOW_STAT_SYMMETRIC, skge_port::flow_status, genesis_link_up(), skge_port::hw, net_device::name, netdev_link_ok(), PFX, PHY_B_AN_RF, PHY_ST_AN_OVER, PHY_ST_LSYNC, PHY_X_P_ASYM_MD, PHY_X_P_BOTH_MD, PHY_X_P_SYM_MD, PHY_X_RS_FD, PHY_X_RS_HD, PHY_X_RS_PAUSE, PHY_XMAC_AUNE_LP, PHY_XMAC_RES_ABI, PHY_XMAC_STAT, port, skge_port::port, net_device::priv, skge_port::speed, SPEED_1000, status, xm_link_down(), and xm_phy_read().

Referenced by xm_link_timer().

◆ xm_link_timer()

static void xm_link_timer ( struct skge_port skge)
static

Definition at line 827 of file skge.c.

828 {
829  struct net_device *dev = skge->netdev;
830  struct skge_hw *hw = skge->hw;
831  int port = skge->port;
832  int i;
833 
834  /*
835  * Verify that the link by checking GPIO register three times.
836  * This pin has the signal from the link_sync pin connected to it.
837  */
838  for (i = 0; i < 3; i++) {
840  return;
841  }
842 
843  /* Re-enable interrupt to detect link down */
844  if (xm_check_link(dev)) {
845  u16 msk = xm_read16(hw, port, XM_IMSK);
846  msk &= ~XM_IS_INP_ASS;
847  xm_write16(hw, port, XM_IMSK, msk);
849  }
850 }
uint16_t u16
Definition: stdint.h:21
static u16 xm_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2560
int port
Definition: skge.h:2498
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
struct net_device * dev[2]
Definition: skge.h:2464
Definition: skge.h:2076
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
Definition: skge.h:2075
u8 port
Port number.
Definition: CIB_PRM.h:31
static int xm_check_link(struct net_device *dev)
Definition: skge.c:752
Definition: skge.h:2460
A network device.
Definition: netdevice.h:352
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
struct net_device * netdev
Definition: skge.h:2497

References net_device::dev, skge_hw::dev, skge_port::hw, skge_port::netdev, port, skge_port::port, xm_check_link(), XM_GP_INP_ASS, XM_GP_PORT, XM_IMSK, XM_IS_INP_ASS, XM_ISRC, xm_read16(), and xm_write16().

Referenced by skge_poll().

◆ genesis_stop()

static void genesis_stop ( struct skge_port skge)
static

Definition at line 998 of file skge.c.

999 {
1000  struct skge_hw *hw = skge->hw;
1001  int port = skge->port;
1002  unsigned retries = 1000;
1003  u16 cmd;
1004 
1005  /* Disable Tx and Rx */
1009 
1010  genesis_reset(hw, port);
1011 
1012  /* Clear Tx packet arbiter timeout IRQ */
1014  port == 0 ? PA_CLR_TO_TX1 : PA_CLR_TO_TX2);
1015 
1016  /* Reset the MAC */
1018  do {
1021  break;
1022  } while (--retries > 0);
1023 
1024  /* For external PHYs there must be special handling */
1025  if (hw->phy_type != SK_PHY_XMAC) {
1027  if (port == 0) {
1028  reg |= GP_DIR_0;
1029  reg &= ~GP_IO_0;
1030  } else {
1031  reg |= GP_DIR_2;
1032  reg &= ~GP_IO_2;
1033  }
1036  }
1037 
1040  & ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX));
1041 
1043 }
uint16_t u16
Definition: stdint.h:21
static u16 xm_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2560
int port
Definition: skge.h:2498
static void xm_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2571
static unsigned int unsigned int reg
Definition: myson.h:162
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
u8 port
Port number.
Definition: CIB_PRM.h:31
Definition: skge.h:367
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
Definition: skge.h:2460
#define SK_REG(port, reg)
Definition: skge.h:2548
Definition: skge.h:358
Definition: skge.h:369
Definition: skge.h:356
Definition: skge.h:128
struct golan_eqe_cmd cmd
Definition: CIB_PRM.h:29
static void genesis_reset(struct skge_hw *hw, int port)
Definition: skge.c:508
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
uint32_t u32
Definition: stdint.h:23
static u16 skge_read16(const struct skge_hw *hw, int reg)
Definition: skge.h:2522

References B2_GP_IO, B3_PA_CTRL, cmd, genesis_reset(), GP_DIR_0, GP_DIR_2, GP_IO_0, GP_IO_2, skge_port::hw, MFF_CLR_MAC_RST, MFF_SET_MAC_RST, PA_CLR_TO_TX1, PA_CLR_TO_TX2, port, skge_port::port, reg, SK_PHY_XMAC, SK_REG, skge_read16(), skge_read32(), skge_write16(), skge_write32(), TX_MFF_CTRL1, XM_MMU_CMD, XM_MMU_ENA_RX, XM_MMU_ENA_TX, xm_read16(), and xm_write16().

Referenced by skge_down().

◆ bcom_phy_intr()

static void bcom_phy_intr ( struct skge_port skge)
inlinestatic

Definition at line 1129 of file skge.c.

1130 {
1131  struct skge_hw *hw = skge->hw;
1132  int port = skge->port;
1133  u16 isrc;
1134 
1136  DBGIO(PFX "%s: phy interrupt status 0x%x\n",
1137  skge->netdev->name, isrc);
1138 
1139  if (isrc & PHY_B_IS_PSE)
1140  DBG(PFX "%s: uncorrectable pair swap error\n",
1141  hw->dev[port]->name);
1142 
1143  /* Workaround BCom Errata:
1144  * enable and disable loopback mode if "NO HCD" occurs.
1145  */
1146  if (isrc & PHY_B_IS_NO_HDCL) {
1149  ctrl | PHY_CT_LOOP);
1151  ctrl & ~PHY_CT_LOOP);
1152  }
1153 
1154  if (isrc & (PHY_B_IS_AN_PR | PHY_B_IS_LST_CHANGE))
1156 
1157 }
uint16_t u16
Definition: stdint.h:21
int port
Definition: skge.h:2498
static void bcom_check_link(struct skge_hw *hw, int port)
Definition: skge.c:553
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
u8 port
Port number.
Definition: CIB_PRM.h:31
static int xm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:458
#define PFX
Definition: sis190.h:34
#define DBGIO(...)
Definition: compiler.h:549
Definition: skge.h:2460
struct net_device * netdev
Definition: skge.h:2497
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
static u16 xm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:449
u8 ctrl
Definition: sky2.h:10
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References bcom_check_link(), ctrl, DBG, DBGIO, skge_port::hw, net_device::name, skge_port::netdev, PFX, PHY_B_IS_AN_PR, PHY_B_IS_LST_CHANGE, PHY_B_IS_NO_HDCL, PHY_B_IS_PSE, PHY_BCOM_CTRL, PHY_BCOM_INT_STAT, PHY_CT_LOOP, port, skge_port::port, xm_phy_read(), and xm_phy_write().

Referenced by skge_phyirq().

◆ __gm_phy_read()

static int __gm_phy_read ( struct skge_hw hw,
int  port,
u16  reg,
u16 val 
)
static

Definition at line 1179 of file skge.c.

1180 {
1181  int i;
1182 
1184  GM_SMI_CT_PHY_AD(hw->phy_addr)
1186 
1187  for (i = 0; i < PHY_RETRIES; i++) {
1188  udelay(1);
1190  goto ready;
1191  }
1192 
1193  return -ETIMEDOUT;
1194  ready:
1196  return 0;
1197 }
static void gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2607
static unsigned int unsigned int reg
Definition: myson.h:162
#define GM_SMI_CT_PHY_AD(x)
Definition: skge.h:1869
#define PHY_RETRIES
Definition: skge.h:28
Definition: hw.c:16
u8 port
Port number.
Definition: CIB_PRM.h:31
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:60
void __asmcall int val
Definition: setjmp.h:28
static u16 gma_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2596
#define GM_SMI_CT_REG_AD(x)
Definition: skge.h:1870
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669

References ETIMEDOUT, GM_SMI_CT_OP_RD, GM_SMI_CT_PHY_AD, GM_SMI_CT_RD_VAL, GM_SMI_CT_REG_AD, GM_SMI_CTRL, GM_SMI_DATA, gma_read16(), gma_write16(), PHY_RETRIES, port, reg, udelay(), and val.

Referenced by gm_phy_read().

◆ gm_phy_read()

static u16 gm_phy_read ( struct skge_hw hw,
int  port,
u16  reg 
)
static

Definition at line 1199 of file skge.c.

1200 {
1201  u16 v = 0;
1202  if (__gm_phy_read(hw, port, reg, &v))
1203  DBG(PFX "%s: phy read timeout port %x reg %x val %x\n",
1204  hw->dev[port]->name,
1205  port, reg, v);
1206  return v;
1207 }
uint16_t u16
Definition: stdint.h:21
static unsigned int unsigned int reg
Definition: myson.h:162
Definition: hw.c:16
static int __gm_phy_read(struct skge_hw *hw, int port, u16 reg, u16 *val)
Definition: skge.c:1179
u8 port
Port number.
Definition: CIB_PRM.h:31
#define PFX
Definition: sis190.h:34
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References __gm_phy_read(), DBG, PFX, port, and reg.

Referenced by yukon_init(), yukon_link_down(), yukon_phy_intr(), and yukon_suspend().

◆ yukon_reset()

static void yukon_reset ( struct skge_hw hw,
int  port 
)
static

Definition at line 1297 of file skge.c.

1298 {
1299  gm_phy_write(hw, port, PHY_MARV_INT_MASK, 0);/* disable PHY IRQs */
1300  gma_write16(hw, port, GM_MC_ADDR_H1, 0); /* clear MC hash */
1304 
1308 }
static void gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2607
Definition: hw.c:16
u8 port
Port number.
Definition: CIB_PRM.h:31
static u16 gma_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2596
static int gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:1159

References GM_MC_ADDR_H1, GM_MC_ADDR_H2, GM_MC_ADDR_H3, GM_MC_ADDR_H4, gm_phy_write(), GM_RX_CTRL, GM_RXCR_MCF_ENA, GM_RXCR_UCF_ENA, gma_read16(), gma_write16(), PHY_MARV_INT_MASK, and port.

Referenced by skge_reset(), and yukon_stop().

◆ is_yukon_lite_a0()

static int is_yukon_lite_a0 ( struct skge_hw hw)
static

Definition at line 1311 of file skge.c.

1312 {
1313  u32 reg;
1314  int ret;
1315 
1316  if (hw->chip_id != CHIP_ID_YUKON)
1317  return 0;
1318 
1319  reg = skge_read32(hw, B2_FAR);
1320  skge_write8(hw, B2_FAR + 3, 0xff);
1321  ret = (skge_read8(hw, B2_FAR + 3) != 0);
1323  return ret;
1324 }
static unsigned int unsigned int reg
Definition: myson.h:162
Definition: hw.c:16
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
static u8 skge_read8(const struct skge_hw *hw, int reg)
Definition: skge.h:2527
Definition: skge.h:112
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
uint32_t u32
Definition: stdint.h:23
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References B2_FAR, CHIP_ID_YUKON, reg, skge_read32(), skge_read8(), skge_write32(), and skge_write8().

Referenced by yukon_mac_init().

◆ yukon_mac_init()

static void yukon_mac_init ( struct skge_hw hw,
int  port 
)
static

Definition at line 1326 of file skge.c.

1327 {
1328  struct skge_port *skge = hw->dev[port]->priv;
1329  int i;
1330  u32 reg;
1331  const u8 *addr = hw->dev[port]->ll_addr;
1332 
1333  /* WA code for COMA mode -- set PHY reset */
1334  if (hw->chip_id == CHIP_ID_YUKON_LITE &&
1335  hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
1336  reg = skge_read32(hw, B2_GP_IO);
1337  reg |= GP_DIR_9 | GP_IO_9;
1339  }
1340 
1341  /* hard reset */
1344 
1345  /* WA code for COMA mode -- clear PHY reset */
1346  if (hw->chip_id == CHIP_ID_YUKON_LITE &&
1347  hw->chip_rev >= CHIP_REV_YU_LITE_A3) {
1348  reg = skge_read32(hw, B2_GP_IO);
1349  reg |= GP_DIR_9;
1350  reg &= ~GP_IO_9;
1352  }
1353 
1354  /* Set hardware config mode */
1358 
1359  /* Clear GMC reset */
1363 
1364  if (skge->autoneg == AUTONEG_DISABLE) {
1368 
1369  switch (skge->speed) {
1370  case SPEED_1000:
1371  reg &= ~GM_GPCR_SPEED_100;
1373  break;
1374  case SPEED_100:
1375  reg &= ~GM_GPCR_SPEED_1000;
1377  break;
1378  case SPEED_10:
1380  break;
1381  }
1382 
1383  if (skge->duplex == DUPLEX_FULL)
1384  reg |= GM_GPCR_DUP_FULL;
1385  } else
1387 
1388  switch (skge->flow_control) {
1389  case FLOW_MODE_NONE:
1392  break;
1393  case FLOW_MODE_LOC_SEND:
1394  /* disable Rx flow-control */
1396  break;
1397  case FLOW_MODE_SYMMETRIC:
1398  case FLOW_MODE_SYM_OR_REM:
1399  /* enable Tx & Rx flow-control */
1400  break;
1401  }
1402 
1405 
1406  yukon_init(hw, port);
1407 
1408  /* MIB clear */
1411 
1412  for (i = 0; i < GM_MIB_CNT_SIZE; i++)
1413  gma_read16(hw, port, GM_MIB_CNT_BASE + 8*i);
1415 
1416  /* transmit control */
1418 
1419  /* receive control reg: unicast + multicast + no FCS */
1422 
1423  /* transmit flow control */
1424  gma_write16(hw, port, GM_TX_FLOW_CTRL, 0xffff);
1425 
1426  /* transmit parameter */
1431 
1432  /* configure the Serial Mode Register */
1436 
1438 
1439  /* physical address: used for pause frames */
1441  /* virtual address for data */
1443 
1444  /* enable interrupt mask for counter overflows */
1448 
1449  /* Initialize Mac Fifo */
1450 
1451  /* Configure Rx MAC FIFO */
1454 
1455  /* disable Rx GMAC FIFO Flush for YUKON-Lite Rev. A0 only */
1456  if (is_yukon_lite_a0(hw))
1457  reg &= ~GMF_RX_F_FL_ON;
1458 
1461  /*
1462  * because Pause Packet Truncation in GMAC is not working
1463  * we have to increase the Flush Threshold to 64 bytes
1464  * in order to flush pause packets in Rx FIFO on Yukon-1
1465  */
1467 
1468  /* Configure Tx MAC FIFO */
1471 }
#define SPEED_1000
Definition: atl1e.h:52
#define IPG_DATA_DEF
Definition: skge.h:1858
static void gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2607
static unsigned int unsigned int reg
Definition: myson.h:162
#define TX_COL_THR(x)
Definition: skge.h:1818
u8 duplex
Definition: skge.h:2506
#define SPEED_10
Definition: atl1e.h:50
Definition: hw.c:16
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
#define SPEED_100
Definition: atl1e.h:51
static int is_yukon_lite_a0(struct skge_hw *hw)
Definition: skge.c:1311
#define TX_JAM_IPG_VAL(x)
Definition: skge.h:1841
#define GM_GPCR_SPEED_1000
Definition: skge.h:1807
u8 port
Port number.
Definition: CIB_PRM.h:31
#define DUPLEX_FULL
Definition: bnx2.h:111
u8 autoneg
Definition: skge.h:2505
#define TX_IPG_JAM_DATA(x)
Definition: skge.h:1842
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
#define GPC_HWCFG_GMII_COP
Definition: skge.h:1988
#define IPG_DATA_VAL(x)
Definition: skge.h:1857
Definition: skge.h:349
#define TX_JAM_LEN_VAL(x)
Definition: skge.h:1840
u32 addr
Definition: sky2.h:8
#define SK_REG(port, reg)
Definition: skge.h:2548
Definition: skge.h:360
static u16 gma_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2596
enum pause_control flow_control
Definition: skge.h:2503
#define TX_COL_DEF
Definition: skge.h:1819
#define GPC_HWCFG_GMII_FIB
Definition: skge.h:1989
#define DATA_BLIND_DEF
Definition: skge.h:1855
Definition: skge.h:128
static void yukon_init(struct skge_hw *hw, int port)
Definition: skge.c:1210
#define AUTONEG_DISABLE
Definition: bnx2.h:4583
#define DATA_BLIND_VAL(x)
Definition: skge.h:1854
static void gma_set_addr(struct skge_hw *hw, int port, int reg, const u8 *addr)
Definition: skge.h:2612
#define GM_MIB_CNT_SIZE
Definition: skge.h:1716
#define GM_GPCR_AU_ALL_DIS
Definition: skge.h:1808
u16 speed
Definition: skge.h:2507
#define GPC_ANEG_ADV_ALL_M
Definition: skge.h:1990
uint8_t u8
Definition: stdint.h:19
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
uint32_t u32
Definition: stdint.h:23
static u16 skge_read16(const struct skge_hw *hw, int reg)
Definition: skge.h:2522
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References addr, skge_port::autoneg, AUTONEG_DISABLE, B2_GP_IO, CHIP_ID_YUKON_LITE, CHIP_REV_YU_LITE_A3, DATA_BLIND_DEF, DATA_BLIND_VAL, skge_port::duplex, DUPLEX_FULL, skge_port::flow_control, FLOW_MODE_LOC_SEND, FLOW_MODE_NONE, FLOW_MODE_SYM_OR_REM, FLOW_MODE_SYMMETRIC, GM_GP_CTRL, GM_GPCR_AU_ALL_DIS, GM_GPCR_AU_FCT_DIS, GM_GPCR_DUP_FULL, GM_GPCR_FC_RX_DIS, GM_GPCR_FC_TX_DIS, GM_GPCR_SPEED_100, GM_GPCR_SPEED_1000, GM_MIB_CNT_BASE, GM_MIB_CNT_SIZE, GM_PAR_MIB_CLR, GM_PHY_ADDR, GM_RX_CTRL, GM_RX_IRQ_MSK, GM_RXCR_CRC_DIS, GM_RXCR_MCF_ENA, GM_RXCR_UCF_ENA, GM_SERIAL_MODE, GM_SMOD_VLAN_ENA, GM_SRC_ADDR_1L, GM_SRC_ADDR_2L, GM_TR_IRQ_MSK, GM_TX_CTRL, GM_TX_FLOW_CTRL, GM_TX_IRQ_MSK, GM_TX_PARAM, gma_read16(), gma_set_addr(), gma_write16(), GMAC_CTRL, GMAC_IRQ_SRC, GMC_PAUSE_OFF, GMC_PAUSE_ON, GMC_RST_CLR, GMC_RST_SET, GMF_OPER_ON, GMF_RST_CLR, GMF_RX_F_FL_ON, GP_DIR_9, GP_IO_9, GPC_ANEG_ADV_ALL_M, GPC_DIS_FC, GPC_DIS_SLEEP, GPC_ENA_PAUSE, GPC_ENA_XC, GPC_HWCFG_GMII_COP, GPC_HWCFG_GMII_FIB, GPC_INT_POL_HI, GPC_RST_CLR, GPC_RST_SET, GPHY_CTRL, IPG_DATA_DEF, IPG_DATA_VAL, is_yukon_lite_a0(), port, reg, RX_FF_FL_DEF_MSK, RX_GMF_CTRL_T, RX_GMF_FL_MSK, RX_GMF_FL_THR, RX_GMF_FL_THR_DEF, SK_REG, skge_read16(), skge_read32(), skge_write16(), skge_write32(), skge_write8(), skge_port::speed, SPEED_10, SPEED_100, SPEED_1000, TX_COL_DEF, TX_COL_THR, TX_GMF_CTRL_T, TX_IPG_JAM_DATA, TX_IPG_JAM_DEF, TX_JAM_IPG_DEF, TX_JAM_IPG_VAL, TX_JAM_LEN_DEF, TX_JAM_LEN_VAL, and yukon_init().

Referenced by skge_up().

◆ yukon_suspend()

static void yukon_suspend ( struct skge_hw hw,
int  port 
)
static

Definition at line 1474 of file skge.c.

1475 {
1476  u16 ctrl;
1477 
1481 
1483  ctrl |= PHY_CT_RESET;
1485 
1486  /* switch IEEE compatible power down mode on */
1488  ctrl |= PHY_CT_PDOWN;
1490 }
uint16_t u16
Definition: stdint.h:21
Definition: hw.c:16
u8 port
Port number.
Definition: CIB_PRM.h:31
static u16 gm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:1199
u8 ctrl
Definition: sky2.h:10
static int gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:1159

References ctrl, gm_phy_read(), gm_phy_write(), PHY_CT_PDOWN, PHY_CT_RESET, PHY_M_PC_POL_R_DIS, PHY_MARV_CTRL, PHY_MARV_PHY_CTRL, and port.

Referenced by yukon_stop().

◆ yukon_stop()

static void yukon_stop ( struct skge_port skge)
static

Definition at line 1492 of file skge.c.

1493 {
1494  struct skge_hw *hw = skge->hw;
1495  int port = skge->port;
1496 
1498  yukon_reset(hw, port);
1499 
1504 
1505  yukon_suspend(hw, port);
1506 
1507  /* set GPHY Control reset */
1510 }
static void yukon_reset(struct skge_hw *hw, int port)
Definition: skge.c:1297
int port
Definition: skge.h:2498
static void gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2607
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
u8 port
Port number.
Definition: CIB_PRM.h:31
Definition: skge.h:2460
#define SK_REG(port, reg)
Definition: skge.h:2548
static u16 gma_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2596
static void yukon_suspend(struct skge_hw *hw, int port)
Definition: skge.c:1474
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References GM_GP_CTRL, GM_GPCR_RX_ENA, GM_GPCR_TX_ENA, gma_read16(), gma_write16(), GMAC_CTRL, GMAC_IRQ_MSK, GMC_RST_SET, GPC_RST_SET, GPHY_CTRL, skge_port::hw, port, skge_port::port, SK_REG, skge_write8(), yukon_reset(), and yukon_suspend().

Referenced by skge_down().

◆ yukon_speed()

static u16 yukon_speed ( const struct skge_hw *hw  __unused,
u16  aux 
)
static

Definition at line 1512 of file skge.c.

1513 {
1514  switch (aux & PHY_M_PS_SPEED_MSK) {
1515  case PHY_M_PS_SPEED_1000:
1516  return SPEED_1000;
1517  case PHY_M_PS_SPEED_100:
1518  return SPEED_100;
1519  default:
1520  return SPEED_10;
1521  }
1522 }
#define SPEED_1000
Definition: atl1e.h:52
#define SPEED_10
Definition: atl1e.h:50
#define SPEED_100
Definition: atl1e.h:51

References PHY_M_PS_SPEED_100, PHY_M_PS_SPEED_1000, PHY_M_PS_SPEED_MSK, SPEED_10, SPEED_100, and SPEED_1000.

Referenced by yukon_phy_intr().

◆ yukon_link_up()

static void yukon_link_up ( struct skge_port skge)
static

Definition at line 1524 of file skge.c.

1525 {
1526  struct skge_hw *hw = skge->hw;
1527  int port = skge->port;
1528  u16 reg;
1529 
1530  /* Enable Transmit FIFO Underrun */
1532 
1534  if (skge->duplex == DUPLEX_FULL || skge->autoneg == AUTONEG_ENABLE)
1535  reg |= GM_GPCR_DUP_FULL;
1536 
1537  /* enable Rx/Tx */
1540 
1542  skge_link_up(skge);
1543 }
uint16_t u16
Definition: stdint.h:21
int port
Definition: skge.h:2498
static void gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2607
static unsigned int unsigned int reg
Definition: myson.h:162
#define AUTONEG_ENABLE
Definition: bnx2.h:4584
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
u8 port
Port number.
Definition: CIB_PRM.h:31
#define GMAC_DEF_MSK
Definition: skge.h:2021
#define DUPLEX_FULL
Definition: bnx2.h:111
u8 autoneg
Definition: skge.h:2505
static void skge_link_up(struct skge_port *skge)
Definition: skge.c:394
Definition: skge.h:2460
#define SK_REG(port, reg)
Definition: skge.h:2548
static u16 gma_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2596
static int gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:1159
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References skge_port::autoneg, AUTONEG_ENABLE, skge_port::duplex, DUPLEX_FULL, GM_GP_CTRL, GM_GPCR_DUP_FULL, GM_GPCR_RX_ENA, GM_GPCR_TX_ENA, gm_phy_write(), gma_read16(), gma_write16(), GMAC_DEF_MSK, GMAC_IRQ_MSK, skge_port::hw, PHY_M_IS_DEF_MSK, PHY_MARV_INT_MASK, port, skge_port::port, reg, SK_REG, skge_link_up(), and skge_write8().

Referenced by yukon_phy_intr().

◆ yukon_link_down()

static void yukon_link_down ( struct skge_port skge)
static

Definition at line 1545 of file skge.c.

1546 {
1547  struct skge_hw *hw = skge->hw;
1548  int port = skge->port;
1549  u16 ctrl;
1550 
1554 
1555  if (skge->flow_status == FLOW_STAT_REM_SEND) {
1557  ctrl |= PHY_M_AN_ASP;
1558  /* restore Asymmetric Pause bit */
1560  }
1561 
1562  skge_link_down(skge);
1563 
1564  yukon_init(hw, port);
1565 }
uint16_t u16
Definition: stdint.h:21
int port
Definition: skge.h:2498
static void gma_write16(const struct skge_hw *hw, int port, int r, u16 v)
Definition: skge.h:2607
static void skge_link_down(struct skge_port *skge)
Definition: skge.c:406
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
u8 port
Port number.
Definition: CIB_PRM.h:31
enum pause_status flow_status
Definition: skge.h:2504
Definition: skge.h:2460
static u16 gm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:1199
static u16 gma_read16(const struct skge_hw *hw, int port, int reg)
Definition: skge.h:2596
u8 ctrl
Definition: sky2.h:10
static int gm_phy_write(struct skge_hw *hw, int port, u16 reg, u16 val)
Definition: skge.c:1159
static void yukon_init(struct skge_hw *hw, int port)
Definition: skge.c:1210

References ctrl, FLOW_STAT_REM_SEND, skge_port::flow_status, GM_GP_CTRL, GM_GPCR_RX_ENA, GM_GPCR_TX_ENA, gm_phy_read(), gm_phy_write(), gma_read16(), gma_write16(), skge_port::hw, PHY_M_AN_ASP, PHY_MARV_AUNE_ADV, port, skge_port::port, skge_link_down(), and yukon_init().

Referenced by yukon_phy_intr().

◆ yukon_phy_intr()

static void yukon_phy_intr ( struct skge_port skge)
static

Definition at line 1567 of file skge.c.

1568 {
1569  struct skge_hw *hw = skge->hw;
1570  int port = skge->port;
1571  const char *reason = NULL;
1572  u16 istatus, phystat;
1573 
1574  istatus = gm_phy_read(hw, port, PHY_MARV_INT_STAT);
1575  phystat = gm_phy_read(hw, port, PHY_MARV_PHY_STAT);
1576 
1577  DBGIO(PFX "%s: phy interrupt status 0x%x 0x%x\n",
1578  skge->netdev->name, istatus, phystat);
1579 
1580  if (istatus & PHY_M_IS_AN_COMPL) {
1582  & PHY_M_AN_RF) {
1583  reason = "remote fault";
1584  goto failed;
1585  }
1586 
1588  reason = "master/slave fault";
1589  goto failed;
1590  }
1591 
1592  if (!(phystat & PHY_M_PS_SPDUP_RES)) {
1593  reason = "speed/duplex";
1594  goto failed;
1595  }
1596 
1597  skge->duplex = (phystat & PHY_M_PS_FULL_DUP)
1599  skge->speed = yukon_speed(hw, phystat);
1600 
1601  /* We are using IEEE 802.3z/D5.0 Table 37-4 */
1602  switch (phystat & PHY_M_PS_PAUSE_MSK) {
1603  case PHY_M_PS_PAUSE_MSK:
1605  break;
1606  case PHY_M_PS_RX_P_EN:
1608  break;
1609  case PHY_M_PS_TX_P_EN:
1611  break;
1612  default:
1613  skge->flow_status = FLOW_STAT_NONE;
1614  }
1615 
1616  if (skge->flow_status == FLOW_STAT_NONE ||
1617  (skge->speed < SPEED_1000 && skge->duplex == DUPLEX_HALF))
1619  else
1621  yukon_link_up(skge);
1622  return;
1623  }
1624 
1625  if (istatus & PHY_M_IS_LSP_CHANGE)
1626  skge->speed = yukon_speed(hw, phystat);
1627 
1628  if (istatus & PHY_M_IS_DUP_CHANGE)
1629  skge->duplex = (phystat & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF;
1630  if (istatus & PHY_M_IS_LST_CHANGE) {
1631  if (phystat & PHY_M_PS_LINK_UP)
1632  yukon_link_up(skge);
1633  else
1634  yukon_link_down(skge);
1635  }
1636  return;
1637  failed:
1638  DBG(PFX "%s: autonegotiation failed (%s)\n",
1639  skge->netdev->name, reason);
1640 
1641  /* XXX restart autonegotiation? */
1642 }
#define SPEED_1000
Definition: atl1e.h:52
uint16_t u16
Definition: stdint.h:21
static void yukon_link_down(struct skge_port *skge)
Definition: skge.c:1545
int port
Definition: skge.h:2498
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
u8 port
Port number.
Definition: CIB_PRM.h:31
enum pause_status flow_status
Definition: skge.h:2504
static u16 yukon_speed(const struct skge_hw *hw __unused, u16 aux)
Definition: skge.c:1512
#define PHY_M_PS_PAUSE_MSK
Definition: skge.h:1451
#define DUPLEX_FULL
Definition: bnx2.h:111
#define PFX
Definition: sis190.h:34
#define DBGIO(...)
Definition: compiler.h:549
Definition: skge.h:2460
static u16 gm_phy_read(struct skge_hw *hw, int port, u16 reg)
Definition: skge.c:1199
#define SK_REG(port, reg)
Definition: skge.h:2548
struct net_device * netdev
Definition: skge.h:2497
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:362
static void yukon_link_up(struct skge_port *skge)
Definition: skge.c:1524
uint16_t reason
Rejection reason.
Definition: ib_mad.h:20
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
u16 speed
Definition: skge.h:2507
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define DUPLEX_HALF
Definition: bnx2.h:110
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References DBG, DBGIO, skge_port::duplex, DUPLEX_FULL, DUPLEX_HALF, FLOW_STAT_LOC_SEND, FLOW_STAT_NONE, FLOW_STAT_REM_SEND, FLOW_STAT_SYMMETRIC, skge_port::flow_status, gm_phy_read(), GMAC_CTRL, GMC_PAUSE_OFF, GMC_PAUSE_ON, skge_port::hw, net_device::name, skge_port::netdev, NULL, PFX, PHY_B_1000S_MSF, PHY_M_AN_RF, PHY_M_IS_AN_COMPL, PHY_M_IS_DUP_CHANGE, PHY_M_IS_LSP_CHANGE, PHY_M_IS_LST_CHANGE, PHY_M_PS_FULL_DUP, PHY_M_PS_LINK_UP, PHY_M_PS_PAUSE_MSK, PHY_M_PS_RX_P_EN, PHY_M_PS_SPDUP_RES, PHY_M_PS_TX_P_EN, PHY_MARV_1000T_STAT, PHY_MARV_AUNE_LP, PHY_MARV_INT_STAT, PHY_MARV_PHY_STAT, port, skge_port::port, reason, SK_REG, skge_write8(), skge_port::speed, SPEED_1000, yukon_link_down(), yukon_link_up(), and yukon_speed().

Referenced by skge_phyirq().

◆ skge_ramset()

static void skge_ramset ( struct skge_hw hw,
u16  q,
u32  start,
size_t  len 
)
static

Definition at line 1644 of file skge.c.

1645 {
1646  u32 end;
1647 
1648  start /= 8;
1649  len /= 8;
1650  end = start + len - 1;
1651 
1656  skge_write32(hw, RB_ADDR(q, RB_END), end);
1657 
1658  if (q == Q_R1 || q == Q_R2) {
1659  /* Set thresholds on receive queue's */
1661  start + (2*len)/3);
1663  start + (len/3));
1664  } else {
1665  /* Enable store & forward on Tx queue's because
1666  * Tx FIFO is only 4K on Genesis and 1K on Yukon
1667  */
1669  }
1670 
1672 }
Definition: skge.h:558
Definition: skge.h:550
Definition: hw.c:16
#define RB_ADDR(offs, queue)
Definition: skge.h:590
uint32_t start
Starting offset.
Definition: netvsc.h:12
Definition: skge.h:539
Definition: skge.h:541
Definition: skge.h:557
uint32_t len
Length.
Definition: ena.h:14
Definition: skge.h:542
uint32_t end
Ending offset.
Definition: netvsc.h:18
Definition: skge.h:540
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
uint32_t u32
Definition: stdint.h:23
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References end, len, Q_R1, Q_R2, RB_ADDR, RB_CTRL, RB_ENA_OP_MD, RB_ENA_STFWD, RB_END, RB_RP, RB_RST_CLR, RB_RX_LTPP, RB_RX_UTPP, RB_START, RB_WP, skge_write32(), skge_write8(), and start.

Referenced by skge_up().

◆ skge_qset()

static void skge_qset ( struct skge_port skge,
u16  q,
const struct skge_element e 
)
static

Definition at line 1675 of file skge.c.

1677 {
1678  struct skge_hw *hw = skge->hw;
1679  u32 watermark = 0x600;
1680  u64 base = skge->dma + (e->desc - skge->mem);
1681 
1682  /* optimization to reduce window on 32bit/33mhz */
1683  if ((skge_read16(hw, B0_CTST) & (CS_BUS_CLOCK | CS_BUS_SLOT_SZ)) == 0)
1684  watermark /= 2;
1685 
1687  skge_write32(hw, Q_ADDR(q, Q_F), watermark);
1688  skge_write32(hw, Q_ADDR(q, Q_DA_H), (u32)(base >> 32));
1689  skge_write32(hw, Q_ADDR(q, Q_DA_L), (u32)base);
1690 }
Definition: skge.h:524
Definition: skge.h:519
Definition: skge.h:523
static const void * base
Base address.
Definition: crypto.h:335
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
u32 dma
Definition: skge.h:2511
uint32_t e
Definition: sha1.c:32
uint64_t u64
Definition: stdint.h:25
Definition: skge.h:2460
Definition: skge.h:78
void * mem
Definition: skge.h:2510
#define Q_ADDR(reg, offs)
Definition: skge.h:534
#define CSR_CLR_RESET
Definition: skge.h:793
Definition: skge.h:518
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
uint32_t u32
Definition: stdint.h:23
static u16 skge_read16(const struct skge_hw *hw, int reg)
Definition: skge.h:2522

References B0_CTST, base, CS_BUS_CLOCK, CS_BUS_SLOT_SZ, CSR_CLR_RESET, skge_port::dma, e, skge_port::hw, skge_port::mem, Q_ADDR, Q_CSR, Q_DA_H, Q_DA_L, Q_F, skge_read16(), and skge_write32().

Referenced by skge_up().

◆ skge_free()

void skge_free ( struct net_device dev)

Definition at line 1692 of file skge.c.

1693 {
1694  struct skge_port *skge = dev->priv;
1695 
1696  free(skge->rx_ring.start);
1697  skge->rx_ring.start = NULL;
1698 
1699  free(skge->tx_ring.start);
1700  skge->tx_ring.start = NULL;
1701 
1702  free_phys(skge->mem, RING_SIZE);
1703  skge->mem = NULL;
1704  skge->dma = 0;
1705 }
struct skge_ring tx_ring
Definition: skge.h:2500
u32 dma
Definition: skge.h:2511
struct skge_element * start
Definition: skge.h:2456
void * priv
Driver private data.
Definition: netdevice.h:431
#define RING_SIZE
Definition: skge.h:32
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
struct skge_ring rx_ring
Definition: skge.h:2501
void * mem
Definition: skge.h:2510
static void free_phys(void *ptr, size_t size)
Free memory allocated with malloc_phys()
Definition: malloc.h:77
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References skge_port::dma, free, free_phys(), skge_port::mem, NULL, net_device::priv, RING_SIZE, skge_port::rx_ring, skge_ring::start, and skge_port::tx_ring.

Referenced by skge_down(), and skge_up().

◆ skge_rx_stop()

static void skge_rx_stop ( struct skge_hw hw,
int  port 
)
static

Definition at line 1782 of file skge.c.

1783 {
1788 }
Definition: skge.h:558
Definition: skge.h:550
Definition: skge.h:523
Definition: hw.c:16
Definition: skge.h:782
#define RB_ADDR(offs, queue)
Definition: skge.h:590
u8 port
Port number.
Definition: CIB_PRM.h:31
static const int rxqaddr[]
Definition: skge.c:86
Definition: skge.h:557
#define Q_ADDR(reg, offs)
Definition: skge.h:534
#define CSR_SET_RESET
Definition: skge.h:790
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References CSR_SET_RESET, CSR_STOP, port, Q_ADDR, Q_CSR, Q_R1, Q_R2, RB_ADDR, RB_CTRL, RB_DIS_OP_MD, RB_RST_SET, rxqaddr, skge_write32(), and skge_write8().

Referenced by skge_down().

◆ skge_tx_avail()

static int skge_tx_avail ( const struct skge_ring ring)
inlinestatic

Definition at line 1856 of file skge.c.

1857 {
1858  mb();
1859  return ((ring->to_clean > ring->to_use) ? 0 : NUM_TX_DESC)
1860  + (ring->to_clean - ring->to_use) - 1;
1861 }
struct skge_element * to_clean
Definition: skge.h:2454
void mb(void)
Memory barrier.
#define NUM_TX_DESC
Definition: igbvf.h:280
struct skge_element * to_use
Definition: skge.h:2455

References mb(), NUM_TX_DESC, skge_ring::to_clean, and skge_ring::to_use.

Referenced by skge_xmit_frame().

◆ phy_length()

static u16 phy_length ( const struct skge_hw hw,
u32  status 
)
inlinestatic

Definition at line 1922 of file skge.c.

1923 {
1924  if (hw->chip_id == CHIP_ID_GENESIS)
1925  return status >> XMR_FS_LEN_SHIFT;
1926  else
1927  return status >> GMR_FS_LEN_SHIFT;
1928 }
Definition: hw.c:16
uint8_t status
Status.
Definition: ena.h:16

References CHIP_ID_GENESIS, GMR_FS_LEN_SHIFT, status, and XMR_FS_LEN_SHIFT.

Referenced by skge_rx_done().

◆ bad_phy_status()

static int bad_phy_status ( const struct skge_hw hw,
u32  status 
)
inlinestatic

Definition at line 1930 of file skge.c.

1931 {
1932  if (hw->chip_id == CHIP_ID_GENESIS)
1933  return (status & (XMR_FS_ERR | XMR_FS_2L_VLAN)) != 0;
1934  else
1935  return (status & GMR_FS_ANY_ERR) ||
1936  (status & GMR_FS_RX_OK) == 0;
1937 }
Definition: hw.c:16
uint8_t status
Status.
Definition: ena.h:16

References CHIP_ID_GENESIS, GMR_FS_ANY_ERR, GMR_FS_RX_OK, status, XMR_FS_2L_VLAN, and XMR_FS_ERR.

Referenced by skge_rx_done().

◆ skge_tx_done()

static void skge_tx_done ( struct net_device dev)
static

Definition at line 1940 of file skge.c.

1941 {
1942  struct skge_port *skge = dev->priv;
1943  struct skge_ring *ring = &skge->tx_ring;
1944  struct skge_element *e;
1945 
1946  skge_write8(skge->hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_IRQ_CL_F);
1947 
1948  for (e = ring->to_clean; e != ring->to_use; e = e->next) {
1949  u32 control = ((const struct skge_tx_desc *) e->desc)->control;
1950 
1951  if (control & BMU_OWN)
1952  break;
1953 
1954  netdev_tx_complete(dev, e->iob);
1955  }
1956  skge->tx_ring.to_clean = e;
1957 
1958  /* Can run lockless until we need to synchronize to restart queue. */
1959  mb();
1960 }
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:752
int port
Definition: skge.h:2498
struct skge_ring tx_ring
Definition: skge.h:2500
Definition: skge.h:523
struct skge_hw * hw
Definition: skge.h:2496
uint32_t e
Definition: sha1.c:32
void * priv
Driver private data.
Definition: netdevice.h:431
struct skge_element * to_clean
Definition: skge.h:2454
uint32_t control
Control.
Definition: myson.h:14
Definition: skge.h:376
#define Q_ADDR(reg, offs)
Definition: skge.h:534
void mb(void)
Memory barrier.
static const int txqaddr[]
Definition: skge.c:85
struct skge_element * to_use
Definition: skge.h:2455
uint32_t u32
Definition: stdint.h:23
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References BMU_OWN, control, CSR_IRQ_CL_F, e, skge_port::hw, mb(), netdev_tx_complete(), skge_port::port, net_device::priv, Q_ADDR, Q_CSR, skge_write8(), skge_ring::to_clean, skge_ring::to_use, skge_port::tx_ring, and txqaddr.

Referenced by skge_poll().

◆ skge_rx_done()

static void skge_rx_done ( struct net_device dev)
static

Definition at line 2004 of file skge.c.

2005 {
2006  struct skge_port *skge = dev->priv;
2007  struct skge_ring *ring = &skge->rx_ring;
2008  struct skge_rx_desc *rd;
2009  struct skge_element *e;
2010  struct io_buffer *iob;
2011  u32 control;
2012  u16 len;
2013  int i;
2014 
2015  e = ring->to_clean;
2016  for (i = 0; i < NUM_RX_DESC; i++) {
2017  iob = e->iob;
2018  rd = e->desc;
2019 
2020  rmb();
2021  control = rd->control;
2022 
2023  if ((control & BMU_OWN))
2024  break;
2025 
2026  if (!iob)
2027  continue;
2028 
2029  len = control & BMU_BBC;
2030 
2031  /* catch RX errors */
2032  if ((bad_phy_status(skge->hw, rd->status)) ||
2033  (phy_length(skge->hw, rd->status) != len)) {
2034  /* report receive errors */
2035  DBG("rx error\n");
2036  netdev_rx_err(dev, iob, -EIO);
2037  } else {
2038  DBG2("received packet, len %d\n", len);
2039  iob_put(iob, len);
2040  netdev_rx(dev, iob);
2041  }
2042 
2043  /* io_buffer passed to core, make sure we don't reuse it */
2044  e->iob = NULL;
2045 
2046  e = e->next;
2047  }
2048  skge_rx_refill(dev);
2049 }
uint16_t u16
Definition: stdint.h:21
#define iob_put(iobuf, len)
Definition: iobuf.h:120
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:586
#define NUM_RX_DESC
Definition: igbvf.h:281
struct skge_hw * hw
Definition: skge.h:2496
u32 control
Definition: skge.h:2423
#define rmb()
Definition: io.h:484
uint32_t e
Definition: sha1.c:32
void * priv
Driver private data.
Definition: netdevice.h:431
struct skge_element * to_clean
Definition: skge.h:2454
uint32_t control
Control.
Definition: myson.h:14
Definition: skge.h:393
struct skge_ring rx_ring
Definition: skge.h:2501
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:548
Definition: skge.h:376
uint32_t len
Length.
Definition: ena.h:14
u32 status
Definition: skge.h:2427
#define EIO
Input/output error.
Definition: errno.h:433
static int bad_phy_status(const struct skge_hw *hw, u32 status)
Definition: skge.c:1930
static void skge_rx_refill(struct net_device *dev)
Definition: skge.c:1962
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static u16 phy_length(const struct skge_hw *hw, u32 status)
Definition: skge.c:1922
uint32_t u32
Definition: stdint.h:23
#define DBG2(...)
Definition: compiler.h:515
A persistent I/O buffer.
Definition: iobuf.h:33

References bad_phy_status(), BMU_BBC, BMU_OWN, control, skge_rx_desc::control, DBG, DBG2, e, EIO, skge_port::hw, iob_put, len, netdev_rx(), netdev_rx_err(), NULL, NUM_RX_DESC, phy_length(), net_device::priv, rmb, skge_port::rx_ring, skge_rx_refill(), skge_rx_desc::status, and skge_ring::to_clean.

Referenced by skge_poll().

◆ skge_board_name()

static const char* skge_board_name ( const struct skge_hw hw)
static

Definition at line 2111 of file skge.c.

2112 {
2113  unsigned int i;
2114  static char buf[16];
2115 
2116  for (i = 0; i < ARRAY_SIZE(skge_chips); i++)
2117  if (skge_chips[i].id == hw->chip_id)
2118  return skge_chips[i].name;
2119 
2120  snprintf(buf, sizeof buf, "chipid 0x%x", hw->chip_id);
2121  return buf;
2122 }
Definition: hw.c:16
static const struct @104 skge_chips[]
#define ARRAY_SIZE(x)
Definition: efx_common.h:43
int snprintf(char *buf, size_t size, const char *fmt,...)
Write a formatted string to a buffer.
Definition: vsprintf.c:382

References ARRAY_SIZE, skge_chips, and snprintf().

Referenced by skge_probe().

◆ skge_reset()

static int skge_reset ( struct skge_hw hw)
static

Definition at line 2129 of file skge.c.

2130 {
2131  u32 reg;
2132  u16 ctst, pci_status;
2133  u8 t8, mac_cfg, pmd_type;
2134  int i;
2135 
2136  ctst = skge_read16(hw, B0_CTST);
2137 
2138  /* do a SW reset */
2141 
2142  /* clear PCI errors, if any */
2145 
2146  pci_read_config_word(hw->pdev, PCI_STATUS, &pci_status);
2148  pci_status | PCI_STATUS_ERROR_BITS);
2151 
2152  /* restore CLK_RUN bits (for Yukon-Lite) */
2155 
2156  hw->chip_id = skge_read8(hw, B2_CHIP_ID);
2157  hw->phy_type = skge_read8(hw, B2_E_1) & 0xf;
2158  pmd_type = skge_read8(hw, B2_PMD_TYP);
2159  hw->copper = (pmd_type == 'T' || pmd_type == '1');
2160 
2161  switch (hw->chip_id) {
2162  case CHIP_ID_GENESIS:
2163  switch (hw->phy_type) {
2164  case SK_PHY_XMAC:
2165  hw->phy_addr = PHY_ADDR_XMAC;
2166  break;
2167  case SK_PHY_BCOM:
2168  hw->phy_addr = PHY_ADDR_BCOM;
2169  break;
2170  default:
2171  DBG(PFX "unsupported phy type 0x%x\n",
2172  hw->phy_type);
2173  return -EOPNOTSUPP;
2174  }
2175  break;
2176 
2177  case CHIP_ID_YUKON:
2178  case CHIP_ID_YUKON_LITE:
2179  case CHIP_ID_YUKON_LP:
2180  if (hw->phy_type < SK_PHY_MARV_COPPER && pmd_type != 'S')
2181  hw->copper = 1;
2182 
2183  hw->phy_addr = PHY_ADDR_MARV;
2184  break;
2185 
2186  default:
2187  DBG(PFX "unsupported chip type 0x%x\n",
2188  hw->chip_id);
2189  return -EOPNOTSUPP;
2190  }
2191 
2192  mac_cfg = skge_read8(hw, B2_MAC_CFG);
2193  hw->ports = (mac_cfg & CFG_SNG_MAC) ? 1 : 2;
2194  hw->chip_rev = (mac_cfg & CFG_CHIP_R_MSK) >> 4;
2195 
2196  /* read the adapters RAM size */
2197  t8 = skge_read8(hw, B2_E_0);
2198  if (hw->chip_id == CHIP_ID_GENESIS) {
2199  if (t8 == 3) {
2200  /* special case: 4 x 64k x 36, offset = 0x80000 */
2201  hw->ram_size = 0x100000;
2202  hw->ram_offset = 0x80000;
2203  } else
2204  hw->ram_size = t8 * 512;
2205  }
2206  else if (t8 == 0)
2207  hw->ram_size = 0x20000;
2208  else
2209  hw->ram_size = t8 * 4096;
2210 
2211  hw->intr_mask = IS_HW_ERR;
2212 
2213  /* Use PHY IRQ for all but fiber based Genesis board */
2214  if (!(hw->chip_id == CHIP_ID_GENESIS && hw->phy_type == SK_PHY_XMAC))
2215  hw->intr_mask |= IS_EXT_REG;
2216 
2217  if (hw->chip_id == CHIP_ID_GENESIS)
2218  genesis_init(hw);
2219  else {
2220  /* switch power to VCC (WA for VAUX problem) */
2223 
2224  /* avoid boards with stuck Hardware error bits */
2225  if ((skge_read32(hw, B0_ISRC) & IS_HW_ERR) &&
2227  DBG(PFX "stuck hardware sensor bit\n");
2228  hw->intr_mask &= ~IS_HW_ERR;
2229  }
2230 
2231  /* Clear PHY COMA */
2234  reg &= ~PCI_PHY_COMA;
2237 
2238 
2239  for (i = 0; i < hw->ports; i++) {
2242  }
2243  }
2244 
2245  /* turn off hardware timer (unused) */
2249 
2250  /* enable the Tx Arbiters */
2251  for (i = 0; i < hw->ports; i++)
2253 
2254  /* Initialize ram interface */
2256 
2269 
2271 
2272  /* Set interrupt moderation for Transmit only
2273  * Receive interrupts avoided by NAPI
2274  */
2278 
2279  skge_write32(hw, B0_IMSK, hw->intr_mask);
2280 
2281  for (i = 0; i < hw->ports; i++) {
2282  if (hw->chip_id == CHIP_ID_GENESIS)
2283  genesis_reset(hw, i);
2284  else
2285  yukon_reset(hw, i);
2286  }
2287 
2288  return 0;
2289 }
uint16_t u16
Definition: stdint.h:21
Definition: skge.h:254
Definition: skge.h:108
static void yukon_reset(struct skge_hw *hw, int port)
Definition: skge.c:1297
static unsigned int unsigned int reg
Definition: myson.h:162
Definition: skge.h:81
int pci_write_config_word(struct pci_device *pci, unsigned int where, uint16_t value)
Write 16-bit word to PCI configuration space.
int pci_read_config_word(struct pci_device *pci, unsigned int where, uint16_t *value)
Read 16-bit word from PCI configuration space.
Definition: hw.c:16
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
Definition: skge.h:82
Definition: skge.h:109
int pci_read_config_dword(struct pci_device *pci, unsigned int where, uint32_t *value)
Read 32-bit dword from PCI configuration space.
#define PCI_PHY_COMA
Definition: skge.h:11
#define PCI_STATUS_ERROR_BITS
Definition: skge.h:70
static void genesis_init(struct skge_hw *hw)
Definition: skge.c:480
static u32 skge_usecs2clk(const struct skge_hw *hw, u32 usec)
Definition: skge.c:127
Definition: skge.h:496
static u8 skge_read8(const struct skge_hw *hw, int reg)
Definition: skge.h:2527
Definition: skge.h:262
#define PFX
Definition: sis190.h:34
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
Definition: skge.h:79
#define EOPNOTSUPP
Operation not supported on socket.
Definition: errno.h:604
#define SK_REG(port, reg)
Definition: skge.h:2548
#define PCI_STATUS
PCI status.
Definition: pci.h:35
Definition: skge.h:78
#define SK_RI_TO_53
Definition: skge.h:442
int pci_write_config_dword(struct pci_device *pci, unsigned int where, uint32_t value)
Write 32-bit dword to PCI configuration space.
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
static void genesis_reset(struct skge_hw *hw, int port)
Definition: skge.c:508
uint8_t u8
Definition: stdint.h:19
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
Definition: skge.h:334
uint32_t u32
Definition: stdint.h:23
static u16 skge_read16(const struct skge_hw *hw, int reg)
Definition: skge.h:2522
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References B0_CTST, B0_HWE_IMSK, B0_HWE_ISRC, B0_IMSK, B0_ISRC, B0_LED, B0_POWER_CTRL, B2_CHIP_ID, B2_E_0, B2_E_1, B2_IRQM_CTRL, B2_IRQM_INI, B2_IRQM_MSK, B2_MAC_CFG, B2_PMD_TYP, B2_TI_CTRL, B2_TST_CTRL1, B2_TST_CTRL2, B3_RI_CTRL, B3_RI_RTO_R1, B3_RI_RTO_R2, B3_RI_RTO_XA1, B3_RI_RTO_XA2, B3_RI_RTO_XS1, B3_RI_RTO_XS2, B3_RI_WTO_R1, B3_RI_WTO_R2, B3_RI_WTO_XA1, B3_RI_WTO_XA2, B3_RI_WTO_XS1, B3_RI_WTO_XS2, CFG_CHIP_R_MSK, CFG_SNG_MAC, CHIP_ID_GENESIS, CHIP_ID_YUKON, CHIP_ID_YUKON_LITE, CHIP_ID_YUKON_LP, CS_CLK_RUN_ENA, CS_CLK_RUN_HOT, CS_CLK_RUN_RST, CS_MRST_CLR, CS_RST_CLR, CS_RST_SET, DBG, EOPNOTSUPP, genesis_init(), genesis_reset(), GMAC_LINK_CTRL, GMLC_RST_CLR, GMLC_RST_SET, IS_ERR_MSK, IS_EXT_REG, IS_HW_ERR, IS_IRQ_SENSOR, IS_XA1_F, IS_XA2_F, LED_STAT_ON, PC_VAUX_ENA, PC_VAUX_OFF, PC_VCC_ENA, PC_VCC_ON, PCI_DEV_REG1, PCI_PHY_COMA, pci_read_config_dword(), pci_read_config_word(), PCI_STATUS, PCI_STATUS_ERROR_BITS, pci_write_config_dword(), pci_write_config_word(), PFX, PHY_ADDR_BCOM, PHY_ADDR_MARV, PHY_ADDR_XMAC, reg, RI_RST_CLR, SK_PHY_BCOM, SK_PHY_MARV_COPPER, SK_PHY_XMAC, SK_REG, SK_RI_TO_53, skge_read16(), skge_read32(), skge_read8(), skge_usecs2clk(), skge_write16(), skge_write32(), skge_write8(), TIM_CLR_IRQ, TIM_START, TIM_STOP, TST_CFG_WRITE_OFF, TST_CFG_WRITE_ON, TXA_CTRL, TXA_ENA_ARB, and yukon_reset().

Referenced by skge_probe().

◆ skge_devinit()

static struct net_device* skge_devinit ( struct skge_hw hw,
int  port,
int highmem  __unused 
)
static

Definition at line 2292 of file skge.c.

2294 {
2295  struct skge_port *skge;
2296  struct net_device *dev = alloc_etherdev(sizeof(*skge));
2297 
2298  if (!dev) {
2299  DBG(PFX "etherdev alloc failed\n");
2300  return NULL;
2301  }
2302 
2303  dev->dev = &hw->pdev->dev;
2304 
2305  skge = dev->priv;
2306  skge->netdev = dev;
2307  skge->hw = hw;
2308 
2309  /* Auto speed and flow control */
2310  skge->autoneg = AUTONEG_ENABLE;
2312  skge->duplex = -1;
2313  skge->speed = -1;
2315 
2316  hw->dev[port] = dev;
2317 
2318  skge->port = port;
2319 
2320  /* read the mac address */
2321  memcpy(dev->hw_addr, (void *) (hw->regs + B2_MAC_1 + port*8), ETH_ALEN);
2322 
2323  return dev;
2324 }
int port
Definition: skge.h:2498
u32 advertising
Definition: skge.h:2508
#define AUTONEG_ENABLE
Definition: bnx2.h:4584
u8 duplex
Definition: skge.h:2506
Definition: hw.c:16
struct skge_hw * hw
Definition: skge.h:2496
void * memcpy(void *dest, const void *src, size_t len) __nonnull
u8 port
Port number.
Definition: CIB_PRM.h:31
u8 autoneg
Definition: skge.h:2505
#define PFX
Definition: sis190.h:34
A network device.
Definition: netdevice.h:352
#define ETH_ALEN
Definition: if_ether.h:8
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
struct net_device * netdev
Definition: skge.h:2497
enum pause_control flow_control
Definition: skge.h:2503
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
u16 speed
Definition: skge.h:2507
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
Definition: skge.h:101
static u32 skge_supported_modes(const struct skge_hw *hw)
Definition: skge.c:92

References skge_port::advertising, alloc_etherdev(), skge_port::autoneg, AUTONEG_ENABLE, B2_MAC_1, DBG, net_device::dev, skge_port::duplex, ETH_ALEN, skge_port::flow_control, FLOW_MODE_SYM_OR_REM, skge_port::hw, memcpy(), skge_port::netdev, NULL, PFX, port, skge_port::port, skge_supported_modes(), and skge_port::speed.

Referenced by skge_probe().

◆ skge_show_addr()

static void skge_show_addr ( struct net_device dev)
static

Definition at line 2326 of file skge.c.

2327 {
2328  DBG2(PFX "%s: addr %s\n",
2329  dev->name, netdev_addr(dev));
2330 }
char name[40]
Name.
Definition: device.h:75
static const char * netdev_addr(struct net_device *netdev)
Get printable network device link-layer address.
Definition: netdevice.h:538
#define PFX
Definition: sis190.h:34
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
#define DBG2(...)
Definition: compiler.h:515

References DBG2, net_device::dev, device::name, netdev_addr(), and PFX.

Referenced by skge_probe().

◆ skge_probe()

static int skge_probe ( struct pci_device pdev)
static

Definition at line 2332 of file skge.c.

2333 {
2334  struct net_device *dev, *dev1;
2335  struct skge_hw *hw;
2336  int err, using_dac = 0;
2337 
2339 
2340  err = -ENOMEM;
2341  hw = zalloc(sizeof(*hw));
2342  if (!hw) {
2343  DBG(PFX "cannot allocate hardware struct\n");
2344  goto err_out_free_regions;
2345  }
2346 
2347  hw->pdev = pdev;
2348 
2349  hw->regs = (unsigned long)pci_ioremap(pdev,
2351  SKGE_REG_SIZE);
2352  if (!hw->regs) {
2353  DBG(PFX "cannot map device registers\n");
2354  goto err_out_free_hw;
2355  }
2356 
2357  err = skge_reset(hw);
2358  if (err)
2359  goto err_out_iounmap;
2360 
2361  DBG(PFX " addr 0x%llx irq %d chip %s rev %d\n",
2362  (unsigned long long)pdev->ioaddr, pdev->irq,
2363  skge_board_name(hw), hw->chip_rev);
2364 
2365  dev = skge_devinit(hw, 0, using_dac);
2366  if (!dev)
2367  goto err_out_led_off;
2368 
2370 
2371  err = register_netdev(dev);
2372  if (err) {
2373  DBG(PFX "cannot register net device\n");
2374  goto err_out_free_netdev;
2375  }
2376 
2378 
2379  if (hw->ports > 1 && (dev1 = skge_devinit(hw, 1, using_dac))) {
2380  if (register_netdev(dev1) == 0)
2381  skge_show_addr(dev1);
2382  else {
2383  /* Failure to register second port need not be fatal */
2384  DBG(PFX "register of second port failed\n");
2385  hw->dev[1] = NULL;
2386  netdev_nullify(dev1);
2387  netdev_put(dev1);
2388  }
2389  }
2391 
2392  return 0;
2393 
2394 err_out_free_netdev:
2396  netdev_put(dev);
2397 err_out_led_off:
2399 err_out_iounmap:
2400  iounmap((void*)hw->regs);
2401 err_out_free_hw:
2402  free(hw);
2403 err_out_free_regions:
2405  return err;
2406 }
uint8_t irq
Interrupt number.
Definition: pci.h:229
struct net_device * dev[2]
Definition: skge.h:2464
static void skge_show_addr(struct net_device *dev)
Definition: skge.c:2326
unsigned long ioaddr
I/O address.
Definition: pci.h:221
static struct net_device_operations skge_operations
Definition: skge.c:76
static struct net_device * skge_devinit(struct skge_hw *hw, int port, int highmem __unused)
Definition: skge.c:2292
#define PCI_BASE_ADDRESS_0
Definition: pci.h:62
#define SKGE_REG_SIZE
Definition: skge.h:34
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:154
Definition: hw.c:16
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:515
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:359
#define ENOMEM
Not enough space.
Definition: errno.h:534
static const char * skge_board_name(const struct skge_hw *hw)
Definition: skge.c:2111
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
Definition: pci.c:96
#define PFX
Definition: sis190.h:34
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
struct pci_device * pdev
Definition: skge.h:2462
Definition: skge.h:79
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
Definition: skge.h:2460
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:759
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
static int skge_reset(struct skge_hw *hw)
Definition: skge.c:2129
struct device * dev
Underlying hardware device.
Definition: netdevice.h:364
void iounmap(volatile const void *io_addr)
Unmap I/O address.
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References adjust_pci_device(), B0_LED, DBG, net_device::dev, skge_hw::dev, ENOMEM, free, pci_device::ioaddr, iounmap(), pci_device::irq, LED_STAT_OFF, netdev_init(), netdev_nullify(), netdev_put(), NULL, pci_bar_start(), PCI_BASE_ADDRESS_0, pci_ioremap(), pci_set_drvdata(), skge_hw::pdev, PFX, register_netdev(), skge_board_name(), skge_devinit(), skge_operations, SKGE_REG_SIZE, skge_reset(), skge_show_addr(), skge_write16(), and zalloc().

◆ skge_remove()

static void skge_remove ( struct pci_device pdev)
static

Definition at line 2408 of file skge.c.

2409 {
2410  struct skge_hw *hw = pci_get_drvdata(pdev);
2411  struct net_device *dev0, *dev1;
2412 
2413  if (!hw)
2414  return;
2415 
2416  if ((dev1 = hw->dev[1]))
2417  unregister_netdev(dev1);
2418  dev0 = hw->dev[0];
2419  unregister_netdev(dev0);
2420 
2421  hw->intr_mask = 0;
2422  skge_write32(hw, B0_IMSK, 0);
2424 
2427 
2428  if (dev1) {
2429  netdev_nullify(dev1);
2430  netdev_put(dev1);
2431  }
2432  netdev_nullify(dev0);
2433  netdev_put(dev0);
2434 
2435  iounmap((void*)hw->regs);
2436  free(hw);
2437  pci_set_drvdata(pdev, NULL);
2438 }
Definition: hw.c:16
static u32 skge_read32(const struct skge_hw *hw, int reg)
Definition: skge.h:2517
static void pci_set_drvdata(struct pci_device *pci, void *priv)
Set PCI driver-private data.
Definition: pci.h:359
Definition: skge.h:82
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:572
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:941
static void skge_write16(const struct skge_hw *hw, int reg, u16 val)
Definition: skge.h:2537
struct pci_device * pdev
Definition: skge.h:2462
Definition: skge.h:79
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
Definition: skge.h:2460
A network device.
Definition: netdevice.h:352
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:528
Definition: skge.h:78
static void * pci_get_drvdata(struct pci_device *pci)
Get PCI driver-private data.
Definition: pci.h:369
void iounmap(volatile const void *io_addr)
Unmap I/O address.
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
static void skge_write32(const struct skge_hw *hw, int reg, u32 val)
Definition: skge.h:2532
static void skge_write8(const struct skge_hw *hw, int reg, u8 val)
Definition: skge.h:2542

References B0_CTST, B0_IMSK, B0_LED, CS_RST_SET, free, iounmap(), LED_STAT_OFF, netdev_nullify(), netdev_put(), NULL, pci_get_drvdata(), pci_set_drvdata(), skge_hw::pdev, skge_read32(), skge_write16(), skge_write32(), skge_write8(), and unregister_netdev().

Variable Documentation

◆ skge_id_table

struct pci_device_id skge_id_table[]
static
Initial value:
= {
PCI_ROM(0x10b7, 0x1700, "3C940", "3COM 3C940", 0),
PCI_ROM(0x10b7, 0x80eb, "3C940B", "3COM 3C940", 0),
PCI_ROM(0x1148, 0x4300, "GE", "Syskonnect GE", 0),
PCI_ROM(0x1148, 0x4320, "YU", "Syskonnect YU", 0),
PCI_ROM(0x1186, 0x4C00, "DGE510T", "DLink DGE-510T", 0),
PCI_ROM(0x1186, 0x4b01, "DGE530T", "DLink DGE-530T", 0),
PCI_ROM(0x11ab, 0x4320, "id4320", "Marvell id4320", 0),
PCI_ROM(0x11ab, 0x5005, "id5005", "Marvell id5005", 0),
PCI_ROM(0x1371, 0x434e, "Gigacard", "CNET Gigacard", 0),
PCI_ROM(0x1737, 0x1064, "EG1064", "Linksys EG1064", 0),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:303

Definition at line 46 of file skge.c.

◆ skge_operations

struct net_device_operations skge_operations
static
Initial value:
= {
.open = skge_up,
.close = skge_down,
.transmit = skge_xmit_frame,
.poll = skge_poll,
.irq = skge_net_irq
}
static void skge_net_irq(struct net_device *dev, int enable)
Definition: skge.c:2448
static int skge_up(struct net_device *dev)
Definition: skge.c:1707
static void skge_poll(struct net_device *dev)
Definition: skge.c:2051
static int skge_xmit_frame(struct net_device *dev, struct io_buffer *iob)
Definition: skge.c:1863
static void skge_down(struct net_device *dev)
Definition: skge.c:1790

Definition at line 76 of file skge.c.

Referenced by skge_probe().

◆ txqaddr

const int txqaddr[] = { Q_XA1, Q_XA2 }
static

Definition at line 85 of file skge.c.

Referenced by skge_down(), skge_tx_done(), skge_up(), and skge_xmit_frame().

◆ rxqaddr

const int rxqaddr[] = { Q_R1, Q_R2 }
static

Definition at line 86 of file skge.c.

Referenced by skge_poll(), skge_rx_stop(), and skge_up().

◆ portmask

const u32 portmask[] = { IS_PORT_1, IS_PORT_2 }
static

Definition at line 87 of file skge.c.

Referenced by skge_down(), skge_net_irq(), and skge_up().

◆ phy_pause_map

const u16 phy_pause_map[]
static

◆ fiber_pause_map

const u16 fiber_pause_map[]
static

◆ id

u8 id

Definition at line 2102 of file skge.c.

◆ name

const char* name

Definition at line 2103 of file skge.c.

◆ skge_chips

const { ... } skge_chips[]
Initial value:
= {
{ CHIP_ID_GENESIS, "Genesis" },
{ CHIP_ID_YUKON, "Yukon" },
{ CHIP_ID_YUKON_LITE, "Yukon-Lite"},
{ CHIP_ID_YUKON_LP, "Yukon-LP"},
}

Referenced by skge_board_name().

◆ __pci_driver

struct pci_driver skge_driver __pci_driver
Initial value:
= {
.ids = skge_id_table,
.id_count = ( sizeof (skge_id_table) / sizeof (skge_id_table[0]) ),
.probe = skge_probe,
}
static int skge_probe(struct pci_device *pdev)
Definition: skge.c:2332
static void skge_remove(struct pci_device *pdev)
Definition: skge.c:2408
static struct pci_device_id skge_id_table[]
Definition: skge.c:46
static struct xen_remove_from_physmap * remove
Definition: xenmem.h:39

Definition at line 2459 of file skge.c.