📄 smc91x.h
字号:
#define SMC_inw(a, r) readw((a) + (r))#define SMC_inl(a, r) readl((a) + (r))#define SMC_outb(v, a, r) writeb(v, (a) + (r))#define SMC_outw(v, a, r) writew(v, (a) + (r))#define SMC_outl(v, a, r) writel(v, (a) + (r))#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l)#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l)#define SMC_IRQ_FLAGS (0)#else#define SMC_CAN_USE_8BIT 1#define SMC_CAN_USE_16BIT 1#define SMC_CAN_USE_32BIT 1#define SMC_NOWAIT 1#define SMC_inb(a, r) readb((a) + (r))#define SMC_inw(a, r) readw((a) + (r))#define SMC_inl(a, r) readl((a) + (r))#define SMC_outb(v, a, r) writeb(v, (a) + (r))#define SMC_outw(v, a, r) writew(v, (a) + (r))#define SMC_outl(v, a, r) writel(v, (a) + (r))#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l)#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l)#define RPC_LSA_DEFAULT RPC_LED_100_10#define RPC_LSB_DEFAULT RPC_LED_TX_RX#endif/* store this information for the driver.. */struct smc_local { /* * If I have to wait until memory is available to send a * packet, I will store the skbuff here, until I get the * desired memory. Then, I'll send it out and free it. */ struct sk_buff *pending_tx_skb; struct tasklet_struct tx_task; /* version/revision of the SMC91x chip */ int version; /* Contains the current active transmission mode */ int tcr_cur_mode; /* Contains the current active receive mode */ int rcr_cur_mode; /* Contains the current active receive/phy mode */ int rpc_cur_mode; int ctl_rfduplx; int ctl_rspeed; u32 msg_enable; u32 phy_type; struct mii_if_info mii; /* work queue */ struct work_struct phy_configure; struct net_device *dev; int work_pending; spinlock_t lock;#ifdef SMC_USE_PXA_DMA /* DMA needs the physical address of the chip */ u_long physaddr; struct device *device;#endif void __iomem *base; void __iomem *datacs;};#ifdef SMC_USE_PXA_DMA/* * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is * always happening in irq context so no need to worry about races. TX is * different and probably not worth it for that reason, and not as critical * as RX which can overrun memory and lose packets. */#include <linux/dma-mapping.h>#include <asm/dma.h>#include <asm/arch/pxa-regs.h>#ifdef SMC_insl#undef SMC_insl#define SMC_insl(a, r, p, l) \ smc_pxa_dma_insl(a, lp, r, dev->dma, p, l)static inline voidsmc_pxa_dma_insl(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, u_char *buf, int len){ u_long physaddr = lp->physaddr; dma_addr_t dmabuf; /* fallback if no DMA available */ if (dma == (unsigned char)-1) { readsl(ioaddr + reg, buf, len); return; } /* 64 bit alignment is required for memory to memory DMA */ if ((long)buf & 4) { *((u32 *)buf) = SMC_inl(ioaddr, reg); buf += 4; len--; } len *= 4; dmabuf = dma_map_single(lp->device, buf, len, DMA_FROM_DEVICE); DCSR(dma) = DCSR_NODESC; DTADR(dma) = dmabuf; DSADR(dma) = physaddr + reg; DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 | DCMD_WIDTH4 | (DCMD_LENGTH & len)); DCSR(dma) = DCSR_NODESC | DCSR_RUN; while (!(DCSR(dma) & DCSR_STOPSTATE)) cpu_relax(); DCSR(dma) = 0; dma_unmap_single(lp->device, dmabuf, len, DMA_FROM_DEVICE);}#endif#ifdef SMC_insw#undef SMC_insw#define SMC_insw(a, r, p, l) \ smc_pxa_dma_insw(a, lp, r, dev->dma, p, l)static inline voidsmc_pxa_dma_insw(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, u_char *buf, int len){ u_long physaddr = lp->physaddr; dma_addr_t dmabuf; /* fallback if no DMA available */ if (dma == (unsigned char)-1) { readsw(ioaddr + reg, buf, len); return; } /* 64 bit alignment is required for memory to memory DMA */ while ((long)buf & 6) { *((u16 *)buf) = SMC_inw(ioaddr, reg); buf += 2; len--; } len *= 2; dmabuf = dma_map_single(lp->device, buf, len, DMA_FROM_DEVICE); DCSR(dma) = DCSR_NODESC; DTADR(dma) = dmabuf; DSADR(dma) = physaddr + reg; DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 | DCMD_WIDTH2 | (DCMD_LENGTH & len)); DCSR(dma) = DCSR_NODESC | DCSR_RUN; while (!(DCSR(dma) & DCSR_STOPSTATE)) cpu_relax(); DCSR(dma) = 0; dma_unmap_single(lp->device, dmabuf, len, DMA_FROM_DEVICE);}#endifstatic voidsmc_pxa_dma_irq(int dma, void *dummy){ DCSR(dma) = 0;}#endif /* SMC_USE_PXA_DMA *//* * Everything a particular hardware setup needs should have been defined * at this point. Add stubs for the undefined cases, mainly to avoid * compilation warnings since they'll be optimized away, or to prevent buggy * use of them. */#if ! SMC_CAN_USE_32BIT#define SMC_inl(ioaddr, reg) ({ BUG(); 0; })#define SMC_outl(x, ioaddr, reg) BUG()#define SMC_insl(a, r, p, l) BUG()#define SMC_outsl(a, r, p, l) BUG()#endif#if !defined(SMC_insl) || !defined(SMC_outsl)#define SMC_insl(a, r, p, l) BUG()#define SMC_outsl(a, r, p, l) BUG()#endif#if ! SMC_CAN_USE_16BIT/* * Any 16-bit access is performed with two 8-bit accesses if the hardware * can't do it directly. Most registers are 16-bit so those are mandatory. */#define SMC_outw(x, ioaddr, reg) \ do { \ unsigned int __val16 = (x); \ SMC_outb( __val16, ioaddr, reg ); \ SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ } while (0)#define SMC_inw(ioaddr, reg) \ ({ \ unsigned int __val16; \ __val16 = SMC_inb( ioaddr, reg ); \ __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ __val16; \ })#define SMC_insw(a, r, p, l) BUG()#define SMC_outsw(a, r, p, l) BUG()#endif#if !defined(SMC_insw) || !defined(SMC_outsw)#define SMC_insw(a, r, p, l) BUG()#define SMC_outsw(a, r, p, l) BUG()#endif#if ! SMC_CAN_USE_8BIT#define SMC_inb(ioaddr, reg) ({ BUG(); 0; })#define SMC_outb(x, ioaddr, reg) BUG()#define SMC_insb(a, r, p, l) BUG()#define SMC_outsb(a, r, p, l) BUG()#endif#if !defined(SMC_insb) || !defined(SMC_outsb)#define SMC_insb(a, r, p, l) BUG()#define SMC_outsb(a, r, p, l) BUG()#endif#ifndef SMC_CAN_USE_DATACS#define SMC_CAN_USE_DATACS 0#endif#ifndef SMC_IO_SHIFT#define SMC_IO_SHIFT 0#endif#ifndef SMC_IRQ_FLAGS#define SMC_IRQ_FLAGS IRQF_TRIGGER_RISING#endif#ifndef SMC_INTERRUPT_PREAMBLE#define SMC_INTERRUPT_PREAMBLE#endif/* Because of bank switching, the LAN91x uses only 16 I/O ports */#define SMC_IO_EXTENT (16 << SMC_IO_SHIFT)#define SMC_DATA_EXTENT (4)/* . Bank Select Register: . . yyyy yyyy 0000 00xx . xx = bank number . yyyy yyyy = 0x33, for identification purposes.*/#define BANK_SELECT (14 << SMC_IO_SHIFT)// Transmit Control Register/* BANK 0 */#define TCR_REG SMC_REG(0x0000, 0)#define TCR_ENABLE 0x0001 // When 1 we can transmit#define TCR_LOOP 0x0002 // Controls output pin LBK#define TCR_FORCOL 0x0004 // When 1 will force a collision#define TCR_PAD_EN 0x0080 // When 1 will pad tx frames < 64 bytes w/0#define TCR_NOCRC 0x0100 // When 1 will not append CRC to tx frames#define TCR_MON_CSN 0x0400 // When 1 tx monitors carrier#define TCR_FDUPLX 0x0800 // When 1 enables full duplex operation#define TCR_STP_SQET 0x1000 // When 1 stops tx if Signal Quality Error#define TCR_EPH_LOOP 0x2000 // When 1 enables EPH block loopback#define TCR_SWFDUP 0x8000 // When 1 enables Switched Full Duplex mode#define TCR_CLEAR 0 /* do NOTHING *//* the default settings for the TCR register : */#define TCR_DEFAULT (TCR_ENABLE | TCR_PAD_EN)// EPH Status Register/* BANK 0 */#define EPH_STATUS_REG SMC_REG(0x0002, 0)#define ES_TX_SUC 0x0001 // Last TX was successful#define ES_SNGL_COL 0x0002 // Single collision detected for last tx#define ES_MUL_COL 0x0004 // Multiple collisions detected for last tx#define ES_LTX_MULT 0x0008 // Last tx was a multicast#define ES_16COL 0x0010 // 16 Collisions Reached#define ES_SQET 0x0020 // Signal Quality Error Test#define ES_LTXBRD 0x0040 // Last tx was a broadcast#define ES_TXDEFR 0x0080 // Transmit Deferred#define ES_LATCOL 0x0200 // Late collision detected on last tx#define ES_LOSTCARR 0x0400 // Lost Carrier Sense#define ES_EXC_DEF 0x0800 // Excessive Deferral#define ES_CTR_ROL 0x1000 // Counter Roll Over indication#define ES_LINK_OK 0x4000 // Driven by inverted value of nLNK pin#define ES_TXUNRN 0x8000 // Tx Underrun// Receive Control Register/* BANK 0 */#define RCR_REG SMC_REG(0x0004, 0)#define RCR_RX_ABORT 0x0001 // Set if a rx frame was aborted#define RCR_PRMS 0x0002 // Enable promiscuous mode#define RCR_ALMUL 0x0004 // When set accepts all multicast frames#define RCR_RXEN 0x0100 // IFF this is set, we can receive packets#define RCR_STRIP_CRC 0x0200 // When set strips CRC from rx packets#define RCR_ABORT_ENB 0x0200 // When set will abort rx on collision#define RCR_FILT_CAR 0x0400 // When set filters leading 12 bit s of carrier#define RCR_SOFTRST 0x8000 // resets the chip/* the normal settings for the RCR register : */#define RCR_DEFAULT (RCR_STRIP_CRC | RCR_RXEN)#define RCR_CLEAR 0x0 // set it to a base state// Counter Register/* BANK 0 */#define COUNTER_REG SMC_REG(0x0006, 0)// Memory Information Register/* BANK 0 */#define MIR_REG SMC_REG(0x0008, 0)// Receive/Phy Control Register/* BANK 0 */#define RPC_REG SMC_REG(0x000A, 0)#define RPC_SPEED 0x2000 // When 1 PHY is in 100Mbps mode.#define RPC_DPLX 0x1000 // When 1 PHY is in Full-Duplex Mode#define RPC_ANEG 0x0800 // When 1 PHY is in Auto-Negotiate Mode#define RPC_LSXA_SHFT 5 // Bits to shift LS2A,LS1A,LS0A to lsb#define RPC_LSXB_SHFT 2 // Bits to get LS2B,LS1B,LS0B to lsb#define RPC_LED_100_10 (0x00) // LED = 100Mbps OR's with 10Mbps link detect#define RPC_LED_RES (0x01) // LED = Reserved#define RPC_LED_10 (0x02) // LED = 10Mbps link detect#define RPC_LED_FD (0x03) // LED = Full Duplex Mode#define RPC_LED_TX_RX (0x04) // LED = TX or RX packet occurred#define RPC_LED_100 (0x05) // LED = 100Mbps link dectect#define RPC_LED_TX (0x06) // LED = TX packet occurred#define RPC_LED_RX (0x07) // LED = RX packet occurred#ifndef RPC_LSA_DEFAULT#define RPC_LSA_DEFAULT RPC_LED_100#endif#ifndef RPC_LSB_DEFAULT#define RPC_LSB_DEFAULT RPC_LED_FD#endif#define RPC_DEFAULT (RPC_ANEG | (RPC_LSA_DEFAULT << RPC_LSXA_SHFT) | (RPC_LSB_DEFAULT << RPC_LSXB_SHFT) | RPC_SPEED | RPC_DPLX)/* Bank 0 0x0C is reserved */// Bank Select Register/* All Banks */#define BSR_REG 0x000E// Configuration Reg/* BANK 1 */#define CONFIG_REG SMC_REG(0x0000, 1)#define CONFIG_EXT_PHY 0x0200 // 1=external MII, 0=internal Phy#define CONFIG_GPCNTRL 0x0400 // Inverse value drives pin nCNTRL#define CONFIG_NO_WAIT 0x1000 // When 1 no extra wait states on ISA bus#define CONFIG_EPH_POWER_EN 0x8000 // When 0 EPH is placed into low power mode.// Default is powered-up, Internal Phy, Wait States, and pin nCNTRL=low#define CONFIG_DEFAULT (CONFIG_EPH_POWER_EN)// Base Address Register/* BANK 1 */#define BASE_REG SMC_REG(0x0002, 1)// Individual Address Registers/* BANK 1 */#define ADDR0_REG SMC_REG(0x0004, 1)#define ADDR1_REG SMC_REG(0x0006, 1)#define ADDR2_REG SMC_REG(0x0008, 1)// General Purpose Register/* BANK 1 */#define GP_REG SMC_REG(0x000A, 1)// Control Register/* BANK 1 */#define CTL_REG SMC_REG(0x000C, 1)#define CTL_RCV_BAD 0x4000 // When 1 bad CRC packets are received#define CTL_AUTO_RELEASE 0x0800 // When 1 tx pages are released automatically#define CTL_LE_ENABLE 0x0080 // When 1 enables Link Error interrupt#define CTL_CR_ENABLE 0x0040 // When 1 enables Counter Rollover interrupt#define CTL_TE_ENABLE 0x0020 // When 1 enables Transmit Error interrupt#define CTL_EEPROM_SELECT 0x0004 // Controls EEPROM reload & store#define CTL_RELOAD 0x0002 // When set reads EEPROM into registers#define CTL_STORE 0x0001 // When set stores registers into EEPROM// MMU Command Register/* BANK 2 */#define MMU_CMD_REG SMC_REG(0x0000, 2)#define MC_BUSY 1 // When 1 the last release has not completed#define MC_NOP (0<<5) // No Op#define MC_ALLOC (1<<5) // OR with number of 256 byte packets#define MC_RESET (2<<5) // Reset MMU to initial state#define MC_REMOVE (3<<5) // Remove the current rx packet#define MC_RELEASE (4<<5) // Remove and release the current rx packet#define MC_FREEPKT (5<<5) // Release packet in PNR register#define MC_ENQUEUE (6<<5) // Enqueue the packet for transmit#define MC_RSTTXFIFO (7<<5) // Reset the TX FIFOs// Packet Number Register/* BANK 2 */#define PN_REG SMC_REG(0x0002, 2)// Allocation Result Register/* BANK 2 */#define AR_REG SMC_REG(0x0003, 2)#define AR_FAILED 0x80 // Alocation Failed// TX FIFO Ports Register/* BANK 2 */#define TXFIFO_REG SMC_REG(0x0004, 2)#define TXFIFO_TEMPTY 0x80 // TX FIFO Empty// RX FIFO Ports Register/* BANK 2 */#define RXFIFO_REG SMC_REG(0x0005, 2)#define RXFIFO_REMPTY 0x80 // RX FIFO Empty#define FIFO_REG SMC_REG(0x0004, 2)// Pointer Register/* BANK 2 */#define PTR_REG SMC_REG(0x0006, 2)#define PTR_RCV 0x8000 // 1=Receive area, 0=Transmit area
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -