lanai.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:91k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* lanai.c -- Copyright 1999 by Mitchell Blank Jr <mitch@sfgoth.com>
  2.  *
  3.  *  This program is free software; you can redistribute it and/or
  4.  *  modify it under the terms of the GNU General Public License
  5.  *  as published by the Free Software Foundation; either version
  6.  *  2 of the License, or (at your option) any later version.
  7.  *
  8.  * This driver supports ATM cards based on the Efficient "Lanai"
  9.  * chipset such as the Speedstream 3010 and the ENI-25p.  The
  10.  * Speedstream 3060 is currently not supported since we don't
  11.  * have the code to drive the on-board Alcatel DSL chipset (yet).
  12.  *
  13.  * Thanks to Efficient for supporting this project with hardware,
  14.  * documentation, and by answering my questions.
  15.  *
  16.  * Things not working yet:
  17.  *
  18.  * o  We're only set up to compile as a module currently.  i.e.
  19.  *    you should put the source in drivers/atm/lanai.c and then
  20.  *    just do "make drivers/atm/lanai.o" from the main
  21.  *    source directory.  This will produce a drivers/atm/lanai.o
  22.  *    file suitable for insmod'ing
  23.  *
  24.  * o  We don't support the Speedstream 3060 yet - this card has
  25.  *    an on-board DSL modem chip by Alcatel and the driver will
  26.  *    need some extra code added to handle it
  27.  *
  28.  * o  Note that due to limitations of the Lanai only one VCC can be
  29.  *    in CBR at once
  30.  *
  31.  * o We don't currently parse the EEPROM at all.  The code is all
  32.  *   there as per the spec, but it doesn't actually work.  I think
  33.  *   there may be some issues with the docs.  Anyway, do NOT
  34.  *   enable it yet - bugs in that code may actually damage your
  35.  *   hardware!  Because of this you should hardware an ESI before
  36.  *   trying to use this in a LANE or MPOA environment.
  37.  *
  38.  * o  AAL0 is stubbed in but the actual rx/tx path isn't written yet:
  39.  * vcc_tx_aal0() needs to send or queue a SKB
  40.  * vcc_tx_unqueue_aal0() needs to attempt to send queued SKBs
  41.  * vcc_rx_aal0() needs to handle AAL0 interrupts
  42.  *    This isn't too much work - I just wanted to get other things
  43.  *    done first.
  44.  *
  45.  * o  lanai_change_qos() isn't written yet
  46.  *
  47.  * o  There aren't any ioctl's yet -- I'd like to eventually support
  48.  *    setting loopback and LED modes that way.  (see lanai_ioctl)
  49.  *
  50.  * o  If the segmentation engine or DMA gets shut down we should restart
  51.  *    card as per section 17.0i.  (see lanai_reset)
  52.  *
  53.  * o setsockopt(SO_CIRANGE) isn't done (although despite what the
  54.  *   API says it isn't exactly commonly implemented)
  55.  */
  56. /* Version history:
  57.  *   v.0.02 -- 11-JAN-2000 -- Endian fixes
  58.  *   v.0.01 -- 30-NOV-1999 -- Initial release
  59.  */
  60. #include <linux/module.h>
  61. #include <linux/mm.h>
  62. #include <linux/atmdev.h>
  63. #include <asm/io.h>
  64. #include <asm/byteorder.h>
  65. #include <linux/spinlock.h>
  66. #include <linux/pci.h>
  67. #include <linux/init.h>
  68. #include <linux/delay.h>
  69. #include <linux/interrupt.h>
  70. #ifndef PCI_VENDOR_ID_EF_ATM_LANAI2
  71. /* These need to eventually go into <linux/pci.h> - they're here for now */
  72. #define PCI_VENDOR_ID_EF_ATM_LANAI2 0x0003
  73. #define PCI_VENDOR_ID_EF_ATM_LANAIHB 0x0005
  74. #endif
  75. /* -------------------- TUNABLE PARAMATERS: */
  76. /*
  77.  * Maximum number of VCIs per card.  Setting it lower could theoretically
  78.  * save some memory, but since we allocate our vcc list with get_free_pages,
  79.  * it's not really likely for most architectures
  80.  */
  81. #define NUM_VCI (1024)
  82. /*
  83.  * Enable extra debugging
  84.  */
  85. #define DEBUG
  86. /*
  87.  * Debug _all_ register operations with card, except the memory test.
  88.  * Also disables the timed poll to prevent extra chattiness.  This
  89.  * isn't for normal use
  90.  */
  91. #undef DEBUG_RW
  92. /*
  93.  * The programming guide specifies a full test of the on-board SRAM
  94.  * at initialization time.  Undefine to remove this
  95.  */
  96. #define FULL_MEMORY_TEST
  97. /*
  98.  * This is the number of (4 byte) service entries that we will
  99.  * try to allocate at startup.  Note that we will end up with
  100.  * one PAGE_SIZE's worth regardless of what this is set to
  101.  */
  102. #define SERVICE_ENTRIES (1024)
  103. /* TODO: make above a module load-time option */
  104. /*
  105.  * We normally read the onboard EEPROM in order to discover our MAC
  106.  * address.  Undefine to _not_ do this
  107.  */
  108. /* #define READ_EEPROM */ /* ***DONT ENABLE YET*** */
  109. /* TODO: make above a module load-time option (also) */
  110. /*
  111.  * Depth of TX fifo (in 128 byte units; range 2-31)
  112.  * Smaller numbers are better for network latency
  113.  * Larger numbers are better for PCI latency
  114.  * I'm really sure where the best tradeoff is, but the BSD driver uses
  115.  * 7 and it seems to work ok.
  116.  */
  117. #define TX_FIFO_DEPTH (7)
  118. /* TODO: make above a module load-time option */
  119. /*
  120.  * How often (in jiffies) we will try to unstick stuck connections -
  121.  * shouldn't need to happen much
  122.  */
  123. #define LANAI_POLL_PERIOD (10*HZ)
  124. /* TODO: make above a module load-time option */
  125. /*
  126.  * When allocating an AAL5 receiving buffer, try to make it at least
  127.  * large enough to hold this many max_sdu sized PDUs
  128.  */
  129. #define AAL5_RX_MULTIPLIER (3)
  130. /* TODO: make above a module load-time option */
  131. /*
  132.  * Same for transmitting buffer
  133.  */
  134. #define AAL5_TX_MULTIPLIER (3)
  135. /* TODO: make above a module load-time option */
  136. /*
  137.  * When allocating an AAL0 transmiting buffer, how many cells should fit.
  138.  * Remember we'll end up with a PAGE_SIZE of them anyway, so this isn't
  139.  * really critical
  140.  */
  141. #define AAL0_TX_MULTIPLIER (40)
  142. /* TODO: make above a module load-time option */
  143. /*
  144.  * How large should we make the AAL0 receiving buffer.  Remember that this
  145.  * is shared between all AAL0 VC's
  146.  */
  147. #define AAL0_RX_BUFFER_SIZE (PAGE_SIZE)
  148. /* TODO: make above a module load-time option */
  149. /*
  150.  * Should we use Lanai's "powerdown" feature when no vcc's are bound?
  151.  */
  152. /* #define USE_POWERDOWN */
  153. /* TODO: make above a module load-time option (also) */
  154. /* -------------------- DEBUGGING AIDS: */
  155. #define DEV_LABEL "lanai"
  156. #ifdef DEBUG
  157. #define DPRINTK(format, args...) 
  158. printk(KERN_DEBUG DEV_LABEL ": " format, ##args)
  159. #define APRINTK(truth, format, args...) 
  160. do { 
  161. if (!(truth)) 
  162. printk(KERN_ERR DEV_LABEL ": " format, ##args); 
  163. } while (0)
  164. #else /* !DEBUG */
  165. #define DPRINTK(format, args...)
  166. #define APRINTK(truth, format, args...)
  167. #endif /* DEBUG */
  168. #ifdef DEBUG_RW
  169. #define RWDEBUG(format, args...) 
  170. printk(KERN_DEBUG DEV_LABEL ": " format, ##args)
  171. #else /* !DEBUG_RW */
  172. #define RWDEBUG(format, args...)
  173. #endif
  174. /* -------------------- DATA DEFINITIONS: */
  175. #define LANAI_MAPPING_SIZE (0x40000)
  176. #define LANAI_EEPROM_SIZE (128)
  177. typedef int vci_t;
  178. typedef unsigned long bus_addr_t;
  179. /* A bitfield large enough for NUM_VCI */
  180. #define VCI_BITFIELD_NELEM  ((NUM_VCI + BITS_PER_LONG - 1) / BITS_PER_LONG)
  181. typedef struct {
  182. unsigned long ul[VCI_BITFIELD_NELEM];
  183. } vci_bitfield;
  184. /* DMA buffer in host memory for TX, RX, or service list. */
  185. struct lanai_buffer {
  186. u32 *start; /* From get_free_pages */
  187. u32 *end; /* One past last byte */
  188. u32 *ptr; /* Pointer to current host location */
  189. int order; /* log2(size/PAGE_SIZE) */
  190. };
  191. struct lanai_vcc_stats {
  192. unsigned rx_nomem;
  193. union {
  194. struct {
  195. unsigned rx_badlen;
  196. unsigned service_trash;
  197. unsigned service_stream;
  198. unsigned service_rxcrc;
  199. } aal5;
  200. struct {
  201. } aal0;
  202. } x;
  203. };
  204. struct lanai_dev; /* Forward declaration */
  205. /*
  206.  * This is the card-specific per-vcc data.  Note that unlike some other
  207.  * drivers there is NOT a 1-to-1 correspondance between these and
  208.  * atm_vcc's - each one of these represents an actual 2-way vcc, but
  209.  * an atm_vcc can be 1-way and share with a 1-way vcc in the other
  210.  * direction.  To make it weirder, there can even be 0-way vccs
  211.  * bound to us, waiting to do a change_qos
  212.  */
  213. struct lanai_vcc {
  214. bus_addr_t vbase; /* Base of VCC's registers */
  215. struct lanai_vcc_stats stats;
  216. int nref; /* # of atm_vcc's who reference us */
  217. vci_t vci;
  218. struct {
  219. struct lanai_buffer buf;
  220. struct atm_vcc *atmvcc; /* atm_vcc who is receiver */
  221. } rx;
  222. struct {
  223. struct lanai_buffer buf;
  224. struct atm_vcc *atmvcc; /* atm_vcc who is transmitter */
  225. int endptr; /* last endptr from service entry */
  226. struct sk_buff_head backlog;
  227. struct sk_buff *inprogress; /* We're streaming this PDU */
  228. unsigned char *pptr; /* Where we are in above */
  229. int inprogleft; /* Bytes left to send "inprogress" */
  230. void (*unqueue)(struct lanai_dev *, struct lanai_vcc *, int);
  231. } tx;
  232. };
  233. enum lanai_type {
  234. lanai2 = PCI_VENDOR_ID_EF_ATM_LANAI2,
  235. lanaihb = PCI_VENDOR_ID_EF_ATM_LANAIHB
  236. };
  237. struct lanai_dev_stats {
  238. unsigned ovfl_trash; /* # of cells dropped - buffer overflow */
  239. unsigned vci_trash; /* # of cells dropped - closed vci */
  240. unsigned hec_err; /* # of cells dropped - bad HEC */
  241. unsigned atm_ovfl; /* # of cells dropped - rx fifo overflow */
  242. unsigned pcierr_parity_detect;
  243. unsigned pcierr_serr_set;
  244. unsigned pcierr_master_abort;
  245. unsigned pcierr_m_target_abort;
  246. unsigned pcierr_s_target_abort;
  247. unsigned pcierr_master_parity;
  248. unsigned service_novcc_rx;
  249. unsigned service_novcc_tx;
  250. unsigned service_notx;
  251. unsigned service_norx;
  252. unsigned service_rxnotaal5;
  253. unsigned dma_reenable;
  254. unsigned card_reset;
  255. };
  256. struct lanai_dev {
  257. bus_addr_t base;
  258. struct lanai_dev_stats stats;
  259. struct lanai_buffer service;
  260. struct lanai_vcc **vccs;
  261. #ifdef USE_POWERDOWN
  262. int nbound; /* number of bound vccs */
  263. #endif
  264. enum lanai_type type;
  265. vci_t num_vci; /* Currently just NUM_VCI */
  266. u8 eeprom[LANAI_EEPROM_SIZE];
  267. u32 serialno, magicno;
  268. struct pci_dev *pci;
  269. vci_bitfield backlog_vccs; /* VCCs that are backlogged */
  270. vci_bitfield transmit_ready; /* VCCs that have transmit space */
  271. struct timer_list timer;
  272. int naal0;
  273. struct lanai_buffer aal0buf; /* AAL0 RX buffers */
  274. u32 conf1, conf2; /* CONFIG[12] registers */
  275. u32 status; /* STATUS register */
  276. spinlock_t txlock;
  277. spinlock_t servicelock;
  278. struct atm_vcc *cbrvcc;
  279. int number;
  280. int board_rev;
  281. u8 pci_revision;
  282. /* TODO - look at race conditions with maintence of conf1/conf2 */
  283. /* TODO - transmit locking: should we use _irq not _irqsave? */
  284. /* TODO - organize above in some rational fashion (see <asm/cache.h>) */
  285. };
  286. /* -------------------- VCI_BITFIELD UTILITIES: */
  287. /*
  288.  * These functions assume that BITS_PER_LONG is a power of two, which
  289.  * should be safe
  290.  */
  291. #if (BITS_PER_LONG & (BITS_PER_LONG - 1))
  292. #error lanai driver requires type long to have a power of two number of bits
  293. #endif
  294. /*
  295.  * In vci_bitfield_{set,clear} we do the operation in three
  296.  * parts to ensure that gcc doesn't cast anything down to
  297.  * 32 bits (and then sign extend them later) on 64-bit
  298.  * platforms like the alpha
  299.  */
  300. static inline void vci_bitfield_set(vci_bitfield *bf, vci_t vci)
  301. {
  302. unsigned long bit = 1;
  303. bit <<= (unsigned long) (vci & (BITS_PER_LONG - 1));
  304. bf->ul[vci / BITS_PER_LONG] |= bit;
  305. }
  306. static inline void vci_bitfield_clear(vci_bitfield *bf, vci_t vci)
  307. {
  308. unsigned long bit = 1;
  309. bit <<= (unsigned long) (vci & (BITS_PER_LONG - 1));
  310. bf->ul[vci / BITS_PER_LONG] &= ~bit;
  311. }
  312. static inline void vci_bitfield_init(vci_bitfield *bf)
  313. {
  314. memset(bf, 0, sizeof(*bf));
  315. }
  316. static void vci_bitfield_iterate(struct lanai_dev *lanai,
  317. const vci_bitfield *bf, void (*func)(struct lanai_dev *,vci_t vci))
  318. {
  319. vci_t vci;
  320. unsigned long mask;
  321. const unsigned long *lp = &(bf->ul[0]);
  322. for (vci = 0; vci < NUM_VCI; lp++)
  323. if (*lp == 0)
  324. vci += BITS_PER_LONG;
  325. else
  326. for (mask = 1; mask != 0; mask <<= 1, vci++)
  327. if (*lp & mask)
  328. func(lanai, vci);
  329. }
  330. /* -------------------- BUFFER  UTILITIES: */
  331. /*
  332.  * Lanai needs DMA buffers aligned to 256 bytes of at least 1024 bytes -
  333.  * we assume that any page allocation will do.  I'm sure this is
  334.  * never going to be a problem, but it's good to document assumtions
  335.  */
  336. #if PAGE_SIZE < 1024
  337. #error PAGE_SIZE too small to support LANAI chipset
  338. #endif
  339. /*
  340.  * We also assume that the maximum buffer size will be some number
  341.  * of whole pages, although that wouldn't be too hard to fix
  342.  */
  343. #if PAGE_SIZE > (128 * 1024)
  344. #error PAGE_SIZE too large to support LANAI chipset
  345. #endif
  346. /* Convert a size to "order" for __get_free_pages */
  347. static int bytes_to_order(int bytes)
  348. {
  349. int order = 0;
  350. if (bytes > (128 * 1024))
  351. bytes = 128 * 1024; /* Max buffer size for lanai */
  352. while ((PAGE_SIZE << order) < bytes)
  353. order++;
  354. return order;
  355. }
  356. /*
  357.  * Allocate a buffer in host RAM for service list, RX, or TX
  358.  * Returns buf->order<0 if no memory
  359.  * Note that the size will be rounded up to an "order" of pages, and
  360.  * if we can't allocate that we'll settle for something smaller
  361.  * until minbytes
  362.  *
  363.  * NOTE: buffer must be 32-bit DMA capable - when linux can
  364.  *  make distinction, this will need tweaking for this
  365.  *  to work on BIG memory machines.
  366.  */
  367. static void lanai_buf_allocate(struct lanai_buffer *buf,
  368. int bytes, int minbytes)
  369. {
  370. unsigned long address;
  371. int order = bytes_to_order(bytes);
  372. do {
  373. address = __get_free_pages(GFP_KERNEL, order);
  374. if (address != 0) { /* Success */
  375. bytes = PAGE_SIZE << order;
  376. buf->start = buf->ptr = (u32 *) address;
  377. buf->end = (u32 *) (address + bytes);
  378. memset((void *) address, 0, bytes);
  379. break;
  380. }
  381. if ((PAGE_SIZE << --order) < minbytes)
  382. order = -1; /* Too small - give up */
  383. } while (order >= 0);
  384. buf->order = order;
  385. }
  386. static inline void lanai_buf_deallocate(struct lanai_buffer *buf)
  387. {
  388. if (buf->order >= 0) {
  389. APRINTK(buf->start != 0, "lanai_buf_deallocate: start==0!n");
  390. free_pages((unsigned long) buf->start, buf->order);
  391. buf->start = buf->end = buf->ptr = 0;
  392. }
  393. }
  394. /* size of buffer in bytes */
  395. static inline int lanai_buf_size(const struct lanai_buffer *buf)
  396. {
  397. return ((unsigned long) buf->end) - ((unsigned long) buf->start);
  398. }
  399. /* size of buffer as "card order" (0=1k .. 7=128k) */
  400. static inline int lanai_buf_size_cardorder(const struct lanai_buffer *buf)
  401. {
  402. return buf->order + PAGE_SHIFT - 10;
  403. }
  404. /* DMA-able address for this buffer */
  405. static unsigned long lanai_buf_dmaaddr(const struct lanai_buffer *buf)
  406. {
  407. unsigned long r = virt_to_bus(buf->start);
  408. APRINTK((r & ~0xFFFFFF00) == 0, "bad dmaaddr: 0x%lxn", (long) r);
  409. return r;
  410. }
  411. /* -------------------- HANDLE BACKLOG_VCCS BITFIELD: */
  412. static inline void vcc_mark_backlogged(struct lanai_dev *lanai,
  413. const struct lanai_vcc *lvcc)
  414. {
  415. APRINTK(lvcc->vbase != 0, "vcc_mark_backlogged: zero vbase!n");
  416. vci_bitfield_set(&lanai->backlog_vccs, lvcc->vci);
  417. }
  418. static inline void vcc_unmark_backlogged(struct lanai_dev *lanai,
  419. const struct lanai_vcc *lvcc)
  420. {
  421. APRINTK(lvcc->vbase != 0, "vcc_unmark_backlogged: zero vbase!n");
  422. vci_bitfield_clear(&lanai->backlog_vccs, lvcc->vci);
  423. }
  424. static inline void vcc_backlog_init(struct lanai_dev *lanai)
  425. {
  426. vci_bitfield_init(&lanai->backlog_vccs);
  427. }
  428. static inline int vcc_is_backlogged(/*const*/ struct lanai_vcc *lvcc)
  429. {
  430. return lvcc->tx.inprogress != NULL ||
  431.     !skb_queue_empty(&lvcc->tx.backlog);
  432. }
  433. /* -------------------- PORT I/O UTILITIES: */
  434. /* Registers (and their bit-fields) */
  435. enum lanai_register {
  436. Reset_Reg = 0x00, /* Reset; read for chip type; bits: */
  437. #define   RESET_GET_BOARD_REV(x)    (((x)>> 0)&0x03) /* Board revision */
  438. #define   RESET_GET_BOARD_ID(x)     (((x)>> 2)&0x03) /* Board ID */
  439. #define     BOARD_ID_LANAI256 (0) /* 25.6M adaptor card */
  440. Endian_Reg = 0x04, /* Endian setting */
  441. IntStatus_Reg = 0x08, /* Interrupt status */
  442. IntStatusMasked_Reg = 0x0C, /* Interrupt status (masked) */
  443. IntAck_Reg = 0x10, /* Interrupt acknowledge */
  444. IntAckMasked_Reg = 0x14, /* Interrupt acknowledge (masked) */
  445. IntStatusSet_Reg = 0x18, /* Get status + enable/disable */
  446. IntStatusSetMasked_Reg = 0x1C, /* Get status + en/di (masked) */
  447. IntControlEna_Reg = 0x20, /* Interrupt control enable */
  448. IntControlDis_Reg = 0x24, /* Interrupt control disable */
  449. Status_Reg = 0x28, /* Status */
  450. #define   STATUS_PROMDATA  (0x00000001) /* PROM_DATA pin */
  451. #define   STATUS_WAITING  (0x00000002) /* Interrupt being delayed */
  452. #define   STATUS_SOOL  (0x00000004) /* SOOL alarm */
  453. #define   STATUS_LOCD  (0x00000008) /* LOCD alarm */
  454. #define   STATUS_LED  (0x00000010) /* LED (HAPPI) output */
  455. #define   STATUS_GPIN  (0x00000020) /* GPIN pin */
  456. #define   STATUS_BUTTBUSY  (0x00000040) /* Butt register is pending */
  457. Config1_Reg = 0x2C, /* Config word 1; bits: */
  458. #define   CONFIG1_PROMDATA  (0x00000001) /* PROM_DATA pin */
  459. #define   CONFIG1_PROMCLK  (0x00000002) /* PROM_CLK pin */
  460. #define   CONFIG1_SET_READMODE(x) ((x)*0x004) /* PCI BM reads; values: */
  461. #define     READMODE_PLAIN     (0) /*   Plain memory read */
  462. #define     READMODE_LINE     (2) /*   Memory read line */
  463. #define     READMODE_MULTIPLE     (3) /*   Memory read multiple */
  464. #define   CONFIG1_DMA_ENABLE  (0x00000010) /* Turn on DMA */
  465. #define   CONFIG1_POWERDOWN  (0x00000020) /* Turn off clocks */
  466. #define   CONFIG1_SET_LOOPMODE(x) ((x)*0x080) /* Clock&loop mode; values: */
  467. #define     LOOPMODE_NORMAL     (0) /*   Normal - no loop */
  468. #define     LOOPMODE_TIME     (1)
  469. #define     LOOPMODE_DIAG     (2)
  470. #define     LOOPMODE_LINE     (3)
  471. #define   CONFIG1_MASK_LOOPMODE  (0x00000180)
  472. #define   CONFIG1_SET_LEDMODE(x) ((x)*0x0200) /* Mode of LED; values: */
  473. #define     LEDMODE_NOT_SOOL     (0) /*   !SOOL */
  474. #define     LEDMODE_OFF     (1) /*   0     */
  475. #define     LEDMODE_ON     (2) /*   1     */
  476. #define     LEDMODE_NOT_LOCD     (3) /*   !LOCD */
  477. #define     LEDMORE_GPIN     (4) /*   GPIN  */
  478. #define     LEDMODE_NOT_GPIN     (7) /*   !GPIN */
  479. #define   CONFIG1_MASK_LEDMODE  (0x00000E00)
  480. #define   CONFIG1_GPOUT1  (0x00001000) /* Toggle for reset */
  481. #define   CONFIG1_GPOUT2  (0x00002000) /* Loopback PHY */
  482. #define   CONFIG1_GPOUT3  (0x00004000) /* Loopback lanai */
  483. Config2_Reg = 0x30, /* Config word 2; bits: */
  484. #define   CONFIG2_HOWMANY  (0x00000001) /* >512 VCIs? */
  485. #define   CONFIG2_PTI7_MODE  (0x00000002) /* Make PTI=7 RM, not OAM */
  486. #define   CONFIG2_VPI_CHK_DIS  (0x00000004) /* Ignore RX VPI value */
  487. #define   CONFIG2_HEC_DROP  (0x00000008) /* Drop cells w/ HEC errors */
  488. #define   CONFIG2_VCI0_NORMAL  (0x00000010) /* Treat VCI=0 normally */
  489. #define   CONFIG2_CBR_ENABLE  (0x00000020) /* Deal with CBR traffic */
  490. #define   CONFIG2_TRASH_ALL  (0x00000040) /* Trashing incoming cells */
  491. #define   CONFIG2_TX_DISABLE  (0x00000080) /* Trashing outgoing cells */
  492. #define   CONFIG2_SET_TRASH  (0x00000100) /* Turn trashing on */
  493. Statistics_Reg = 0x34, /* Statistics; bits: */
  494. #define   STATS_GET_FIFO_OVFL(x)    (((x)>> 0)&0xFF) /* FIFO overflowed */
  495. #define   STATS_GET_HEC_ERR(x)      (((x)>> 8)&0xFF) /* HEC was bad */
  496. #define   STATS_GET_BAD_VCI(x)      (((x)>>16)&0xFF) /* VCI not open */
  497. #define   STATS_GET_BUF_OVFL(x)     (((x)>>24)&0xFF) /* VCC buffer full */
  498. ServiceStuff_Reg = 0x38, /* Service stuff; bits: */
  499. #define   SSTUFF_SET_SIZE(x) ((x)*0x20000000) /* size of service buffer */
  500. #define   SSTUFF_SET_ADDR(x)     ((x)>>8) /* set address of buffer */
  501. ServWrite_Reg = 0x3C, /* ServWrite Pointer */
  502. ServRead_Reg = 0x40, /* ServRead Pointer */
  503. TxDepth_Reg = 0x44, /* FIFO Transmit Depth */
  504. Butt_Reg = 0x48, /* Butt register */
  505. CBR_ICG_Reg = 0x50,
  506. CBR_PTR_Reg = 0x54,
  507. PingCount_Reg = 0x58, /* Ping count */
  508. DMA_Addr_Reg = 0x5C /* DMA address */
  509. };
  510. static inline bus_addr_t reg_addr(const struct lanai_dev *lanai,
  511. enum lanai_register reg)
  512. {
  513. return lanai->base + (bus_addr_t) reg;
  514. }
  515. static inline u32 reg_read(const struct lanai_dev *lanai,
  516. enum lanai_register reg)
  517. {
  518. u32 t;
  519. t = readl(reg_addr(lanai, reg));
  520. RWDEBUG("R [0x%08X] 0x%02X = 0x%08Xn", (unsigned int) lanai->base,
  521.     (int) reg, t);
  522. return t;
  523. }
  524. static inline void reg_write(const struct lanai_dev *lanai, u32 val,
  525. enum lanai_register reg)
  526. {
  527. RWDEBUG("W [0x%08X] 0x%02X < 0x%08Xn", (unsigned int) lanai->base,
  528.     (int) reg, val);
  529. writel(val, reg_addr(lanai, reg));
  530. mdelay(1);
  531. }
  532. static inline void conf1_write(const struct lanai_dev *lanai)
  533. {
  534. reg_write(lanai, lanai->conf1, Config1_Reg);
  535. }
  536. static inline void conf2_write(const struct lanai_dev *lanai)
  537. {
  538. reg_write(lanai, lanai->conf2, Config2_Reg);
  539. }
  540. static inline void reset_board(const struct lanai_dev *lanai)
  541. {
  542. DPRINTK("about to reset boardn");
  543. reg_write(lanai, 0, Reset_Reg);
  544. /*
  545.  * If we don't delay a little while here then we can end up
  546.  * leaving the card in a VERY weird state and lock up the
  547.  * PCI bus.  This isn't documented anywhere but I've convinced
  548.  * myself after a lot of painful experimentation
  549.  */
  550. udelay(5);
  551. }
  552. /* -------------------- VCC LIST LOCK: */
  553. /*
  554.  * The linux-atm code disables local IRQs while managing the list of
  555.  * VCCs on a card.  This is good, but it doesn't save us against
  556.  * SMP.  Unfortunately, fixing this will require changes in the
  557.  * API which will have to wait a little bit.  It's a hard race to
  558.  * trigger accidentally, so it isn't TOO horrible so far.
  559.  *
  560.  * One possible solution would be to have an rwlock which is
  561.  * always grabbed _irq-style on writing.  This would automatically
  562.  * be grabbed (for writing) by the higher layers on things that
  563.  * would result in a change in the vcc list (_open, _close,
  564.  * probably _change_qos) - thus it would also protect the
  565.  * higher-level list of vccs on each device (atm_dev->vccs).
  566.  * The driver would be responsible for grabbing it as a read_lock
  567.  * anytime it wants to consult its table of vccs - for instance
  568.  * when handling an incoming PDU.  This also explains why we would
  569.  * probably want the write_lock while in _change_qos - to prevent
  570.  * handling of PDUs while possibly in an inconsistant state.
  571.  * Also, _send would grab the lock for reading.
  572.  *
  573.  * One problem with this is that _open and _close could no longer
  574.  * do anything that might provoke a schedule.  First, it would
  575.  * force us to use GFP_ATOMIC memory (which is bad), but also
  576.  * some devices pretty much require scheduling due to long
  577.  * delays (see lanai_close for an example).  So in this case
  578.  * we need a way to schedule without losing the spinlock.
  579.  * The cleanest way to do this is probably have a way to mark a
  580.  * VCC as "in progress" so that the interrupt handler can
  581.  * still disregard any traffic for it while _open or _close
  582.  * are sleeping on it.  Then it will need to be _open and
  583.  * _close's job to relinquish the write_lock.  Thus, the
  584.  * lock could be dropped around the times that scheduling
  585.  * might occur.  Perhaps the _READY flag can be used for
  586.  * this purpose.
  587.  *
  588.  * One short note about this "upper layer grabs, driver
  589.  * relinquishes" write lock - since this needs to be
  590.  * an _irq lock we're going to have problem saving
  591.  * and restoring flags (_irqsave/_irqrestore).  This
  592.  * shouldn't be a problem, however - we must just
  593.  * require that those syscalls are never called with
  594.  * interrupts disabled so we can use the non-flags-saving
  595.  * versions.
  596.  *
  597.  * Anyway, all of the above is vaporware currently - fixing
  598.  * this right will require changes in the API and all of
  599.  * the drivers - this will wait until 2.5.x most likely.
  600.  * The following NOP macros are just here to mark where
  601.  * the locks will be needed in the future.
  602.  */
  603. #define vcclist_read_lock() do {} while (0)
  604. #define vcclist_read_unlock() do {} while (0)
  605. #define vcclist_write_lock() do {} while (0)
  606. #define vcclist_write_unlock() do {} while (0)
  607. /* -------------------- CARD SRAM UTILITIES: */
  608. /* The SRAM is mapped into normal PCI memory space - the only catch is
  609.  * that it is only 16-bits wide but must be accessed as 32-bit.  The
  610.  * 16 high bits will be zero.  We don't hide this, since they get
  611.  * programmed mostly like discrete registers anyway
  612.  */
  613. #define SRAM_START (0x20000)
  614. #define SRAM_BYTES (0x20000) /* Again, half don't really exist */
  615. static inline bus_addr_t sram_addr(const struct lanai_dev *lanai, int offset)
  616. {
  617. return lanai->base + SRAM_START + offset;
  618. }
  619. static inline u32 sram_read(const struct lanai_dev *lanai, int offset)
  620. {
  621. return readl(sram_addr(lanai, offset));
  622. }
  623. static inline void sram_write(const struct lanai_dev *lanai,
  624. u32 val, int offset)
  625. {
  626. writel(val, sram_addr(lanai, offset));
  627. }
  628. static int __init sram_test_word(
  629. const struct lanai_dev *lanai, int offset, u32 pattern)
  630. {
  631. u32 readback;
  632. sram_write(lanai, pattern, offset);
  633. readback = sram_read(lanai, offset);
  634. if (readback == pattern)
  635. return 0;
  636. printk(KERN_ERR DEV_LABEL
  637.     "(itf %d): SRAM word at %d bad: wrote 0x%X, read 0x%Xn",
  638.     lanai->number, offset, pattern, readback);
  639. return -EIO;
  640. }
  641. static int __init sram_test_pass(const struct lanai_dev *lanai, u32 pattern)
  642. {
  643. int offset, result = 0;
  644. for (offset = 0; offset < SRAM_BYTES && result == 0; offset += 4)
  645. result = sram_test_word(lanai, offset, pattern);
  646. return result;
  647. }
  648. static int __init sram_test_and_clear(const struct lanai_dev *lanai)
  649. {
  650. #ifdef FULL_MEMORY_TEST
  651. int result;
  652. DPRINTK("testing SRAMn");
  653. if ((result = sram_test_pass(lanai, 0x5555)) != 0)
  654. return result;
  655. if ((result = sram_test_pass(lanai, 0xAAAA)) != 0)
  656. return result;
  657. #endif
  658. DPRINTK("clearing SRAMn");
  659. return sram_test_pass(lanai, 0x0000);
  660. }
  661. /* -------------------- CARD-BASED VCC TABLE UTILITIES: */
  662. /* vcc table */
  663. enum lanai_vcc_offset {
  664. vcc_rxaddr1 = 0x00, /* Location1, plus bits: */
  665. #define   RXADDR1_SET_SIZE(x) ((x)*0x0000100) /* size of RX buffer */
  666. #define   RXADDR1_SET_RMMODE(x) ((x)*0x00800) /* RM cell action; values: */
  667. #define     RMMODE_TRASH   (0) /*   discard */
  668. #define     RMMODE_PRESERVE   (1) /*   input as AAL0 */
  669. #define     RMMODE_PIPE   (2) /*   pipe to coscheduler */
  670. #define     RMMODE_PIPEALL   (3) /*   pipe non-RM too */
  671. #define   RXADDR1_OAM_PRESERVE  (0x00002000) /* Input OAM cells as AAL0 */
  672. #define   RXADDR1_SET_MODE(x) ((x)*0x0004000) /* Reassembly mode */
  673. #define     RXMODE_TRASH   (0) /*   discard */
  674. #define     RXMODE_AAL0   (1) /*   non-AAL5 mode */
  675. #define     RXMODE_AAL5   (2) /*   AAL5, intr. each PDU */
  676. #define     RXMODE_AAL5_STREAM   (3) /*   AAL5 w/o per-PDU intr */
  677. vcc_rxaddr2 = 0x04, /* Location2 */
  678. vcc_rxcrc1 = 0x08, /* RX CRC claculation space */
  679. vcc_rxcrc2 = 0x0C,
  680. vcc_rxwriteptr = 0x10, /* RX writeptr, plus bits: */
  681. #define   RXWRITEPTR_LASTEFCI  (0x00002000) /* Last PDU had EFCI bit */
  682. #define   RXWRITEPTR_DROPPING  (0x00004000) /* Had error, dropping */
  683. #define   RXWRITEPTR_TRASHING  (0x00008000) /* Trashing */
  684. vcc_rxbufstart = 0x14, /* RX bufstart, plus bits: */
  685. #define   RXBUFSTART_CLP  (0x00004000)
  686. #define   RXBUFSTART_CI  (0x00008000)
  687. vcc_rxreadptr = 0x18, /* RX readptr */
  688. vcc_txicg = 0x1C, /* TX ICG */
  689. vcc_txaddr1 = 0x20, /* Location1, plus bits: */
  690. #define   TXADDR1_SET_SIZE(x) ((x)*0x0000100) /* size of TX buffer */
  691. #define   TXADDR1_ABR  (0x00008000) /* use ABR (doesn't work) */
  692. vcc_txaddr2 = 0x24, /* Location2 */
  693. vcc_txcrc1 = 0x28, /* TX CRC claculation space */
  694. vcc_txcrc2 = 0x2C,
  695. vcc_txreadptr = 0x30, /* TX Readptr, plus bits: */
  696. #define   TXREADPTR_GET_PTR(x) ((x)&0x01FFF)
  697. #define   TXREADPTR_MASK_DELTA (0x0000E000) /* ? */
  698. vcc_txendptr = 0x34, /* TX Endptr, plus bits: */
  699. #define   TXENDPTR_CLP (0x00002000)
  700. #define   TXENDPTR_MASK_PDUMODE (0x0000C000) /* PDU mode; values: */
  701. #define     PDUMODE_AAL0  (0*0x04000)
  702. #define     PDUMODE_AAL5  (2*0x04000)
  703. #define     PDUMODE_AAL5STREAM  (3*0x04000)
  704. vcc_txwriteptr = 0x38, /* TX Writeptr */
  705. #define   TXWRITEPTR_GET_PTR(x) ((x)&0x1FFF)
  706. vcc_txcbr_next = 0x3C /* # of next CBR VCI in ring */
  707. #define   TXCBR_NEXT_BOZO (0x00008000) /* "bozo bit" */
  708. };
  709. #define CARDVCC_SIZE (0x40)
  710. static inline bus_addr_t cardvcc_addr(const struct lanai_dev *lanai,
  711. vci_t vci)
  712. {
  713. return sram_addr(lanai, vci * CARDVCC_SIZE);
  714. }
  715. static inline u32 cardvcc_read(const struct lanai_vcc *lvcc,
  716. enum lanai_vcc_offset offset)
  717. {
  718. u32 val;
  719. APRINTK(lvcc->vbase != 0, "cardvcc_read: unbound vcc!n");
  720. val= readl(lvcc->vbase + (bus_addr_t) offset);
  721. RWDEBUG("VR vci=%04d 0x%02X = 0x%08Xn",
  722.     lvcc->vci, (int) offset, val);
  723. return val;
  724. }
  725. static inline void cardvcc_write(const struct lanai_vcc *lvcc,
  726. u32 val, enum lanai_vcc_offset offset)
  727. {
  728. APRINTK(lvcc->vbase != 0, "cardvcc_write: unbound vcc!n");
  729. APRINTK((val & ~0xFFFF) == 0,
  730.     "cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)n",
  731.     val, lvcc->vci, (int) offset);
  732. RWDEBUG("VW vci=%04d 0x%02X > 0x%08Xn",
  733.     lvcc->vci, (int) offset, val);
  734. writel(val, lvcc->vbase + (bus_addr_t) offset);
  735. }
  736. /* -------------------- COMPUTE SIZE OF AN AAL5 PDU: */
  737. /* How many bytes will an AAL5 PDU take to transmit - remember that:
  738.  *   o  we need to add 8 bytes for length, CPI, UU, and CRC
  739.  *   o  we need to round up to 48 bytes for cells
  740.  */
  741. static inline int aal5_size(int size)
  742. {
  743. int cells = (size + 8 + 47) / 48;
  744. return cells * 48;
  745. }
  746. /* How many bytes can we send if we have "space" space, assuming we have
  747.  * to send full cells
  748.  */
  749. static inline int aal5_spacefor(int space)
  750. {
  751. int cells = space / 48;
  752. return cells * 48;
  753. }
  754. /* -------------------- FREE AN ATM SKB: */
  755. static inline void lanai_free_skb(struct atm_vcc *atmvcc, struct sk_buff *skb)
  756. {
  757. if (atmvcc->pop != NULL)
  758. atmvcc->pop(atmvcc, skb);
  759. else
  760. dev_kfree_skb_any(skb);
  761. }
  762. /* -------------------- TURN VCCS ON AND OFF: */
  763. static void host_vcc_start_rx(const struct lanai_vcc *lvcc)
  764. {
  765. u32 addr1;
  766. if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5) {
  767. unsigned long dmaaddr = lanai_buf_dmaaddr(&lvcc->rx.buf);
  768. cardvcc_write(lvcc, 0xFFFF, vcc_rxcrc1);
  769. cardvcc_write(lvcc, 0xFFFF, vcc_rxcrc2);
  770. cardvcc_write(lvcc, 0, vcc_rxwriteptr);
  771. cardvcc_write(lvcc, 0, vcc_rxbufstart);
  772. cardvcc_write(lvcc, 0, vcc_rxreadptr);
  773. cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF, vcc_rxaddr2);
  774. addr1 = ((dmaaddr >> 8) & 0xFF) |
  775.     RXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->rx.buf))|
  776.     RXADDR1_SET_RMMODE(RMMODE_TRASH) | /* ??? */
  777.  /* RXADDR1_OAM_PRESERVE | --- no OAM support yet */
  778.     RXADDR1_SET_MODE(RXMODE_AAL5);
  779. } else
  780. addr1 = RXADDR1_SET_RMMODE(RMMODE_PRESERVE) | /* ??? */
  781.     RXADDR1_OAM_PRESERVE |       /* ??? */
  782.     RXADDR1_SET_MODE(RXMODE_AAL0);
  783. /* This one must be last! */
  784. cardvcc_write(lvcc, addr1, vcc_rxaddr1);
  785. }
  786. static void host_vcc_start_tx(const struct lanai_vcc *lvcc)
  787. {
  788. unsigned long dmaaddr = lanai_buf_dmaaddr(&lvcc->tx.buf);
  789. cardvcc_write(lvcc, 0, vcc_txicg);
  790. cardvcc_write(lvcc, 0xFFFF, vcc_txcrc1);
  791. cardvcc_write(lvcc, 0xFFFF, vcc_txcrc2);
  792. cardvcc_write(lvcc, 0, vcc_txreadptr);
  793. cardvcc_write(lvcc, 0, vcc_txendptr);
  794. cardvcc_write(lvcc, 0, vcc_txwriteptr);
  795. cardvcc_write(lvcc,
  796. (lvcc->tx.atmvcc->qos.txtp.traffic_class == ATM_CBR) ?
  797. TXCBR_NEXT_BOZO | lvcc->vci : 0, vcc_txcbr_next);
  798. cardvcc_write(lvcc, (dmaaddr >> 16) & 0xFFFF, vcc_txaddr2);
  799. cardvcc_write(lvcc,
  800.     ((dmaaddr >> 8) & 0xFF) |
  801.     TXADDR1_SET_SIZE(lanai_buf_size_cardorder(&lvcc->tx.buf)),
  802.     vcc_txaddr1);
  803. }
  804. /* Shutdown receiving on card */
  805. static void lanai_shutdown_rx_vci(const struct lanai_vcc *lvcc)
  806. {
  807. if (lvcc->vbase == 0) /* We were never bound to a VCI */
  808. return;
  809. /* 15.1.1 - set to trashing, wait one cell time (15us) */
  810. cardvcc_write(lvcc,
  811.     RXADDR1_SET_RMMODE(RMMODE_TRASH) |
  812.     RXADDR1_SET_MODE(RXMODE_TRASH), vcc_rxaddr1);
  813. udelay(15);
  814. /* 15.1.2 - clear rest of entries */
  815. cardvcc_write(lvcc, 0, vcc_rxaddr2);
  816. cardvcc_write(lvcc, 0, vcc_rxcrc1);
  817. cardvcc_write(lvcc, 0, vcc_rxcrc2);
  818. cardvcc_write(lvcc, 0, vcc_rxwriteptr);
  819. cardvcc_write(lvcc, 0, vcc_rxbufstart);
  820. cardvcc_write(lvcc, 0, vcc_rxreadptr);
  821. }
  822. /* Shutdown transmitting on card.
  823.  * Unfortunately the lanai needs us to wait until all the data
  824.  * drains out of the buffer before we can dealloc it, so this
  825.  * can take awhile -- up to 370ms for a full 128KB buffer
  826.  * assuming everone else is quiet.  In theory the time is
  827.  * boundless if there's a CBR VCC holding things up.
  828.  */
  829. static void lanai_shutdown_tx_vci(struct lanai_dev *lanai,
  830. struct lanai_vcc *lvcc)
  831. {
  832. struct sk_buff *skb;
  833. unsigned long flags, timeout;
  834. int read, write, lastread = -1;
  835. APRINTK(!in_interrupt(),
  836.     "lanai_shutdown_tx_vci called w/o process context!n");
  837. if (lvcc->vbase == 0) /* We were never bound to a VCI */
  838. return;
  839. /* 15.2.1 - wait for queue to drain */
  840. spin_lock_irqsave(&lanai->txlock, flags);
  841. if (lvcc->tx.inprogress != NULL) {
  842. lanai_free_skb(lvcc->tx.atmvcc, lvcc->tx.inprogress);
  843. lvcc->tx.inprogress = NULL;
  844. }
  845. while ((skb = skb_dequeue(&lvcc->tx.backlog)) != NULL)
  846. lanai_free_skb(lvcc->tx.atmvcc, skb);
  847. vcc_unmark_backlogged(lanai, lvcc);
  848. spin_unlock_irqrestore(&lanai->txlock, flags);
  849. timeout = jiffies + ((lanai_buf_size(&lvcc->tx.buf) * HZ) >> 17);
  850. write = TXWRITEPTR_GET_PTR(cardvcc_read(lvcc, vcc_txwriteptr));
  851. goto start;
  852. while (time_before_eq(jiffies, timeout)) {
  853. schedule_timeout(HZ / 25);
  854.     start:
  855. read = TXREADPTR_GET_PTR(cardvcc_read(lvcc, vcc_txreadptr));
  856. if (read == write &&    /* Is TX buffer empty? */
  857.     (lvcc->tx.atmvcc->qos.txtp.traffic_class != ATM_CBR ||
  858.     (cardvcc_read(lvcc, vcc_txcbr_next) &
  859.     TXCBR_NEXT_BOZO) == 0))
  860. goto done;
  861. if (read != lastread) {    /* Has there been any progress? */
  862. lastread = read;
  863. timeout += HZ / 10;
  864. }
  865. }
  866. printk(KERN_ERR DEV_LABEL "(itf %d): Timed out on backlog closing "
  867.     "vci %dn", lvcc->tx.atmvcc->dev->number, lvcc->vci);
  868. DPRINTK("read, write = %d, %dn", read, write);
  869.     done:
  870. /* 15.2.2 - clear out all tx registers */
  871. cardvcc_write(lvcc, 0, vcc_txreadptr);
  872. cardvcc_write(lvcc, 0, vcc_txwriteptr);
  873. cardvcc_write(lvcc, 0, vcc_txendptr);
  874. cardvcc_write(lvcc, 0, vcc_txcrc1);
  875. cardvcc_write(lvcc, 0, vcc_txcrc2);
  876. cardvcc_write(lvcc, 0, vcc_txaddr2);
  877. cardvcc_write(lvcc, 0, vcc_txaddr1);
  878. }
  879. /* -------------------- MANAGING AAL0 RX BUFFER: */
  880. static inline int aal0_buffer_allocate(struct lanai_dev *lanai)
  881. {
  882. DPRINTK("aal0_buffer_allocate: allocating AAL0 RX buffern");
  883. lanai_buf_allocate(&lanai->aal0buf, AAL0_RX_BUFFER_SIZE, 80);
  884. return (lanai->aal0buf.order < 0) ? -ENOMEM : 0;
  885. }
  886. static inline void aal0_buffer_free(struct lanai_dev *lanai)
  887. {
  888. DPRINTK("aal0_buffer_allocate: freeing AAL0 RX buffern");
  889. lanai_buf_deallocate(&lanai->aal0buf);
  890. }
  891. /* -------------------- EEPROM UTILITIES: */
  892. /* Offsets of data in the EEPROM */
  893. #define EEPROM_COPYRIGHT (0)
  894. #define EEPROM_COPYRIGHT_LEN (44)
  895. #define EEPROM_CHECKSUM (62)
  896. #define EEPROM_CHECKSUM_REV (63)
  897. #define EEPROM_MAC (64)
  898. #define EEPROM_MAC_REV (70)
  899. #define EEPROM_SERIAL (112)
  900. #define EEPROM_SERIAL_REV (116)
  901. #define EEPROM_MAGIC (120)
  902. #define EEPROM_MAGIC_REV (124)
  903. #define EEPROM_MAGIC_VALUE (0x5AB478D2)
  904. #ifndef READ_EEPROM
  905. /* Stub functions to use if EEPROM reading is disabled */
  906. static int __init eeprom_read(struct lanai_dev *lanai)
  907. {
  908. printk(KERN_INFO DEV_LABEL "(itf %d): *NOT* reading EEPROMn",
  909.     lanai->number);
  910. memset(&lanai->eeprom[EEPROM_MAC], 0, 6);
  911. return 0;
  912. }
  913. static int __init eeprom_validate(struct lanai_dev *lanai)
  914. {
  915. lanai->serialno = 0;
  916. lanai->magicno = EEPROM_MAGIC_VALUE;
  917. return 0;
  918. }
  919. #else /* READ_EEPROM */
  920. static int __init eeprom_read(struct lanai_dev *lanai)
  921. {
  922. int i, address;
  923. u8 data;
  924. u32 tmp;
  925. #define set_config1(x)   do { lanai->conf1 = x; conf1_write(lanai); 
  926.     } while (0)
  927. #define clock_h()  set_config1(lanai->conf1 | CONFIG1_PROMCLK)
  928. #define clock_l()  set_config1(lanai->conf1 &~ CONFIG1_PROMCLK)
  929. #define data_h()  set_config1(lanai->conf1 | CONFIG1_PROMDATA)
  930. #define data_l()  set_config1(lanai->conf1 &~ CONFIG1_PROMDATA)
  931. #define pre_read()  do { data_h(); clock_h(); udelay(5); } while (0)
  932. #define read_pin()  (reg_read(lanai, Status_Reg) & STATUS_PROMDATA)
  933. #define send_stop()  do { data_l(); udelay(5); clock_h(); udelay(5); 
  934.       data_h(); udelay(5); } while (0)
  935. /* start with both clock and data high */
  936. data_h(); clock_h(); udelay(5);
  937. for (address = 0; address < LANAI_EEPROM_SIZE; address++) {
  938. data = (address << 1) | 1; /* Command=read + address */
  939. /* send start bit */
  940. data_l(); udelay(5);
  941. clock_l(); udelay(5);
  942. for (i = 128; i != 0; i >>= 1) {   /* write command out */
  943. tmp = (lanai->conf1 & ~CONFIG1_PROMDATA) |
  944.     (data & i) ? CONFIG1_PROMDATA : 0;
  945. if (lanai->conf1 != tmp) {
  946. set_config1(tmp);
  947. udelay(5); /* Let new data settle */
  948. }
  949. clock_h(); udelay(5); clock_l(); udelay(5);
  950. }
  951. /* look for ack */
  952. data_h(); clock_h(); udelay(5);
  953. if (read_pin() != 0)
  954. goto error; /* No ack seen */
  955. clock_l(); udelay(5);
  956. /* read back result */
  957. for (data = 0, i = 7; i >= 0; i--) {
  958. data_h(); clock_h(); udelay(5);
  959. data = (data << 1) | !!read_pin();
  960. clock_l(); udelay(5);
  961. }
  962. /* look again for ack */
  963. data_h(); clock_h(); udelay(5);
  964. if (read_pin() == 0)
  965. goto error; /* Spurious ack */
  966. clock_l(); udelay(5);
  967. send_stop();
  968. lanai->eeprom[address] = data;
  969. DPRINTK("EEPROM 0x%04X %02Xn", address, data);
  970. }
  971. return 0;
  972.     error:
  973. clock_l(); udelay(5); /* finish read */
  974. send_stop();
  975. printk(KERN_ERR DEV_LABEL "(itf %d): error reading EEPROM byte %dn",
  976.     lanai->number, address);
  977. return -EIO;
  978. #undef set_config1
  979. #undef clock_h
  980. #undef clock_l
  981. #undef data_h
  982. #undef data_l
  983. #undef pre_read
  984. #undef read_pin
  985. #undef send_stop
  986. }
  987. /* read a big-endian 4-byte value out of eeprom */
  988. static inline u32 eeprom_be4(const struct lanai_dev *lanai, int address)
  989. {
  990. return be32_to_cpup((u32 *) (&lanai->eeprom[address]));
  991. }
  992. /* Checksum/validate EEPROM contents */
  993. static int __init eeprom_validate(struct lanai_dev *lanai)
  994. {
  995. int i, s;
  996. u32 v;
  997. const u8 *e = lanai->eeprom;
  998. #ifdef DEBUG
  999. /* First, see if we can get an ASCIIZ string out of the copyright */
  1000. for (i = EEPROM_COPYRIGHT;
  1001.     i < (EEPROM_COPYRIGHT + EEPROM_COPYRIGHT_LEN); i++)
  1002. if (e[i] < 0x20 || e[i] > 0x7E)
  1003. break;
  1004. if ( i != EEPROM_COPYRIGHT &&
  1005.     i != EEPROM_COPYRIGHT + EEPROM_COPYRIGHT_LEN && e[i] == '')
  1006. DPRINTK("eeprom: copyright = "%s"n",
  1007.     (char *) &e[EEPROM_COPYRIGHT]);
  1008. else
  1009. DPRINTK("eeprom: copyright not foundn");
  1010. #endif
  1011. /* Validate checksum */
  1012. for (i = s = 0; i < EEPROM_CHECKSUM; i++)
  1013. s += e[i];
  1014. s &= 0xFF;
  1015. if (s != e[EEPROM_CHECKSUM]) {
  1016. printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM checksum bad "
  1017.     "(wanted 0x%02X, got 0x%02X)n", lanai->number,
  1018.     s, e[EEPROM_CHECKSUM]);
  1019. return -EIO;
  1020. }
  1021. s ^= 0xFF;
  1022. if (s != e[EEPROM_CHECKSUM_REV]) {
  1023. printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM inverse checksum "
  1024.     "bad (wanted 0x%02X, got 0x%02X)n", lanai->number,
  1025.     s, e[EEPROM_CHECKSUM_REV]);
  1026. return -EIO;
  1027. }
  1028. /* Verify MAC address */
  1029. for (i = 0; i < 6; i++)
  1030. if ((e[EEPROM_MAC + i] ^ e[EEPROM_MAC_REV + i]) != 0xFF) {
  1031. printk(KERN_ERR DEV_LABEL
  1032.     "(itf %d) : EEPROM MAC addresses don't match "
  1033.     "(0x%02X, inverse 0x%02X)n", lanai->number,
  1034.     e[EEPROM_MAC + i], e[EEPROM_MAC_REV + i]);
  1035. return -EIO;
  1036. }
  1037. DPRINTK("eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02Xn",
  1038. e[EEPROM_MAC + 0], e[EEPROM_MAC + 1], e[EEPROM_MAC + 2],
  1039. e[EEPROM_MAC + 3], e[EEPROM_MAC + 4], e[EEPROM_MAC + 5]);
  1040. /* Verify serial number */
  1041. lanai->serialno = eeprom_be4(lanai, EEPROM_SERIAL);
  1042. v = eeprom_be4(lanai, EEPROM_SERIAL_REV);
  1043. if ((lanai->serialno ^ v) != 0xFFFFFFFF) {
  1044. printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM serial numbers "
  1045.     "don't match (0x%08X, inverse 0x%08X)n", lanai->number,
  1046.     lanai->serialno, v);
  1047. return -EIO;
  1048. }
  1049. DPRINTK("eeprom: Serial number = %dn", lanai->serialno);
  1050. /* Verify magic number */
  1051. lanai->magicno = eeprom_be4(lanai, EEPROM_MAGIC);
  1052. v = eeprom_be4(lanai, EEPROM_MAGIC_REV);
  1053. if ((lanai->magicno ^ v) != 0xFFFFFFFF) {
  1054. printk(KERN_ERR DEV_LABEL "(itf %d): EEPROM magic numbers "
  1055.     "don't match (0x%08X, inverse 0x%08X)n", lanai->number,
  1056.     lanai->magicno, v);
  1057. return -EIO;
  1058. }
  1059. DPRINTK("eeprom: Magic number = 0x%08Xn", lanai->magicno);
  1060. if (lanai->magicno != EEPROM_MAGIC_VALUE)
  1061. printk(KERN_WARNING DEV_LABEL "(itf %d): warning - EEPROM "
  1062.     "magic not what expected (got 0x%08X, not 0x%08X)n",
  1063.     lanai->number, lanai->magicno, EEPROM_MAGIC_VALUE);
  1064. return 0;
  1065. }
  1066. #endif /* READ_EEPROM */
  1067. static inline const u8 *eeprom_mac(const struct lanai_dev *lanai)
  1068. {
  1069. return &lanai->eeprom[EEPROM_MAC];
  1070. }
  1071. /* -------------------- INTERRUPT HANDLING UTILITIES: */
  1072. /* Interrupt types */
  1073. #define INT_STATS (0x00000002) /* Statistics counter overflow */
  1074. #define INT_SOOL (0x00000004) /* SOOL changed state */
  1075. #define INT_LOCD (0x00000008) /* LOCD changed state */
  1076. #define INT_LED (0x00000010) /* LED (HAPPI) changed state */
  1077. #define INT_GPIN (0x00000020) /* GPIN changed state */
  1078. #define INT_PING (0x00000040) /* PING_COUNT fulfilled */
  1079. #define INT_WAKE (0x00000080) /* Lanai wants bus */
  1080. #define INT_CBR0 (0x00000100) /* CBR sched hit VCI 0 */
  1081. #define INT_LOCK (0x00000200) /* Service list overflow */
  1082. #define INT_MISMATCH (0x00000400) /* TX magic list mismatch */
  1083. #define INT_AAL0_STR (0x00000800) /* Non-AAL5 buffer half filled */
  1084. #define INT_AAL0 (0x00001000) /* Non-AAL5 data available */
  1085. #define INT_SERVICE (0x00002000) /* Service list entries available */
  1086. #define INT_TABORTSENT (0x00004000) /* Target abort sent by lanai */
  1087. #define INT_TABORTBM (0x00008000) /* Abort rcv'd as bus master */
  1088. #define INT_TIMEOUTBM (0x00010000) /* No response to bus master */
  1089. #define INT_PCIPARITY (0x00020000) /* Parity error on PCI */
  1090. /* Sets of the above */
  1091. #define INT_ALL (0x0003FFFE) /* All interrupts */
  1092. #define INT_STATUS (0x0000003C) /* Some status pin changed */
  1093. #define INT_DMASHUT (0x00038000) /* DMA engine got shut down */
  1094. #define INT_SEGSHUT (0x00000700) /* Segmentation got shut down */
  1095. static inline u32 intr_pending(const struct lanai_dev *lanai)
  1096. {
  1097. return reg_read(lanai, IntStatusMasked_Reg);
  1098. }
  1099. static inline void intr_enable(const struct lanai_dev *lanai, u32 i)
  1100. {
  1101. reg_write(lanai, i, IntControlEna_Reg);
  1102. }
  1103. static inline void intr_disable(const struct lanai_dev *lanai, u32 i)
  1104. {
  1105. reg_write(lanai, i, IntControlDis_Reg);
  1106. }
  1107. /* -------------------- CARD/PCI STATUS: */
  1108. static void status_message(int itf, const char *name, int status)
  1109. {
  1110. static const char *onoff[2] = { "off to on", "on to off" };
  1111. printk(KERN_INFO DEV_LABEL "(itf %d): %s changed from %sn",
  1112.     itf, name, onoff[!status]);
  1113. }
  1114. static void lanai_check_status(struct lanai_dev *lanai)
  1115. {
  1116. u32 new = reg_read(lanai, Status_Reg);
  1117. u32 changes = new ^ lanai->status;
  1118. lanai->status = new;
  1119. #define e(flag, name) 
  1120. if (changes & flag) 
  1121. status_message(lanai->number, name, new & flag)
  1122. e(STATUS_SOOL, "SOOL");
  1123. e(STATUS_LOCD, "LOCD");
  1124. e(STATUS_LED, "LED");
  1125. e(STATUS_GPIN, "GPIN");
  1126. #undef e
  1127. }
  1128. static void pcistatus_got(int itf, const char *name)
  1129. {
  1130. printk(KERN_INFO DEV_LABEL "(itf %d): PCI got %s errorn", itf, name);
  1131. }
  1132. static void pcistatus_check(struct lanai_dev *lanai, int clearonly)
  1133. {
  1134. u16 s;
  1135. int result;
  1136. result = pci_read_config_word(lanai->pci, PCI_STATUS, &s);
  1137. if (result != PCIBIOS_SUCCESSFUL) {
  1138. printk(KERN_ERR DEV_LABEL "(itf %d): can't read PCI_STATUS: "
  1139.     "%dn", lanai->number, result);
  1140. return;
  1141. }
  1142. s &= PCI_STATUS_DETECTED_PARITY | PCI_STATUS_SIG_SYSTEM_ERROR |
  1143.     PCI_STATUS_REC_MASTER_ABORT | PCI_STATUS_REC_TARGET_ABORT |
  1144.     PCI_STATUS_SIG_TARGET_ABORT | PCI_STATUS_PARITY;
  1145. if (s == 0)
  1146. return;
  1147. result = pci_write_config_word(lanai->pci, PCI_STATUS, s);
  1148. if (result != PCIBIOS_SUCCESSFUL)
  1149. printk(KERN_ERR DEV_LABEL "(itf %d): can't write PCI_STATUS: "
  1150.     "%dn", lanai->number, result);
  1151. if (clearonly)
  1152. return;
  1153. #define e(flag, name, stat) 
  1154. if (s & flag) { 
  1155. pcistatus_got(lanai->number, name); 
  1156. ++lanai->stats.pcierr_##stat; 
  1157. }
  1158. e(PCI_STATUS_DETECTED_PARITY, "parity", parity_detect);
  1159. e(PCI_STATUS_SIG_SYSTEM_ERROR, "signalled system", serr_set);
  1160. e(PCI_STATUS_REC_MASTER_ABORT, "master", master_abort);
  1161. e(PCI_STATUS_REC_TARGET_ABORT, "master target", m_target_abort);
  1162. e(PCI_STATUS_SIG_TARGET_ABORT, "slave", s_target_abort);
  1163. e(PCI_STATUS_PARITY, "master parity", master_parity);
  1164. #undef e
  1165. }
  1166. /* -------------------- VCC TX BUFFER UTILITIES: */
  1167. /* space left in tx buffer in bytes */
  1168. static inline int vcc_tx_space(const struct lanai_vcc *lvcc, int endptr)
  1169. {
  1170. int r;
  1171. r = endptr * 16;
  1172. r -= ((unsigned long) lvcc->tx.buf.ptr) -
  1173.     ((unsigned long) lvcc->tx.buf.start);
  1174. r -= 16; /* Leave "bubble" - if start==end it looks empty */
  1175. if (r < 0)
  1176. r += lanai_buf_size(&lvcc->tx.buf);
  1177. return r;
  1178. }
  1179. /* Bit fields in the segmentation buffer descriptor */
  1180. #define DESCRIPTOR_MAGIC (0xD0000000)
  1181. #define DESCRIPTOR_AAL5 (0x00008000)
  1182. #define DESCRIPTOR_AAL5_STREAM (0x00004000)
  1183. #define DESCRIPTOR_CLP (0x00002000)
  1184. /* Add 32-bit descriptor with it's padding */
  1185. static inline void vcc_tx_add_aal5_descriptor(struct lanai_vcc *lvcc,
  1186. u32 flags, int len)
  1187. {
  1188. int pos;
  1189. APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 0,
  1190.     "vcc_tx_add_aal5_descriptor: bad ptr=%pn", lvcc->tx.buf.ptr);
  1191. lvcc->tx.buf.ptr += 4; /* Hope the values REALLY don't matter */
  1192. pos = ((unsigned char *) lvcc->tx.buf.ptr) -
  1193.     (unsigned char *) lvcc->tx.buf.start;
  1194. APRINTK((pos & ~0x0001FFF0) == 0,
  1195.     "vcc_tx_add_aal5_descriptor: bad pos (%d) before, vci=%d, "
  1196.     "start,ptr,end=%p,%p,%pn", pos, lvcc->vci,
  1197.     lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end);
  1198. pos = (pos + len) & (lanai_buf_size(&lvcc->tx.buf) - 1);
  1199. APRINTK((pos & ~0x0001FFF0) == 0,
  1200.     "vcc_tx_add_aal5_descriptor: bad pos (%d) after, vci=%d, "
  1201.     "start,ptr,end=%p,%p,%pn", pos, lvcc->vci,
  1202.     lvcc->tx.buf.start, lvcc->tx.buf.ptr, lvcc->tx.buf.end);
  1203. lvcc->tx.buf.ptr[-1] =
  1204.     cpu_to_le32(DESCRIPTOR_MAGIC | DESCRIPTOR_AAL5 |
  1205.     ((lvcc->tx.atmvcc->atm_options & ATM_ATMOPT_CLP) ?
  1206.     DESCRIPTOR_CLP : 0) | flags | pos >> 4);
  1207. if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end)
  1208. lvcc->tx.buf.ptr = lvcc->tx.buf.start;
  1209. }
  1210. /* Add 32-bit AAL5 trailer and leave room for its CRC */
  1211. static inline void vcc_tx_add_aal5trailer(struct lanai_vcc *lvcc,
  1212. int len, int cpi, int uu)
  1213. {
  1214. APRINTK((((unsigned long) lvcc->tx.buf.ptr) & 15) == 8,
  1215.     "vcc_tx_add_aal5_descriptor: bad ptr=%pn", lvcc->tx.buf.ptr);
  1216. lvcc->tx.buf.ptr += 2;
  1217. lvcc->tx.buf.ptr[-2] = cpu_to_be32((uu << 24) | (cpi << 16) | len);
  1218. if (lvcc->tx.buf.ptr >= lvcc->tx.buf.end)
  1219. lvcc->tx.buf.ptr = lvcc->tx.buf.start;
  1220. }
  1221. static inline void vcc_tx_memcpy(struct lanai_vcc *lvcc,
  1222. const unsigned char *src, int n)
  1223. {
  1224. unsigned char *e;
  1225. int m;
  1226. e = ((unsigned char *) lvcc->tx.buf.ptr) + n;
  1227. m = e - (unsigned char *) lvcc->tx.buf.end;
  1228. if (m < 0)
  1229. m = 0;
  1230. memcpy(lvcc->tx.buf.ptr, src, n - m);
  1231. if (m != 0) {
  1232. memcpy(lvcc->tx.buf.start, src + n - m, m);
  1233. e = ((unsigned char *) lvcc->tx.buf.start) + m;
  1234. }
  1235. lvcc->tx.buf.ptr = (u32 *) e;
  1236. }
  1237. static inline void vcc_tx_memzero(struct lanai_vcc *lvcc, int n)
  1238. {
  1239. unsigned char *e;
  1240. int m;
  1241. if (n == 0)
  1242. return;
  1243. e = ((unsigned char *) lvcc->tx.buf.ptr) + n;
  1244. m = e - (unsigned char *) lvcc->tx.buf.end;
  1245. if (m < 0)
  1246. m = 0;
  1247. memset(lvcc->tx.buf.ptr, 0, n - m);
  1248. if (m != 0) {
  1249. memset(lvcc->tx.buf.start, 0, m);
  1250. e = ((unsigned char *) lvcc->tx.buf.start) + m;
  1251. }
  1252. lvcc->tx.buf.ptr = (u32 *) e;
  1253. }
  1254. /* Update "butt" register to specify new WritePtr */
  1255. static inline void lanai_endtx(const struct lanai_dev *lanai,
  1256. const struct lanai_vcc *lvcc)
  1257. {
  1258. int i, ptr = ((unsigned char *) lvcc->tx.buf.ptr) -
  1259.     (unsigned char *) lvcc->tx.buf.start;
  1260. APRINTK((ptr & ~0x0001FFF0) == 0,
  1261.     "lanai_endtx: bad ptr (%d), vci=%d, start,ptr,end=%p,%p,%pn",
  1262.     ptr, lvcc->vci, lvcc->tx.buf.start, lvcc->tx.buf.ptr,
  1263.     lvcc->tx.buf.end);
  1264. /*
  1265.  * We need to check if the "butt busy" bit is set before
  1266.  * updating the butt register.  In theory this should
  1267.  * never happen because the ATM card is plenty fast at
  1268.  * updating the register.  Still, we should make sure
  1269.  */
  1270. for (i = 0; reg_read(lanai, Status_Reg) & STATUS_BUTTBUSY; i++) {
  1271. if (i > 50) {
  1272. printk(KERN_ERR DEV_LABEL "(itf %d): butt register "
  1273.     "always busy!n", lanai->number);
  1274. break;
  1275. }
  1276. udelay(5);
  1277. }
  1278. reg_write(lanai, (ptr << 12) | lvcc->vci, Butt_Reg);
  1279. }
  1280. /* Try to fill the buffer - don't call unless there is backlog */
  1281. static void vcc_tx_unqueue_aal5(struct lanai_dev *lanai,
  1282. struct lanai_vcc *lvcc, int endptr)
  1283. {
  1284. int pad, n;
  1285. struct sk_buff *skb;
  1286. int space = vcc_tx_space(lvcc, endptr);
  1287. APRINTK(vcc_is_backlogged(lvcc),
  1288.     "vcc_tx_unqueue() called with empty backlog (vci=%d)n",
  1289.     lvcc->vci);
  1290. if (space < 64)
  1291. return; /* No space for even 1 cell+descriptor */
  1292. if (lvcc->tx.inprogress != NULL) {
  1293. APRINTK((lvcc->tx.inprogleft % 48) == 0,
  1294.     "vcc_tx_unqueue_aal5: bad progleft=%dn",
  1295.     lvcc->tx.inprogleft);
  1296. if (lvcc->tx.inprogleft + 16 > space) { /* Can't send all? */
  1297. n = aal5_spacefor(space - 16); /* Bytes to send */
  1298. vcc_tx_add_aal5_descriptor(lvcc,
  1299.     DESCRIPTOR_AAL5_STREAM, n);
  1300. pad = lvcc->tx.pptr + n - lvcc->tx.inprogress->tail;
  1301. if (pad < 0)
  1302. pad = 0;
  1303. vcc_tx_memcpy(lvcc, lvcc->tx.pptr, n - pad);
  1304. vcc_tx_memzero(lvcc, pad);
  1305. lvcc->tx.pptr += n;
  1306. lvcc->tx.inprogleft -= n;
  1307. goto end; /* Buffer is now full */
  1308. }
  1309. /* OK, there's at least space for all of "inprogress" skb */
  1310. vcc_tx_add_aal5_descriptor(lvcc, 0,
  1311.     lvcc->tx.inprogleft);
  1312. pad = lvcc->tx.pptr + lvcc->tx.inprogleft -
  1313.     lvcc->tx.inprogress->tail;
  1314. if (pad >= lvcc->tx.inprogleft) { /* Nothing but pad left */
  1315. APRINTK(lvcc->tx.inprogleft == 48,
  1316.     "vcc_tx_unqueue_aal5: bad pure-pad=%dn",
  1317.     lvcc->tx.inprogleft);
  1318. pad = 48;
  1319. } else
  1320. vcc_tx_memcpy(lvcc, lvcc->tx.pptr,
  1321.     lvcc->tx.inprogleft - pad);
  1322. vcc_tx_memzero(lvcc, pad - 8);
  1323. vcc_tx_add_aal5trailer(lvcc, lvcc->tx.inprogress->len, 0, 0);
  1324. lanai_free_skb(lvcc->tx.atmvcc, lvcc->tx.inprogress);
  1325. lvcc->tx.inprogress = NULL;
  1326. space -= lvcc->tx.inprogleft + 16;
  1327. atomic_inc(&lvcc->tx.atmvcc->stats->tx);
  1328. }
  1329. while (space >= 64) {
  1330. if ((skb = skb_dequeue(&lvcc->tx.backlog)) == NULL)
  1331. break;
  1332. n = aal5_size(skb->len);
  1333. if (n + 16 > space) { /* Can only send part */
  1334. int m = aal5_spacefor(space - 16); /* Bytes to send */
  1335. vcc_tx_add_aal5_descriptor(lvcc,
  1336.     DESCRIPTOR_AAL5_STREAM, m);
  1337. lvcc->tx.pptr = skb->data + m;
  1338. pad = lvcc->tx.pptr - skb->tail;
  1339. if (pad < 0)
  1340. pad = 0;
  1341. vcc_tx_memcpy(lvcc, skb->data, m - pad);
  1342. vcc_tx_memzero(lvcc, pad);
  1343. lvcc->tx.inprogleft = n - m;
  1344. lvcc->tx.inprogress = skb;
  1345. goto end;
  1346. }
  1347. vcc_tx_add_aal5_descriptor(lvcc, 0, n);
  1348. pad = n - skb->len - 8;
  1349. vcc_tx_memcpy(lvcc, skb->data, skb->len);
  1350. vcc_tx_memzero(lvcc, pad);
  1351. lanai_free_skb(lvcc->tx.atmvcc, skb);
  1352. vcc_tx_add_aal5trailer(lvcc, skb->len, 0, 0);
  1353. space -= n + 16;
  1354. atomic_inc(&lvcc->tx.atmvcc->stats->tx);
  1355. }
  1356. if (skb_queue_empty(&lvcc->tx.backlog))
  1357. vcc_unmark_backlogged(lanai, lvcc);
  1358.     end:
  1359. lanai_endtx(lanai, lvcc);
  1360. }
  1361. /* Given an skb that we want to transmit either send it now or queue */
  1362. static void vcc_tx_aal5(struct lanai_dev *lanai, struct lanai_vcc *lvcc,
  1363. struct sk_buff *skb)
  1364. {
  1365. int space, n, pad;
  1366. if (vcc_is_backlogged(lvcc)) /* Already backlogged */
  1367. goto queue_it;
  1368. space = vcc_tx_space(lvcc, TXREADPTR_GET_PTR(cardvcc_read(lvcc,
  1369.     vcc_txreadptr)));
  1370. if (space < 64) {
  1371. vcc_mark_backlogged(lanai, lvcc); /* No space */
  1372. goto queue_it;
  1373. }
  1374. if (space >= 16 + (n = aal5_size(skb->len))) {
  1375. /* We can send the whole thing now */
  1376. vcc_tx_add_aal5_descriptor(lvcc, 0, n);
  1377. pad = n - skb->len;
  1378. vcc_tx_memcpy(lvcc, skb->data, skb->len);
  1379. vcc_tx_memzero(lvcc, pad - 8);
  1380. vcc_tx_add_aal5trailer(lvcc, skb->len, 0, 0);
  1381. lanai_free_skb(lvcc->tx.atmvcc, skb);
  1382. atomic_inc(&lvcc->tx.atmvcc->stats->tx);
  1383. } else { /* Space for only part of skb */
  1384. int bytes = aal5_spacefor(space - 16); /* Bytes to send */
  1385. vcc_tx_add_aal5_descriptor(lvcc,
  1386. DESCRIPTOR_AAL5_STREAM, bytes);
  1387. pad = bytes - skb->len;
  1388. if (pad < 0)
  1389. pad = 0;
  1390. vcc_tx_memcpy(lvcc, skb->data, bytes - pad);
  1391. vcc_tx_memzero(lvcc, pad);
  1392. lvcc->tx.inprogress = skb;
  1393. lvcc->tx.inprogleft = n - bytes;
  1394. lvcc->tx.pptr = skb->data + bytes;
  1395. vcc_mark_backlogged(lanai, lvcc);
  1396. }
  1397. lanai_endtx(lanai, lvcc);
  1398. return;
  1399.     queue_it:
  1400. skb_queue_tail(&lvcc->tx.backlog, skb);
  1401. }
  1402. static void vcc_tx_unqueue_aal0(struct lanai_dev *lanai,
  1403. struct lanai_vcc *lvcc, int endptr)
  1404. {
  1405. printk(KERN_INFO DEV_LABEL
  1406.     ": vcc_tx_unqueue_aal0: not implementedn");
  1407. }
  1408. static void vcc_tx_aal0(struct lanai_dev *lanai, struct lanai_vcc *lvcc,
  1409. struct sk_buff *skb)
  1410. {
  1411. printk(KERN_INFO DEV_LABEL ": vcc_tx_aal0: not implementedn");
  1412. /* Remember to increment lvcc->tx.atmvcc->stats->tx */
  1413. lanai_free_skb(lvcc->tx.atmvcc, skb);
  1414. }
  1415. /* Try to undequeue 1 backlogged vcc */
  1416. static void iter_dequeue(struct lanai_dev *lanai, vci_t vci)
  1417. {
  1418. struct lanai_vcc *lvcc = lanai->vccs[vci];
  1419. int endptr;
  1420. if (lvcc == NULL || !vcc_is_backlogged(lvcc)) {
  1421. vci_bitfield_clear(&lanai->backlog_vccs, vci);
  1422. return;
  1423. }
  1424. endptr = TXREADPTR_GET_PTR(cardvcc_read(lvcc, vcc_txreadptr));
  1425. lvcc->tx.unqueue(lanai, lvcc, endptr);
  1426. }
  1427. /* Try a dequeue on all backlogged connections */
  1428. static inline void vcc_tx_dequeue_all(struct lanai_dev *lanai)
  1429. {
  1430. unsigned long flags;
  1431. spin_lock_irqsave(&lanai->txlock, flags);
  1432. vci_bitfield_iterate(lanai, &lanai->backlog_vccs, iter_dequeue);
  1433. spin_unlock_irqrestore(&lanai->txlock, flags);
  1434. }
  1435. /* -------------------- VCC RX BUFFER UTILITIES: */
  1436. /* unlike the _tx_ cousins, this doesn't update ptr */
  1437. static inline void vcc_rx_memcpy(unsigned char *dest,
  1438. const struct lanai_vcc *lvcc, int n)
  1439. {
  1440. int m = ((const unsigned char *) lvcc->rx.buf.ptr) + n -
  1441.     ((const unsigned char *) (lvcc->rx.buf.end));
  1442. if (m < 0)
  1443. m = 0;
  1444. memcpy(dest, lvcc->rx.buf.ptr, n - m);
  1445. memcpy(dest + n - m, lvcc->rx.buf.start, m);
  1446. }
  1447. /* Receive AAL5 data on a VCC with a particular endptr */
  1448. static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
  1449. {
  1450. int size;
  1451. struct sk_buff *skb;
  1452. /*const*/ u32 *x, *end = &lvcc->rx.buf.start[endptr * 4];
  1453. int n = ((unsigned long) end) - ((unsigned long) lvcc->rx.buf.ptr);
  1454. if (n < 0)
  1455. n += lanai_buf_size(&lvcc->rx.buf);
  1456. APRINTK(n >= 0 && n < lanai_buf_size(&lvcc->rx.buf) && !(n & 15),
  1457.     "vcc_rx_aal5: n out of range (%d/%d)n",
  1458.     n, lanai_buf_size(&lvcc->rx.buf));
  1459. /* Recover the second-to-last word to get true pdu length */
  1460. if ((x = &end[-2]) < lvcc->rx.buf.start)
  1461. x = &lvcc->rx.buf.end[-2];
  1462. size = be32_to_cpup(x) & 0xffff;
  1463. if (n != aal5_size(size)) { /* Make sure size matches padding */
  1464. printk(KERN_INFO DEV_LABEL "(itf %d): Got bad AAL5 length "
  1465.     "on vci=%d - size=%d n=%dn",
  1466.     lvcc->rx.atmvcc->dev->number, lvcc->vci, size, n);
  1467. lvcc->stats.x.aal5.rx_badlen++;
  1468. goto out;
  1469. }
  1470. skb = atm_alloc_charge(lvcc->rx.atmvcc, size, GFP_ATOMIC);
  1471. if (skb == NULL) {
  1472. lvcc->stats.rx_nomem++;
  1473. goto out;
  1474. }
  1475. skb_put(skb, size);
  1476. ATM_SKB(skb)->vcc = lvcc->rx.atmvcc;
  1477. skb->stamp = xtime;
  1478. vcc_rx_memcpy(skb->data, lvcc, size);
  1479. lvcc->rx.atmvcc->push(lvcc->rx.atmvcc, skb);
  1480. atomic_inc(&lvcc->rx.atmvcc->stats->rx);
  1481.     out:
  1482. lvcc->rx.buf.ptr = end;
  1483. cardvcc_write(lvcc, endptr, vcc_rxreadptr);
  1484. }
  1485. static void vcc_rx_aal0(struct lanai_dev *lanai)
  1486. {
  1487. printk(KERN_INFO DEV_LABEL ": vcc_rx_aal0: not implementedn");
  1488. /* Remember to get vcclist_read_lock while looking up VC */
  1489. /* Remember to increment lvcc->rx.atmvcc->stats->rx */
  1490. }
  1491. /* -------------------- MANAGING HOST-BASED VCC TABLE: */
  1492. /* Decide whether to use vmalloc or get_free_page for VCC table */
  1493. #if (NUM_VCI * BITS_PER_LONG) <= PAGE_SIZE
  1494. #define VCCTABLE_GETFREEPAGE
  1495. #else
  1496. #include <linux/vmalloc.h>
  1497. #endif
  1498. static int __init vcc_table_allocate(struct lanai_dev *lanai)
  1499. {
  1500. #ifdef VCCTABLE_GETFREEPAGE
  1501. APRINTK((lanai->num_vci) * sizeof(struct lanai_vcc *) <= PAGE_SIZE,
  1502.     "vcc table > PAGE_SIZE!");
  1503. lanai->vccs = (struct lanai_vcc **) get_free_page(GFP_KERNEL);
  1504. return (lanai->vccs == NULL) ? -ENOMEM : 0;
  1505. #else
  1506. int bytes = (lanai->num_vci) * sizeof(struct lanai_vcc *);
  1507. lanai->vccs = (struct lanai_vcc **) vmalloc(bytes);
  1508. if (lanai->vccs == NULL)
  1509. return -ENOMEM;
  1510. memset(lanai->vccs, 0, bytes);
  1511. return 0;
  1512. #endif
  1513. }
  1514. static inline void vcc_table_deallocate(const struct lanai_dev *lanai)
  1515. {
  1516. #ifdef VCCTABLE_GETFREEPAGE
  1517. free_page((unsigned long) lanai->vccs);
  1518. #else
  1519. vfree(lanai->vccs);
  1520. #endif
  1521. }
  1522. /* Allocate a fresh lanai_vcc, with the appropriate things cleared */
  1523. static inline struct lanai_vcc *new_lanai_vcc(void)
  1524. {
  1525. struct lanai_vcc *lvcc;
  1526. lvcc = (struct lanai_vcc *) kmalloc(sizeof(*lvcc), GFP_KERNEL);
  1527. if (lvcc != NULL) {
  1528. lvcc->vbase = 0;
  1529. lvcc->rx.atmvcc = lvcc->tx.atmvcc = NULL;
  1530. lvcc->nref = 0;
  1531. memset(&lvcc->stats, 0, sizeof lvcc->stats);
  1532. lvcc->rx.buf.start = lvcc->tx.buf.start = NULL;
  1533. skb_queue_head_init(&lvcc->tx.backlog);
  1534. lvcc->tx.inprogress = NULL;
  1535. #ifdef DEBUG
  1536. lvcc->tx.unqueue = NULL;
  1537. lvcc->vci = -1;
  1538. #endif
  1539. }
  1540. return lvcc;
  1541. }
  1542. static int lanai_get_sized_buffer(int number, struct lanai_buffer *buf,
  1543. int max_sdu, int multiplier, int min, const char *name)
  1544. {
  1545. int size;
  1546. if (max_sdu < 1)
  1547. max_sdu = 1;
  1548. max_sdu = aal5_size(max_sdu);
  1549. size = (max_sdu + 16) * multiplier + 16;
  1550. lanai_buf_allocate(buf, size, min);
  1551. if (buf->order < 0)
  1552. return -ENOMEM;
  1553. if (lanai_buf_size(buf) < size)
  1554. printk(KERN_WARNING DEV_LABEL "(itf %d): wanted %d bytes "
  1555.     "for %s buffer, got only %dn", number, size, name,
  1556.     lanai_buf_size(buf));
  1557. DPRINTK("Allocated %d byte %s buffern", lanai_buf_size(buf), name);
  1558. return 0;
  1559. }
  1560. /* Setup a RX buffer for a currently unbound AAL5 vci */
  1561. static inline int lanai_setup_rx_vci_aal5(int number, struct lanai_vcc *lvcc,
  1562. const struct atm_qos *qos)
  1563. {
  1564. return lanai_get_sized_buffer(number, &lvcc->rx.buf,
  1565.     qos->rxtp.max_sdu, AAL5_RX_MULTIPLIER, qos->rxtp.max_sdu + 32,
  1566.     "RX");
  1567. }
  1568. /* Setup a TX buffer for a currently unbound AAL5 vci */
  1569. static int lanai_setup_tx_vci(int number, struct lanai_vcc *lvcc,
  1570. const struct atm_qos *qos)
  1571. {
  1572. int max_sdu, multiplier;
  1573. if (qos->aal == ATM_AAL0) {
  1574. lvcc->tx.unqueue = vcc_tx_unqueue_aal0;
  1575. max_sdu = ATM_CELL_SIZE - 1;
  1576. multiplier = AAL0_TX_MULTIPLIER;
  1577. } else {
  1578. lvcc->tx.unqueue = vcc_tx_unqueue_aal5;
  1579. max_sdu = qos->txtp.max_sdu;
  1580. multiplier = AAL5_TX_MULTIPLIER;
  1581. }
  1582. return lanai_get_sized_buffer(number, &lvcc->tx.buf, max_sdu,
  1583.     multiplier, 80, "TX");
  1584. }
  1585. static inline void host_vcc_bind(struct lanai_dev *lanai,
  1586. struct lanai_vcc *lvcc, vci_t vci)
  1587. {
  1588. if (lvcc->vbase != 0)
  1589. return;    /* We already were bound in the other direction */
  1590. DPRINTK("Binding vci %dn", vci);
  1591. #ifdef USE_POWERDOWN
  1592. if (lanai->nbound++ == 0) {
  1593. DPRINTK("Coming out of powerdownn");
  1594. lanai->conf1 &= ~CONFIG1_POWERDOWN;
  1595. conf1_write(lanai);
  1596. conf2_write(lanai);
  1597. }
  1598. #endif
  1599. lvcc->vbase = cardvcc_addr(lanai, vci);
  1600. lanai->vccs[lvcc->vci = vci] = lvcc;
  1601. }
  1602. static inline void host_vcc_unbind(struct lanai_dev *lanai,
  1603. struct lanai_vcc *lvcc)
  1604. {
  1605. if (lvcc->vbase == 0)
  1606. return; /* This vcc was never bound */
  1607. DPRINTK("Unbinding vci %dn", lvcc->vci);
  1608. lvcc->vbase = 0;
  1609. lanai->vccs[lvcc->vci] = NULL;
  1610. #ifdef USE_POWERDOWN
  1611. if (--lanai->nbound == 0) {
  1612. DPRINTK("Going into powerdownn");
  1613. lanai->conf1 |= CONFIG1_POWERDOWN;
  1614. conf1_write(lanai);
  1615. }
  1616. #endif
  1617. }
  1618. /* -------------------- RESET CARD: */
  1619. static void lanai_reset(struct lanai_dev *lanai)
  1620. {
  1621. printk(KERN_CRIT DEV_LABEL "(itf %d): *NOT* reseting - not "
  1622.     "implementedn", lanai->number);
  1623. /* TODO */
  1624. /* The following is just a hack until we write the real
  1625.  * resetter - at least ack whatever interrupt sent us
  1626.  * here
  1627.  */
  1628. reg_write(lanai, INT_ALL, IntAck_Reg);
  1629. lanai->stats.card_reset++;
  1630. }
  1631. /* -------------------- SERVICE LIST UTILITIES: */
  1632. /*
  1633.  * Allocate service buffer and tell card about it
  1634.  */
  1635. static int __init service_buffer_allocate(struct lanai_dev *lanai)
  1636. {
  1637. lanai_buf_allocate(&lanai->service, SERVICE_ENTRIES * 4, 0);
  1638. if (lanai->service.order < 0)
  1639. return -ENOMEM;
  1640. DPRINTK("allocated service buffer at 0x%08lX, size %d(%d)n",
  1641.     (unsigned long) lanai->service.start,
  1642.     lanai_buf_size(&lanai->service),
  1643.     lanai_buf_size_cardorder(&lanai->service));
  1644. /* Clear ServWrite register to be safe */
  1645. reg_write(lanai, 0, ServWrite_Reg);
  1646. /* ServiceStuff register contains size and address of buffer */
  1647. reg_write(lanai,
  1648.     SSTUFF_SET_SIZE(lanai_buf_size_cardorder(&lanai->service)) |
  1649.     SSTUFF_SET_ADDR(lanai_buf_dmaaddr(&lanai->service)),
  1650.     ServiceStuff_Reg);
  1651. return 0;
  1652. }
  1653. static inline void service_buffer_deallocate(struct lanai_dev *lanai)
  1654. {
  1655. lanai_buf_deallocate(&lanai->service);
  1656. }
  1657. /* Bitfields in service list */
  1658. #define SERVICE_TX (0x80000000) /* Was from transmission */
  1659. #define SERVICE_TRASH (0x40000000) /* RXed PDU was trashed */
  1660. #define SERVICE_CRCERR (0x20000000) /* RXed PDU had CRC error */
  1661. #define SERVICE_CI (0x10000000) /* RXed PDU had CI set */
  1662. #define SERVICE_CLP (0x08000000) /* RXed PDU had CLP set */
  1663. #define SERVICE_STREAM (0x04000000) /* RX Stream mode */
  1664. #define SERVICE_GET_VCI(x) (((x)>>16)&0x3FF)
  1665. #define SERVICE_GET_END(x) ((x)&0x1FFF)
  1666. /* Handle one thing from the service list - returns true if it marked a
  1667.  * VCC ready for xmit
  1668.  */
  1669. static int handle_service(struct lanai_dev *lanai, u32 s)
  1670. {
  1671. vci_t vci = SERVICE_GET_VCI(s);
  1672. struct lanai_vcc *lvcc;
  1673. vcclist_read_lock();
  1674. lvcc = lanai->vccs[vci];
  1675. if (lvcc == NULL) {
  1676. vcclist_read_unlock();
  1677. DPRINTK("(itf %d) got service entry 0x%X for nonexistent "
  1678.     "vcc %dn", lanai->number, s, vci);
  1679. if (s & SERVICE_TX)
  1680. lanai->stats.service_novcc_tx++;
  1681. else
  1682. lanai->stats.service_novcc_rx++;
  1683. return 0;
  1684. }
  1685. if (s & SERVICE_TX) { /* segmentation interrupt */
  1686. if (lvcc->tx.atmvcc == NULL) {
  1687. vcclist_read_unlock();
  1688. DPRINTK("(itf %d) got service entry 0x%X for non-TX "
  1689.     "vcc %dn", lanai->number, s, vci);
  1690. lanai->stats.service_notx++;
  1691. return 0;
  1692. }
  1693. vci_bitfield_set(&lanai->transmit_ready, vci);
  1694. lvcc->tx.endptr = SERVICE_GET_END(s);
  1695. vcclist_read_unlock();
  1696. return 1;
  1697. }
  1698. if (lvcc->rx.atmvcc == NULL) {
  1699. vcclist_read_unlock();
  1700. DPRINTK("(itf %d) got service entry 0x%X for non-RX "
  1701.     "vcc %dn", lanai->number, s, vci);
  1702. lanai->stats.service_norx++;
  1703. return 0;
  1704. }
  1705. if (lvcc->rx.atmvcc->qos.aal != ATM_AAL5) {
  1706. vcclist_read_unlock();
  1707. DPRINTK("(itf %d) got RX service entry 0x%X for non-AAL5 "
  1708.     "vcc %dn", lanai->number, s, vci);
  1709. lanai->stats.service_rxnotaal5++;
  1710. atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
  1711. return 0;
  1712. }
  1713. if ((s & (SERVICE_TRASH | SERVICE_STREAM | SERVICE_CRCERR)) == 0) {
  1714. vcc_rx_aal5(lvcc, SERVICE_GET_END(s));
  1715. vcclist_read_unlock();
  1716. return 0;
  1717. }
  1718. if (s & SERVICE_TRASH) {
  1719. int bytes;
  1720. vcclist_read_unlock();
  1721. DPRINTK("got trashed rx pdu on vci %dn", vci);
  1722. atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
  1723. lvcc->stats.x.aal5.service_trash++;
  1724. bytes = (SERVICE_GET_END(s) * 16) -
  1725.     (((unsigned long) lvcc->rx.buf.ptr) -
  1726.     ((unsigned long) lvcc->rx.buf.start)) + 47;
  1727. if (bytes < 0)
  1728. bytes += lanai_buf_size(&lvcc->rx.buf);
  1729. lanai->stats.ovfl_trash += (bytes / 48);
  1730. return 0;
  1731. }
  1732. if (s & SERVICE_STREAM) {
  1733. vcclist_read_unlock();
  1734. atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
  1735. lvcc->stats.x.aal5.service_stream++;
  1736. printk(KERN_ERR DEV_LABEL "(itf %d): Got AAL5 stream "
  1737.     "PDU on VCI %d!n", lanai->number, vci);
  1738. lanai_reset(lanai);
  1739. return 0;
  1740. }
  1741. DPRINTK("got rx crc error on vci %dn", vci);
  1742. atomic_inc(&lvcc->rx.atmvcc->stats->rx_err);
  1743. lvcc->stats.x.aal5.service_rxcrc++;
  1744. lvcc->rx.buf.ptr = &lvcc->rx.buf.start[SERVICE_GET_END(s) * 4];
  1745. cardvcc_write(lvcc, SERVICE_GET_END(s), vcc_rxreadptr);
  1746. vcclist_read_unlock();
  1747. return 0;
  1748. }
  1749. /* Try transmitting on all VCIs that we marked ready to serve */
  1750. static void iter_transmit(struct lanai_dev *lanai, vci_t vci)
  1751. {
  1752. struct lanai_vcc *lvcc = lanai->vccs[vci];
  1753. if (!vcc_is_backlogged(lvcc))
  1754. return;
  1755. lvcc->tx.unqueue(lanai, lvcc, lvcc->tx.endptr);
  1756. }
  1757. /* Run service queue -- called from interrupt context or with
  1758.  * interrupts otherwise disabled and with the lanai->servicelock
  1759.  * lock held
  1760.  */
  1761. static void run_service(struct lanai_dev *lanai)
  1762. {
  1763. int ntx = 0;
  1764. u32 wreg = reg_read(lanai, ServWrite_Reg);
  1765. const u32 *end = lanai->service.start + wreg;
  1766. while (lanai->service.ptr != end) {
  1767. ntx += handle_service(lanai,
  1768.     le32_to_cpup(lanai->service.ptr++));
  1769. if (lanai->service.ptr >= lanai->service.end)
  1770. lanai->service.ptr = lanai->service.start;
  1771. }
  1772. reg_write(lanai, wreg, ServRead_Reg);
  1773. if (ntx != 0) {
  1774. spin_lock(&lanai->txlock);
  1775. vcclist_read_lock();
  1776. vci_bitfield_iterate(lanai, &lanai->transmit_ready,
  1777.     iter_transmit);
  1778. vci_bitfield_init(&lanai->transmit_ready);
  1779. vcclist_read_unlock();
  1780. spin_unlock(&lanai->txlock);
  1781. }
  1782. }
  1783. /* -------------------- GATHER STATISTICS: */
  1784. static void get_statistics(struct lanai_dev *lanai)
  1785. {
  1786. u32 statreg = reg_read(lanai, Statistics_Reg);
  1787. lanai->stats.atm_ovfl += STATS_GET_FIFO_OVFL(statreg);
  1788. lanai->stats.hec_err += STATS_GET_HEC_ERR(statreg);
  1789. lanai->stats.vci_trash += STATS_GET_BAD_VCI(statreg);
  1790. lanai->stats.ovfl_trash += STATS_GET_BUF_OVFL(statreg);
  1791. }
  1792. /* -------------------- POLLING TIMER: */
  1793. static void lanai_timed_poll(unsigned long arg)
  1794. {
  1795. #ifndef DEBUG_RW
  1796. struct lanai_dev *lanai = (struct lanai_dev *) arg;
  1797. unsigned long flags;
  1798. #ifdef USE_POWERDOWN
  1799. if (lanai->conf1 & CONFIG1_POWERDOWN)
  1800. return;
  1801. #endif
  1802. spin_lock_irqsave(&lanai->servicelock, flags);
  1803. run_service(lanai);
  1804. spin_unlock_irqrestore(&lanai->servicelock, flags);
  1805. vcc_tx_dequeue_all(lanai);
  1806. get_statistics(lanai);
  1807. mod_timer(&lanai->timer, jiffies + LANAI_POLL_PERIOD);
  1808. #endif /* DEBUG_RW */
  1809. }
  1810. static inline void lanai_timed_poll_start(struct lanai_dev *lanai)
  1811. {
  1812. init_timer(&lanai->timer);
  1813. lanai->timer.expires = jiffies + LANAI_POLL_PERIOD;
  1814. lanai->timer.data = (unsigned long) lanai;
  1815. lanai->timer.function = lanai_timed_poll;
  1816. add_timer(&lanai->timer);
  1817. }
  1818. static inline void lanai_timed_poll_stop(struct lanai_dev *lanai)
  1819. {
  1820. del_timer(&lanai->timer);
  1821. }
  1822. /* -------------------- INTERRUPT SERVICE: */
  1823. static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
  1824. {
  1825. u32 ack = 0;
  1826. if (reason & INT_SERVICE) {
  1827. ack = INT_SERVICE;
  1828. spin_lock(&lanai->servicelock);
  1829. run_service(lanai);
  1830. spin_unlock(&lanai->servicelock);
  1831. }
  1832. if (reason & (INT_AAL0_STR | INT_AAL0)) {
  1833. ack |= reason & (INT_AAL0_STR | INT_AAL0);
  1834. vcc_rx_aal0(lanai);
  1835. }
  1836. if (reason & INT_STATS) {
  1837. reason &= ~INT_STATS; /* No need to ack */
  1838. get_statistics(lanai);
  1839. }
  1840. if (reason & INT_STATUS) {
  1841. ack |= reason & INT_STATUS;
  1842. lanai_check_status(lanai);
  1843. }
  1844. if (reason & INT_DMASHUT) {
  1845. printk(KERN_ERR DEV_LABEL "(itf %d): driver error - DMA "
  1846.     "shutdown, reason=0x%08X, address=0x%08Xn",
  1847.     lanai->number, reason & INT_DMASHUT,
  1848.     reg_read(lanai, DMA_Addr_Reg));
  1849. if (reason & INT_TABORTBM) {
  1850. lanai_reset(lanai);
  1851. return;
  1852. }
  1853. ack |= (reason & INT_DMASHUT);
  1854. printk(KERN_ERR DEV_LABEL "(itf %d): re-enabling DMAn",
  1855.     lanai->number);
  1856. conf1_write(lanai);
  1857. lanai->stats.dma_reenable++;
  1858. pcistatus_check(lanai, 0);
  1859. }
  1860. if (reason & INT_TABORTSENT) {
  1861. ack |= (reason & INT_TABORTSENT);
  1862. printk(KERN_ERR DEV_LABEL "(itf %d): sent PCI target abortn",
  1863.     lanai->number);
  1864. pcistatus_check(lanai, 0);
  1865. }
  1866. if (reason & INT_SEGSHUT) {
  1867. printk(KERN_ERR DEV_LABEL "(itf %d): driver error - "
  1868.     "segmentation shutdown, reason=0x%08Xn", lanai->number,
  1869.     reason & INT_SEGSHUT);
  1870. lanai_reset(lanai);
  1871. return;
  1872. }
  1873. if (reason & (INT_PING | INT_WAKE)) {
  1874. printk(KERN_ERR DEV_LABEL "(itf %d): driver error - "
  1875.     "unexpected interrupt 0x%08X, resettingn",
  1876.     lanai->number, reason & (INT_PING | INT_WAKE));
  1877. lanai_reset(lanai);
  1878. return;
  1879. }
  1880. #ifdef DEBUG
  1881. if (ack != reason) {
  1882. DPRINTK("unacked ints: 0x%08Xn", reason & ~ack);
  1883. ack = reason;
  1884. }
  1885. #endif
  1886. if (ack != 0)
  1887. reg_write(lanai, ack, IntAck_Reg);
  1888. }
  1889. static void lanai_int(int irq, void *devid, struct pt_regs *regs)
  1890. {
  1891. struct lanai_dev *lanai = (struct lanai_dev *) devid;
  1892. u32 reason;
  1893. (void) irq; (void) regs; /* unused variables */
  1894. #ifdef USE_POWERDOWN
  1895. if (lanai->conf1 & CONFIG1_POWERDOWN) {
  1896. lanai->conf1 &= ~CONFIG1_POWERDOWN;
  1897. conf1_write(lanai);
  1898. printk(KERN_WARNING DEV_LABEL "(itf %d): Got interrupt "
  1899.     "0x%08X while in POWERDOWN, powering upn", lanai->conf1,
  1900.     intr_pending(lanai));
  1901. conf2_write(lanai);
  1902. }
  1903. #endif
  1904. while ((reason = intr_pending(lanai)) != 0)
  1905. lanai_int_1(lanai, reason);
  1906. }
  1907. /* TODO - it would be nice if we could use the "delayed interrupt" system
  1908.  *   to some advantage
  1909.  */
  1910. /* -------------------- CHECK BOARD ID/REV: */
  1911. /*
  1912.  * The board id and revision are stored both in the reset register and
  1913.  * in the PCI configuration space - the documentation says to check
  1914.  * each of them.  If revp!=NULL we store the revision there
  1915.  */
  1916. static int check_board_id_and_rev(const char *name, u32 val, int *revp)
  1917. {
  1918. DPRINTK("%s says board_id=%d, board_rev=%dn", name,
  1919. RESET_GET_BOARD_ID(val), RESET_GET_BOARD_REV(val));
  1920. if (RESET_GET_BOARD_ID(val) != BOARD_ID_LANAI256) {
  1921. printk(KERN_ERR DEV_LABEL ": Found %s board-id %d -- not a "
  1922.     "Lanai 25.6n", name, RESET_GET_BOARD_ID(val));
  1923. return -ENODEV;
  1924. }
  1925. if (revp != NULL)
  1926. *revp = RESET_GET_BOARD_REV(val);
  1927. return 0;
  1928. }
  1929. /* -------------------- PCI INITIALIZATION/SHUTDOWN: */
  1930. static inline int __init lanai_pci_start(struct lanai_dev *lanai)
  1931. {
  1932. struct pci_dev *pci = lanai->pci;
  1933. int result;
  1934. u16 w;
  1935. /* Get the pci revision byte */
  1936. result = pci_read_config_byte(pci, PCI_REVISION_ID,
  1937.     &lanai->pci_revision);
  1938. if (result != PCIBIOS_SUCCESSFUL) {
  1939. printk(KERN_ERR DEV_LABEL "(itf %d): can't read "
  1940.     "PCI_REVISION_ID: %dn", lanai->number, result);
  1941. return -EINVAL;
  1942. }
  1943. result = pci_read_config_word(pci, PCI_SUBSYSTEM_ID, &w);
  1944. if (result != PCIBIOS_SUCCESSFUL) {
  1945. printk(KERN_ERR DEV_LABEL "(itf %d): can't read "
  1946.     "PCI_SUBSYSTEM_ID: %dn", lanai->number, result);
  1947. return -EINVAL;
  1948. }
  1949. if ((result = check_board_id_and_rev("PCI", w, NULL)) != 0)
  1950. return result;
  1951. /* Set latency timer to zero as per lanai docs */
  1952. result = pci_write_config_byte(pci, PCI_LATENCY_TIMER, 0);
  1953. if (result != PCIBIOS_SUCCESSFUL) {
  1954. printk(KERN_ERR DEV_LABEL "(itf %d): can't write "
  1955.     "PCI_LATENCY_TIMER: %dn", lanai->number, result);
  1956. return -EINVAL;
  1957. }
  1958. result = pci_read_config_word(pci, PCI_COMMAND, &w);
  1959. if (result != PCIBIOS_SUCCESSFUL) {
  1960. printk(KERN_ERR DEV_LABEL "(itf %d): can't read "
  1961.     "PCI_COMMAND: %dn", lanai->number, result);
  1962. return -EINVAL;
  1963. }
  1964. w |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_SERR |
  1965.     PCI_COMMAND_PARITY);
  1966. result = pci_write_config_word(pci, PCI_COMMAND, w);
  1967. if (result != PCIBIOS_SUCCESSFUL) {
  1968. printk(KERN_ERR DEV_LABEL "(itf %d): can't "
  1969. "write PCI_COMMAND: %dn", lanai->number, result);
  1970. return -EINVAL;
  1971. }
  1972. pcistatus_check(lanai, 1);
  1973. pcistatus_check(lanai, 0);
  1974. return 0;
  1975. }
  1976. static void lanai_pci_stop(struct lanai_dev *lanai)
  1977. {
  1978. struct pci_dev *pci = lanai->pci;
  1979. int result;
  1980. u16 pci_command;
  1981. result = pci_read_config_word(pci, PCI_COMMAND, &pci_command);
  1982. if (result != PCIBIOS_SUCCESSFUL) {
  1983. printk(KERN_ERR DEV_LABEL "(itf %d): can't "
  1984. "read PCI_COMMAND: %dn", lanai->number, result);
  1985. return;
  1986. }
  1987. pci_command &= ~(PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
  1988. result = pci_write_config_word(pci, PCI_COMMAND, pci_command);
  1989. if (result != PCIBIOS_SUCCESSFUL)
  1990. printk(KERN_ERR DEV_LABEL "(itf %d): can't "
  1991. "write PCI_COMMAND: %dn", lanai->number, result);
  1992. }
  1993. /* -------------------- VPI/VCI ALLOCATION: */
  1994. /*
  1995.  * We _can_ use VCI==0 for normal traffic, but only for UBR (or we'll
  1996.  * get a CBRZERO interrupt), and we can use it only if noone is receiving
  1997.  * AAL0 traffic (since they will use the same queue) - according to the
  1998.  * docs we shouldn't even use it for AAL0 traffic
  1999.  */
  2000. static inline int vci0_is_ok(struct lanai_dev *lanai,
  2001. const struct atm_qos *qos)
  2002. {
  2003. if (qos->txtp.traffic_class == ATM_CBR || qos->aal == ATM_AAL0)
  2004. return 0;
  2005. if (qos->rxtp.traffic_class != ATM_NONE) {
  2006. if (lanai->naal0 != 0)
  2007. return 0;
  2008. lanai->conf2 |= CONFIG2_VCI0_NORMAL;
  2009. #ifdef USE_POWERDOWN
  2010. if ((lanai->conf1 & CONFIG1_POWERDOWN) == 0)
  2011. #endif
  2012. conf2_write(lanai);
  2013. }
  2014. return 1;
  2015. }
  2016. /* return true if vci is currently unused, or if requested qos is
  2017.  * compatible
  2018.  */
  2019. static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
  2020. const struct atm_vcc *atmvcc)
  2021. {
  2022. const struct atm_qos *qos = &atmvcc->qos;
  2023. const struct lanai_vcc *lvcc = lanai->vccs[vci];
  2024. if (vci == 0 && !vci0_is_ok(lanai, qos))
  2025. return 0;
  2026. if (lvcc != NULL) {
  2027. if (qos->rxtp.traffic_class != ATM_NONE &&
  2028.     lvcc->rx.atmvcc != NULL && lvcc->rx.atmvcc != atmvcc)
  2029. return 0;
  2030. if (qos->txtp.traffic_class != ATM_NONE &&
  2031.     lvcc->tx.atmvcc != NULL && lvcc->tx.atmvcc != atmvcc)
  2032. return 0;
  2033. if (qos->txtp.traffic_class == ATM_CBR &&
  2034.     lanai->cbrvcc != NULL && lanai->cbrvcc != atmvcc)
  2035. return 0;
  2036. }
  2037. if (qos->aal == ATM_AAL0 && lanai->naal0 == 0 &&
  2038.     qos->rxtp.traffic_class != ATM_NONE) {
  2039. const struct lanai_vcc *vci0 = lanai->vccs[0];
  2040. if (vci0 != NULL && vci0->rx.atmvcc != NULL)
  2041. return 0;
  2042. lanai->conf2 &= ~CONFIG2_VCI0_NORMAL;
  2043. #ifdef USE_POWERDOWN
  2044. if ((lanai->conf1 & CONFIG1_POWERDOWN) == 0)
  2045. #endif
  2046. conf2_write(lanai);
  2047. }
  2048. return 1;
  2049. }
  2050. static int lanai_normalize_ci(struct lanai_dev *lanai,
  2051. const struct atm_vcc *atmvcc, short *vpip, vci_t *vcip)
  2052. {
  2053. switch (*vpip) {
  2054. case ATM_VPI_ANY:
  2055. *vpip = 0;
  2056. /* FALLTHROUGH */
  2057. case 0:
  2058. break;
  2059. default:
  2060. return -EADDRINUSE;
  2061. }
  2062. switch (*vcip) {
  2063. case ATM_VCI_ANY:
  2064. for (*vcip = ATM_NOT_RSV_VCI; *vcip < lanai->num_vci;
  2065.     (*vcip)++)
  2066. if (vci_is_ok(lanai, *vcip, atmvcc))
  2067. return 0;
  2068. return -EADDRINUSE;
  2069. default:
  2070. if (*vcip >= lanai->num_vci || *vcip < 0 ||
  2071.     !vci_is_ok(lanai, *vcip, atmvcc))
  2072. return -EADDRINUSE;
  2073. }
  2074. return 0;
  2075. }
  2076. /* -------------------- MANAGE CBR: */
  2077. /*
  2078.  * CBR ICG is stored as a fixed-point number with 4 fractional bits.
  2079.  * Note that storing a number greater than 2046.0 will result in
  2080.  * incorrect shaping
  2081.  */
  2082. #define CBRICG_FRAC_BITS (4)
  2083. #define CBRICG_MAX (2046 << CBRICG_FRAC_BITS)
  2084. /*
  2085.  * ICG is related to PCR with the formula PCR = MAXPCR / (ICG + 1)
  2086.  * where MAXPCR is (according to the docs) 25600000/(54*8),
  2087.  * which is equal to (3125<<9)/27.
  2088.  *
  2089.  * Solving for ICG, we get:
  2090.  *    ICG = MAXPCR/PCR - 1
  2091.  *    ICG = (3125<<9)/(27*PCR) - 1
  2092.  *    ICG = ((3125<<9) - (27*PCR)) / (27*PCR)
  2093.  *
  2094.  * The end result is supposed to be a fixed-point number with FRAC_BITS
  2095.  * bits of a fractional part, so we keep everything in the numerator
  2096.  * shifted by that much as we compute
  2097.  *
  2098.  */
  2099. static int pcr_to_cbricg(/*const*/ struct atm_qos *qos)
  2100. {
  2101. int rounddown = 0; /* 1 = Round PCR down, i.e. round ICG _up_ */
  2102. int x, icg, pcr = atm_pcr_goal(&qos->txtp);
  2103. if (pcr == 0) /* Use maximum bandwidth */
  2104. return 0;
  2105. if (pcr < 0) {
  2106. rounddown = 1;
  2107. pcr = -pcr;
  2108. }
  2109. x = pcr * 27;
  2110. icg = (3125 << (9 + CBRICG_FRAC_BITS)) - (x << CBRICG_FRAC_BITS);
  2111. if (rounddown)
  2112. icg += x - 1;
  2113. icg /= x;
  2114. if (icg > CBRICG_MAX)
  2115. icg = CBRICG_MAX;
  2116. DPRINTK("pcr_to_cbricg: pcr=%d rounddown=%c icg=%dn",
  2117.     pcr, rounddown ? 'Y' : 'N', icg);
  2118. return icg;
  2119. }
  2120. static inline void lanai_cbr_setup(struct lanai_dev *lanai)
  2121. {
  2122. reg_write(lanai, pcr_to_cbricg(&lanai->cbrvcc->qos), CBR_ICG_Reg);
  2123. reg_write(lanai, lanai->cbrvcc->vci, CBR_PTR_Reg);
  2124. lanai->conf2 |= CONFIG2_CBR_ENABLE;
  2125. conf2_write(lanai);
  2126. }
  2127. static inline void lanai_cbr_shutdown(struct lanai_dev *lanai)
  2128. {
  2129. lanai->conf2 &= ~CONFIG2_CBR_ENABLE;
  2130. conf2_write(lanai);
  2131. }
  2132. /* -------------------- OPERATIONS: */
  2133. /* setup a newly detected device */
  2134. static int __init lanai_dev_open(struct atm_dev *atmdev)
  2135. {
  2136. struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
  2137. unsigned long raw_base;
  2138. int result;
  2139. DPRINTK("In lanai_dev_open()n");
  2140. /* Basic device fields */
  2141. lanai->number = atmdev->number;
  2142. lanai->num_vci = NUM_VCI;
  2143. vci_bitfield_init(&lanai->backlog_vccs);
  2144. vci_bitfield_init(&lanai->transmit_ready);
  2145. lanai->naal0 = 0;
  2146. #ifdef USE_POWERDOWN
  2147. lanai->nbound = 0;
  2148. #endif
  2149. lanai->cbrvcc = NULL;
  2150. memset(&lanai->stats, 0, sizeof lanai->stats);
  2151. spin_lock_init(&lanai->txlock);
  2152. spin_lock_init(&lanai->servicelock);
  2153. atmdev->ci_range.vpi_bits = 0;
  2154. atmdev->ci_range.vci_bits = 0;
  2155. while (1 << atmdev->ci_range.vci_bits < lanai->num_vci)
  2156. atmdev->ci_range.vci_bits++;
  2157. atmdev->link_rate = ((25600000 / 8 - 8000) / 54);
  2158. /* 3.2: PCI initialization */
  2159. if ((result = lanai_pci_start(lanai)) != 0)
  2160. goto error;
  2161. raw_base = (bus_addr_t) lanai->pci->resource[0].start;
  2162. lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE);
  2163. if (lanai->base == 0) {
  2164. printk(KERN_ERR DEV_LABEL ": couldn't remap I/O spacen");
  2165. goto error_pci;
  2166. }
  2167. /* 3.3: Reset lanai and PHY */
  2168. reset_board(lanai);
  2169. lanai->conf1 = reg_read(lanai, Config1_Reg);
  2170. lanai->conf1 &= ~(CONFIG1_GPOUT1 | CONFIG1_POWERDOWN |
  2171.     CONFIG1_MASK_LEDMODE);
  2172. lanai->conf1 |= CONFIG1_SET_LEDMODE(LEDMODE_NOT_SOOL);
  2173. reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg);
  2174. udelay(1000);
  2175. conf1_write(lanai);
  2176. /*
  2177.  * 3.4: Turn on endian mode for big-endian hardware
  2178.  *   We don't actually want to do this - the actual bit fields
  2179.  *   in the endian register are not documented anywhere.
  2180.  *   Instead we do the bit-flipping ourselves on big-endian
  2181.  *   hardware.
  2182.  *
  2183.  * 3.5: get the board ID/rev by reading the reset register
  2184.  */
  2185. result = check_board_id_and_rev("register",
  2186.     reg_read(lanai, Reset_Reg), &lanai->board_rev);
  2187. if (result != 0)
  2188. goto error_unmap;
  2189. /* 3.6: read EEPROM */
  2190. if ((result = eeprom_read(lanai)) != 0)
  2191. goto error_unmap;
  2192. if ((result = eeprom_validate(lanai)) != 0)
  2193. goto error_unmap;
  2194. /* 3.7: re-reset PHY, do loopback tests, setup PHY */
  2195. reg_write(lanai, lanai->conf1 | CONFIG1_GPOUT1, Config1_Reg);
  2196. udelay(1000);
  2197. conf1_write(lanai);
  2198. /* TODO - loopback tests */
  2199. lanai->conf1 |= (CONFIG1_GPOUT2 | CONFIG1_GPOUT3 | CONFIG1_DMA_ENABLE);
  2200. conf1_write(lanai);
  2201. /* 3.8/3.9: test and initialize card SRAM */
  2202. if ((result = sram_test_and_clear(lanai)) != 0)
  2203. goto error_unmap;
  2204. /* 3.10: initialize lanai registers */
  2205. lanai->conf1 |= CONFIG1_DMA_ENABLE;
  2206. conf1_write(lanai);
  2207. if ((result = service_buffer_allocate(lanai)) != 0)
  2208. goto error_unmap;
  2209. if ((result = vcc_table_allocate(lanai)) != 0)
  2210. goto error_service;
  2211. lanai->conf2 = (lanai->num_vci >= 512 ? CONFIG2_HOWMANY : 0) |
  2212.     CONFIG2_HEC_DROP | /* ??? */ CONFIG2_PTI7_MODE;
  2213. conf2_write(lanai);
  2214. reg_write(lanai, TX_FIFO_DEPTH, TxDepth_Reg);
  2215. reg_write(lanai, 0, CBR_ICG_Reg); /* CBR defaults to no limit */
  2216. if ((result = request_irq(lanai->pci->irq, lanai_int, SA_SHIRQ,
  2217.     "lanai", lanai)) != 0) {
  2218. printk(KERN_ERR DEV_LABEL ": can't allocate interruptn");
  2219. goto error_vcctable;
  2220. }
  2221. MOD_INC_USE_COUNT; /* At this point we can't fail */
  2222. intr_enable(lanai, INT_ALL & ~(INT_PING | INT_WAKE));
  2223. /* 3.11: initialize loop mode (i.e. turn looping off) */
  2224. lanai->conf1 = (lanai->conf1 & ~CONFIG1_MASK_LOOPMODE) |
  2225.     CONFIG1_SET_LOOPMODE(LOOPMODE_NORMAL) |
  2226.     CONFIG1_GPOUT2 | CONFIG1_GPOUT3;
  2227. conf1_write(lanai);
  2228. lanai->status = reg_read(lanai, Status_Reg);
  2229. /* We're now done initializing this card */
  2230. #ifdef USE_POWERDOWN
  2231. lanai->conf1 |= CONFIG1_POWERDOWN;
  2232. conf1_write(lanai);
  2233. #endif
  2234. memcpy(atmdev->esi, eeprom_mac(lanai), ESI_LEN);
  2235. lanai_timed_poll_start(lanai);
  2236. printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d, base=0x%lx, irq=%d "
  2237.     "(%02X-%02X-%02X-%02X-%02X-%02X)n", lanai->number,
  2238.     lanai->pci_revision, (long) lanai->base, lanai->pci->irq,
  2239.     atmdev->esi[0], atmdev->esi[1], atmdev->esi[2],
  2240.     atmdev->esi[3], atmdev->esi[4], atmdev->esi[5]);
  2241. printk(KERN_NOTICE DEV_LABEL "(itf %d): LANAI%s, serialno=%d(0x%X), "
  2242.     "board_rev=%dn", lanai->number,
  2243.     lanai->type==lanai2 ? "2" : "HB", lanai->serialno,
  2244.     lanai->serialno, lanai->board_rev);
  2245. return 0;
  2246.     error_vcctable:
  2247. vcc_table_deallocate(lanai);
  2248.     error_service:
  2249. service_buffer_deallocate(lanai);
  2250.     error_unmap:
  2251. reset_board(lanai);
  2252. #ifdef USE_POWERDOWN
  2253. lanai->conf1 = reg_read(lanai, Config1_Reg) | CONFIG1_POWERDOWN;
  2254. conf1_write(lanai);
  2255. #endif
  2256. iounmap((void *) lanai->base);
  2257.     error_pci:
  2258. lanai_pci_stop(lanai);
  2259.     error:
  2260. return result;
  2261. }
  2262. /* called when device is being shutdown, and all vcc's are gone - higher
  2263.  * levels will deallocate the atm device for us
  2264.  */
  2265. static void lanai_dev_close(struct atm_dev *atmdev)
  2266. {
  2267. struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
  2268. printk(KERN_INFO DEV_LABEL "(itf %d): shutting down interfacen",
  2269.     lanai->number);
  2270. lanai_timed_poll_stop(lanai);
  2271. #ifdef USE_POWERDOWN
  2272. lanai->conf1 = reg_read(lanai, Config1_Reg) & ~CONFIG1_POWERDOWN;
  2273. conf1_write(lanai);
  2274. #endif
  2275. intr_disable(lanai, INT_ALL);
  2276. free_irq(lanai->pci->irq, lanai);
  2277. reset_board(lanai);
  2278. #ifdef USE_POWERDOWN
  2279. lanai->conf1 |= CONFIG1_POWERDOWN;
  2280. conf1_write(lanai);
  2281. #endif
  2282. lanai_pci_stop(lanai);
  2283. vcc_table_deallocate(lanai);
  2284. service_buffer_deallocate(lanai);
  2285. iounmap((void *) lanai->base);
  2286. kfree(lanai);
  2287. MOD_DEC_USE_COUNT;
  2288. }
  2289. /* close a vcc */
  2290. static void lanai_close(struct atm_vcc *atmvcc)
  2291. {
  2292. struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data;
  2293. struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
  2294. if (lvcc == NULL)
  2295. return;
  2296. clear_bit(ATM_VF_READY, &atmvcc->flags);
  2297. clear_bit(ATM_VF_PARTIAL, &atmvcc->flags);
  2298. if (lvcc->rx.atmvcc == atmvcc) {
  2299. lanai_shutdown_rx_vci(lvcc);
  2300. if (atmvcc->qos.aal == ATM_AAL0) {
  2301. if (--lanai->naal0 <= 0)
  2302. aal0_buffer_free(lanai);
  2303. } else
  2304. lanai_buf_deallocate(&lvcc->rx.buf);
  2305. lvcc->rx.atmvcc = NULL;
  2306. }
  2307. if (lvcc->tx.atmvcc == atmvcc) {
  2308. if (atmvcc == lanai->cbrvcc) {
  2309. if (lvcc->vbase != 0)
  2310. lanai_cbr_shutdown(lanai);
  2311. lanai->cbrvcc = NULL;
  2312. }
  2313. lanai_shutdown_tx_vci(lanai, lvcc);
  2314. lanai_buf_deallocate(&lvcc->tx.buf);
  2315. lvcc->tx.atmvcc = NULL;
  2316. }
  2317. if (--lvcc->nref == 0) {
  2318. host_vcc_unbind(lanai, lvcc);
  2319. kfree(lvcc);
  2320. }
  2321. atmvcc->dev_data = NULL;
  2322. clear_bit(ATM_VF_ADDR, &atmvcc->flags);
  2323. }
  2324. /* open a vcc on the card to vpi/vci */
  2325. static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
  2326. {
  2327. struct lanai_dev *lanai;
  2328. struct lanai_vcc *lvcc;
  2329. int result = 0;
  2330. /* we don't support partial open - it's not really useful anyway */
  2331. if ((test_bit(ATM_VF_PARTIAL, &atmvcc->flags)) ||
  2332.     (vpi == ATM_VPI_UNSPEC) || (vci == ATM_VCI_UNSPEC))
  2333. return -EINVAL;
  2334. lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
  2335. if ((result = lanai_normalize_ci(lanai, atmvcc, &vpi, &vci)) != 0)
  2336. goto out;
  2337. atmvcc->vpi = vpi;
  2338. atmvcc->vci = vci;
  2339. set_bit(ATM_VF_ADDR, &atmvcc->flags);
  2340. lvcc = lanai->vccs[vci];
  2341. if (atmvcc->qos.aal != ATM_AAL0 && atmvcc->qos.aal != ATM_AAL5)
  2342. return -EINVAL;
  2343. #if 0
  2344. DPRINTK(DEV_LABEL "(itf %d): open %d.%d flags=0x%Xn",
  2345.     lanai->number, vpi, vci, (unsigned long) atmvcc->flags);
  2346. #else
  2347. DPRINTK(DEV_LABEL "(itf %d): open %d.%dn", lanai->number, vpi, vci);
  2348. #endif
  2349. if (lvcc == NULL && (lvcc = new_lanai_vcc()) == NULL)
  2350. return -ENOMEM;
  2351. atmvcc->dev_data = lvcc;
  2352. lvcc->nref++;
  2353. if (atmvcc->qos.rxtp.traffic_class != ATM_NONE) {
  2354. APRINTK(lvcc->rx.atmvcc == NULL, "rx.atmvcc!=NULL, vci=%dn",
  2355.     vci);
  2356. if (atmvcc->qos.aal == ATM_AAL0) {
  2357. if (lanai->naal0 == 0)
  2358. result = aal0_buffer_allocate(lanai);
  2359. } else
  2360. result = lanai_setup_rx_vci_aal5(
  2361.     lanai->number, lvcc, &atmvcc->qos);
  2362. if (result != 0)
  2363. goto out_free;
  2364. lvcc->rx.atmvcc = atmvcc;
  2365. lvcc->stats.rx_nomem = 0;
  2366. lvcc->stats.x.aal5.rx_badlen = 0;
  2367. lvcc->stats.x.aal5.service_trash = 0;
  2368. lvcc->stats.x.aal5.service_stream = 0;
  2369. lvcc->stats.x.aal5.service_rxcrc = 0;
  2370. if (atmvcc->qos.aal == ATM_AAL0)
  2371. lanai->naal0++;
  2372. }
  2373. if (atmvcc->qos.txtp.traffic_class != ATM_NONE) {
  2374. APRINTK(lvcc->tx.atmvcc == NULL, "tx.atmvcc!=NULL, vci=%dn",
  2375.     vci);
  2376. result = lanai_setup_tx_vci(lanai->number, lvcc, &atmvcc->qos);
  2377. if (result != 0)
  2378. goto out_free;
  2379. lvcc->tx.atmvcc = atmvcc;
  2380. if (atmvcc->qos.txtp.traffic_class == ATM_CBR) {
  2381. APRINTK(lanai->cbrvcc == NULL,
  2382.     "cbrvcc!=NULL, vci=%dn", vci);
  2383. lanai->cbrvcc = atmvcc;
  2384. }
  2385. }
  2386. host_vcc_bind(lanai, lvcc, vci);
  2387. if (atmvcc == lvcc->rx.atmvcc)
  2388. host_vcc_start_rx(lvcc);
  2389. if (atmvcc == lvcc->tx.atmvcc) {
  2390. host_vcc_start_tx(lvcc);
  2391. if (lanai->cbrvcc == atmvcc)
  2392. lanai_cbr_setup(lanai);
  2393. }
  2394. set_bit(ATM_VF_READY, &atmvcc->flags);
  2395. return 0;
  2396.     out_free:
  2397. lanai_close(atmvcc);
  2398.     out:
  2399. return result;
  2400. }
  2401. /* ioctl operations for card */
  2402. /* NOTE: these are all DEBUGGING ONLY currently */
  2403. static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg)
  2404. {
  2405. int result = 0;
  2406. struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
  2407. switch(cmd) {
  2408. case 2106275:
  2409. shutdown_atm_dev(atmdev);
  2410. return 0;
  2411. case 2200000: {
  2412. unsigned long flags;
  2413. spin_lock_irqsave(&lanai->servicelock, flags);
  2414. run_service(lanai);
  2415. spin_unlock_irqrestore(&lanai->servicelock, flags);
  2416. return 0; }
  2417. case 2200001:
  2418. vcc_tx_dequeue_all(lanai);
  2419. return 0;
  2420. case 2200002:
  2421. get_statistics(lanai);
  2422. return 0;
  2423. case 2200003: {
  2424. int i;
  2425. for (i = 0; i <= 0x5C ; i += 4) {
  2426. if (i==0x48) /* Write-only butt reg */
  2427. continue;
  2428. printk(KERN_CRIT DEV_LABEL "  0x%02X: "
  2429.     "0x%08Xn", i,
  2430.     (u32) readl(lanai->base + i));
  2431. barrier(); mb();
  2432. pcistatus_check(lanai, 0);
  2433. barrier(); mb();
  2434. }
  2435. return 0; }
  2436. case 2200004: {
  2437. u8 b;
  2438. u16 w;
  2439. u32 dw;
  2440. struct pci_dev *pci = lanai->pci;
  2441. (void) pci_read_config_word(pci, PCI_VENDOR_ID, &w);
  2442. DPRINTK("vendor = 0x%Xn", w);
  2443. (void) pci_read_config_word(pci, PCI_DEVICE_ID, &w);
  2444. DPRINTK("device = 0x%Xn", w);
  2445. (void) pci_read_config_word(pci, PCI_COMMAND, &w);
  2446. DPRINTK("command = 0x%Xn", w);
  2447. (void) pci_read_config_word(pci, PCI_STATUS, &w);
  2448. DPRINTK("status = 0x%Xn", w);
  2449. (void) pci_read_config_dword(pci,
  2450.     PCI_CLASS_REVISION, &dw);
  2451. DPRINTK("class/revision = 0x%Xn", dw);
  2452. (void) pci_read_config_byte(pci,
  2453.     PCI_CACHE_LINE_SIZE, &b);
  2454. DPRINTK("cache line size = 0x%Xn", b);
  2455. (void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b);
  2456. DPRINTK("latency = %d (0x%X)n", b, b);
  2457. (void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b);
  2458. DPRINTK("header type = 0x%Xn", b);
  2459. (void) pci_read_config_byte(pci, PCI_BIST, &b);
  2460. DPRINTK("bist = 0x%Xn", b);
  2461. /* skipping a few here */
  2462. (void) pci_read_config_byte(pci,
  2463.     PCI_INTERRUPT_LINE, &b);
  2464. DPRINTK("pci_int_line = 0x%Xn", b);
  2465. (void) pci_read_config_byte(pci,
  2466.     PCI_INTERRUPT_PIN, &b);
  2467. DPRINTK("pci_int_pin = 0x%Xn", b);
  2468. (void) pci_read_config_byte(pci, PCI_MIN_GNT, &b);
  2469. DPRINTK("min_gnt = 0x%Xn", b);
  2470. (void) pci_read_config_byte(pci, PCI_MAX_LAT, &b);
  2471. DPRINTK("max_lat = 0x%Xn", b); }
  2472. return 0;
  2473. #ifdef USE_POWERDOWN
  2474. case 2200005:
  2475. DPRINTK("Coming out of powerdownn");
  2476. lanai->conf1 &= ~CONFIG1_POWERDOWN;
  2477. conf1_write(lanai);
  2478. return 0;
  2479. #endif
  2480. default:
  2481. result = -EINVAL;
  2482. }
  2483. return result;
  2484. }
  2485. static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
  2486. {
  2487. struct lanai_vcc *lvcc = (struct lanai_vcc *) atmvcc->dev_data;
  2488. struct lanai_dev *lanai = (struct lanai_dev *) atmvcc->dev->dev_data;
  2489. unsigned long flags;
  2490. if (lvcc == NULL || lvcc->vbase == 0 || lvcc->tx.atmvcc != atmvcc)
  2491. goto einval;
  2492. #ifdef DEBUG
  2493. if (skb == NULL) {
  2494. DPRINTK("lanai_send: skb==NULL for vci=%dn", atmvcc->vci);
  2495. goto einval;
  2496. }
  2497. if (lanai == NULL) {
  2498. DPRINTK("lanai_send: lanai==NULL for vci=%dn", atmvcc->vci);
  2499. goto einval;
  2500. }
  2501. #endif
  2502. ATM_SKB(skb)->vcc = atmvcc;
  2503. switch (atmvcc->qos.aal) {
  2504. case ATM_AAL5:
  2505. spin_lock_irqsave(&lanai->txlock, flags);
  2506. vcc_tx_aal5(lanai, lvcc, skb);
  2507. spin_unlock_irqrestore(&lanai->txlock, flags);
  2508. return 0;
  2509. case ATM_AAL0:
  2510. if (skb->len != ATM_CELL_SIZE-1)
  2511. goto einval;
  2512.   /* NOTE - this next line is technically invalid - we haven't unshared skb */
  2513. cpu_to_be32s((u32 *) skb->data);
  2514. spin_lock_irqsave(&lanai->txlock, flags);
  2515. vcc_tx_aal0(lanai, lvcc, skb);
  2516. spin_unlock_irqrestore(&lanai->txlock, flags);
  2517. return 0;
  2518. }
  2519. DPRINTK("lanai_send: bad aal=%d on vci=%dn", atmvcc->qos.aal,
  2520.     atmvcc->vci);
  2521.     einval:
  2522. lanai_free_skb(atmvcc, skb);
  2523. return -EINVAL;
  2524. }
  2525. static int lanai_change_qos(struct atm_vcc *atmvcc,
  2526. /*const*/ struct atm_qos *qos, int flags)
  2527. {
  2528. return -EBUSY; /* TODO: need to write this */
  2529. }
  2530. #ifndef CONFIG_PROC_FS
  2531. #define lanai_proc_read NULL
  2532. #else
  2533. static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
  2534. {
  2535. struct lanai_dev *lanai = (struct lanai_dev *) atmdev->dev_data;
  2536. loff_t left = *pos;
  2537. struct lanai_vcc *lvcc;
  2538. if (left-- == 0)
  2539. return sprintf(page, DEV_LABEL "(itf %d): chip=LANAI%s, "
  2540.     "serial=%d, magic=0x%08X, num_vci=%dn",
  2541.     atmdev->number, lanai->type==lanai2 ? "2" : "HB",
  2542.     lanai->serialno, lanai->magicno, lanai->num_vci);
  2543. if (left-- == 0)
  2544. return sprintf(page, "revision: board=%d, pci_if=%dn",
  2545.     lanai->board_rev, lanai->pci_revision);
  2546. if (left-- == 0)
  2547. return sprintf(page, "EEPROM ESI: "
  2548.     "%02X:%02X:%02X:%02X:%02X:%02Xn",
  2549.     lanai->eeprom[EEPROM_MAC + 0],
  2550.     lanai->eeprom[EEPROM_MAC + 1],
  2551.     lanai->eeprom[EEPROM_MAC + 2],
  2552.     lanai->eeprom[EEPROM_MAC + 3],
  2553.     lanai->eeprom[EEPROM_MAC + 4],
  2554.     lanai->eeprom[EEPROM_MAC + 5]);
  2555. if (left-- == 0)
  2556. return sprintf(page, "status: SOOL=%d, LOCD=%d, LED=%d, "
  2557.     "GPIN=%dn", (lanai->status & STATUS_SOOL) ? 1 : 0,
  2558.     (lanai->status & STATUS_LOCD) ? 1 : 0,
  2559.     (lanai->status & STATUS_LED) ? 1 : 0,
  2560.     (lanai->status & STATUS_GPIN) ? 1 : 0);
  2561. if (left-- == 0)
  2562. return sprintf(page, "global buffer sizes: service=%d, "
  2563.     "aal0_rx=%dn", lanai_buf_size(&lanai->service),
  2564.     lanai->naal0 ? lanai_buf_size(&lanai->aal0buf) : 0);
  2565. if (left-- == 0) {
  2566. get_statistics(lanai);
  2567. return sprintf(page, "cells in error: overflow=%d, "
  2568.     "closed_vci=%d, bad_HEC=%d, rx_fifo=%dn",
  2569.     lanai->stats.ovfl_trash, lanai->stats.vci_trash,
  2570.     lanai->stats.hec_err, lanai->stats.atm_ovfl);
  2571. }
  2572. if (left-- == 0)
  2573. return sprintf(page, "PCI errors: parity_detect=%d, "
  2574.     "master_abort=%d, master_target_abort=%d,n",
  2575.     lanai->stats.pcierr_parity_detect,
  2576.     lanai->stats.pcierr_serr_set,
  2577.     lanai->stats.pcierr_m_target_abort);
  2578. if (left-- == 0)
  2579. return sprintf(page, "            slave_target_abort=%d, "
  2580.     "master_parity=%dn", lanai->stats.pcierr_s_target_abort,
  2581.     lanai->stats.pcierr_master_parity);
  2582. if (left-- == 0)
  2583. return sprintf(page, "service list errors: no_vcc_rx=%d, "
  2584.     "no_vcc_tx=%d,n", lanai->stats.service_novcc_rx,
  2585.     lanai->stats.service_novcc_tx);
  2586. if (left-- == 0)
  2587. return sprintf(page, "                     no_tx=%d, "
  2588.     "no_rx=%d, bad_rx_aal=%dn", lanai->stats.service_norx,
  2589.     lanai->stats.service_notx,
  2590.     lanai->stats.service_rxnotaal5);
  2591. if (left-- == 0)
  2592. return sprintf(page, "resets: dma=%d, card=%dn",
  2593.     lanai->stats.dma_reenable, lanai->stats.card_reset);
  2594. /* At this point, "left" should be the VCI we're looking for */
  2595. vcclist_read_lock();
  2596. for (; ; left++) {
  2597. if (left >= NUM_VCI) {
  2598. left = 0;
  2599. goto out;
  2600. }
  2601. if ((lvcc = lanai->vccs[left]) != NULL)
  2602. break;
  2603. (*pos)++;
  2604. }
  2605. /* Note that we re-use "left" here since we're done with it */
  2606. left = sprintf(page, "VCI %4d: nref=%d, rx_nomem=%d",  (vci_t) left,
  2607.     lvcc->nref, lvcc->stats.rx_nomem);
  2608. if (lvcc->rx.atmvcc != NULL) {
  2609. left += sprintf(&page[left], ",n          rx_AAL=%d",
  2610.     lvcc->rx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0);
  2611. if (lvcc->rx.atmvcc->qos.aal == ATM_AAL5)
  2612. left += sprintf(&page[left], ", rx_buf_size=%d, "
  2613.     "rx_bad_len=%d,n          rx_service_trash=%d, "
  2614.     "rx_service_stream=%d, rx_bad_crc=%d",
  2615.     lanai_buf_size(&lvcc->rx.buf),
  2616.     lvcc->stats.x.aal5.rx_badlen,
  2617.     lvcc->stats.x.aal5.service_trash,
  2618.     lvcc->stats.x.aal5.service_stream,
  2619.     lvcc->stats.x.aal5.service_rxcrc);
  2620. }
  2621. if (lvcc->tx.atmvcc != NULL)
  2622. left += sprintf(&page[left], ",n          tx_AAL=%d, "
  2623.     "tx_buf_size=%d, tx_qos=%cBR, tx_backlogged=%c",
  2624.     lvcc->tx.atmvcc->qos.aal == ATM_AAL5 ? 5 : 0,
  2625.     lanai_buf_size(&lvcc->tx.buf),
  2626.     lvcc->tx.atmvcc == lanai->cbrvcc ? 'C' : 'U',
  2627.     vcc_is_backlogged(lvcc) ? 'Y' : 'N');
  2628. page[left++] = 'n';
  2629. page[left] = '';
  2630.     out:
  2631. vcclist_read_unlock();
  2632. return left;
  2633. }
  2634. #endif /* CONFIG_PROC_FS */
  2635. /* -------------------- HOOKS: */
  2636. static const struct atmdev_ops ops = {
  2637. dev_close: lanai_dev_close,
  2638. open: lanai_open,
  2639. close: lanai_close,
  2640. ioctl: lanai_ioctl,
  2641. getsockopt: NULL,
  2642. setsockopt: NULL,
  2643. send: lanai_send,
  2644. sg_send: NULL, /* no scatter-gather on card */
  2645. send_oam: NULL, /* OAM support not in linux yet */
  2646. phy_put: NULL,
  2647. phy_get: NULL,
  2648. feedback: NULL,
  2649. change_qos: lanai_change_qos,
  2650. free_rx_skb: NULL,
  2651. proc_read: lanai_proc_read
  2652. };
  2653. /* detect one type of card LANAI2 or LANAIHB */
  2654. static int __init lanai_detect_1(unsigned int vendor, unsigned int device)
  2655. {
  2656. struct pci_dev *pci = NULL;
  2657. struct lanai_dev *lanai;
  2658. struct atm_dev *atmdev;
  2659. int count = 0, result;
  2660. while ((pci = pci_find_device(vendor, device, pci)) != NULL) {
  2661. lanai = (struct lanai_dev *)
  2662.     kmalloc(sizeof *lanai, GFP_KERNEL);
  2663. if (lanai == NULL) {
  2664. printk(KERN_ERR DEV_LABEL ": couldn't allocate "
  2665.     "dev_data structure!n");
  2666. break;
  2667. }
  2668. atmdev = atm_dev_register(DEV_LABEL, &ops, -1, 0);
  2669. if (atmdev == NULL) {
  2670. printk(KERN_ERR DEV_LABEL ": couldn't register "
  2671.     "atm device!n");
  2672. kfree(lanai);
  2673. break;
  2674. }
  2675. atmdev->dev_data = lanai;
  2676. lanai->pci = pci;
  2677. lanai->type = (enum lanai_type) device;
  2678. if ((result = lanai_dev_open(atmdev)) != 0) {
  2679. DPRINTK("lanai_start() failed, err=%dn", -result);
  2680. atm_dev_deregister(atmdev);
  2681. kfree(lanai);
  2682. continue;
  2683. }
  2684. count++;
  2685. }
  2686. return count;
  2687. }
  2688. #ifdef MODULE
  2689. static
  2690. #endif
  2691. int __init lanai_detect(void)
  2692. {
  2693. return lanai_detect_1(PCI_VENDOR_ID_EF, PCI_VENDOR_ID_EF_ATM_LANAI2) +
  2694.        lanai_detect_1(PCI_VENDOR_ID_EF, PCI_VENDOR_ID_EF_ATM_LANAIHB);
  2695. }
  2696. #ifdef MODULE
  2697. int init_module(void)
  2698. {
  2699. if (lanai_detect() == 0) {
  2700. printk(KERN_ERR DEV_LABEL ": no adaptor foundn");
  2701. return -ENODEV;
  2702. }
  2703. return 0;
  2704. }
  2705. void cleanup_module(void)
  2706. {
  2707. /* We'll only get called when all the interfaces are already
  2708.  * gone, so there isn't much to do
  2709.  */
  2710. DPRINTK("cleanup_module()n");
  2711. }
  2712. MODULE_AUTHOR("Mitchell Blank Jr <mitch@sfgoth.com>");
  2713. MODULE_DESCRIPTION("Efficient Networks Speedstream 3010 driver");
  2714. MODULE_LICENSE("GPL");
  2715. #endif /* MODULE */