zatm.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:48k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* drivers/atm/zatm.c - ZeitNet ZN122x device driver */
  2.  
  3. /* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
  4. #include <linux/config.h>
  5. #include <linux/module.h>
  6. #include <linux/sched.h>
  7. #include <linux/kernel.h>
  8. #include <linux/mm.h>
  9. #include <linux/pci.h>
  10. #include <linux/errno.h>
  11. #include <linux/atm.h>
  12. #include <linux/atmdev.h>
  13. #include <linux/sonet.h>
  14. #include <linux/skbuff.h>
  15. #include <linux/netdevice.h>
  16. #include <linux/delay.h>
  17. #include <linux/ioport.h> /* for request_region */
  18. #include <linux/uio.h>
  19. #include <linux/init.h>
  20. #include <linux/atm_zatm.h>
  21. #include <linux/capability.h>
  22. #include <linux/bitops.h>
  23. #include <asm/byteorder.h>
  24. #include <asm/system.h>
  25. #include <asm/string.h>
  26. #include <asm/io.h>
  27. #include <asm/atomic.h>
  28. #include <asm/uaccess.h>
  29. #include "uPD98401.h"
  30. #include "uPD98402.h"
  31. #include "zeprom.h"
  32. #include "zatm.h"
  33. /*
  34.  * TODO:
  35.  *
  36.  * Minor features
  37.  *  - support 64 kB SDUs (will have to use multibuffer batches then :-( )
  38.  *  - proper use of CDV, credit = max(1,CDVT*PCR)
  39.  *  - AAL0
  40.  *  - better receive timestamps
  41.  *  - OAM
  42.  */
  43. #if 0
  44. #define DPRINTK(format,args...) printk(KERN_DEBUG format,##args)
  45. #else
  46. #define DPRINTK(format,args...)
  47. #endif
  48. #ifndef __i386__
  49. #ifdef CONFIG_ATM_ZATM_EXACT_TS
  50. #warning Precise timestamping only available on i386 platform
  51. #undef CONFIG_ATM_ZATM_EXACT_TS
  52. #endif
  53. #endif
  54. #ifndef CONFIG_ATM_ZATM_DEBUG
  55. #define NULLCHECK(x)
  56. #define EVENT(s,a,b)
  57. static void event_dump(void)
  58. {
  59. }
  60. #else
  61. /* 
  62.  * NULL pointer checking
  63.  */
  64. #define NULLCHECK(x) 
  65.   if ((unsigned long) (x) < 0x30) printk(KERN_CRIT #x "==0x%xn", (int) (x))
  66. /*
  67.  * Very extensive activity logging. Greatly improves bug detection speed but
  68.  * costs a few Mbps if enabled.
  69.  */
  70. #define EV 64
  71. static const char *ev[EV];
  72. static unsigned long ev_a[EV],ev_b[EV];
  73. static int ec = 0;
  74. static void EVENT(const char *s,unsigned long a,unsigned long b)
  75. {
  76. ev[ec] = s; 
  77. ev_a[ec] = a;
  78. ev_b[ec] = b;
  79. ec = (ec+1) % EV;
  80. }
  81. static void event_dump(void)
  82. {
  83. int n,i;
  84. printk(KERN_NOTICE "----- event dump follows -----n");
  85. for (n = 0; n < EV; n++) {
  86. i = (ec+n) % EV;
  87. printk(KERN_NOTICE);
  88. printk(ev[i] ? ev[i] : "(null)",ev_a[i],ev_b[i]);
  89. }
  90. printk(KERN_NOTICE "----- event dump ends here -----n");
  91. }
  92. #endif /* CONFIG_ATM_ZATM_DEBUG */
  93. #define RING_BUSY 1 /* indication from do_tx that PDU has to be
  94.    backlogged */
  95. static struct atm_dev *zatm_boards = NULL;
  96. static unsigned long dummy[2] = {0,0};
  97. #define zin_n(r) inl(zatm_dev->base+r*4)
  98. #define zin(r) inl(zatm_dev->base+uPD98401_##r*4)
  99. #define zout(v,r) outl(v,zatm_dev->base+uPD98401_##r*4)
  100. #define zwait while (zin(CMR) & uPD98401_BUSY)
  101. /* RX0, RX1, TX0, TX1 */
  102. static const int mbx_entries[NR_MBX] = { 1024,1024,1024,1024 };
  103. static const int mbx_esize[NR_MBX] = { 16,16,4,4 }; /* entry size in bytes */
  104. #define MBX_SIZE(i) (mbx_entries[i]*mbx_esize[i])
  105. /*-------------------------------- utilities --------------------------------*/
  106. static void zpokel(struct zatm_dev *zatm_dev,u32 value,u32 addr)
  107. {
  108. zwait;
  109. zout(value,CER);
  110. zout(uPD98401_IND_ACC | uPD98401_IA_BALL |
  111.     (uPD98401_IA_TGT_CM << uPD98401_IA_TGT_SHIFT) | addr,CMR);
  112. }
  113. static u32 zpeekl(struct zatm_dev *zatm_dev,u32 addr)
  114. {
  115. zwait;
  116. zout(uPD98401_IND_ACC | uPD98401_IA_BALL | uPD98401_IA_RW |
  117.   (uPD98401_IA_TGT_CM << uPD98401_IA_TGT_SHIFT) | addr,CMR);
  118. zwait;
  119. return zin(CER);
  120. }
  121. /*------------------------------- free lists --------------------------------*/
  122. /*
  123.  * Free buffer head structure:
  124.  *   [0] pointer to buffer (for SAR)
  125.  *   [1] buffer descr link pointer (for SAR)
  126.  *   [2] back pointer to skb (for poll_rx)
  127.  *   [3] data
  128.  *   ...
  129.  */
  130. struct rx_buffer_head {
  131. u32 buffer; /* pointer to buffer (for SAR) */
  132. u32 link; /* buffer descriptor link pointer (for SAR) */
  133. struct sk_buff *skb; /* back pointer to skb (for poll_rx) */
  134. };
  135. static void refill_pool(struct atm_dev *dev,int pool)
  136. {
  137. struct zatm_dev *zatm_dev;
  138. struct sk_buff *skb;
  139. struct rx_buffer_head *first;
  140. unsigned long flags;
  141. int align,offset,free,count,size;
  142. EVENT("refill_pooln",0,0);
  143. zatm_dev = ZATM_DEV(dev);
  144. size = (64 << (pool <= ZATM_AAL5_POOL_BASE ? 0 :
  145.     pool-ZATM_AAL5_POOL_BASE))+sizeof(struct rx_buffer_head);
  146. if (size < PAGE_SIZE) {
  147. align = 32; /* for 32 byte alignment */
  148. offset = sizeof(struct rx_buffer_head);
  149. }
  150. else {
  151. align = 4096;
  152. offset = zatm_dev->pool_info[pool].offset+
  153.     sizeof(struct rx_buffer_head);
  154. }
  155. size += align;
  156. save_flags(flags);
  157. cli();
  158. free = zpeekl(zatm_dev,zatm_dev->pool_base+2*pool) &
  159.     uPD98401_RXFP_REMAIN;
  160. restore_flags(flags);
  161. if (free >= zatm_dev->pool_info[pool].low_water) return;
  162. EVENT("starting ... POOL: 0x%x, 0x%xn",
  163.     zpeekl(zatm_dev,zatm_dev->pool_base+2*pool),
  164.     zpeekl(zatm_dev,zatm_dev->pool_base+2*pool+1));
  165. EVENT("dummy: 0x%08lx, 0x%08lxn",dummy[0],dummy[1]);
  166. count = 0;
  167. first = NULL;
  168. while (free < zatm_dev->pool_info[pool].high_water) {
  169. struct rx_buffer_head *head;
  170. skb = alloc_skb(size,GFP_ATOMIC);
  171. if (!skb) {
  172. printk(KERN_WARNING DEV_LABEL "(Itf %d): got no new "
  173.     "skb (%d) with %d freen",dev->number,size,free);
  174. break;
  175. }
  176. skb_reserve(skb,(unsigned char *) ((((unsigned long) skb->data+
  177.     align+offset-1) & ~(unsigned long) (align-1))-offset)-
  178.     skb->data);
  179. head = (struct rx_buffer_head *) skb->data;
  180. skb_reserve(skb,sizeof(struct rx_buffer_head));
  181. if (!first) first = head;
  182. count++;
  183. head->buffer = virt_to_bus(skb->data);
  184. head->link = 0;
  185. head->skb = skb;
  186. EVENT("enq skb 0x%08lx/0x%08lxn",(unsigned long) skb,
  187.     (unsigned long) head);
  188. cli();
  189. if (zatm_dev->last_free[pool])
  190. ((struct rx_buffer_head *) (zatm_dev->last_free[pool]->
  191.     data))[-1].link = virt_to_bus(head);
  192. zatm_dev->last_free[pool] = skb;
  193. skb_queue_tail(&zatm_dev->pool[pool],skb);
  194. restore_flags(flags);
  195. free++;
  196. }
  197. if (first) {
  198. cli();
  199. zwait;
  200. zout(virt_to_bus(first),CER);
  201. zout(uPD98401_ADD_BAT | (pool << uPD98401_POOL_SHIFT) | count,
  202.     CMR);
  203. restore_flags(flags);
  204. EVENT ("POOL: 0x%x, 0x%xn",
  205.     zpeekl(zatm_dev,zatm_dev->pool_base+2*pool),
  206.     zpeekl(zatm_dev,zatm_dev->pool_base+2*pool+1));
  207. EVENT("dummy: 0x%08lx, 0x%08lxn",dummy[0],dummy[1]);
  208. }
  209. }
  210. static void drain_free(struct atm_dev *dev,int pool)
  211. {
  212. skb_queue_purge(&ZATM_DEV(dev)->pool[pool]);
  213. }
  214. static int pool_index(int max_pdu)
  215. {
  216. int i;
  217. if (max_pdu % ATM_CELL_PAYLOAD)
  218. printk(KERN_ERR DEV_LABEL ": driver error in pool_index: "
  219.     "max_pdu is %dn",max_pdu);
  220. if (max_pdu > 65536) return -1;
  221. for (i = 0; (64 << i) < max_pdu; i++);
  222. return i+ZATM_AAL5_POOL_BASE;
  223. }
  224. /* use_pool isn't reentrant */
  225. static void use_pool(struct atm_dev *dev,int pool)
  226. {
  227. struct zatm_dev *zatm_dev;
  228. unsigned long flags;
  229. int size;
  230. zatm_dev = ZATM_DEV(dev);
  231. if (!(zatm_dev->pool_info[pool].ref_count++)) {
  232. skb_queue_head_init(&zatm_dev->pool[pool]);
  233. size = pool-ZATM_AAL5_POOL_BASE;
  234. if (size < 0) size = 0; /* 64B... */
  235. else if (size > 10) size = 10; /* ... 64kB */
  236. save_flags(flags);
  237. cli();
  238. zpokel(zatm_dev,((zatm_dev->pool_info[pool].low_water/4) <<
  239.     uPD98401_RXFP_ALERT_SHIFT) |
  240.     (1 << uPD98401_RXFP_BTSZ_SHIFT) |
  241.     (size << uPD98401_RXFP_BFSZ_SHIFT),
  242.     zatm_dev->pool_base+pool*2);
  243. zpokel(zatm_dev,(unsigned long) dummy,zatm_dev->pool_base+
  244.     pool*2+1);
  245. restore_flags(flags);
  246. zatm_dev->last_free[pool] = NULL;
  247. refill_pool(dev,pool);
  248. }
  249. DPRINTK("pool %d: %dn",pool,zatm_dev->pool_info[pool].ref_count);
  250. }
  251. static void unuse_pool(struct atm_dev *dev,int pool)
  252. {
  253. if (!(--ZATM_DEV(dev)->pool_info[pool].ref_count))
  254. drain_free(dev,pool);
  255. }
  256. static void zatm_feedback(struct atm_vcc *vcc,struct sk_buff *skb,
  257.     unsigned long start,unsigned long dest,int len)
  258. {
  259. struct zatm_pool_info *pool;
  260. unsigned long offset,flags;
  261. DPRINTK("start 0x%08lx dest 0x%08lx len %dn",start,dest,len);
  262. if (len < PAGE_SIZE) return;
  263. pool = &ZATM_DEV(vcc->dev)->pool_info[ZATM_VCC(vcc)->pool];
  264. offset = (dest-start) & (PAGE_SIZE-1);
  265. save_flags(flags);
  266. cli();
  267. if (!offset || pool->offset == offset) {
  268. pool->next_cnt = 0;
  269. restore_flags(flags);
  270. return;
  271. }
  272. if (offset != pool->next_off) {
  273. pool->next_off = offset;
  274. pool->next_cnt = 0;
  275. restore_flags(flags);
  276. return;
  277. }
  278. if (++pool->next_cnt >= pool->next_thres) {
  279. pool->offset = pool->next_off;
  280. pool->next_cnt = 0;
  281. }
  282. restore_flags(flags);
  283. }
  284. /*----------------------- high-precision timestamps -------------------------*/
  285. #ifdef CONFIG_ATM_ZATM_EXACT_TS
  286. static struct timer_list sync_timer;
  287. /*
  288.  * Note: the exact time is not normalized, i.e. tv_usec can be > 1000000.
  289.  * This must be handled by higher layers.
  290.  */
  291. static inline struct timeval exact_time(struct zatm_dev *zatm_dev,u32 ticks)
  292. {
  293. struct timeval tmp;
  294. tmp = zatm_dev->last_time;
  295. tmp.tv_usec += ((s64) (ticks-zatm_dev->last_clk)*
  296.     (s64) zatm_dev->factor) >> TIMER_SHIFT;
  297. return tmp;
  298. }
  299. static void zatm_clock_sync(unsigned long dummy)
  300. {
  301. struct atm_dev *atm_dev;
  302. struct zatm_dev *zatm_dev;
  303. for (atm_dev = zatm_boards; atm_dev; atm_dev = zatm_dev->more) {
  304. unsigned long flags,interval;
  305. int diff;
  306. struct timeval now,expected;
  307. u32 ticks;
  308. zatm_dev = ZATM_DEV(atm_dev);
  309. save_flags(flags);
  310. cli();
  311. ticks = zpeekl(zatm_dev,uPD98401_TSR);
  312. do_gettimeofday(&now);
  313. restore_flags(flags);
  314. expected = exact_time(zatm_dev,ticks);
  315. diff = 1000000*(expected.tv_sec-now.tv_sec)+
  316.     (expected.tv_usec-now.tv_usec);
  317. zatm_dev->timer_history[zatm_dev->th_curr].real = now;
  318. zatm_dev->timer_history[zatm_dev->th_curr].expected = expected;
  319. zatm_dev->th_curr = (zatm_dev->th_curr+1) &
  320.     (ZATM_TIMER_HISTORY_SIZE-1);
  321. interval = 1000000*(now.tv_sec-zatm_dev->last_real_time.tv_sec)
  322.     +(now.tv_usec-zatm_dev->last_real_time.tv_usec);
  323. if (diff >= -ADJ_REP_THRES && diff <= ADJ_REP_THRES)
  324. zatm_dev->timer_diffs = 0;
  325. else
  326. #ifndef AGGRESSIVE_DEBUGGING
  327. if (++zatm_dev->timer_diffs >= ADJ_MSG_THRES)
  328. #endif
  329. {
  330. zatm_dev->timer_diffs = 0;
  331. printk(KERN_INFO DEV_LABEL ": TSR update after %ld us:"
  332.     " calculation differed by %d usn",interval,diff);
  333. #ifdef AGGRESSIVE_DEBUGGING
  334. printk(KERN_DEBUG "  %d.%08d -> %d.%08d (%lu)n",
  335.     zatm_dev->last_real_time.tv_sec,
  336.     zatm_dev->last_real_time.tv_usec,
  337.     now.tv_sec,now.tv_usec,interval);
  338. printk(KERN_DEBUG "  %u -> %u (%d)n",
  339.     zatm_dev->last_clk,ticks,ticks-zatm_dev->last_clk);
  340. printk(KERN_DEBUG "  factor %un",zatm_dev->factor);
  341. #endif
  342. }
  343. if (diff < -ADJ_IGN_THRES || diff > ADJ_IGN_THRES) {
  344.     /* filter out any major changes (e.g. time zone setup and
  345.        such) */
  346. zatm_dev->last_time = now;
  347. zatm_dev->factor =
  348.     (1000 << TIMER_SHIFT)/(zatm_dev->khz+1);
  349. }
  350. else {
  351. zatm_dev->last_time = expected;
  352. /*
  353.  * Is the accuracy of udelay really only about 1:300 on
  354.  * a 90 MHz Pentium ? Well, the following line avoids
  355.  * the problem, but ...
  356.  *
  357.  * What it does is simply:
  358.  *
  359.  * zatm_dev->factor = (interval << TIMER_SHIFT)/
  360.  *     (ticks-zatm_dev->last_clk);
  361.  */
  362. #define S(x) #x /* "stringification" ... */
  363. #define SX(x) S(x)
  364. asm("movl %2,%%ebxnt"
  365.     "subl %3,%%ebxnt"
  366.     "xorl %%edx,%%edxnt"
  367.     "shldl $" SX(TIMER_SHIFT) ",%1,%%edxnt"
  368.     "shl $" SX(TIMER_SHIFT) ",%1nt"
  369.     "divl %%ebxnt"
  370.     : "=a" (zatm_dev->factor)
  371.     : "0" (interval-diff),"g" (ticks),
  372.       "g" (zatm_dev->last_clk)
  373.     : "ebx","edx","cc");
  374. #undef S
  375. #undef SX
  376. #ifdef AGGRESSIVE_DEBUGGING
  377. printk(KERN_DEBUG "  (%ld << %d)/(%u-%u) = %un",
  378.     interval,TIMER_SHIFT,ticks,zatm_dev->last_clk,
  379.     zatm_dev->factor);
  380. #endif
  381. }
  382. zatm_dev->last_real_time = now;
  383. zatm_dev->last_clk = ticks;
  384. }
  385. mod_timer(&sync_timer,sync_timer.expires+POLL_INTERVAL*HZ);
  386. }
  387. static void __init zatm_clock_init(struct zatm_dev *zatm_dev)
  388. {
  389. static int start_timer = 1;
  390. unsigned long flags;
  391. zatm_dev->factor = (1000 << TIMER_SHIFT)/(zatm_dev->khz+1);
  392. zatm_dev->timer_diffs = 0;
  393. memset(zatm_dev->timer_history,0,sizeof(zatm_dev->timer_history));
  394. zatm_dev->th_curr = 0;
  395. save_flags(flags);
  396. cli();
  397. do_gettimeofday(&zatm_dev->last_time);
  398. zatm_dev->last_clk = zpeekl(zatm_dev,uPD98401_TSR);
  399. if (start_timer) {
  400. start_timer = 0;
  401. init_timer(&sync_timer);
  402. sync_timer.expires = jiffies+POLL_INTERVAL*HZ;
  403. sync_timer.function = zatm_clock_sync;
  404. add_timer(&sync_timer);
  405. }
  406. restore_flags(flags);
  407. }
  408. #endif
  409. /*----------------------------------- RX ------------------------------------*/
  410. #if 0
  411. static void exception(struct atm_vcc *vcc)
  412. {
  413.    static int count = 0;
  414.    struct zatm_dev *zatm_dev = ZATM_DEV(vcc->dev);
  415.    struct zatm_vcc *zatm_vcc = ZATM_VCC(vcc);
  416.    unsigned long *qrp;
  417.    int i;
  418.    if (count++ > 2) return;
  419.    for (i = 0; i < 8; i++)
  420. printk("TX%d: 0x%08lxn",i,
  421.   zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+i));
  422.    for (i = 0; i < 5; i++)
  423. printk("SH%d: 0x%08lxn",i,
  424.   zpeekl(zatm_dev,uPD98401_IM(zatm_vcc->shaper)+16*i));
  425.    qrp = (unsigned long *) zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+
  426.      uPD98401_TXVC_QRP);
  427.    printk("qrp=0x%08lxn",(unsigned long) qrp);
  428.    for (i = 0; i < 4; i++) printk("QRP[%d]: 0x%08lx",i,qrp[i]);
  429. }
  430. #endif
  431. static const char *err_txt[] = {
  432. "No error",
  433. "RX buf underflow",
  434. "RX FIFO overrun",
  435. "Maximum len violation",
  436. "CRC error",
  437. "User abort",
  438. "Length violation",
  439. "T1 error",
  440. "Deactivated",
  441. "???",
  442. "???",
  443. "???",
  444. "???",
  445. "???",
  446. "???",
  447. "???"
  448. };
  449. static void poll_rx(struct atm_dev *dev,int mbx)
  450. {
  451. struct zatm_dev *zatm_dev;
  452. unsigned long pos;
  453. u32 x;
  454. int error;
  455. EVENT("poll_rxn",0,0);
  456. zatm_dev = ZATM_DEV(dev);
  457. pos = (zatm_dev->mbx_start[mbx] & ~0xffffUL) | zin(MTA(mbx));
  458. while (x = zin(MWA(mbx)), (pos & 0xffff) != x) {
  459. u32 *here;
  460. struct sk_buff *skb;
  461. struct atm_vcc *vcc;
  462. int cells,size,chan;
  463. EVENT("MBX: host 0x%lx, nic 0x%xn",pos,x);
  464. here = (u32 *) pos;
  465. if (((pos += 16) & 0xffff) == zatm_dev->mbx_end[mbx])
  466. pos = zatm_dev->mbx_start[mbx];
  467. cells = here[0] & uPD98401_AAL5_SIZE;
  468. #if 0
  469. printk("RX IND: 0x%x, 0x%x, 0x%x, 0x%xn",here[0],here[1],here[2],here[3]);
  470. {
  471. unsigned long *x;
  472. printk("POOL: 0x%08x, 0x%08xn",zpeekl(zatm_dev,
  473.       zatm_dev->pool_base),
  474.       zpeekl(zatm_dev,zatm_dev->pool_base+1));
  475. x = (unsigned long *) here[2];
  476. printk("[0..3] = 0x%08lx, 0x%08lx, 0x%08lx, 0x%08lxn",
  477.     x[0],x[1],x[2],x[3]);
  478. }
  479. #endif
  480. error = 0;
  481. if (here[3] & uPD98401_AAL5_ERR) {
  482. error = (here[3] & uPD98401_AAL5_ES) >>
  483.     uPD98401_AAL5_ES_SHIFT;
  484. if (error == uPD98401_AAL5_ES_DEACT ||
  485.     error == uPD98401_AAL5_ES_FREE) continue;
  486. }
  487. EVENT("error code 0x%x/0x%xn",(here[3] & uPD98401_AAL5_ES) >>
  488.   uPD98401_AAL5_ES_SHIFT,error);
  489. skb = ((struct rx_buffer_head *) bus_to_virt(here[2]))->skb;
  490. #ifdef CONFIG_ATM_ZATM_EXACT_TS
  491. skb->stamp = exact_time(zatm_dev,here[1]);
  492. #else
  493. skb->stamp = xtime;
  494. #endif
  495. #if 0
  496. printk("[-3..0] 0x%08lx 0x%08lx 0x%08lx 0x%08lxn",((unsigned *) skb->data)[-3],
  497.   ((unsigned *) skb->data)[-2],((unsigned *) skb->data)[-1],
  498.   ((unsigned *) skb->data)[0]);
  499. #endif
  500. EVENT("skb 0x%lx, here 0x%lxn",(unsigned long) skb,
  501.     (unsigned long) here);
  502. #if 0
  503. printk("dummy: 0x%08lx, 0x%08lxn",dummy[0],dummy[1]);
  504. #endif
  505. size = error ? 0 : ntohs(((u16 *) skb->data)[cells*
  506.     ATM_CELL_PAYLOAD/sizeof(u16)-3]);
  507. EVENT("got skb 0x%lx, size %dn",(unsigned long) skb,size);
  508. chan = (here[3] & uPD98401_AAL5_CHAN) >>
  509.     uPD98401_AAL5_CHAN_SHIFT;
  510. if (chan < zatm_dev->chans && zatm_dev->rx_map[chan]) {
  511. vcc = zatm_dev->rx_map[chan];
  512. if (skb == zatm_dev->last_free[ZATM_VCC(vcc)->pool])
  513. zatm_dev->last_free[ZATM_VCC(vcc)->pool] = NULL;
  514. skb_unlink(skb);
  515. }
  516. else {
  517. printk(KERN_ERR DEV_LABEL "(itf %d): RX indication "
  518.     "for non-existing channeln",dev->number);
  519. size = 0;
  520. vcc = NULL;
  521. event_dump();
  522. }
  523. if (error) {
  524. static unsigned long silence = 0;
  525. static int last_error = 0;
  526. if (error != last_error ||
  527.     time_after(jiffies, silence)  || silence == 0){
  528. printk(KERN_WARNING DEV_LABEL "(itf %d): "
  529.     "chan %d error %sn",dev->number,chan,
  530.     err_txt[error]);
  531. last_error = error;
  532. silence = (jiffies+2*HZ)|1;
  533. }
  534. size = 0;
  535. }
  536. if (size && (size > cells*ATM_CELL_PAYLOAD-ATM_AAL5_TRAILER ||
  537.     size <= (cells-1)*ATM_CELL_PAYLOAD-ATM_AAL5_TRAILER)) {
  538. printk(KERN_ERR DEV_LABEL "(itf %d): size %d with %d "
  539.     "cellsn",dev->number,size,cells);
  540. size = 0;
  541. event_dump();
  542. }
  543. if (size > ATM_MAX_AAL5_PDU) {
  544. printk(KERN_ERR DEV_LABEL "(itf %d): size too big "
  545.     "(%d)n",dev->number,size);
  546. size = 0;
  547. event_dump();
  548. }
  549. if (!size) {
  550. dev_kfree_skb_irq(skb);
  551. if (vcc) atomic_inc(&vcc->stats->rx_err);
  552. continue;
  553. }
  554. if (!atm_charge(vcc,skb->truesize)) {
  555. dev_kfree_skb_irq(skb);
  556. continue;
  557. }
  558. skb->len = size;
  559. ATM_SKB(skb)->vcc = vcc;
  560. vcc->push(vcc,skb);
  561. atomic_inc(&vcc->stats->rx);
  562. }
  563. zout(pos & 0xffff,MTA(mbx));
  564. #if 0 /* probably a stupid idea */
  565. refill_pool(dev,zatm_vcc->pool);
  566. /* maybe this saves us a few interrupts */
  567. #endif
  568. }
  569. static int open_rx_first(struct atm_vcc *vcc)
  570. {
  571. struct zatm_dev *zatm_dev;
  572. struct zatm_vcc *zatm_vcc;
  573. unsigned long flags;
  574. unsigned short chan;
  575. int cells;
  576. DPRINTK("open_rx_first (0x%x)n",inb_p(0xc053));
  577. zatm_dev = ZATM_DEV(vcc->dev);
  578. zatm_vcc = ZATM_VCC(vcc);
  579. zatm_vcc->rx_chan = 0;
  580. if (vcc->qos.rxtp.traffic_class == ATM_NONE) return 0;
  581. if (vcc->qos.aal == ATM_AAL5) {
  582. if (vcc->qos.rxtp.max_sdu > 65464)
  583. vcc->qos.rxtp.max_sdu = 65464;
  584. /* fix this - we may want to receive 64kB SDUs
  585.    later */
  586. cells = (vcc->qos.rxtp.max_sdu+ATM_AAL5_TRAILER+
  587.     ATM_CELL_PAYLOAD-1)/ATM_CELL_PAYLOAD;
  588. zatm_vcc->pool = pool_index(cells*ATM_CELL_PAYLOAD);
  589. }
  590. else {
  591. cells = 1;
  592. zatm_vcc->pool = ZATM_AAL0_POOL;
  593. }
  594. if (zatm_vcc->pool < 0) return -EMSGSIZE;
  595. save_flags(flags);
  596. cli();
  597. zwait;
  598. zout(uPD98401_OPEN_CHAN,CMR);
  599. zwait;
  600. DPRINTK("0x%x 0x%xn",zin(CMR),zin(CER));
  601. chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT;
  602. restore_flags(flags);
  603. DPRINTK("chan is %dn",chan);
  604. if (!chan) return -EAGAIN;
  605. use_pool(vcc->dev,zatm_vcc->pool);
  606. DPRINTK("pool %dn",zatm_vcc->pool);
  607. /* set up VC descriptor */
  608. cli();
  609. zpokel(zatm_dev,zatm_vcc->pool << uPD98401_RXVC_POOL_SHIFT,
  610.     chan*VC_SIZE/4);
  611. zpokel(zatm_dev,uPD98401_RXVC_OD | (vcc->qos.aal == ATM_AAL5 ?
  612.     uPD98401_RXVC_AR : 0) | cells,chan*VC_SIZE/4+1);
  613. zpokel(zatm_dev,0,chan*VC_SIZE/4+2);
  614. zatm_vcc->rx_chan = chan;
  615. zatm_dev->rx_map[chan] = vcc;
  616. restore_flags(flags);
  617. return 0;
  618. }
  619. static int open_rx_second(struct atm_vcc *vcc)
  620. {
  621. struct zatm_dev *zatm_dev;
  622. struct zatm_vcc *zatm_vcc;
  623. unsigned long flags;
  624. int pos,shift;
  625. DPRINTK("open_rx_second (0x%x)n",inb_p(0xc053));
  626. zatm_dev = ZATM_DEV(vcc->dev);
  627. zatm_vcc = ZATM_VCC(vcc);
  628. if (!zatm_vcc->rx_chan) return 0;
  629. save_flags(flags);
  630. cli();
  631. /* should also handle VPI @@@ */
  632. pos = vcc->vci >> 1;
  633. shift = (1-(vcc->vci & 1)) << 4;
  634. zpokel(zatm_dev,(zpeekl(zatm_dev,pos) & ~(0xffff << shift)) |
  635.     ((zatm_vcc->rx_chan | uPD98401_RXLT_ENBL) << shift),pos);
  636. restore_flags(flags);
  637. return 0;
  638. }
  639. static void close_rx(struct atm_vcc *vcc)
  640. {
  641. struct zatm_dev *zatm_dev;
  642. struct zatm_vcc *zatm_vcc;
  643. unsigned long flags;
  644. int pos,shift;
  645. zatm_vcc = ZATM_VCC(vcc);
  646. zatm_dev = ZATM_DEV(vcc->dev);
  647. if (!zatm_vcc->rx_chan) return;
  648. DPRINTK("close_rxn");
  649. /* disable receiver */
  650. save_flags(flags);
  651. if (vcc->vpi != ATM_VPI_UNSPEC && vcc->vci != ATM_VCI_UNSPEC) {
  652. cli();
  653. pos = vcc->vci >> 1;
  654. shift = (1-(vcc->vci & 1)) << 4;
  655. zpokel(zatm_dev,zpeekl(zatm_dev,pos) & ~(0xffff << shift),pos);
  656. zwait;
  657. zout(uPD98401_NOP,CMR);
  658. zwait;
  659. zout(uPD98401_NOP,CMR);
  660. restore_flags(flags);
  661. }
  662. cli();
  663. zwait;
  664. zout(uPD98401_DEACT_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan <<
  665.     uPD98401_CHAN_ADDR_SHIFT),CMR);
  666. zwait;
  667. udelay(10); /* why oh why ... ? */
  668. zout(uPD98401_CLOSE_CHAN | uPD98401_CHAN_RT | (zatm_vcc->rx_chan <<
  669.     uPD98401_CHAN_ADDR_SHIFT),CMR);
  670. zwait;
  671. if (!(zin(CMR) & uPD98401_CHAN_ADDR))
  672. printk(KERN_CRIT DEV_LABEL "(itf %d): can't close RX channel "
  673.     "%dn",vcc->dev->number,zatm_vcc->rx_chan);
  674. restore_flags(flags);
  675. zatm_dev->rx_map[zatm_vcc->rx_chan] = NULL;
  676. zatm_vcc->rx_chan = 0;
  677. unuse_pool(vcc->dev,zatm_vcc->pool);
  678. }
  679. static int start_rx(struct atm_dev *dev)
  680. {
  681. struct zatm_dev *zatm_dev;
  682. int size,i;
  683. DPRINTK("start_rxn");
  684. zatm_dev = ZATM_DEV(dev);
  685. size = sizeof(struct atm_vcc *)*zatm_dev->chans;
  686. zatm_dev->rx_map = (struct atm_vcc **) kmalloc(size,GFP_KERNEL);
  687. if (!zatm_dev->rx_map) return -ENOMEM;
  688. memset(zatm_dev->rx_map,0,size);
  689. /* set VPI/VCI split (use all VCIs and give what's left to VPIs) */
  690. zpokel(zatm_dev,(1 << dev->ci_range.vci_bits)-1,uPD98401_VRR);
  691. /* prepare free buffer pools */
  692. for (i = 0; i <= ZATM_LAST_POOL; i++) {
  693. zatm_dev->pool_info[i].ref_count = 0;
  694. zatm_dev->pool_info[i].rqa_count = 0;
  695. zatm_dev->pool_info[i].rqu_count = 0;
  696. zatm_dev->pool_info[i].low_water = LOW_MARK;
  697. zatm_dev->pool_info[i].high_water = HIGH_MARK;
  698. zatm_dev->pool_info[i].offset = 0;
  699. zatm_dev->pool_info[i].next_off = 0;
  700. zatm_dev->pool_info[i].next_cnt = 0;
  701. zatm_dev->pool_info[i].next_thres = OFF_CNG_THRES;
  702. }
  703. return 0;
  704. }
  705. /*----------------------------------- TX ------------------------------------*/
  706. static int do_tx(struct sk_buff *skb)
  707. {
  708. struct atm_vcc *vcc;
  709. struct zatm_dev *zatm_dev;
  710. struct zatm_vcc *zatm_vcc;
  711. u32 *dsc;
  712. unsigned long flags;
  713. EVENT("do_txn",0,0);
  714. DPRINTK("sending skb %pn",skb);
  715. vcc = ATM_SKB(skb)->vcc;
  716. zatm_dev = ZATM_DEV(vcc->dev);
  717. zatm_vcc = ZATM_VCC(vcc);
  718. EVENT("iovcnt=%dn",ATM_SKB(skb)->iovcnt,0);
  719. save_flags(flags);
  720. cli();
  721. if (!ATM_SKB(skb)->iovcnt) {
  722. if (zatm_vcc->txing == RING_ENTRIES-1) {
  723. restore_flags(flags);
  724. return RING_BUSY;
  725. }
  726. zatm_vcc->txing++;
  727. dsc = zatm_vcc->ring+zatm_vcc->ring_curr;
  728. zatm_vcc->ring_curr = (zatm_vcc->ring_curr+RING_WORDS) &
  729.     (RING_ENTRIES*RING_WORDS-1);
  730. dsc[1] = 0;
  731. dsc[2] = skb->len;
  732. dsc[3] = virt_to_bus(skb->data);
  733. mb();
  734. dsc[0] = uPD98401_TXPD_V | uPD98401_TXPD_DP | uPD98401_TXPD_SM
  735.     | (vcc->qos.aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 |
  736.     (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ?
  737.     uPD98401_CLPM_1 : uPD98401_CLPM_0));
  738. EVENT("dsc (0x%lx)n",(unsigned long) dsc,0);
  739. }
  740. else {
  741. printk("NONONONOO!!!!n");
  742. dsc = NULL;
  743. #if 0
  744. u32 *put;
  745. int i;
  746. dsc = (u32 *) kmalloc(uPD98401_TXPD_SIZE*2+
  747.     uPD98401_TXBD_SIZE*ATM_SKB(skb)->iovcnt,GFP_ATOMIC);
  748. if (!dsc) {
  749. if (vcc->pop) vcc->pop(vcc,skb);
  750. else dev_kfree_skb_irq(skb);
  751. return -EAGAIN;
  752. }
  753. /* @@@ should check alignment */
  754. put = dsc+8;
  755. dsc[0] = uPD98401_TXPD_V | uPD98401_TXPD_DP |
  756.     (vcc->aal == ATM_AAL5 ? uPD98401_TXPD_AAL5 : 0 |
  757.     (ATM_SKB(skb)->atm_options & ATM_ATMOPT_CLP ?
  758.     uPD98401_CLPM_1 : uPD98401_CLPM_0));
  759. dsc[1] = 0;
  760. dsc[2] = ATM_SKB(skb)->iovcnt*uPD98401_TXBD_SIZE;
  761. dsc[3] = virt_to_bus(put);
  762. for (i = 0; i < ATM_SKB(skb)->iovcnt; i++) {
  763. *put++ = ((struct iovec *) skb->data)[i].iov_len;
  764. *put++ = virt_to_bus(((struct iovec *)
  765.     skb->data)[i].iov_base);
  766. }
  767. put[-2] |= uPD98401_TXBD_LAST;
  768. #endif
  769. }
  770. ZATM_PRV_DSC(skb) = dsc;
  771. skb_queue_tail(&zatm_vcc->tx_queue,skb);
  772. DPRINTK("QRP=0x%08lxn",zpeekl(zatm_dev,zatm_vcc->tx_chan*VC_SIZE/4+
  773.   uPD98401_TXVC_QRP));
  774. zwait;
  775. zout(uPD98401_TX_READY | (zatm_vcc->tx_chan <<
  776.     uPD98401_CHAN_ADDR_SHIFT),CMR);
  777. restore_flags(flags);
  778. EVENT("donen",0,0);
  779. return 0;
  780. }
  781. static inline void dequeue_tx(struct atm_vcc *vcc)
  782. {
  783. struct zatm_vcc *zatm_vcc;
  784. struct sk_buff *skb;
  785. EVENT("dequeue_txn",0,0);
  786. zatm_vcc = ZATM_VCC(vcc);
  787. skb = skb_dequeue(&zatm_vcc->tx_queue);
  788. if (!skb) {
  789. printk(KERN_CRIT DEV_LABEL "(itf %d): dequeue_tx but not "
  790.     "txingn",vcc->dev->number);
  791. return;
  792. }
  793. #if 0 /* @@@ would fail on CLP */
  794. if (*ZATM_PRV_DSC(skb) != (uPD98401_TXPD_V | uPD98401_TXPD_DP |
  795.   uPD98401_TXPD_SM | uPD98401_TXPD_AAL5)) printk("@#*$!!!!  (%08x)n",
  796.   *ZATM_PRV_DSC(skb));
  797. #endif
  798. *ZATM_PRV_DSC(skb) = 0; /* mark as invalid */
  799. zatm_vcc->txing--;
  800. if (vcc->pop) vcc->pop(vcc,skb);
  801. else dev_kfree_skb_irq(skb);
  802. while ((skb = skb_dequeue(&zatm_vcc->backlog)))
  803. if (do_tx(skb) == RING_BUSY) {
  804. skb_queue_head(&zatm_vcc->backlog,skb);
  805. break;
  806. }
  807. atomic_inc(&vcc->stats->tx);
  808. wake_up(&zatm_vcc->tx_wait);
  809. }
  810. static void poll_tx(struct atm_dev *dev,int mbx)
  811. {
  812. struct zatm_dev *zatm_dev;
  813. unsigned long pos;
  814. u32 x;
  815. EVENT("poll_txn",0,0);
  816. zatm_dev = ZATM_DEV(dev);
  817. pos = (zatm_dev->mbx_start[mbx] & ~0xffffUL) | zin(MTA(mbx));
  818. while (x = zin(MWA(mbx)), (pos & 0xffff) != x) {
  819. int chan;
  820. #if 1
  821. u32 data,*addr;
  822. EVENT("MBX: host 0x%lx, nic 0x%xn",pos,x);
  823. addr = (u32 *) pos;
  824. data = *addr;
  825. chan = (data & uPD98401_TXI_CONN) >> uPD98401_TXI_CONN_SHIFT;
  826. EVENT("addr = 0x%lx, data = 0x%08x,",(unsigned long) addr,
  827.     data);
  828. EVENT("chan = %dn",chan,0);
  829. #else
  830. NO !
  831. chan = (zatm_dev->mbx_start[mbx][pos >> 2] & uPD98401_TXI_CONN)
  832. >> uPD98401_TXI_CONN_SHIFT;
  833. #endif
  834. if (chan < zatm_dev->chans && zatm_dev->tx_map[chan])
  835. dequeue_tx(zatm_dev->tx_map[chan]);
  836. else {
  837. printk(KERN_CRIT DEV_LABEL "(itf %d): TX indication "
  838.     "for non-existing channel %dn",dev->number,chan);
  839. event_dump();
  840. }
  841. if (((pos += 4) & 0xffff) == zatm_dev->mbx_end[mbx])
  842. pos = zatm_dev->mbx_start[mbx];
  843. }
  844. zout(pos & 0xffff,MTA(mbx));
  845. }
  846. /*
  847.  * BUG BUG BUG: Doesn't handle "new-style" rate specification yet.
  848.  */
  849. static int alloc_shaper(struct atm_dev *dev,int *pcr,int min,int max,int ubr)
  850. {
  851. struct zatm_dev *zatm_dev;
  852. unsigned long flags;
  853. unsigned long i,m,c;
  854. int shaper;
  855. DPRINTK("alloc_shaper (min = %d, max = %d)n",min,max);
  856. zatm_dev = ZATM_DEV(dev);
  857. if (!zatm_dev->free_shapers) return -EAGAIN;
  858. for (shaper = 0; !((zatm_dev->free_shapers >> shaper) & 1); shaper++);
  859. zatm_dev->free_shapers &= ~1 << shaper;
  860. if (ubr) {
  861. c = 5;
  862. i = m = 1;
  863. zatm_dev->ubr_ref_cnt++;
  864. zatm_dev->ubr = shaper;
  865. }
  866. else {
  867. if (min) {
  868. if (min <= 255) {
  869. i = min;
  870. m = ATM_OC3_PCR;
  871. }
  872. else {
  873. i = 255;
  874. m = ATM_OC3_PCR*255/min;
  875. }
  876. }
  877. else {
  878. if (max > zatm_dev->tx_bw) max = zatm_dev->tx_bw;
  879. if (max <= 255) {
  880. i = max;
  881. m = ATM_OC3_PCR;
  882. }
  883. else {
  884. i = 255;
  885. m = (ATM_OC3_PCR*255+max-1)/max;
  886. }
  887. }
  888. if (i > m) {
  889. printk(KERN_CRIT DEV_LABEL "shaper algorithm botched "
  890.     "[%d,%d] -> i=%ld,m=%ldn",min,max,i,m);
  891. m = i;
  892. }
  893. *pcr = i*ATM_OC3_PCR/m;
  894. c = 20; /* @@@ should use max_cdv ! */
  895. if ((min && *pcr < min) || (max && *pcr > max)) return -EINVAL;
  896. if (zatm_dev->tx_bw < *pcr) return -EAGAIN;
  897. zatm_dev->tx_bw -= *pcr;
  898. }
  899. save_flags(flags);
  900. cli();
  901. DPRINTK("i = %d, m = %d, PCR = %dn",i,m,*pcr);
  902. zpokel(zatm_dev,(i << uPD98401_IM_I_SHIFT) | m,uPD98401_IM(shaper));
  903. zpokel(zatm_dev,c << uPD98401_PC_C_SHIFT,uPD98401_PC(shaper));
  904. zpokel(zatm_dev,0,uPD98401_X(shaper));
  905. zpokel(zatm_dev,0,uPD98401_Y(shaper));
  906. zpokel(zatm_dev,uPD98401_PS_E,uPD98401_PS(shaper));
  907. restore_flags(flags);
  908. return shaper;
  909. }
  910. static void dealloc_shaper(struct atm_dev *dev,int shaper)
  911. {
  912. struct zatm_dev *zatm_dev;
  913. unsigned long flags;
  914. zatm_dev = ZATM_DEV(dev);
  915. if (shaper == zatm_dev->ubr) {
  916. if (--zatm_dev->ubr_ref_cnt) return;
  917. zatm_dev->ubr = -1;
  918. }
  919. save_flags(flags);
  920. cli();
  921. zpokel(zatm_dev,zpeekl(zatm_dev,uPD98401_PS(shaper)) & ~uPD98401_PS_E,
  922.     uPD98401_PS(shaper));
  923. restore_flags(flags);
  924. zatm_dev->free_shapers |= 1 << shaper;
  925. }
  926. static void close_tx(struct atm_vcc *vcc)
  927. {
  928. struct zatm_dev *zatm_dev;
  929. struct zatm_vcc *zatm_vcc;
  930. unsigned long flags;
  931. int chan;
  932. struct sk_buff *skb;
  933. int once = 1;
  934. zatm_vcc = ZATM_VCC(vcc);
  935. zatm_dev = ZATM_DEV(vcc->dev);
  936. chan = zatm_vcc->tx_chan;
  937. if (!chan) return;
  938. DPRINTK("close_txn");
  939. save_flags(flags);
  940. cli();
  941. while (skb_peek(&zatm_vcc->backlog)) {
  942. if (once) {
  943. printk("waiting for backlog to drain ...n");
  944. event_dump();
  945. once = 0;
  946. }
  947. sleep_on(&zatm_vcc->tx_wait);
  948. }
  949. once = 1;
  950. while ((skb = skb_peek(&zatm_vcc->tx_queue))) {
  951. if (once) {
  952. printk("waiting for TX queue to drain ... %pn",skb);
  953. event_dump();
  954. once = 0;
  955. }
  956. DPRINTK("waiting for TX queue to drain ... %pn",skb);
  957. sleep_on(&zatm_vcc->tx_wait);
  958. }
  959. #if 0
  960. zwait;
  961. zout(uPD98401_DEACT_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR);
  962. #endif
  963. zwait;
  964. zout(uPD98401_CLOSE_CHAN | (chan << uPD98401_CHAN_ADDR_SHIFT),CMR);
  965. zwait;
  966. if (!(zin(CMR) & uPD98401_CHAN_ADDR))
  967. printk(KERN_CRIT DEV_LABEL "(itf %d): can't close TX channel "
  968.     "%dn",vcc->dev->number,chan);
  969. restore_flags(flags);
  970. zatm_vcc->tx_chan = 0;
  971. zatm_dev->tx_map[chan] = NULL;
  972. if (zatm_vcc->shaper != zatm_dev->ubr) {
  973. zatm_dev->tx_bw += vcc->qos.txtp.min_pcr;
  974. dealloc_shaper(vcc->dev,zatm_vcc->shaper);
  975. }
  976. if (zatm_vcc->ring) kfree(zatm_vcc->ring);
  977. }
  978. static int open_tx_first(struct atm_vcc *vcc)
  979. {
  980. struct zatm_dev *zatm_dev;
  981. struct zatm_vcc *zatm_vcc;
  982. unsigned long flags;
  983. u32 *loop;
  984. unsigned short chan;
  985. int pcr,unlimited;
  986. DPRINTK("open_tx_firstn");
  987. zatm_dev = ZATM_DEV(vcc->dev);
  988. zatm_vcc = ZATM_VCC(vcc);
  989. zatm_vcc->tx_chan = 0;
  990. if (vcc->qos.txtp.traffic_class == ATM_NONE) return 0;
  991. save_flags(flags);
  992. cli();
  993. zwait;
  994. zout(uPD98401_OPEN_CHAN,CMR);
  995. zwait;
  996. DPRINTK("0x%x 0x%xn",zin(CMR),zin(CER));
  997. chan = (zin(CMR) & uPD98401_CHAN_ADDR) >> uPD98401_CHAN_ADDR_SHIFT;
  998. restore_flags(flags);
  999. DPRINTK("chan is %dn",chan);
  1000. if (!chan) return -EAGAIN;
  1001. unlimited = vcc->qos.txtp.traffic_class == ATM_UBR &&
  1002.     (!vcc->qos.txtp.max_pcr || vcc->qos.txtp.max_pcr == ATM_MAX_PCR ||
  1003.     vcc->qos.txtp.max_pcr >= ATM_OC3_PCR);
  1004. if (unlimited && zatm_dev->ubr != -1) zatm_vcc->shaper = zatm_dev->ubr;
  1005. else {
  1006. if (unlimited) vcc->qos.txtp.max_sdu = ATM_MAX_AAL5_PDU;
  1007. if ((zatm_vcc->shaper = alloc_shaper(vcc->dev,&pcr,
  1008.     vcc->qos.txtp.min_pcr,vcc->qos.txtp.max_pcr,unlimited))
  1009.     < 0) {
  1010. close_tx(vcc);
  1011. return zatm_vcc->shaper;
  1012. }
  1013. if (pcr > ATM_OC3_PCR) pcr = ATM_OC3_PCR;
  1014. vcc->qos.txtp.min_pcr = vcc->qos.txtp.max_pcr = pcr;
  1015. }
  1016. zatm_vcc->tx_chan = chan;
  1017. skb_queue_head_init(&zatm_vcc->tx_queue);
  1018. init_waitqueue_head(&zatm_vcc->tx_wait);
  1019. /* initialize ring */
  1020. zatm_vcc->ring = kmalloc(RING_SIZE,GFP_KERNEL);
  1021. if (!zatm_vcc->ring) return -ENOMEM;
  1022. memset(zatm_vcc->ring,0,RING_SIZE);
  1023. loop = zatm_vcc->ring+RING_ENTRIES*RING_WORDS;
  1024. loop[0] = uPD98401_TXPD_V;
  1025. loop[1] = loop[2] = 0;
  1026. loop[3] = virt_to_bus(zatm_vcc->ring);
  1027. zatm_vcc->ring_curr = 0;
  1028. zatm_vcc->txing = 0;
  1029. skb_queue_head_init(&zatm_vcc->backlog);
  1030. zpokel(zatm_dev,virt_to_bus(zatm_vcc->ring),
  1031.     chan*VC_SIZE/4+uPD98401_TXVC_QRP);
  1032. return 0;
  1033. }
  1034. static int open_tx_second(struct atm_vcc *vcc)
  1035. {
  1036. struct zatm_dev *zatm_dev;
  1037. struct zatm_vcc *zatm_vcc;
  1038. unsigned long flags;
  1039. DPRINTK("open_tx_secondn");
  1040. zatm_dev = ZATM_DEV(vcc->dev);
  1041. zatm_vcc = ZATM_VCC(vcc);
  1042. if (!zatm_vcc->tx_chan) return 0;
  1043. save_flags(flags);
  1044. /* set up VC descriptor */
  1045. cli();
  1046. zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4);
  1047. zpokel(zatm_dev,uPD98401_TXVC_L | (zatm_vcc->shaper <<
  1048.     uPD98401_TXVC_SHP_SHIFT) | (vcc->vpi << uPD98401_TXVC_VPI_SHIFT) |
  1049.     vcc->vci,zatm_vcc->tx_chan*VC_SIZE/4+1);
  1050. zpokel(zatm_dev,0,zatm_vcc->tx_chan*VC_SIZE/4+2);
  1051. restore_flags(flags);
  1052. zatm_dev->tx_map[zatm_vcc->tx_chan] = vcc;
  1053. return 0;
  1054. }
  1055. static int start_tx(struct atm_dev *dev)
  1056. {
  1057. struct zatm_dev *zatm_dev;
  1058. int i;
  1059. DPRINTK("start_txn");
  1060. zatm_dev = ZATM_DEV(dev);
  1061. zatm_dev->tx_map = (struct atm_vcc **) kmalloc(sizeof(struct atm_vcc *)*
  1062.     zatm_dev->chans,GFP_KERNEL);
  1063. if (!zatm_dev->tx_map) return -ENOMEM;
  1064. zatm_dev->tx_bw = ATM_OC3_PCR;
  1065. zatm_dev->free_shapers = (1 << NR_SHAPERS)-1;
  1066. zatm_dev->ubr = -1;
  1067. zatm_dev->ubr_ref_cnt = 0;
  1068. /* initialize shapers */
  1069. for (i = 0; i < NR_SHAPERS; i++) zpokel(zatm_dev,0,uPD98401_PS(i));
  1070. return 0;
  1071. }
  1072. /*------------------------------- interrupts --------------------------------*/
  1073. static void zatm_int(int irq,void *dev_id,struct pt_regs *regs)
  1074. {
  1075. struct atm_dev *dev;
  1076. struct zatm_dev *zatm_dev;
  1077. u32 reason;
  1078. dev = dev_id;
  1079. zatm_dev = ZATM_DEV(dev);
  1080. while ((reason = zin(GSR))) {
  1081. EVENT("reason 0x%xn",reason,0);
  1082. if (reason & uPD98401_INT_PI) {
  1083. EVENT("PHY intn",0,0);
  1084. dev->phy->interrupt(dev);
  1085. }
  1086. if (reason & uPD98401_INT_RQA) {
  1087. unsigned long pools;
  1088. int i;
  1089. pools = zin(RQA);
  1090. EVENT("RQA (0x%08x)n",pools,0);
  1091. for (i = 0; pools; i++) {
  1092. if (pools & 1) {
  1093. refill_pool(dev,i);
  1094. zatm_dev->pool_info[i].rqa_count++;
  1095. }
  1096. pools >>= 1;
  1097. }
  1098. }
  1099. if (reason & uPD98401_INT_RQU) {
  1100. unsigned long pools;
  1101. int i;
  1102. pools = zin(RQU);
  1103. printk(KERN_WARNING DEV_LABEL "(itf %d): RQU 0x%08lxn",
  1104.     dev->number,pools);
  1105. event_dump();
  1106. for (i = 0; pools; i++) {
  1107. if (pools & 1) {
  1108. refill_pool(dev,i);
  1109. zatm_dev->pool_info[i].rqu_count++;
  1110. }
  1111. pools >>= 1;
  1112. }
  1113. }
  1114. /* don't handle RD */
  1115. if (reason & uPD98401_INT_SPE)
  1116. printk(KERN_ALERT DEV_LABEL "(itf %d): system parity "
  1117.     "error at 0x%08xn",dev->number,zin(ADDR));
  1118. if (reason & uPD98401_INT_CPE)
  1119. printk(KERN_ALERT DEV_LABEL "(itf %d): control memory "
  1120.     "parity error at 0x%08xn",dev->number,zin(ADDR));
  1121. if (reason & uPD98401_INT_SBE) {
  1122. printk(KERN_ALERT DEV_LABEL "(itf %d): system bus "
  1123.     "error at 0x%08xn",dev->number,zin(ADDR));
  1124. event_dump();
  1125. }
  1126. /* don't handle IND */
  1127. if (reason & uPD98401_INT_MF) {
  1128. printk(KERN_CRIT DEV_LABEL "(itf %d): mailbox full "
  1129.     "(0x%x)n",dev->number,(reason & uPD98401_INT_MF)
  1130.     >> uPD98401_INT_MF_SHIFT);
  1131. event_dump();
  1132.     /* @@@ should try to recover */
  1133. }
  1134. if (reason & uPD98401_INT_MM) {
  1135. if (reason & 1) poll_rx(dev,0);
  1136. if (reason & 2) poll_rx(dev,1);
  1137. if (reason & 4) poll_tx(dev,2);
  1138. if (reason & 8) poll_tx(dev,3);
  1139. }
  1140. /* @@@ handle RCRn */
  1141. }
  1142. }
  1143. /*----------------------------- (E)EPROM access -----------------------------*/
  1144. static void __init eprom_set(struct zatm_dev *zatm_dev,unsigned long value,
  1145.     unsigned short cmd)
  1146. {
  1147. int error;
  1148. if ((error = pci_write_config_dword(zatm_dev->pci_dev,cmd,value)))
  1149. printk(KERN_ERR DEV_LABEL ": PCI write failed (0x%02x)n",
  1150.     error);
  1151. }
  1152. static unsigned long __init eprom_get(struct zatm_dev *zatm_dev,
  1153.     unsigned short cmd)
  1154. {
  1155. unsigned int value;
  1156. int error;
  1157. if ((error = pci_read_config_dword(zatm_dev->pci_dev,cmd,&value)))
  1158. printk(KERN_ERR DEV_LABEL ": PCI read failed (0x%02x)n",
  1159.     error);
  1160. return value;
  1161. }
  1162. static void __init eprom_put_bits(struct zatm_dev *zatm_dev,
  1163.     unsigned long data,int bits,unsigned short cmd)
  1164. {
  1165. unsigned long value;
  1166. int i;
  1167. for (i = bits-1; i >= 0; i--) {
  1168. value = ZEPROM_CS | (((data >> i) & 1) ? ZEPROM_DI : 0);
  1169. eprom_set(zatm_dev,value,cmd);
  1170. eprom_set(zatm_dev,value | ZEPROM_SK,cmd);
  1171. eprom_set(zatm_dev,value,cmd);
  1172. }
  1173. }
  1174. static void __init eprom_get_byte(struct zatm_dev *zatm_dev,
  1175.     unsigned char *byte,unsigned short cmd)
  1176. {
  1177. int i;
  1178. *byte = 0;
  1179. for (i = 8; i; i--) {
  1180. eprom_set(zatm_dev,ZEPROM_CS,cmd);
  1181. eprom_set(zatm_dev,ZEPROM_CS | ZEPROM_SK,cmd);
  1182. *byte <<= 1;
  1183. if (eprom_get(zatm_dev,cmd) & ZEPROM_DO) *byte |= 1;
  1184. eprom_set(zatm_dev,ZEPROM_CS,cmd);
  1185. }
  1186. }
  1187. static unsigned char __init eprom_try_esi(struct atm_dev *dev,
  1188.     unsigned short cmd,int offset,int swap)
  1189. {
  1190. unsigned char buf[ZEPROM_SIZE];
  1191. struct zatm_dev *zatm_dev;
  1192. int i;
  1193. zatm_dev = ZATM_DEV(dev);
  1194. for (i = 0; i < ZEPROM_SIZE; i += 2) {
  1195. eprom_set(zatm_dev,ZEPROM_CS,cmd); /* select EPROM */
  1196. eprom_put_bits(zatm_dev,ZEPROM_CMD_READ,ZEPROM_CMD_LEN,cmd);
  1197. eprom_put_bits(zatm_dev,i >> 1,ZEPROM_ADDR_LEN,cmd);
  1198. eprom_get_byte(zatm_dev,buf+i+swap,cmd);
  1199. eprom_get_byte(zatm_dev,buf+i+1-swap,cmd);
  1200. eprom_set(zatm_dev,0,cmd); /* deselect EPROM */
  1201. }
  1202. memcpy(dev->esi,buf+offset,ESI_LEN);
  1203. return memcmp(dev->esi,"",ESI_LEN); /* assumes ESI_LEN == 6 */
  1204. }
  1205. static void __init eprom_get_esi(struct atm_dev *dev)
  1206. {
  1207. if (eprom_try_esi(dev,ZEPROM_V1_REG,ZEPROM_V1_ESI_OFF,1)) return;
  1208. (void) eprom_try_esi(dev,ZEPROM_V2_REG,ZEPROM_V2_ESI_OFF,0);
  1209. }
  1210. /*--------------------------------- entries ---------------------------------*/
  1211. static int __init zatm_init(struct atm_dev *dev)
  1212. {
  1213. struct zatm_dev *zatm_dev;
  1214. struct pci_dev *pci_dev;
  1215. unsigned short command;
  1216. unsigned char revision;
  1217. int error,i,last;
  1218. unsigned long t0,t1,t2;
  1219. DPRINTK(">zatm_initn");
  1220. zatm_dev = ZATM_DEV(dev);
  1221. pci_dev = zatm_dev->pci_dev;
  1222. zatm_dev->base = pci_resource_start(pci_dev, 0);
  1223. zatm_dev->irq = pci_dev->irq;
  1224. if ((error = pci_read_config_word(pci_dev,PCI_COMMAND,&command)) ||
  1225.     (error = pci_read_config_byte(pci_dev,PCI_REVISION_ID,&revision))) {
  1226. printk(KERN_ERR DEV_LABEL "(itf %d): init error 0x%02xn",
  1227.     dev->number,error);
  1228. return -EINVAL;
  1229. }
  1230. if ((error = pci_write_config_word(pci_dev,PCI_COMMAND,
  1231.     command | PCI_COMMAND_IO | PCI_COMMAND_MASTER))) {
  1232. printk(KERN_ERR DEV_LABEL "(itf %d): can't enable IO (0x%02x)"
  1233.     "n",dev->number,error);
  1234. return -EIO;
  1235. }
  1236. eprom_get_esi(dev);
  1237. printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d,base=0x%x,irq=%d,",
  1238.     dev->number,revision,zatm_dev->base,zatm_dev->irq);
  1239. /* reset uPD98401 */
  1240. zout(0,SWR);
  1241. while (!(zin(GSR) & uPD98401_INT_IND));
  1242. zout(uPD98401_GMR_ONE /*uPD98401_BURST4*/,GMR);
  1243. last = MAX_CRAM_SIZE;
  1244. for (i = last-RAM_INCREMENT; i >= 0; i -= RAM_INCREMENT) {
  1245. zpokel(zatm_dev,0x55555555,i);
  1246. if (zpeekl(zatm_dev,i) != 0x55555555) last = i;
  1247. else {
  1248. zpokel(zatm_dev,0xAAAAAAAA,i);
  1249. if (zpeekl(zatm_dev,i) != 0xAAAAAAAA) last = i;
  1250. else zpokel(zatm_dev,i,i);
  1251. }
  1252. }
  1253. for (i = 0; i < last; i += RAM_INCREMENT)
  1254. if (zpeekl(zatm_dev,i) != i) break;
  1255. zatm_dev->mem = i << 2;
  1256. while (i) zpokel(zatm_dev,0,--i);
  1257. /* reset again to rebuild memory pointers */
  1258. zout(0,SWR);
  1259. while (!(zin(GSR) & uPD98401_INT_IND));
  1260. zout(uPD98401_GMR_ONE | uPD98401_BURST8 | uPD98401_BURST4 |
  1261.     uPD98401_BURST2 | uPD98401_GMR_PM | uPD98401_GMR_DR,GMR);
  1262. /* TODO: should shrink allocation now */
  1263. printk("mem=%dkB,%s (",zatm_dev->mem >> 10,zatm_dev->copper ? "UTP" :
  1264.     "MMF");
  1265. for (i = 0; i < ESI_LEN; i++)
  1266. printk("%02X%s",dev->esi[i],i == ESI_LEN-1 ? ")n" : "-");
  1267. do {
  1268. unsigned long flags;
  1269. save_flags(flags);
  1270. cli();
  1271. t0 = zpeekl(zatm_dev,uPD98401_TSR);
  1272. udelay(10);
  1273. t1 = zpeekl(zatm_dev,uPD98401_TSR);
  1274. udelay(1010);
  1275. t2 = zpeekl(zatm_dev,uPD98401_TSR);
  1276. restore_flags(flags);
  1277. }
  1278. while (t0 > t1 || t1 > t2); /* loop if wrapping ... */
  1279. zatm_dev->khz = t2-2*t1+t0;
  1280. printk(KERN_NOTICE DEV_LABEL "(itf %d): uPD98401 %d.%d at %d.%03d "
  1281.     "MHzn",dev->number,
  1282.     (zin(VER) & uPD98401_MAJOR) >> uPD98401_MAJOR_SHIFT,
  1283.             zin(VER) & uPD98401_MINOR,zatm_dev->khz/1000,zatm_dev->khz % 1000);
  1284. #ifdef CONFIG_ATM_ZATM_EXACT_TS
  1285. zatm_clock_init(zatm_dev);
  1286. #endif
  1287. return uPD98402_init(dev);
  1288. }
  1289. static int __init zatm_start(struct atm_dev *dev)
  1290. {
  1291. struct zatm_dev *zatm_dev;
  1292. unsigned long curr;
  1293. int pools,vccs,rx;
  1294. int error,i,ld;
  1295. DPRINTK("zatm_startn");
  1296. zatm_dev = ZATM_DEV(dev);
  1297. zatm_dev->rx_map = zatm_dev->tx_map = NULL;
  1298. for (i = 0; i < NR_MBX; i++)
  1299. zatm_dev->mbx_start[i] = 0;
  1300. if (request_irq(zatm_dev->irq,&zatm_int,SA_SHIRQ,DEV_LABEL,dev)) {
  1301. printk(KERN_ERR DEV_LABEL "(itf %d): IRQ%d is already in usen",
  1302.     dev->number,zatm_dev->irq);
  1303. return -EAGAIN;
  1304. }
  1305. request_region(zatm_dev->base,uPD98401_PORTS,DEV_LABEL);
  1306. /* define memory regions */
  1307. pools = NR_POOLS;
  1308. if (NR_SHAPERS*SHAPER_SIZE > pools*POOL_SIZE)
  1309. pools = NR_SHAPERS*SHAPER_SIZE/POOL_SIZE;
  1310. vccs = (zatm_dev->mem-NR_SHAPERS*SHAPER_SIZE-pools*POOL_SIZE)/
  1311.     (2*VC_SIZE+RX_SIZE);
  1312. ld = -1;
  1313. for (rx = 1; rx < vccs; rx <<= 1) ld++;
  1314. dev->ci_range.vpi_bits = 0; /* @@@ no VPI for now */
  1315. dev->ci_range.vci_bits = ld;
  1316. dev->link_rate = ATM_OC3_PCR;
  1317. zatm_dev->chans = vccs; /* ??? */
  1318. curr = rx*RX_SIZE/4;
  1319. DPRINTK("RX pool 0x%08lxn",curr);
  1320. zpokel(zatm_dev,curr,uPD98401_PMA); /* receive pool */
  1321. zatm_dev->pool_base = curr;
  1322. curr += pools*POOL_SIZE/4;
  1323. DPRINTK("Shapers 0x%08lxn",curr);
  1324. zpokel(zatm_dev,curr,uPD98401_SMA); /* shapers */
  1325. curr += NR_SHAPERS*SHAPER_SIZE/4;
  1326. DPRINTK("Free    0x%08lxn",curr);
  1327. zpokel(zatm_dev,curr,uPD98401_TOS); /* free pool */
  1328. printk(KERN_INFO DEV_LABEL "(itf %d): %d shapers, %d pools, %d RX, "
  1329.     "%ld VCsn",dev->number,NR_SHAPERS,pools,rx,
  1330.     (zatm_dev->mem-curr*4)/VC_SIZE);
  1331. /* create mailboxes */
  1332. for (i = 0; i < NR_MBX; i++)
  1333. if (mbx_entries[i]) {
  1334. unsigned long here;
  1335. here = (unsigned long) kmalloc(2*MBX_SIZE(i),
  1336.     GFP_KERNEL);
  1337. if (!here) {
  1338. error = -ENOMEM;
  1339. goto out;
  1340. }
  1341. if ((here^(here+MBX_SIZE(i))) & ~0xffffUL)/* paranoia */
  1342. here = (here & ~0xffffUL)+0x10000;
  1343. zatm_dev->mbx_start[i] = here;
  1344. if ((here^virt_to_bus((void *) here)) & 0xffff) {
  1345. printk(KERN_ERR DEV_LABEL "(itf %d): system "
  1346.     "bus incompatible with drivern",
  1347.     dev->number);
  1348. error = -ENODEV;
  1349. goto out;
  1350. }
  1351. DPRINTK("mbx@0x%08lx-0x%08lxn",here,here+MBX_SIZE(i));
  1352. zatm_dev->mbx_end[i] = (here+MBX_SIZE(i)) & 0xffff;
  1353. zout(virt_to_bus((void *) here) >> 16,MSH(i));
  1354. zout(virt_to_bus((void *) here),MSL(i));
  1355. zout((here+MBX_SIZE(i)) & 0xffff,MBA(i));
  1356. zout(here & 0xffff,MTA(i));
  1357. zout(here & 0xffff,MWA(i));
  1358. }
  1359. error = start_tx(dev);
  1360. if (error) goto out;
  1361. error = start_rx(dev);
  1362. if (error) goto out;
  1363. error = dev->phy->start(dev);
  1364. if (error) goto out;
  1365. zout(0xffffffff,IMR); /* enable interrupts */
  1366. /* enable TX & RX */
  1367. zout(zin(GMR) | uPD98401_GMR_SE | uPD98401_GMR_RE,GMR);
  1368. return 0;
  1369.     out:
  1370. for (i = 0; i < NR_MBX; i++)
  1371. if (zatm_dev->mbx_start[i] != 0)
  1372. kfree((void *) zatm_dev->mbx_start[i]);
  1373. if (zatm_dev->rx_map != NULL)
  1374. kfree(zatm_dev->rx_map);
  1375. if (zatm_dev->tx_map != NULL)
  1376. kfree(zatm_dev->tx_map);
  1377. free_irq(zatm_dev->irq, dev);
  1378. return error;
  1379. }
  1380. static void zatm_close(struct atm_vcc *vcc)
  1381. {
  1382.         DPRINTK(">zatm_closen");
  1383.         if (!ZATM_VCC(vcc)) return;
  1384. clear_bit(ATM_VF_READY,&vcc->flags);
  1385.         close_rx(vcc);
  1386. EVENT("close_txn",0,0);
  1387.         close_tx(vcc);
  1388.         DPRINTK("zatm_close: done waitingn");
  1389.         /* deallocate memory */
  1390.         kfree(ZATM_VCC(vcc));
  1391.         ZATM_VCC(vcc) = NULL;
  1392. clear_bit(ATM_VF_ADDR,&vcc->flags);
  1393. }
  1394. static int zatm_open(struct atm_vcc *vcc,short vpi,int vci)
  1395. {
  1396. struct zatm_dev *zatm_dev;
  1397. struct zatm_vcc *zatm_vcc;
  1398. int error;
  1399. DPRINTK(">zatm_openn");
  1400. zatm_dev = ZATM_DEV(vcc->dev);
  1401. if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) ZATM_VCC(vcc) = NULL;
  1402. error = atm_find_ci(vcc,&vpi,&vci);
  1403. if (error) return error;
  1404. vcc->vpi = vpi;
  1405. vcc->vci = vci;
  1406. if (vci != ATM_VPI_UNSPEC && vpi != ATM_VCI_UNSPEC)
  1407. set_bit(ATM_VF_ADDR,&vcc->flags);
  1408. if (vcc->qos.aal != ATM_AAL5) return -EINVAL; /* @@@ AAL0 */
  1409. DPRINTK(DEV_LABEL "(itf %d): open %d.%dn",vcc->dev->number,vcc->vpi,
  1410.     vcc->vci);
  1411. if (!test_bit(ATM_VF_PARTIAL,&vcc->flags)) {
  1412. zatm_vcc = kmalloc(sizeof(struct zatm_vcc),GFP_KERNEL);
  1413. if (!zatm_vcc) {
  1414. clear_bit(ATM_VF_ADDR,&vcc->flags);
  1415. return -ENOMEM;
  1416. }
  1417. ZATM_VCC(vcc) = zatm_vcc;
  1418. ZATM_VCC(vcc)->tx_chan = 0; /* for zatm_close after open_rx */
  1419. if ((error = open_rx_first(vcc))) {
  1420.                 zatm_close(vcc);
  1421.                 return error;
  1422.         }
  1423. if ((error = open_tx_first(vcc))) {
  1424. zatm_close(vcc);
  1425. return error;
  1426.         }
  1427. }
  1428. if (vci == ATM_VPI_UNSPEC || vpi == ATM_VCI_UNSPEC) return 0;
  1429. if ((error = open_rx_second(vcc))) {
  1430. zatm_close(vcc);
  1431. return error;
  1432.         }
  1433. if ((error = open_tx_second(vcc))) {
  1434. zatm_close(vcc);
  1435. return error;
  1436.         }
  1437. set_bit(ATM_VF_READY,&vcc->flags);
  1438.         return 0;
  1439. }
  1440. static int zatm_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flags)
  1441. {
  1442. printk("Not yet implementedn");
  1443. return -ENOSYS;
  1444. /* @@@ */
  1445. }
  1446. static int zatm_ioctl(struct atm_dev *dev,unsigned int cmd,void *arg)
  1447. {
  1448. struct zatm_dev *zatm_dev;
  1449. unsigned long flags;
  1450. zatm_dev = ZATM_DEV(dev);
  1451. switch (cmd) {
  1452. case ZATM_GETPOOLZ:
  1453. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  1454. /* fall through */
  1455. case ZATM_GETPOOL:
  1456. {
  1457. struct zatm_pool_info info;
  1458. int pool;
  1459. if (get_user(pool,
  1460.     &((struct zatm_pool_req *) arg)->pool_num))
  1461. return -EFAULT;
  1462. if (pool < 0 || pool > ZATM_LAST_POOL)
  1463. return -EINVAL;
  1464. save_flags(flags);
  1465. cli();
  1466. info = zatm_dev->pool_info[pool];
  1467. if (cmd == ZATM_GETPOOLZ) {
  1468. zatm_dev->pool_info[pool].rqa_count = 0;
  1469. zatm_dev->pool_info[pool].rqu_count = 0;
  1470. }
  1471. restore_flags(flags);
  1472. return copy_to_user(
  1473.     &((struct zatm_pool_req *) arg)->info,
  1474.     &info,sizeof(info)) ? -EFAULT : 0;
  1475. }
  1476. case ZATM_SETPOOL:
  1477. {
  1478. struct zatm_pool_info info;
  1479. int pool;
  1480. if (!capable(CAP_NET_ADMIN)) return -EPERM;
  1481. if (get_user(pool,
  1482.     &((struct zatm_pool_req *) arg)->pool_num))
  1483. return -EFAULT;
  1484. if (pool < 0 || pool > ZATM_LAST_POOL)
  1485. return -EINVAL;
  1486. if (copy_from_user(&info,
  1487.     &((struct zatm_pool_req *) arg)->info,
  1488.     sizeof(info))) return -EFAULT;
  1489. if (!info.low_water)
  1490. info.low_water = zatm_dev->
  1491.     pool_info[pool].low_water;
  1492. if (!info.high_water)
  1493. info.high_water = zatm_dev->
  1494.     pool_info[pool].high_water;
  1495. if (!info.next_thres)
  1496. info.next_thres = zatm_dev->
  1497.     pool_info[pool].next_thres;
  1498. if (info.low_water >= info.high_water ||
  1499.     info.low_water < 0)
  1500. return -EINVAL;
  1501. save_flags(flags);
  1502. cli();
  1503. zatm_dev->pool_info[pool].low_water =
  1504.     info.low_water;
  1505. zatm_dev->pool_info[pool].high_water =
  1506.     info.high_water;
  1507. zatm_dev->pool_info[pool].next_thres =
  1508.     info.next_thres;
  1509. restore_flags(flags);
  1510. return 0;
  1511. }
  1512. #ifdef CONFIG_ATM_ZATM_EXACT_TS
  1513. case ZATM_GETTHIST:
  1514. {
  1515. int i;
  1516. struct zatm_t_hist hs[ZATM_TIMER_HISTORY_SIZE];
  1517. save_flags(flags);
  1518. cli();
  1519. for (i = 0; i < ZATM_TIMER_HISTORY_SIZE; i++)
  1520. hs[i] = zatm_dev->timer_history[
  1521.     (zatm_dev->th_curr+i) &
  1522.     (ZATM_TIMER_HISTORY_SIZE-1)];
  1523. restore_flags(flags);
  1524. return copy_to_user((struct zatm_t_hist *) arg,
  1525.     hs, sizeof(hs)) ? -EFAULT : 0;
  1526. }
  1527. #endif
  1528. default:
  1529.          if (!dev->phy->ioctl) return -ENOIOCTLCMD;
  1530.         return dev->phy->ioctl(dev,cmd,arg);
  1531. }
  1532. }
  1533. static int zatm_getsockopt(struct atm_vcc *vcc,int level,int optname,
  1534.     void *optval,int optlen)
  1535. {
  1536. return -EINVAL;
  1537. }
  1538. static int zatm_setsockopt(struct atm_vcc *vcc,int level,int optname,
  1539.     void *optval,int optlen)
  1540. {
  1541. return -EINVAL;
  1542. }
  1543. #if 0
  1544. static int zatm_sg_send(struct atm_vcc *vcc,unsigned long start,
  1545.     unsigned long size)
  1546. {
  1547. return vcc->aal == ATM_AAL5;
  1548.    /* @@@ should check size and maybe alignment*/
  1549. }
  1550. #endif
  1551. static int zatm_send(struct atm_vcc *vcc,struct sk_buff *skb)
  1552. {
  1553. int error;
  1554. EVENT(">zatm_send 0x%lxn",(unsigned long) skb,0);
  1555. if (!ZATM_VCC(vcc)->tx_chan || !test_bit(ATM_VF_READY,&vcc->flags)) {
  1556. if (vcc->pop) vcc->pop(vcc,skb);
  1557. else dev_kfree_skb(skb);
  1558. return -EINVAL;
  1559. }
  1560. if (!skb) {
  1561. printk(KERN_CRIT "!skb in zatm_send ?n");
  1562. if (vcc->pop) vcc->pop(vcc,skb);
  1563. return -EINVAL;
  1564. }
  1565. ATM_SKB(skb)->vcc = vcc;
  1566. error = do_tx(skb);
  1567. if (error != RING_BUSY) return error;
  1568. skb_queue_tail(&ZATM_VCC(vcc)->backlog,skb);
  1569. return 0;
  1570. }
  1571. static void zatm_phy_put(struct atm_dev *dev,unsigned char value,
  1572.     unsigned long addr)
  1573. {
  1574. struct zatm_dev *zatm_dev;
  1575. zatm_dev = ZATM_DEV(dev);
  1576. zwait;
  1577. zout(value,CER);
  1578. zout(uPD98401_IND_ACC | uPD98401_IA_B0 |
  1579.     (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
  1580. }
  1581. static unsigned char zatm_phy_get(struct atm_dev *dev,unsigned long addr)
  1582. {
  1583. struct zatm_dev *zatm_dev;
  1584. zatm_dev = ZATM_DEV(dev);
  1585. zwait;
  1586. zout(uPD98401_IND_ACC | uPD98401_IA_B0 | uPD98401_IA_RW |
  1587.   (uPD98401_IA_TGT_PHY << uPD98401_IA_TGT_SHIFT) | addr,CMR);
  1588. zwait;
  1589. return zin(CER) & 0xff;
  1590. }
  1591. static const struct atmdev_ops ops = {
  1592. open: zatm_open,
  1593. close: zatm_close,
  1594. ioctl: zatm_ioctl,
  1595. getsockopt: zatm_getsockopt,
  1596. setsockopt: zatm_setsockopt,
  1597. send: zatm_send,
  1598. /*zatm_sg_send*/
  1599. phy_put: zatm_phy_put,
  1600. phy_get: zatm_phy_get,
  1601. feedback: zatm_feedback,
  1602. change_qos: zatm_change_qos,
  1603. };
  1604. int __init zatm_detect(void)
  1605. {
  1606. struct atm_dev *dev;
  1607. struct zatm_dev *zatm_dev;
  1608. int devs,type;
  1609. zatm_dev = (struct zatm_dev *) kmalloc(sizeof(struct zatm_dev),
  1610.     GFP_KERNEL);
  1611. if (!zatm_dev) return -ENOMEM;
  1612. devs = 0;
  1613. for (type = 0; type < 2; type++) {
  1614. struct pci_dev *pci_dev;
  1615. pci_dev = NULL;
  1616. while ((pci_dev = pci_find_device(PCI_VENDOR_ID_ZEITNET,type ?
  1617.     PCI_DEVICE_ID_ZEITNET_1225 : PCI_DEVICE_ID_ZEITNET_1221,
  1618.     pci_dev))) {
  1619. if (pci_enable_device(pci_dev)) break;
  1620. dev = atm_dev_register(DEV_LABEL,&ops,-1,NULL);
  1621. if (!dev) break;
  1622. zatm_dev->pci_dev = pci_dev;
  1623. ZATM_DEV(dev) = zatm_dev;
  1624. zatm_dev->copper = type;
  1625. if (zatm_init(dev) || zatm_start(dev)) {
  1626. atm_dev_deregister(dev);
  1627. break;
  1628. }
  1629. zatm_dev->more = zatm_boards;
  1630. zatm_boards = dev;
  1631. devs++;
  1632. zatm_dev = (struct zatm_dev *) kmalloc(sizeof(struct
  1633.     zatm_dev),GFP_KERNEL);
  1634. if (!zatm_dev) {
  1635. printk(KERN_EMERG "zatm.c: memory shortagen");
  1636. return devs;
  1637. }
  1638. }
  1639. }
  1640. kfree(zatm_dev);
  1641. return devs;
  1642. }
  1643. #ifdef MODULE
  1644.  
  1645. MODULE_LICENSE("GPL");
  1646. int init_module(void)
  1647. {
  1648. if (!zatm_detect()) {
  1649. printk(KERN_ERR DEV_LABEL ": no adapter foundn");
  1650. return -ENXIO;
  1651. }
  1652. MOD_INC_USE_COUNT;
  1653. return 0;
  1654. }
  1655.  
  1656.  
  1657. void cleanup_module(void)
  1658. {
  1659. /*
  1660.  * Well, there's no way to get rid of the driver yet, so we don't
  1661.  * have to clean up, right ? :-)
  1662.  */
  1663. }
  1664.  
  1665. #endif