Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 989a7241df87526bfef0396567e71ebe53a84ae4 1348 lines 41 kB view raw
1/*------------------------------------------------------------------------ 2 . smc91x.h - macros for SMSC's 91C9x/91C1xx single-chip Ethernet device. 3 . 4 . Copyright (C) 1996 by Erik Stahlman 5 . Copyright (C) 2001 Standard Microsystems Corporation 6 . Developed by Simple Network Magic Corporation 7 . Copyright (C) 2003 Monta Vista Software, Inc. 8 . Unified SMC91x driver by Nicolas Pitre 9 . 10 . This program is free software; you can redistribute it and/or modify 11 . it under the terms of the GNU General Public License as published by 12 . the Free Software Foundation; either version 2 of the License, or 13 . (at your option) any later version. 14 . 15 . This program is distributed in the hope that it will be useful, 16 . but WITHOUT ANY WARRANTY; without even the implied warranty of 17 . MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 . GNU General Public License for more details. 19 . 20 . You should have received a copy of the GNU General Public License 21 . along with this program; if not, write to the Free Software 22 . Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23 . 24 . Information contained in this file was obtained from the LAN91C111 25 . manual from SMC. To get a copy, if you really want one, you can find 26 . information under www.smsc.com. 27 . 28 . Authors 29 . Erik Stahlman <erik@vt.edu> 30 . Daris A Nevil <dnevil@snmc.com> 31 . Nicolas Pitre <nico@cam.org> 32 . 33 ---------------------------------------------------------------------------*/ 34#ifndef _SMC91X_H_ 35#define _SMC91X_H_ 36 37 38/* 39 * Define your architecture specific bus configuration parameters here. 40 */ 41 42#if defined(CONFIG_ARCH_LUBBOCK) 43 44/* We can only do 16-bit reads and writes in the static memory space. */ 45#define SMC_CAN_USE_8BIT 0 46#define SMC_CAN_USE_16BIT 1 47#define SMC_CAN_USE_32BIT 0 48#define SMC_NOWAIT 1 49 50/* The first two address lines aren't connected... */ 51#define SMC_IO_SHIFT 2 52 53#define SMC_inw(a, r) readw((a) + (r)) 54#define SMC_outw(v, a, r) writew(v, (a) + (r)) 55#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) 56#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) 57#define SMC_IRQ_FLAGS (-1) /* from resource */ 58 59#elif defined(CONFIG_BLACKFIN) 60 61#define SMC_IRQ_FLAGS IRQF_TRIGGER_HIGH 62#define RPC_LSA_DEFAULT RPC_LED_100_10 63#define RPC_LSB_DEFAULT RPC_LED_TX_RX 64 65# if defined (CONFIG_BFIN561_EZKIT) 66#define SMC_CAN_USE_8BIT 0 67#define SMC_CAN_USE_16BIT 1 68#define SMC_CAN_USE_32BIT 1 69#define SMC_IO_SHIFT 0 70#define SMC_NOWAIT 1 71#define SMC_USE_BFIN_DMA 0 72 73 74#define SMC_inw(a, r) readw((a) + (r)) 75#define SMC_outw(v, a, r) writew(v, (a) + (r)) 76#define SMC_inl(a, r) readl((a) + (r)) 77#define SMC_outl(v, a, r) writel(v, (a) + (r)) 78#define SMC_outsl(a, r, p, l) outsl((unsigned long *)((a) + (r)), p, l) 79#define SMC_insl(a, r, p, l) insl ((unsigned long *)((a) + (r)), p, l) 80# else 81#define SMC_CAN_USE_8BIT 0 82#define SMC_CAN_USE_16BIT 1 83#define SMC_CAN_USE_32BIT 0 84#define SMC_IO_SHIFT 0 85#define SMC_NOWAIT 1 86#define SMC_USE_BFIN_DMA 0 87 88 89#define SMC_inw(a, r) readw((a) + (r)) 90#define SMC_outw(v, a, r) writew(v, (a) + (r)) 91#define SMC_outsw(a, r, p, l) outsw((unsigned long *)((a) + (r)), p, l) 92#define SMC_insw(a, r, p, l) insw ((unsigned long *)((a) + (r)), p, l) 93# endif 94/* check if the mac in reg is valid */ 95#define SMC_GET_MAC_ADDR(addr) \ 96 do { \ 97 unsigned int __v; \ 98 __v = SMC_inw(ioaddr, ADDR0_REG); \ 99 addr[0] = __v; addr[1] = __v >> 8; \ 100 __v = SMC_inw(ioaddr, ADDR1_REG); \ 101 addr[2] = __v; addr[3] = __v >> 8; \ 102 __v = SMC_inw(ioaddr, ADDR2_REG); \ 103 addr[4] = __v; addr[5] = __v >> 8; \ 104 if (*(u32 *)(&addr[0]) == 0xFFFFFFFF) { \ 105 random_ether_addr(addr); \ 106 } \ 107 } while (0) 108#elif defined(CONFIG_REDWOOD_5) || defined(CONFIG_REDWOOD_6) 109 110/* We can only do 16-bit reads and writes in the static memory space. */ 111#define SMC_CAN_USE_8BIT 0 112#define SMC_CAN_USE_16BIT 1 113#define SMC_CAN_USE_32BIT 0 114#define SMC_NOWAIT 1 115 116#define SMC_IO_SHIFT 0 117 118#define SMC_inw(a, r) in_be16((volatile u16 *)((a) + (r))) 119#define SMC_outw(v, a, r) out_be16((volatile u16 *)((a) + (r)), v) 120#define SMC_insw(a, r, p, l) \ 121 do { \ 122 unsigned long __port = (a) + (r); \ 123 u16 *__p = (u16 *)(p); \ 124 int __l = (l); \ 125 insw(__port, __p, __l); \ 126 while (__l > 0) { \ 127 *__p = swab16(*__p); \ 128 __p++; \ 129 __l--; \ 130 } \ 131 } while (0) 132#define SMC_outsw(a, r, p, l) \ 133 do { \ 134 unsigned long __port = (a) + (r); \ 135 u16 *__p = (u16 *)(p); \ 136 int __l = (l); \ 137 while (__l > 0) { \ 138 /* Believe it or not, the swab isn't needed. */ \ 139 outw( /* swab16 */ (*__p++), __port); \ 140 __l--; \ 141 } \ 142 } while (0) 143#define SMC_IRQ_FLAGS (0) 144 145#elif defined(CONFIG_SA1100_PLEB) 146/* We can only do 16-bit reads and writes in the static memory space. */ 147#define SMC_CAN_USE_8BIT 1 148#define SMC_CAN_USE_16BIT 1 149#define SMC_CAN_USE_32BIT 0 150#define SMC_IO_SHIFT 0 151#define SMC_NOWAIT 1 152 153#define SMC_inb(a, r) readb((a) + (r)) 154#define SMC_insb(a, r, p, l) readsb((a) + (r), p, (l)) 155#define SMC_inw(a, r) readw((a) + (r)) 156#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) 157#define SMC_outb(v, a, r) writeb(v, (a) + (r)) 158#define SMC_outsb(a, r, p, l) writesb((a) + (r), p, (l)) 159#define SMC_outw(v, a, r) writew(v, (a) + (r)) 160#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) 161 162#define SMC_IRQ_FLAGS (-1) 163 164#elif defined(CONFIG_SA1100_ASSABET) 165 166#include <asm/arch/neponset.h> 167 168/* We can only do 8-bit reads and writes in the static memory space. */ 169#define SMC_CAN_USE_8BIT 1 170#define SMC_CAN_USE_16BIT 0 171#define SMC_CAN_USE_32BIT 0 172#define SMC_NOWAIT 1 173 174/* The first two address lines aren't connected... */ 175#define SMC_IO_SHIFT 2 176 177#define SMC_inb(a, r) readb((a) + (r)) 178#define SMC_outb(v, a, r) writeb(v, (a) + (r)) 179#define SMC_insb(a, r, p, l) readsb((a) + (r), p, (l)) 180#define SMC_outsb(a, r, p, l) writesb((a) + (r), p, (l)) 181#define SMC_IRQ_FLAGS (-1) /* from resource */ 182 183#elif defined(CONFIG_MACH_LOGICPD_PXA270) 184 185#define SMC_CAN_USE_8BIT 0 186#define SMC_CAN_USE_16BIT 1 187#define SMC_CAN_USE_32BIT 0 188#define SMC_IO_SHIFT 0 189#define SMC_NOWAIT 1 190 191#define SMC_inw(a, r) readw((a) + (r)) 192#define SMC_outw(v, a, r) writew(v, (a) + (r)) 193#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) 194#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) 195 196#elif defined(CONFIG_ARCH_INNOKOM) || \ 197 defined(CONFIG_MACH_MAINSTONE) || \ 198 defined(CONFIG_ARCH_PXA_IDP) || \ 199 defined(CONFIG_ARCH_RAMSES) || \ 200 defined(CONFIG_ARCH_PCM027) 201 202#define SMC_CAN_USE_8BIT 1 203#define SMC_CAN_USE_16BIT 1 204#define SMC_CAN_USE_32BIT 1 205#define SMC_IO_SHIFT 0 206#define SMC_NOWAIT 1 207#define SMC_USE_PXA_DMA 1 208 209#define SMC_inb(a, r) readb((a) + (r)) 210#define SMC_inw(a, r) readw((a) + (r)) 211#define SMC_inl(a, r) readl((a) + (r)) 212#define SMC_outb(v, a, r) writeb(v, (a) + (r)) 213#define SMC_outl(v, a, r) writel(v, (a) + (r)) 214#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) 215#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) 216#define SMC_IRQ_FLAGS (-1) /* from resource */ 217 218/* We actually can't write halfwords properly if not word aligned */ 219static inline void 220SMC_outw(u16 val, void __iomem *ioaddr, int reg) 221{ 222 if (reg & 2) { 223 unsigned int v = val << 16; 224 v |= readl(ioaddr + (reg & ~2)) & 0xffff; 225 writel(v, ioaddr + (reg & ~2)); 226 } else { 227 writew(val, ioaddr + reg); 228 } 229} 230 231#elif defined(CONFIG_MACH_ZYLONITE) 232 233#define SMC_CAN_USE_8BIT 1 234#define SMC_CAN_USE_16BIT 1 235#define SMC_CAN_USE_32BIT 0 236#define SMC_IO_SHIFT 0 237#define SMC_NOWAIT 1 238#define SMC_USE_PXA_DMA 1 239#define SMC_inb(a, r) readb((a) + (r)) 240#define SMC_inw(a, r) readw((a) + (r)) 241#define SMC_insw(a, r, p, l) insw((a) + (r), p, l) 242#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) 243#define SMC_outb(v, a, r) writeb(v, (a) + (r)) 244#define SMC_outw(v, a, r) writew(v, (a) + (r)) 245#define SMC_IRQ_FLAGS (-1) /* from resource */ 246 247#elif defined(CONFIG_ARCH_OMAP) 248 249/* We can only do 16-bit reads and writes in the static memory space. */ 250#define SMC_CAN_USE_8BIT 0 251#define SMC_CAN_USE_16BIT 1 252#define SMC_CAN_USE_32BIT 0 253#define SMC_IO_SHIFT 0 254#define SMC_NOWAIT 1 255 256#define SMC_inw(a, r) readw((a) + (r)) 257#define SMC_outw(v, a, r) writew(v, (a) + (r)) 258#define SMC_insw(a, r, p, l) readsw((a) + (r), p, l) 259#define SMC_outsw(a, r, p, l) writesw((a) + (r), p, l) 260#define SMC_IRQ_FLAGS (-1) /* from resource */ 261 262#elif defined(CONFIG_SH_SH4202_MICRODEV) 263 264#define SMC_CAN_USE_8BIT 0 265#define SMC_CAN_USE_16BIT 1 266#define SMC_CAN_USE_32BIT 0 267 268#define SMC_inb(a, r) inb((a) + (r) - 0xa0000000) 269#define SMC_inw(a, r) inw((a) + (r) - 0xa0000000) 270#define SMC_inl(a, r) inl((a) + (r) - 0xa0000000) 271#define SMC_outb(v, a, r) outb(v, (a) + (r) - 0xa0000000) 272#define SMC_outw(v, a, r) outw(v, (a) + (r) - 0xa0000000) 273#define SMC_outl(v, a, r) outl(v, (a) + (r) - 0xa0000000) 274#define SMC_insl(a, r, p, l) insl((a) + (r) - 0xa0000000, p, l) 275#define SMC_outsl(a, r, p, l) outsl((a) + (r) - 0xa0000000, p, l) 276#define SMC_insw(a, r, p, l) insw((a) + (r) - 0xa0000000, p, l) 277#define SMC_outsw(a, r, p, l) outsw((a) + (r) - 0xa0000000, p, l) 278 279#define SMC_IRQ_FLAGS (0) 280 281#elif defined(CONFIG_ISA) 282 283#define SMC_CAN_USE_8BIT 1 284#define SMC_CAN_USE_16BIT 1 285#define SMC_CAN_USE_32BIT 0 286 287#define SMC_inb(a, r) inb((a) + (r)) 288#define SMC_inw(a, r) inw((a) + (r)) 289#define SMC_outb(v, a, r) outb(v, (a) + (r)) 290#define SMC_outw(v, a, r) outw(v, (a) + (r)) 291#define SMC_insw(a, r, p, l) insw((a) + (r), p, l) 292#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) 293 294#elif defined(CONFIG_SUPERH) 295 296#ifdef CONFIG_SOLUTION_ENGINE 297#define SMC_IRQ_FLAGS (0) 298#define SMC_CAN_USE_8BIT 0 299#define SMC_CAN_USE_16BIT 1 300#define SMC_CAN_USE_32BIT 0 301#define SMC_IO_SHIFT 0 302#define SMC_NOWAIT 1 303 304#define SMC_inw(a, r) inw((a) + (r)) 305#define SMC_outw(v, a, r) outw(v, (a) + (r)) 306#define SMC_insw(a, r, p, l) insw((a) + (r), p, l) 307#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) 308 309#else /* BOARDS */ 310 311#define SMC_CAN_USE_8BIT 1 312#define SMC_CAN_USE_16BIT 1 313#define SMC_CAN_USE_32BIT 0 314 315#define SMC_inb(a, r) inb((a) + (r)) 316#define SMC_inw(a, r) inw((a) + (r)) 317#define SMC_outb(v, a, r) outb(v, (a) + (r)) 318#define SMC_outw(v, a, r) outw(v, (a) + (r)) 319#define SMC_insw(a, r, p, l) insw((a) + (r), p, l) 320#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) 321 322#endif /* BOARDS */ 323 324#elif defined(CONFIG_M32R) 325 326#define SMC_CAN_USE_8BIT 0 327#define SMC_CAN_USE_16BIT 1 328#define SMC_CAN_USE_32BIT 0 329 330#define SMC_inb(a, r) inb(((u32)a) + (r)) 331#define SMC_inw(a, r) inw(((u32)a) + (r)) 332#define SMC_outb(v, a, r) outb(v, ((u32)a) + (r)) 333#define SMC_outw(v, a, r) outw(v, ((u32)a) + (r)) 334#define SMC_insw(a, r, p, l) insw(((u32)a) + (r), p, l) 335#define SMC_outsw(a, r, p, l) outsw(((u32)a) + (r), p, l) 336 337#define SMC_IRQ_FLAGS (0) 338 339#define RPC_LSA_DEFAULT RPC_LED_TX_RX 340#define RPC_LSB_DEFAULT RPC_LED_100_10 341 342#elif defined(CONFIG_MACH_LPD79520) \ 343 || defined(CONFIG_MACH_LPD7A400) \ 344 || defined(CONFIG_MACH_LPD7A404) 345 346/* The LPD7X_IOBARRIER is necessary to overcome a mismatch between the 347 * way that the CPU handles chip selects and the way that the SMC chip 348 * expects the chip select to operate. Refer to 349 * Documentation/arm/Sharp-LH/IOBarrier for details. The read from 350 * IOBARRIER is a byte, in order that we read the least-common 351 * denominator. It would be wasteful to read 32 bits from an 8-bit 352 * accessible region. 353 * 354 * There is no explicit protection against interrupts intervening 355 * between the writew and the IOBARRIER. In SMC ISR there is a 356 * preamble that performs an IOBARRIER in the extremely unlikely event 357 * that the driver interrupts itself between a writew to the chip an 358 * the IOBARRIER that follows *and* the cache is large enough that the 359 * first off-chip access while handing the interrupt is to the SMC 360 * chip. Other devices in the same address space as the SMC chip must 361 * be aware of the potential for trouble and perform a similar 362 * IOBARRIER on entry to their ISR. 363 */ 364 365#include <asm/arch/constants.h> /* IOBARRIER_VIRT */ 366 367#define SMC_CAN_USE_8BIT 0 368#define SMC_CAN_USE_16BIT 1 369#define SMC_CAN_USE_32BIT 0 370#define SMC_NOWAIT 0 371#define LPD7X_IOBARRIER readb (IOBARRIER_VIRT) 372 373#define SMC_inw(a,r)\ 374 ({ unsigned short v = readw ((void*) ((a) + (r))); LPD7X_IOBARRIER; v; }) 375#define SMC_outw(v,a,r) ({ writew ((v), (a) + (r)); LPD7X_IOBARRIER; }) 376 377#define SMC_insw LPD7_SMC_insw 378static inline void LPD7_SMC_insw (unsigned char* a, int r, 379 unsigned char* p, int l) 380{ 381 unsigned short* ps = (unsigned short*) p; 382 while (l-- > 0) { 383 *ps++ = readw (a + r); 384 LPD7X_IOBARRIER; 385 } 386} 387 388#define SMC_outsw LPD7_SMC_outsw 389static inline void LPD7_SMC_outsw (unsigned char* a, int r, 390 unsigned char* p, int l) 391{ 392 unsigned short* ps = (unsigned short*) p; 393 while (l-- > 0) { 394 writew (*ps++, a + r); 395 LPD7X_IOBARRIER; 396 } 397} 398 399#define SMC_INTERRUPT_PREAMBLE LPD7X_IOBARRIER 400 401#define RPC_LSA_DEFAULT RPC_LED_TX_RX 402#define RPC_LSB_DEFAULT RPC_LED_100_10 403 404#elif defined(CONFIG_SOC_AU1X00) 405 406#include <au1xxx.h> 407 408/* We can only do 16-bit reads and writes in the static memory space. */ 409#define SMC_CAN_USE_8BIT 0 410#define SMC_CAN_USE_16BIT 1 411#define SMC_CAN_USE_32BIT 0 412#define SMC_IO_SHIFT 0 413#define SMC_NOWAIT 1 414 415#define SMC_inw(a, r) au_readw((unsigned long)((a) + (r))) 416#define SMC_insw(a, r, p, l) \ 417 do { \ 418 unsigned long _a = (unsigned long)((a) + (r)); \ 419 int _l = (l); \ 420 u16 *_p = (u16 *)(p); \ 421 while (_l-- > 0) \ 422 *_p++ = au_readw(_a); \ 423 } while(0) 424#define SMC_outw(v, a, r) au_writew(v, (unsigned long)((a) + (r))) 425#define SMC_outsw(a, r, p, l) \ 426 do { \ 427 unsigned long _a = (unsigned long)((a) + (r)); \ 428 int _l = (l); \ 429 const u16 *_p = (const u16 *)(p); \ 430 while (_l-- > 0) \ 431 au_writew(*_p++ , _a); \ 432 } while(0) 433 434#define SMC_IRQ_FLAGS (0) 435 436#elif defined(CONFIG_ARCH_VERSATILE) 437 438#define SMC_CAN_USE_8BIT 1 439#define SMC_CAN_USE_16BIT 1 440#define SMC_CAN_USE_32BIT 1 441#define SMC_NOWAIT 1 442 443#define SMC_inb(a, r) readb((a) + (r)) 444#define SMC_inw(a, r) readw((a) + (r)) 445#define SMC_inl(a, r) readl((a) + (r)) 446#define SMC_outb(v, a, r) writeb(v, (a) + (r)) 447#define SMC_outw(v, a, r) writew(v, (a) + (r)) 448#define SMC_outl(v, a, r) writel(v, (a) + (r)) 449#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) 450#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) 451#define SMC_IRQ_FLAGS (-1) /* from resource */ 452 453#elif defined(CONFIG_MN10300) 454 455/* 456 * MN10300/AM33 configuration 457 */ 458 459#include <asm/unit/smc91111.h> 460 461#else 462 463/* 464 * Default configuration 465 */ 466 467#define SMC_CAN_USE_8BIT 1 468#define SMC_CAN_USE_16BIT 1 469#define SMC_CAN_USE_32BIT 1 470#define SMC_NOWAIT 1 471 472#define SMC_inb(a, r) readb((a) + (r)) 473#define SMC_inw(a, r) readw((a) + (r)) 474#define SMC_inl(a, r) readl((a) + (r)) 475#define SMC_outb(v, a, r) writeb(v, (a) + (r)) 476#define SMC_outw(v, a, r) writew(v, (a) + (r)) 477#define SMC_outl(v, a, r) writel(v, (a) + (r)) 478#define SMC_insl(a, r, p, l) readsl((a) + (r), p, l) 479#define SMC_outsl(a, r, p, l) writesl((a) + (r), p, l) 480 481#define RPC_LSA_DEFAULT RPC_LED_100_10 482#define RPC_LSB_DEFAULT RPC_LED_TX_RX 483 484#endif 485 486 487/* store this information for the driver.. */ 488struct smc_local { 489 /* 490 * If I have to wait until memory is available to send a 491 * packet, I will store the skbuff here, until I get the 492 * desired memory. Then, I'll send it out and free it. 493 */ 494 struct sk_buff *pending_tx_skb; 495 struct tasklet_struct tx_task; 496 497 /* version/revision of the SMC91x chip */ 498 int version; 499 500 /* Contains the current active transmission mode */ 501 int tcr_cur_mode; 502 503 /* Contains the current active receive mode */ 504 int rcr_cur_mode; 505 506 /* Contains the current active receive/phy mode */ 507 int rpc_cur_mode; 508 int ctl_rfduplx; 509 int ctl_rspeed; 510 511 u32 msg_enable; 512 u32 phy_type; 513 struct mii_if_info mii; 514 515 /* work queue */ 516 struct work_struct phy_configure; 517 struct net_device *dev; 518 int work_pending; 519 520 spinlock_t lock; 521 522#ifdef SMC_USE_PXA_DMA 523 /* DMA needs the physical address of the chip */ 524 u_long physaddr; 525 struct device *device; 526#endif 527 void __iomem *base; 528 void __iomem *datacs; 529}; 530 531 532#ifdef SMC_USE_PXA_DMA 533/* 534 * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is 535 * always happening in irq context so no need to worry about races. TX is 536 * different and probably not worth it for that reason, and not as critical 537 * as RX which can overrun memory and lose packets. 538 */ 539#include <linux/dma-mapping.h> 540#include <asm/dma.h> 541#include <asm/arch/pxa-regs.h> 542 543#ifdef SMC_insl 544#undef SMC_insl 545#define SMC_insl(a, r, p, l) \ 546 smc_pxa_dma_insl(a, lp, r, dev->dma, p, l) 547static inline void 548smc_pxa_dma_insl(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, 549 u_char *buf, int len) 550{ 551 u_long physaddr = lp->physaddr; 552 dma_addr_t dmabuf; 553 554 /* fallback if no DMA available */ 555 if (dma == (unsigned char)-1) { 556 readsl(ioaddr + reg, buf, len); 557 return; 558 } 559 560 /* 64 bit alignment is required for memory to memory DMA */ 561 if ((long)buf & 4) { 562 *((u32 *)buf) = SMC_inl(ioaddr, reg); 563 buf += 4; 564 len--; 565 } 566 567 len *= 4; 568 dmabuf = dma_map_single(lp->device, buf, len, DMA_FROM_DEVICE); 569 DCSR(dma) = DCSR_NODESC; 570 DTADR(dma) = dmabuf; 571 DSADR(dma) = physaddr + reg; 572 DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 | 573 DCMD_WIDTH4 | (DCMD_LENGTH & len)); 574 DCSR(dma) = DCSR_NODESC | DCSR_RUN; 575 while (!(DCSR(dma) & DCSR_STOPSTATE)) 576 cpu_relax(); 577 DCSR(dma) = 0; 578 dma_unmap_single(lp->device, dmabuf, len, DMA_FROM_DEVICE); 579} 580#endif 581 582#ifdef SMC_insw 583#undef SMC_insw 584#define SMC_insw(a, r, p, l) \ 585 smc_pxa_dma_insw(a, lp, r, dev->dma, p, l) 586static inline void 587smc_pxa_dma_insw(void __iomem *ioaddr, struct smc_local *lp, int reg, int dma, 588 u_char *buf, int len) 589{ 590 u_long physaddr = lp->physaddr; 591 dma_addr_t dmabuf; 592 593 /* fallback if no DMA available */ 594 if (dma == (unsigned char)-1) { 595 readsw(ioaddr + reg, buf, len); 596 return; 597 } 598 599 /* 64 bit alignment is required for memory to memory DMA */ 600 while ((long)buf & 6) { 601 *((u16 *)buf) = SMC_inw(ioaddr, reg); 602 buf += 2; 603 len--; 604 } 605 606 len *= 2; 607 dmabuf = dma_map_single(lp->device, buf, len, DMA_FROM_DEVICE); 608 DCSR(dma) = DCSR_NODESC; 609 DTADR(dma) = dmabuf; 610 DSADR(dma) = physaddr + reg; 611 DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 | 612 DCMD_WIDTH2 | (DCMD_LENGTH & len)); 613 DCSR(dma) = DCSR_NODESC | DCSR_RUN; 614 while (!(DCSR(dma) & DCSR_STOPSTATE)) 615 cpu_relax(); 616 DCSR(dma) = 0; 617 dma_unmap_single(lp->device, dmabuf, len, DMA_FROM_DEVICE); 618} 619#endif 620 621static void 622smc_pxa_dma_irq(int dma, void *dummy) 623{ 624 DCSR(dma) = 0; 625} 626#endif /* SMC_USE_PXA_DMA */ 627 628 629/* 630 * Everything a particular hardware setup needs should have been defined 631 * at this point. Add stubs for the undefined cases, mainly to avoid 632 * compilation warnings since they'll be optimized away, or to prevent buggy 633 * use of them. 634 */ 635 636#if ! SMC_CAN_USE_32BIT 637#define SMC_inl(ioaddr, reg) ({ BUG(); 0; }) 638#define SMC_outl(x, ioaddr, reg) BUG() 639#define SMC_insl(a, r, p, l) BUG() 640#define SMC_outsl(a, r, p, l) BUG() 641#endif 642 643#if !defined(SMC_insl) || !defined(SMC_outsl) 644#define SMC_insl(a, r, p, l) BUG() 645#define SMC_outsl(a, r, p, l) BUG() 646#endif 647 648#if ! SMC_CAN_USE_16BIT 649 650/* 651 * Any 16-bit access is performed with two 8-bit accesses if the hardware 652 * can't do it directly. Most registers are 16-bit so those are mandatory. 653 */ 654#define SMC_outw(x, ioaddr, reg) \ 655 do { \ 656 unsigned int __val16 = (x); \ 657 SMC_outb( __val16, ioaddr, reg ); \ 658 SMC_outb( __val16 >> 8, ioaddr, reg + (1 << SMC_IO_SHIFT));\ 659 } while (0) 660#define SMC_inw(ioaddr, reg) \ 661 ({ \ 662 unsigned int __val16; \ 663 __val16 = SMC_inb( ioaddr, reg ); \ 664 __val16 |= SMC_inb( ioaddr, reg + (1 << SMC_IO_SHIFT)) << 8; \ 665 __val16; \ 666 }) 667 668#define SMC_insw(a, r, p, l) BUG() 669#define SMC_outsw(a, r, p, l) BUG() 670 671#endif 672 673#if !defined(SMC_insw) || !defined(SMC_outsw) 674#define SMC_insw(a, r, p, l) BUG() 675#define SMC_outsw(a, r, p, l) BUG() 676#endif 677 678#if ! SMC_CAN_USE_8BIT 679#define SMC_inb(ioaddr, reg) ({ BUG(); 0; }) 680#define SMC_outb(x, ioaddr, reg) BUG() 681#define SMC_insb(a, r, p, l) BUG() 682#define SMC_outsb(a, r, p, l) BUG() 683#endif 684 685#if !defined(SMC_insb) || !defined(SMC_outsb) 686#define SMC_insb(a, r, p, l) BUG() 687#define SMC_outsb(a, r, p, l) BUG() 688#endif 689 690#ifndef SMC_CAN_USE_DATACS 691#define SMC_CAN_USE_DATACS 0 692#endif 693 694#ifndef SMC_IO_SHIFT 695#define SMC_IO_SHIFT 0 696#endif 697 698#ifndef SMC_IRQ_FLAGS 699#define SMC_IRQ_FLAGS IRQF_TRIGGER_RISING 700#endif 701 702#ifndef SMC_INTERRUPT_PREAMBLE 703#define SMC_INTERRUPT_PREAMBLE 704#endif 705 706 707/* Because of bank switching, the LAN91x uses only 16 I/O ports */ 708#define SMC_IO_EXTENT (16 << SMC_IO_SHIFT) 709#define SMC_DATA_EXTENT (4) 710 711/* 712 . Bank Select Register: 713 . 714 . yyyy yyyy 0000 00xx 715 . xx = bank number 716 . yyyy yyyy = 0x33, for identification purposes. 717*/ 718#define BANK_SELECT (14 << SMC_IO_SHIFT) 719 720 721// Transmit Control Register 722/* BANK 0 */ 723#define TCR_REG SMC_REG(0x0000, 0) 724#define TCR_ENABLE 0x0001 // When 1 we can transmit 725#define TCR_LOOP 0x0002 // Controls output pin LBK 726#define TCR_FORCOL 0x0004 // When 1 will force a collision 727#define TCR_PAD_EN 0x0080 // When 1 will pad tx frames < 64 bytes w/0 728#define TCR_NOCRC 0x0100 // When 1 will not append CRC to tx frames 729#define TCR_MON_CSN 0x0400 // When 1 tx monitors carrier 730#define TCR_FDUPLX 0x0800 // When 1 enables full duplex operation 731#define TCR_STP_SQET 0x1000 // When 1 stops tx if Signal Quality Error 732#define TCR_EPH_LOOP 0x2000 // When 1 enables EPH block loopback 733#define TCR_SWFDUP 0x8000 // When 1 enables Switched Full Duplex mode 734 735#define TCR_CLEAR 0 /* do NOTHING */ 736/* the default settings for the TCR register : */ 737#define TCR_DEFAULT (TCR_ENABLE | TCR_PAD_EN) 738 739 740// EPH Status Register 741/* BANK 0 */ 742#define EPH_STATUS_REG SMC_REG(0x0002, 0) 743#define ES_TX_SUC 0x0001 // Last TX was successful 744#define ES_SNGL_COL 0x0002 // Single collision detected for last tx 745#define ES_MUL_COL 0x0004 // Multiple collisions detected for last tx 746#define ES_LTX_MULT 0x0008 // Last tx was a multicast 747#define ES_16COL 0x0010 // 16 Collisions Reached 748#define ES_SQET 0x0020 // Signal Quality Error Test 749#define ES_LTXBRD 0x0040 // Last tx was a broadcast 750#define ES_TXDEFR 0x0080 // Transmit Deferred 751#define ES_LATCOL 0x0200 // Late collision detected on last tx 752#define ES_LOSTCARR 0x0400 // Lost Carrier Sense 753#define ES_EXC_DEF 0x0800 // Excessive Deferral 754#define ES_CTR_ROL 0x1000 // Counter Roll Over indication 755#define ES_LINK_OK 0x4000 // Driven by inverted value of nLNK pin 756#define ES_TXUNRN 0x8000 // Tx Underrun 757 758 759// Receive Control Register 760/* BANK 0 */ 761#define RCR_REG SMC_REG(0x0004, 0) 762#define RCR_RX_ABORT 0x0001 // Set if a rx frame was aborted 763#define RCR_PRMS 0x0002 // Enable promiscuous mode 764#define RCR_ALMUL 0x0004 // When set accepts all multicast frames 765#define RCR_RXEN 0x0100 // IFF this is set, we can receive packets 766#define RCR_STRIP_CRC 0x0200 // When set strips CRC from rx packets 767#define RCR_ABORT_ENB 0x0200 // When set will abort rx on collision 768#define RCR_FILT_CAR 0x0400 // When set filters leading 12 bit s of carrier 769#define RCR_SOFTRST 0x8000 // resets the chip 770 771/* the normal settings for the RCR register : */ 772#define RCR_DEFAULT (RCR_STRIP_CRC | RCR_RXEN) 773#define RCR_CLEAR 0x0 // set it to a base state 774 775 776// Counter Register 777/* BANK 0 */ 778#define COUNTER_REG SMC_REG(0x0006, 0) 779 780 781// Memory Information Register 782/* BANK 0 */ 783#define MIR_REG SMC_REG(0x0008, 0) 784 785 786// Receive/Phy Control Register 787/* BANK 0 */ 788#define RPC_REG SMC_REG(0x000A, 0) 789#define RPC_SPEED 0x2000 // When 1 PHY is in 100Mbps mode. 790#define RPC_DPLX 0x1000 // When 1 PHY is in Full-Duplex Mode 791#define RPC_ANEG 0x0800 // When 1 PHY is in Auto-Negotiate Mode 792#define RPC_LSXA_SHFT 5 // Bits to shift LS2A,LS1A,LS0A to lsb 793#define RPC_LSXB_SHFT 2 // Bits to get LS2B,LS1B,LS0B to lsb 794#define RPC_LED_100_10 (0x00) // LED = 100Mbps OR's with 10Mbps link detect 795#define RPC_LED_RES (0x01) // LED = Reserved 796#define RPC_LED_10 (0x02) // LED = 10Mbps link detect 797#define RPC_LED_FD (0x03) // LED = Full Duplex Mode 798#define RPC_LED_TX_RX (0x04) // LED = TX or RX packet occurred 799#define RPC_LED_100 (0x05) // LED = 100Mbps link dectect 800#define RPC_LED_TX (0x06) // LED = TX packet occurred 801#define RPC_LED_RX (0x07) // LED = RX packet occurred 802 803#ifndef RPC_LSA_DEFAULT 804#define RPC_LSA_DEFAULT RPC_LED_100 805#endif 806#ifndef RPC_LSB_DEFAULT 807#define RPC_LSB_DEFAULT RPC_LED_FD 808#endif 809 810#define RPC_DEFAULT (RPC_ANEG | (RPC_LSA_DEFAULT << RPC_LSXA_SHFT) | (RPC_LSB_DEFAULT << RPC_LSXB_SHFT) | RPC_SPEED | RPC_DPLX) 811 812 813/* Bank 0 0x0C is reserved */ 814 815// Bank Select Register 816/* All Banks */ 817#define BSR_REG 0x000E 818 819 820// Configuration Reg 821/* BANK 1 */ 822#define CONFIG_REG SMC_REG(0x0000, 1) 823#define CONFIG_EXT_PHY 0x0200 // 1=external MII, 0=internal Phy 824#define CONFIG_GPCNTRL 0x0400 // Inverse value drives pin nCNTRL 825#define CONFIG_NO_WAIT 0x1000 // When 1 no extra wait states on ISA bus 826#define CONFIG_EPH_POWER_EN 0x8000 // When 0 EPH is placed into low power mode. 827 828// Default is powered-up, Internal Phy, Wait States, and pin nCNTRL=low 829#define CONFIG_DEFAULT (CONFIG_EPH_POWER_EN) 830 831 832// Base Address Register 833/* BANK 1 */ 834#define BASE_REG SMC_REG(0x0002, 1) 835 836 837// Individual Address Registers 838/* BANK 1 */ 839#define ADDR0_REG SMC_REG(0x0004, 1) 840#define ADDR1_REG SMC_REG(0x0006, 1) 841#define ADDR2_REG SMC_REG(0x0008, 1) 842 843 844// General Purpose Register 845/* BANK 1 */ 846#define GP_REG SMC_REG(0x000A, 1) 847 848 849// Control Register 850/* BANK 1 */ 851#define CTL_REG SMC_REG(0x000C, 1) 852#define CTL_RCV_BAD 0x4000 // When 1 bad CRC packets are received 853#define CTL_AUTO_RELEASE 0x0800 // When 1 tx pages are released automatically 854#define CTL_LE_ENABLE 0x0080 // When 1 enables Link Error interrupt 855#define CTL_CR_ENABLE 0x0040 // When 1 enables Counter Rollover interrupt 856#define CTL_TE_ENABLE 0x0020 // When 1 enables Transmit Error interrupt 857#define CTL_EEPROM_SELECT 0x0004 // Controls EEPROM reload & store 858#define CTL_RELOAD 0x0002 // When set reads EEPROM into registers 859#define CTL_STORE 0x0001 // When set stores registers into EEPROM 860 861 862// MMU Command Register 863/* BANK 2 */ 864#define MMU_CMD_REG SMC_REG(0x0000, 2) 865#define MC_BUSY 1 // When 1 the last release has not completed 866#define MC_NOP (0<<5) // No Op 867#define MC_ALLOC (1<<5) // OR with number of 256 byte packets 868#define MC_RESET (2<<5) // Reset MMU to initial state 869#define MC_REMOVE (3<<5) // Remove the current rx packet 870#define MC_RELEASE (4<<5) // Remove and release the current rx packet 871#define MC_FREEPKT (5<<5) // Release packet in PNR register 872#define MC_ENQUEUE (6<<5) // Enqueue the packet for transmit 873#define MC_RSTTXFIFO (7<<5) // Reset the TX FIFOs 874 875 876// Packet Number Register 877/* BANK 2 */ 878#define PN_REG SMC_REG(0x0002, 2) 879 880 881// Allocation Result Register 882/* BANK 2 */ 883#define AR_REG SMC_REG(0x0003, 2) 884#define AR_FAILED 0x80 // Alocation Failed 885 886 887// TX FIFO Ports Register 888/* BANK 2 */ 889#define TXFIFO_REG SMC_REG(0x0004, 2) 890#define TXFIFO_TEMPTY 0x80 // TX FIFO Empty 891 892// RX FIFO Ports Register 893/* BANK 2 */ 894#define RXFIFO_REG SMC_REG(0x0005, 2) 895#define RXFIFO_REMPTY 0x80 // RX FIFO Empty 896 897#define FIFO_REG SMC_REG(0x0004, 2) 898 899// Pointer Register 900/* BANK 2 */ 901#define PTR_REG SMC_REG(0x0006, 2) 902#define PTR_RCV 0x8000 // 1=Receive area, 0=Transmit area 903#define PTR_AUTOINC 0x4000 // Auto increment the pointer on each access 904#define PTR_READ 0x2000 // When 1 the operation is a read 905 906 907// Data Register 908/* BANK 2 */ 909#define DATA_REG SMC_REG(0x0008, 2) 910 911 912// Interrupt Status/Acknowledge Register 913/* BANK 2 */ 914#define INT_REG SMC_REG(0x000C, 2) 915 916 917// Interrupt Mask Register 918/* BANK 2 */ 919#define IM_REG SMC_REG(0x000D, 2) 920#define IM_MDINT 0x80 // PHY MI Register 18 Interrupt 921#define IM_ERCV_INT 0x40 // Early Receive Interrupt 922#define IM_EPH_INT 0x20 // Set by Ethernet Protocol Handler section 923#define IM_RX_OVRN_INT 0x10 // Set by Receiver Overruns 924#define IM_ALLOC_INT 0x08 // Set when allocation request is completed 925#define IM_TX_EMPTY_INT 0x04 // Set if the TX FIFO goes empty 926#define IM_TX_INT 0x02 // Transmit Interrupt 927#define IM_RCV_INT 0x01 // Receive Interrupt 928 929 930// Multicast Table Registers 931/* BANK 3 */ 932#define MCAST_REG1 SMC_REG(0x0000, 3) 933#define MCAST_REG2 SMC_REG(0x0002, 3) 934#define MCAST_REG3 SMC_REG(0x0004, 3) 935#define MCAST_REG4 SMC_REG(0x0006, 3) 936 937 938// Management Interface Register (MII) 939/* BANK 3 */ 940#define MII_REG SMC_REG(0x0008, 3) 941#define MII_MSK_CRS100 0x4000 // Disables CRS100 detection during tx half dup 942#define MII_MDOE 0x0008 // MII Output Enable 943#define MII_MCLK 0x0004 // MII Clock, pin MDCLK 944#define MII_MDI 0x0002 // MII Input, pin MDI 945#define MII_MDO 0x0001 // MII Output, pin MDO 946 947 948// Revision Register 949/* BANK 3 */ 950/* ( hi: chip id low: rev # ) */ 951#define REV_REG SMC_REG(0x000A, 3) 952 953 954// Early RCV Register 955/* BANK 3 */ 956/* this is NOT on SMC9192 */ 957#define ERCV_REG SMC_REG(0x000C, 3) 958#define ERCV_RCV_DISCRD 0x0080 // When 1 discards a packet being received 959#define ERCV_THRESHOLD 0x001F // ERCV Threshold Mask 960 961 962// External Register 963/* BANK 7 */ 964#define EXT_REG SMC_REG(0x0000, 7) 965 966 967#define CHIP_9192 3 968#define CHIP_9194 4 969#define CHIP_9195 5 970#define CHIP_9196 6 971#define CHIP_91100 7 972#define CHIP_91100FD 8 973#define CHIP_91111FD 9 974 975static const char * chip_ids[ 16 ] = { 976 NULL, NULL, NULL, 977 /* 3 */ "SMC91C90/91C92", 978 /* 4 */ "SMC91C94", 979 /* 5 */ "SMC91C95", 980 /* 6 */ "SMC91C96", 981 /* 7 */ "SMC91C100", 982 /* 8 */ "SMC91C100FD", 983 /* 9 */ "SMC91C11xFD", 984 NULL, NULL, NULL, 985 NULL, NULL, NULL}; 986 987 988/* 989 . Receive status bits 990*/ 991#define RS_ALGNERR 0x8000 992#define RS_BRODCAST 0x4000 993#define RS_BADCRC 0x2000 994#define RS_ODDFRAME 0x1000 995#define RS_TOOLONG 0x0800 996#define RS_TOOSHORT 0x0400 997#define RS_MULTICAST 0x0001 998#define RS_ERRORS (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT) 999 1000 1001/* 1002 * PHY IDs 1003 * LAN83C183 == LAN91C111 Internal PHY 1004 */ 1005#define PHY_LAN83C183 0x0016f840 1006#define PHY_LAN83C180 0x02821c50 1007 1008/* 1009 * PHY Register Addresses (LAN91C111 Internal PHY) 1010 * 1011 * Generic PHY registers can be found in <linux/mii.h> 1012 * 1013 * These phy registers are specific to our on-board phy. 1014 */ 1015 1016// PHY Configuration Register 1 1017#define PHY_CFG1_REG 0x10 1018#define PHY_CFG1_LNKDIS 0x8000 // 1=Rx Link Detect Function disabled 1019#define PHY_CFG1_XMTDIS 0x4000 // 1=TP Transmitter Disabled 1020#define PHY_CFG1_XMTPDN 0x2000 // 1=TP Transmitter Powered Down 1021#define PHY_CFG1_BYPSCR 0x0400 // 1=Bypass scrambler/descrambler 1022#define PHY_CFG1_UNSCDS 0x0200 // 1=Unscramble Idle Reception Disable 1023#define PHY_CFG1_EQLZR 0x0100 // 1=Rx Equalizer Disabled 1024#define PHY_CFG1_CABLE 0x0080 // 1=STP(150ohm), 0=UTP(100ohm) 1025#define PHY_CFG1_RLVL0 0x0040 // 1=Rx Squelch level reduced by 4.5db 1026#define PHY_CFG1_TLVL_SHIFT 2 // Transmit Output Level Adjust 1027#define PHY_CFG1_TLVL_MASK 0x003C 1028#define PHY_CFG1_TRF_MASK 0x0003 // Transmitter Rise/Fall time 1029 1030 1031// PHY Configuration Register 2 1032#define PHY_CFG2_REG 0x11 1033#define PHY_CFG2_APOLDIS 0x0020 // 1=Auto Polarity Correction disabled 1034#define PHY_CFG2_JABDIS 0x0010 // 1=Jabber disabled 1035#define PHY_CFG2_MREG 0x0008 // 1=Multiple register access (MII mgt) 1036#define PHY_CFG2_INTMDIO 0x0004 // 1=Interrupt signaled with MDIO pulseo 1037 1038// PHY Status Output (and Interrupt status) Register 1039#define PHY_INT_REG 0x12 // Status Output (Interrupt Status) 1040#define PHY_INT_INT 0x8000 // 1=bits have changed since last read 1041#define PHY_INT_LNKFAIL 0x4000 // 1=Link Not detected 1042#define PHY_INT_LOSSSYNC 0x2000 // 1=Descrambler has lost sync 1043#define PHY_INT_CWRD 0x1000 // 1=Invalid 4B5B code detected on rx 1044#define PHY_INT_SSD 0x0800 // 1=No Start Of Stream detected on rx 1045#define PHY_INT_ESD 0x0400 // 1=No End Of Stream detected on rx 1046#define PHY_INT_RPOL 0x0200 // 1=Reverse Polarity detected 1047#define PHY_INT_JAB 0x0100 // 1=Jabber detected 1048#define PHY_INT_SPDDET 0x0080 // 1=100Base-TX mode, 0=10Base-T mode 1049#define PHY_INT_DPLXDET 0x0040 // 1=Device in Full Duplex 1050 1051// PHY Interrupt/Status Mask Register 1052#define PHY_MASK_REG 0x13 // Interrupt Mask 1053// Uses the same bit definitions as PHY_INT_REG 1054 1055 1056/* 1057 * SMC91C96 ethernet config and status registers. 1058 * These are in the "attribute" space. 1059 */ 1060#define ECOR 0x8000 1061#define ECOR_RESET 0x80 1062#define ECOR_LEVEL_IRQ 0x40 1063#define ECOR_WR_ATTRIB 0x04 1064#define ECOR_ENABLE 0x01 1065 1066#define ECSR 0x8002 1067#define ECSR_IOIS8 0x20 1068#define ECSR_PWRDWN 0x04 1069#define ECSR_INT 0x02 1070 1071#define ATTRIB_SIZE ((64*1024) << SMC_IO_SHIFT) 1072 1073 1074/* 1075 * Macros to abstract register access according to the data bus 1076 * capabilities. Please use those and not the in/out primitives. 1077 * Note: the following macros do *not* select the bank -- this must 1078 * be done separately as needed in the main code. The SMC_REG() macro 1079 * only uses the bank argument for debugging purposes (when enabled). 1080 * 1081 * Note: despite inline functions being safer, everything leading to this 1082 * should preferably be macros to let BUG() display the line number in 1083 * the core source code since we're interested in the top call site 1084 * not in any inline function location. 1085 */ 1086 1087#if SMC_DEBUG > 0 1088#define SMC_REG(reg, bank) \ 1089 ({ \ 1090 int __b = SMC_CURRENT_BANK(); \ 1091 if (unlikely((__b & ~0xf0) != (0x3300 | bank))) { \ 1092 printk( "%s: bank reg screwed (0x%04x)\n", \ 1093 CARDNAME, __b ); \ 1094 BUG(); \ 1095 } \ 1096 reg<<SMC_IO_SHIFT; \ 1097 }) 1098#else 1099#define SMC_REG(reg, bank) (reg<<SMC_IO_SHIFT) 1100#endif 1101 1102/* 1103 * Hack Alert: Some setups just can't write 8 or 16 bits reliably when not 1104 * aligned to a 32 bit boundary. I tell you that does exist! 1105 * Fortunately the affected register accesses can be easily worked around 1106 * since we can write zeroes to the preceeding 16 bits without adverse 1107 * effects and use a 32-bit access. 1108 * 1109 * Enforce it on any 32-bit capable setup for now. 1110 */ 1111#define SMC_MUST_ALIGN_WRITE SMC_CAN_USE_32BIT 1112 1113#define SMC_GET_PN() \ 1114 ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, PN_REG)) \ 1115 : (SMC_inw(ioaddr, PN_REG) & 0xFF) ) 1116 1117#define SMC_SET_PN(x) \ 1118 do { \ 1119 if (SMC_MUST_ALIGN_WRITE) \ 1120 SMC_outl((x)<<16, ioaddr, SMC_REG(0, 2)); \ 1121 else if (SMC_CAN_USE_8BIT) \ 1122 SMC_outb(x, ioaddr, PN_REG); \ 1123 else \ 1124 SMC_outw(x, ioaddr, PN_REG); \ 1125 } while (0) 1126 1127#define SMC_GET_AR() \ 1128 ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, AR_REG)) \ 1129 : (SMC_inw(ioaddr, PN_REG) >> 8) ) 1130 1131#define SMC_GET_TXFIFO() \ 1132 ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, TXFIFO_REG)) \ 1133 : (SMC_inw(ioaddr, TXFIFO_REG) & 0xFF) ) 1134 1135#define SMC_GET_RXFIFO() \ 1136 ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, RXFIFO_REG)) \ 1137 : (SMC_inw(ioaddr, TXFIFO_REG) >> 8) ) 1138 1139#define SMC_GET_INT() \ 1140 ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, INT_REG)) \ 1141 : (SMC_inw(ioaddr, INT_REG) & 0xFF) ) 1142 1143#define SMC_ACK_INT(x) \ 1144 do { \ 1145 if (SMC_CAN_USE_8BIT) \ 1146 SMC_outb(x, ioaddr, INT_REG); \ 1147 else { \ 1148 unsigned long __flags; \ 1149 int __mask; \ 1150 local_irq_save(__flags); \ 1151 __mask = SMC_inw( ioaddr, INT_REG ) & ~0xff; \ 1152 SMC_outw( __mask | (x), ioaddr, INT_REG ); \ 1153 local_irq_restore(__flags); \ 1154 } \ 1155 } while (0) 1156 1157#define SMC_GET_INT_MASK() \ 1158 ( SMC_CAN_USE_8BIT ? (SMC_inb(ioaddr, IM_REG)) \ 1159 : (SMC_inw( ioaddr, INT_REG ) >> 8) ) 1160 1161#define SMC_SET_INT_MASK(x) \ 1162 do { \ 1163 if (SMC_CAN_USE_8BIT) \ 1164 SMC_outb(x, ioaddr, IM_REG); \ 1165 else \ 1166 SMC_outw((x) << 8, ioaddr, INT_REG); \ 1167 } while (0) 1168 1169#define SMC_CURRENT_BANK() SMC_inw(ioaddr, BANK_SELECT) 1170 1171#define SMC_SELECT_BANK(x) \ 1172 do { \ 1173 if (SMC_MUST_ALIGN_WRITE) \ 1174 SMC_outl((x)<<16, ioaddr, 12<<SMC_IO_SHIFT); \ 1175 else \ 1176 SMC_outw(x, ioaddr, BANK_SELECT); \ 1177 } while (0) 1178 1179#define SMC_GET_BASE() SMC_inw(ioaddr, BASE_REG) 1180 1181#define SMC_SET_BASE(x) SMC_outw(x, ioaddr, BASE_REG) 1182 1183#define SMC_GET_CONFIG() SMC_inw(ioaddr, CONFIG_REG) 1184 1185#define SMC_SET_CONFIG(x) SMC_outw(x, ioaddr, CONFIG_REG) 1186 1187#define SMC_GET_COUNTER() SMC_inw(ioaddr, COUNTER_REG) 1188 1189#define SMC_GET_CTL() SMC_inw(ioaddr, CTL_REG) 1190 1191#define SMC_SET_CTL(x) SMC_outw(x, ioaddr, CTL_REG) 1192 1193#define SMC_GET_MII() SMC_inw(ioaddr, MII_REG) 1194 1195#define SMC_SET_MII(x) SMC_outw(x, ioaddr, MII_REG) 1196 1197#define SMC_GET_MIR() SMC_inw(ioaddr, MIR_REG) 1198 1199#define SMC_SET_MIR(x) SMC_outw(x, ioaddr, MIR_REG) 1200 1201#define SMC_GET_MMU_CMD() SMC_inw(ioaddr, MMU_CMD_REG) 1202 1203#define SMC_SET_MMU_CMD(x) SMC_outw(x, ioaddr, MMU_CMD_REG) 1204 1205#define SMC_GET_FIFO() SMC_inw(ioaddr, FIFO_REG) 1206 1207#define SMC_GET_PTR() SMC_inw(ioaddr, PTR_REG) 1208 1209#define SMC_SET_PTR(x) \ 1210 do { \ 1211 if (SMC_MUST_ALIGN_WRITE) \ 1212 SMC_outl((x)<<16, ioaddr, SMC_REG(4, 2)); \ 1213 else \ 1214 SMC_outw(x, ioaddr, PTR_REG); \ 1215 } while (0) 1216 1217#define SMC_GET_EPH_STATUS() SMC_inw(ioaddr, EPH_STATUS_REG) 1218 1219#define SMC_GET_RCR() SMC_inw(ioaddr, RCR_REG) 1220 1221#define SMC_SET_RCR(x) SMC_outw(x, ioaddr, RCR_REG) 1222 1223#define SMC_GET_REV() SMC_inw(ioaddr, REV_REG) 1224 1225#define SMC_GET_RPC() SMC_inw(ioaddr, RPC_REG) 1226 1227#define SMC_SET_RPC(x) \ 1228 do { \ 1229 if (SMC_MUST_ALIGN_WRITE) \ 1230 SMC_outl((x)<<16, ioaddr, SMC_REG(8, 0)); \ 1231 else \ 1232 SMC_outw(x, ioaddr, RPC_REG); \ 1233 } while (0) 1234 1235#define SMC_GET_TCR() SMC_inw(ioaddr, TCR_REG) 1236 1237#define SMC_SET_TCR(x) SMC_outw(x, ioaddr, TCR_REG) 1238 1239#ifndef SMC_GET_MAC_ADDR 1240#define SMC_GET_MAC_ADDR(addr) \ 1241 do { \ 1242 unsigned int __v; \ 1243 __v = SMC_inw( ioaddr, ADDR0_REG ); \ 1244 addr[0] = __v; addr[1] = __v >> 8; \ 1245 __v = SMC_inw( ioaddr, ADDR1_REG ); \ 1246 addr[2] = __v; addr[3] = __v >> 8; \ 1247 __v = SMC_inw( ioaddr, ADDR2_REG ); \ 1248 addr[4] = __v; addr[5] = __v >> 8; \ 1249 } while (0) 1250#endif 1251 1252#define SMC_SET_MAC_ADDR(addr) \ 1253 do { \ 1254 SMC_outw( addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG ); \ 1255 SMC_outw( addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG ); \ 1256 SMC_outw( addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG ); \ 1257 } while (0) 1258 1259#define SMC_SET_MCAST(x) \ 1260 do { \ 1261 const unsigned char *mt = (x); \ 1262 SMC_outw( mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1 ); \ 1263 SMC_outw( mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2 ); \ 1264 SMC_outw( mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3 ); \ 1265 SMC_outw( mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4 ); \ 1266 } while (0) 1267 1268#define SMC_PUT_PKT_HDR(status, length) \ 1269 do { \ 1270 if (SMC_CAN_USE_32BIT) \ 1271 SMC_outl((status) | (length)<<16, ioaddr, DATA_REG); \ 1272 else { \ 1273 SMC_outw(status, ioaddr, DATA_REG); \ 1274 SMC_outw(length, ioaddr, DATA_REG); \ 1275 } \ 1276 } while (0) 1277 1278#define SMC_GET_PKT_HDR(status, length) \ 1279 do { \ 1280 if (SMC_CAN_USE_32BIT) { \ 1281 unsigned int __val = SMC_inl(ioaddr, DATA_REG); \ 1282 (status) = __val & 0xffff; \ 1283 (length) = __val >> 16; \ 1284 } else { \ 1285 (status) = SMC_inw(ioaddr, DATA_REG); \ 1286 (length) = SMC_inw(ioaddr, DATA_REG); \ 1287 } \ 1288 } while (0) 1289 1290#define SMC_PUSH_DATA(p, l) \ 1291 do { \ 1292 if (SMC_CAN_USE_32BIT) { \ 1293 void *__ptr = (p); \ 1294 int __len = (l); \ 1295 void __iomem *__ioaddr = ioaddr; \ 1296 if (__len >= 2 && (unsigned long)__ptr & 2) { \ 1297 __len -= 2; \ 1298 SMC_outw(*(u16 *)__ptr, ioaddr, DATA_REG); \ 1299 __ptr += 2; \ 1300 } \ 1301 if (SMC_CAN_USE_DATACS && lp->datacs) \ 1302 __ioaddr = lp->datacs; \ 1303 SMC_outsl(__ioaddr, DATA_REG, __ptr, __len>>2); \ 1304 if (__len & 2) { \ 1305 __ptr += (__len & ~3); \ 1306 SMC_outw(*((u16 *)__ptr), ioaddr, DATA_REG); \ 1307 } \ 1308 } else if (SMC_CAN_USE_16BIT) \ 1309 SMC_outsw(ioaddr, DATA_REG, p, (l) >> 1); \ 1310 else if (SMC_CAN_USE_8BIT) \ 1311 SMC_outsb(ioaddr, DATA_REG, p, l); \ 1312 } while (0) 1313 1314#define SMC_PULL_DATA(p, l) \ 1315 do { \ 1316 if (SMC_CAN_USE_32BIT) { \ 1317 void *__ptr = (p); \ 1318 int __len = (l); \ 1319 void __iomem *__ioaddr = ioaddr; \ 1320 if ((unsigned long)__ptr & 2) { \ 1321 /* \ 1322 * We want 32bit alignment here. \ 1323 * Since some buses perform a full \ 1324 * 32bit fetch even for 16bit data \ 1325 * we can't use SMC_inw() here. \ 1326 * Back both source (on-chip) and \ 1327 * destination pointers of 2 bytes. \ 1328 * This is possible since the call to \ 1329 * SMC_GET_PKT_HDR() already advanced \ 1330 * the source pointer of 4 bytes, and \ 1331 * the skb_reserve(skb, 2) advanced \ 1332 * the destination pointer of 2 bytes. \ 1333 */ \ 1334 __ptr -= 2; \ 1335 __len += 2; \ 1336 SMC_SET_PTR(2|PTR_READ|PTR_RCV|PTR_AUTOINC); \ 1337 } \ 1338 if (SMC_CAN_USE_DATACS && lp->datacs) \ 1339 __ioaddr = lp->datacs; \ 1340 __len += 2; \ 1341 SMC_insl(__ioaddr, DATA_REG, __ptr, __len>>2); \ 1342 } else if (SMC_CAN_USE_16BIT) \ 1343 SMC_insw(ioaddr, DATA_REG, p, (l) >> 1); \ 1344 else if (SMC_CAN_USE_8BIT) \ 1345 SMC_insb(ioaddr, DATA_REG, p, l); \ 1346 } while (0) 1347 1348#endif /* _SMC91X_H_ */