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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  tms380tr.c: A network driver library for Texas Instruments TMS380-based
  3.  *              Token Ring Adapters.
  4.  *
  5.  *  Originally sktr.c: Written 1997 by Christoph Goos
  6.  *
  7.  *  A fine result of the Linux Systems Network Architecture Project.
  8.  *  http://www.linux-sna.org
  9.  *
  10.  *  This software may be used and distributed according to the terms
  11.  *  of the GNU General Public License, incorporated herein by reference.
  12.  *
  13.  *  The following modules are currently available for card support:
  14.  * - tmspci (Generic PCI card support)
  15.  * - abyss (Madge PCI support)
  16.  *      - tmsisa (SysKonnect TR4/16 ISA)
  17.  *
  18.  *  Sources:
  19.  *   - The hardware related parts of this driver are take from
  20.  *     the SysKonnect Token Ring driver for Windows NT.
  21.  *   - I used the IBM Token Ring driver 'ibmtr.c' as a base for this
  22.  *     driver, as well as the 'skeleton.c' driver by Donald Becker.
  23.  *   - Also various other drivers in the linux source tree were taken
  24.  *     as samples for some tasks.
  25.  *      - TI TMS380 Second-Generation Token Ring User's Guide
  26.  *   - TI datasheets for respective chips
  27.  *   - David Hein at Texas Instruments 
  28.  *   - Various Madge employees
  29.  *
  30.  *  Maintainer(s):
  31.  *    JS Jay Schulist jschlst@samba.org
  32.  *    CG Christoph Goos cgoos@syskonnect.de
  33.  *    AF Adam Fritzler mid@auk.cx
  34.  *    MLP       Mike Phillips           phillim@amtrak.com
  35.  *    JF Jochen Friedrich jochen@scram.de
  36.  *     
  37.  *  Modification History:
  38.  * 29-Aug-97 CG Created
  39.  * 04-Apr-98 CG Fixed problems caused by tok_timer_check
  40.  * 10-Apr-98 CG Fixed lockups at cable disconnection
  41.  * 27-May-98 JS Formated to Linux Kernel Format
  42.  * 31-May-98 JS Hacked in PCI support
  43.  * 16-Jun-98 JS Modulized for multiple cards with one driver
  44.  *    Sep-99 AF Renamed to tms380tr (supports more than SK's)
  45.  *      23-Sep-99 AF      Added Compaq and Thomas-Conrad PCI support
  46.  * Fixed a bug causing double copies on PCI
  47.  * Fixed for new multicast stuff (2.2/2.3)
  48.  * 25-Sep-99 AF Uped TPL_NUM from 3 to 9
  49.  * Removed extraneous 'No free TPL'
  50.  * 22-Dec-99 AF Added Madge PCI Mk2 support and generalized
  51.  * parts of the initilization procedure.
  52.  * 30-Dec-99 AF Turned tms380tr into a library ala 8390.
  53.  * Madge support is provided in the abyss module
  54.  * Generic PCI support is in the tmspci module.
  55.  * 30-Nov-00 JF Updated PCI code to support IO MMU via
  56.  * pci_map_static(). Alpha uses this MMU for ISA
  57.  * as well.
  58.  *      14-Jan-01 JF Fix DMA on ifdown/ifup sequences. Some 
  59.  *       cleanup.
  60.  *      
  61.  *  To do:
  62.  *    1. Multi/Broadcast packet handling (this may have fixed itself)
  63.  *    2. Write a sktrisa module that includes the old ISA support (done)
  64.  *    3. Allow modules to load their own microcode
  65.  *    4. Speed up the BUD process -- freezing the kernel for 3+sec is
  66.  *         quite unacceptable.
  67.  *    5. Still a few remaining stalls when the cable is unplugged.
  68.  */
  69. #ifdef MODULE
  70. static const char version[] = "tms380tr.c: v1.08 14/01/2001 by Christoph Goos, Adam Fritzlern";
  71. #endif
  72. #include <linux/module.h>
  73. #include <linux/version.h>
  74. #include <linux/kernel.h>
  75. #include <linux/sched.h>
  76. #include <linux/types.h>
  77. #include <linux/fcntl.h>
  78. #include <linux/interrupt.h>
  79. #include <linux/ptrace.h>
  80. #include <linux/ioport.h>
  81. #include <linux/in.h>
  82. #include <linux/slab.h>
  83. #include <linux/string.h>
  84. #include <linux/time.h>
  85. #include <asm/system.h>
  86. #include <asm/bitops.h>
  87. #include <asm/io.h>
  88. #include <asm/dma.h>
  89. #include <asm/irq.h>
  90. #include <asm/uaccess.h>
  91. #include <linux/errno.h>
  92. #include <linux/init.h>
  93. #include <linux/pci.h>
  94. #include <linux/delay.h>
  95. #include <linux/netdevice.h>
  96. #include <linux/etherdevice.h>
  97. #include <linux/skbuff.h>
  98. #include <linux/trdevice.h>
  99. #include "tms380tr.h" /* Our Stuff */
  100. #include "tms380tr_microcode.h" /* TI microcode for COMMprocessor */
  101. /* Use 0 for production, 1 for verification, 2 for debug, and
  102.  * 3 for very verbose debug.
  103.  */
  104. #ifndef TMS380TR_DEBUG
  105. #define TMS380TR_DEBUG 0
  106. #endif
  107. static unsigned int tms380tr_debug = TMS380TR_DEBUG;
  108. /* Index to functions, as function prototypes.
  109.  * Alphabetical by function name.
  110.  */
  111. /* "A" */
  112. /* "B" */
  113. static int      tms380tr_bringup_diags(struct net_device *dev);
  114. /* "C" */
  115. static void tms380tr_cancel_tx_queue(struct net_local* tp);
  116. static int  tms380tr_chipset_init(struct net_device *dev);
  117. static void  tms380tr_chk_irq(struct net_device *dev);
  118. static void  tms380tr_chk_outstanding_cmds(struct net_device *dev);
  119. static void  tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr);
  120. static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType);
  121. int   tms380tr_close(struct net_device *dev);
  122. static void  tms380tr_cmd_status_irq(struct net_device *dev);
  123. /* "D" */
  124. static void  tms380tr_disable_interrupts(struct net_device *dev);
  125. #if TMS380TR_DEBUG > 0
  126. static void  tms380tr_dump(unsigned char *Data, int length);
  127. #endif
  128. /* "E" */
  129. static void  tms380tr_enable_interrupts(struct net_device *dev);
  130. static void  tms380tr_exec_cmd(struct net_device *dev, unsigned short Command);
  131. static void  tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue);
  132. /* "F" */
  133. /* "G" */
  134. static struct net_device_stats *tms380tr_get_stats(struct net_device *dev);
  135. /* "H" */
  136. static void  tms380tr_hardware_send_packet(struct net_device *dev,
  137. struct net_local* tp);
  138. /* "I" */
  139. static int  tms380tr_init_adapter(struct net_device *dev);
  140. static int  tms380tr_init_card(struct net_device *dev);
  141. static void  tms380tr_init_ipb(struct net_local *tp);
  142. static void  tms380tr_init_net_local(struct net_device *dev);
  143. static void  tms380tr_init_opb(struct net_device *dev);
  144. void   tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  145. /* "M" */
  146. /* "O" */
  147. int tms380tr_open(struct net_device *dev);
  148. static void tms380tr_open_adapter(struct net_device *dev);
  149. /* "P" */
  150. /* "R" */
  151. static void  tms380tr_rcv_status_irq(struct net_device *dev);
  152. static int  tms380tr_read_ptr(struct net_device *dev);
  153. static void  tms380tr_read_ram(struct net_device *dev, unsigned char *Data,
  154. unsigned short Address, int Length);
  155. static int  tms380tr_reset_adapter(struct net_device *dev);
  156. static void  tms380tr_reset_interrupt(struct net_device *dev);
  157. static void  tms380tr_ring_status_irq(struct net_device *dev);
  158. /* "S" */
  159. static int  tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev);
  160. static void  tms380tr_set_multicast_list(struct net_device *dev);
  161. static int tms380tr_set_mac_address(struct net_device *dev, void *addr);
  162. /* "T" */
  163. static void  tms380tr_timer_chk(unsigned long data);
  164. static void  tms380tr_timer_end_wait(unsigned long data);
  165. static void  tms380tr_tx_status_irq(struct net_device *dev);
  166. /* "U" */
  167. static void  tms380tr_update_rcv_stats(struct net_local *tp,
  168. unsigned char DataPtr[], unsigned int Length);
  169. /* "W" */
  170. void   tms380tr_wait(unsigned long time);
  171. static void  tms380tr_write_rpl_status(RPL *rpl, unsigned int Status);
  172. static void  tms380tr_write_tpl_status(TPL *tpl, unsigned int Status);
  173. #define SIFREADB(reg) (((struct net_local *)dev->priv)->sifreadb(dev, reg))
  174. #define SIFWRITEB(val, reg) (((struct net_local *)dev->priv)->sifwriteb(dev, val, reg))
  175. #define SIFREADW(reg) (((struct net_local *)dev->priv)->sifreadw(dev, reg))
  176. #define SIFWRITEW(val, reg) (((struct net_local *)dev->priv)->sifwritew(dev, val, reg))
  177. #if 0 /* TMS380TR_DEBUG > 0 */
  178. static int madgemc_sifprobe(struct net_device *dev)
  179. {
  180.         unsigned char old, chk1, chk2;
  181. old = SIFREADB(SIFADR);  /* Get the old SIFADR value */
  182.         chk1 = 0;       /* Begin with check value 0 */
  183.         do {
  184. madgemc_setregpage(dev, 0);
  185.                 /* Write new SIFADR value */
  186. SIFWRITEB(chk1, SIFADR);
  187. chk2 = SIFREADB(SIFADR);
  188. if (chk2 != chk1)
  189. return -1;
  190. madgemc_setregpage(dev, 1);
  191.                 /* Read, invert and write */
  192. chk2 = SIFREADB(SIFADD);
  193. if (chk2 != chk1)
  194. return -1;
  195. madgemc_setregpage(dev, 0);
  196.                 chk2 ^= 0x0FE;
  197. SIFWRITEB(chk2, SIFADR);
  198.                 /* Read, invert and compare */
  199. madgemc_setregpage(dev, 1);
  200. chk2 = SIFREADB(SIFADD);
  201. madgemc_setregpage(dev, 0);
  202.                 chk2 ^= 0x0FE;
  203.                 if(chk1 != chk2)
  204.                         return (-1);    /* No adapter */
  205.                 chk1 -= 2;
  206.         } while(chk1 != 0);     /* Repeat 128 times (all byte values) */
  207. madgemc_setregpage(dev, 0); /* sanity */
  208.         /* Restore the SIFADR value */
  209. SIFWRITEB(old, SIFADR);
  210.         return (0);
  211. }
  212. #endif
  213. /* Dummy function */
  214. static int __init tms380tr_init_card(struct net_device *dev)
  215. {
  216. if(tms380tr_debug > 3)
  217. printk("%s: tms380tr_init_cardn", dev->name);
  218. return (0);
  219. }
  220. /*
  221.  * Open/initialize the board. This is called sometime after
  222.  * booting when the 'ifconfig' program is run.
  223.  *
  224.  * This routine should set everything up anew at each open, even
  225.  * registers that "should" only need to be set once at boot, so that
  226.  * there is non-reboot way to recover if something goes wrong.
  227.  */
  228. int tms380tr_open(struct net_device *dev)
  229. {
  230. struct net_local *tp = (struct net_local *)dev->priv;
  231. int err;
  232. /* Reset the hardware here. Don't forget to set the station address. */
  233. if(dev->dma > 0) 
  234. {
  235. unsigned long flags=claim_dma_lock();
  236. disable_dma(dev->dma);
  237. set_dma_mode(dev->dma, DMA_MODE_CASCADE);
  238. enable_dma(dev->dma);
  239. release_dma_lock(flags);
  240. }
  241. err = tms380tr_chipset_init(dev);
  242.    if(err)
  243. {
  244. printk(KERN_INFO "%s: Chipset initialization errorn", 
  245. dev->name);
  246. return (-1);
  247. }
  248. init_timer(&tp->timer);
  249. tp->timer.expires = jiffies + 30*HZ;
  250. tp->timer.function = tms380tr_timer_end_wait;
  251. tp->timer.data = (unsigned long)dev;
  252. add_timer(&tp->timer);
  253. printk(KERN_INFO "%s: Adapter RAM size: %dKn", 
  254.        dev->name, tms380tr_read_ptr(dev));
  255. tms380tr_enable_interrupts(dev);
  256. tms380tr_open_adapter(dev);
  257. netif_start_queue(dev);
  258. /* Wait for interrupt from hardware. If interrupt does not come,
  259.  * there will be a timeout from the timer.
  260.  */
  261. tp->Sleeping = 1;
  262. interruptible_sleep_on(&tp->wait_for_tok_int);
  263. del_timer(&tp->timer);
  264. /* If AdapterVirtOpenFlag is 1, the adapter is now open for use */
  265. if(tp->AdapterVirtOpenFlag == 0)
  266. {
  267. tms380tr_disable_interrupts(dev);
  268. return (-1);
  269. }
  270. tp->StartTime = jiffies;
  271. /* Start function control timer */
  272. tp->timer.expires = jiffies + 2*HZ;
  273. tp->timer.function = tms380tr_timer_chk;
  274. tp->timer.data = (unsigned long)dev;
  275. add_timer(&tp->timer);
  276. return (0);
  277. }
  278. /*
  279.  * Timeout function while waiting for event
  280.  */
  281. static void tms380tr_timer_end_wait(unsigned long data)
  282. {
  283. struct net_device *dev = (struct net_device*)data;
  284. struct net_local *tp = (struct net_local *)dev->priv;
  285. if(tp->Sleeping)
  286. {
  287. tp->Sleeping = 0;
  288. wake_up_interruptible(&tp->wait_for_tok_int);
  289. }
  290. return;
  291. }
  292. /*
  293.  * Initialize the chipset
  294.  */
  295. static int tms380tr_chipset_init(struct net_device *dev)
  296. {
  297. struct net_local *tp = (struct net_local *)dev->priv;
  298. int err;
  299. tms380tr_init_ipb(tp);
  300. tms380tr_init_opb(dev);
  301. tms380tr_init_net_local(dev);
  302. if(tms380tr_debug > 3)
  303. printk(KERN_INFO "%s: Resetting adapter...n", dev->name);
  304. err = tms380tr_reset_adapter(dev);
  305. if(err < 0)
  306. return (-1);
  307. if(tms380tr_debug > 3)
  308. printk(KERN_INFO "%s: Bringup diags...n", dev->name);
  309. err = tms380tr_bringup_diags(dev);
  310. if(err < 0)
  311. return (-1);
  312. if(tms380tr_debug > 3)
  313. printk(KERN_INFO "%s: Init adapter...n", dev->name);
  314. err = tms380tr_init_adapter(dev);
  315. if(err < 0)
  316. return (-1);
  317. if(tms380tr_debug > 3)
  318. printk(KERN_INFO "%s: Done!n", dev->name);
  319. return (0);
  320. }
  321. /*
  322.  * Initializes the net_local structure.
  323.  */
  324. static void tms380tr_init_net_local(struct net_device *dev)
  325. {
  326. struct net_local *tp = (struct net_local *)dev->priv;
  327. int i;
  328. dma_addr_t dmabuf;
  329. tp->scb.CMD = 0;
  330. tp->scb.Parm[0] = 0;
  331. tp->scb.Parm[1] = 0;
  332. tp->ssb.STS = 0;
  333. tp->ssb.Parm[0] = 0;
  334. tp->ssb.Parm[1] = 0;
  335. tp->ssb.Parm[2] = 0;
  336. tp->CMDqueue = 0;
  337. tp->AdapterOpenFlag = 0;
  338. tp->AdapterVirtOpenFlag = 0;
  339. tp->ScbInUse = 0;
  340. tp->OpenCommandIssued = 0;
  341. tp->ReOpenInProgress = 0;
  342. tp->HaltInProgress = 0;
  343. tp->TransmitHaltScheduled = 0;
  344. tp->LobeWireFaultLogged = 0;
  345. tp->LastOpenStatus = 0;
  346. tp->MaxPacketSize = DEFAULT_PACKET_SIZE;
  347. skb_queue_head_init(&tp->SendSkbQueue);
  348. tp->QueueSkb = MAX_TX_QUEUE;
  349. /* Create circular chain of transmit lists */
  350. for (i = 0; i < TPL_NUM; i++)
  351. {
  352. tp->Tpl[i].NextTPLAddr = htonl(((char *)(&tp->Tpl[(i+1) % TPL_NUM]) - (char *)tp) + tp->dmabuffer); /* DMA buffer may be MMU driven */
  353. tp->Tpl[i].Status = 0;
  354. tp->Tpl[i].FrameSize = 0;
  355. tp->Tpl[i].FragList[0].DataCount = 0;
  356. tp->Tpl[i].FragList[0].DataAddr = 0;
  357. tp->Tpl[i].NextTPLPtr = &tp->Tpl[(i+1) % TPL_NUM];
  358. tp->Tpl[i].MData = NULL;
  359. tp->Tpl[i].TPLIndex = i;
  360. tp->Tpl[i].DMABuff = 0;
  361. tp->Tpl[i].BusyFlag = 0;
  362. }
  363. tp->TplFree = tp->TplBusy = &tp->Tpl[0];
  364. /* Create circular chain of receive lists */
  365. for (i = 0; i < RPL_NUM; i++)
  366. {
  367. tp->Rpl[i].NextRPLAddr = htonl(((char *)(&tp->Rpl[(i+1) % RPL_NUM]) - (char *)tp) + tp->dmabuffer); /* DMA buffer may be MMU driven */
  368. tp->Rpl[i].Status = (RX_VALID | RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
  369. tp->Rpl[i].FrameSize = 0;
  370. tp->Rpl[i].FragList[0].DataCount = cpu_to_be16((unsigned short)tp->MaxPacketSize);
  371. /* Alloc skb and point adapter to data area */
  372. tp->Rpl[i].Skb = dev_alloc_skb(tp->MaxPacketSize);
  373. tp->Rpl[i].DMABuff = 0;
  374. /* skb == NULL ? then use local buffer */
  375. if(tp->Rpl[i].Skb == NULL)
  376. {
  377. tp->Rpl[i].SkbStat = SKB_UNAVAILABLE;
  378. tp->Rpl[i].FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[i] - (char *)tp) + tp->dmabuffer);
  379. tp->Rpl[i].MData = tp->LocalRxBuffers[i];
  380. }
  381. else /* SKB != NULL */
  382. {
  383. tp->Rpl[i].Skb->dev = dev;
  384. skb_put(tp->Rpl[i].Skb, tp->MaxPacketSize);
  385. /* data unreachable for DMA ? then use local buffer */
  386. dmabuf = pci_map_single(tp->pdev, tp->Rpl[i].Skb->data, tp->MaxPacketSize, PCI_DMA_FROMDEVICE);
  387. if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit))
  388. {
  389. tp->Rpl[i].SkbStat = SKB_DATA_COPY;
  390. tp->Rpl[i].FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[i] - (char *)tp) + tp->dmabuffer);
  391. tp->Rpl[i].MData = tp->LocalRxBuffers[i];
  392. }
  393. else /* DMA directly in skb->data */
  394. {
  395. tp->Rpl[i].SkbStat = SKB_DMA_DIRECT;
  396. tp->Rpl[i].FragList[0].DataAddr = htonl(dmabuf);
  397. tp->Rpl[i].MData = tp->Rpl[i].Skb->data;
  398. tp->Rpl[i].DMABuff = dmabuf;
  399. }
  400. }
  401. tp->Rpl[i].NextRPLPtr = &tp->Rpl[(i+1) % RPL_NUM];
  402. tp->Rpl[i].RPLIndex = i;
  403. }
  404. tp->RplHead = &tp->Rpl[0];
  405. tp->RplTail = &tp->Rpl[RPL_NUM-1];
  406. tp->RplTail->Status = (RX_START_FRAME | RX_END_FRAME | RX_FRAME_IRQ);
  407. return;
  408. }
  409. /*
  410.  * Initializes the initialisation parameter block.
  411.  */
  412. static void tms380tr_init_ipb(struct net_local *tp)
  413. {
  414. tp->ipb.Init_Options = BURST_MODE;
  415. tp->ipb.CMD_Status_IV = 0;
  416. tp->ipb.TX_IV = 0;
  417. tp->ipb.RX_IV = 0;
  418. tp->ipb.Ring_Status_IV = 0;
  419. tp->ipb.SCB_Clear_IV = 0;
  420. tp->ipb.Adapter_CHK_IV = 0;
  421. tp->ipb.RX_Burst_Size = BURST_SIZE;
  422. tp->ipb.TX_Burst_Size = BURST_SIZE;
  423. tp->ipb.DMA_Abort_Thrhld = DMA_RETRIES;
  424. tp->ipb.SCB_Addr = 0;
  425. tp->ipb.SSB_Addr = 0;
  426. return;
  427. }
  428. /*
  429.  * Initializes the open parameter block.
  430.  */
  431. static void tms380tr_init_opb(struct net_device *dev)
  432. {
  433. struct net_local *tp;
  434. unsigned long Addr;
  435. unsigned short RplSize    = RPL_SIZE;
  436. unsigned short TplSize    = TPL_SIZE;
  437. unsigned short BufferSize = BUFFER_SIZE;
  438. int i;
  439. tp = (struct net_local *)dev->priv;
  440. tp->ocpl.OPENOptions   = 0;
  441. tp->ocpl.OPENOptions  |= ENABLE_FULL_DUPLEX_SELECTION;
  442. tp->ocpl.FullDuplex   = 0;
  443. tp->ocpl.FullDuplex  |= OPEN_FULL_DUPLEX_OFF;
  444.         /* 
  445.  * Set node address 
  446.  *
  447.  * We go ahead and put it in the OPB even though on
  448.  * most of the generic adapters this isn't required.
  449.  * Its simpler this way.  -- ASF
  450.  */
  451.         for (i=0;i<6;i++)
  452.                 tp->ocpl.NodeAddr[i] = ((unsigned char *)dev->dev_addr)[i];
  453. tp->ocpl.GroupAddr  = 0;
  454. tp->ocpl.FunctAddr  = 0;
  455. tp->ocpl.RxListSize  = cpu_to_be16((unsigned short)RplSize);
  456. tp->ocpl.TxListSize  = cpu_to_be16((unsigned short)TplSize);
  457. tp->ocpl.BufSize  = cpu_to_be16((unsigned short)BufferSize);
  458. tp->ocpl.Reserved  = 0;
  459. tp->ocpl.TXBufMin  = TX_BUF_MIN;
  460. tp->ocpl.TXBufMax  = TX_BUF_MAX;
  461. Addr = htonl(((char *)tp->ProductID - (char *)tp) + tp->dmabuffer);
  462. tp->ocpl.ProdIDAddr[0]  = LOWORD(Addr);
  463. tp->ocpl.ProdIDAddr[1]  = HIWORD(Addr);
  464. return;
  465. }
  466. /*
  467.  * Send OPEN command to adapter
  468.  */
  469. static void tms380tr_open_adapter(struct net_device *dev)
  470. {
  471. struct net_local *tp = (struct net_local *)dev->priv;
  472. if(tp->OpenCommandIssued)
  473. return;
  474. tp->OpenCommandIssued = 1;
  475. tms380tr_exec_cmd(dev, OC_OPEN);
  476. return;
  477. }
  478. /*
  479.  * Clear the adapter's interrupt flag. Clear system interrupt enable
  480.  * (SINTEN): disable adapter to system interrupts.
  481.  */
  482. static void tms380tr_disable_interrupts(struct net_device *dev)
  483. {
  484. SIFWRITEB(0, SIFACL);
  485. return;
  486. }
  487. /*
  488.  * Set the adapter's interrupt flag. Set system interrupt enable
  489.  * (SINTEN): enable adapter to system interrupts.
  490.  */
  491. static void tms380tr_enable_interrupts(struct net_device *dev)
  492. {
  493. SIFWRITEB(ACL_SINTEN, SIFACL);
  494. return;
  495. }
  496. /*
  497.  * Put command in command queue, try to execute it.
  498.  */
  499. static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command)
  500. {
  501. struct net_local *tp = (struct net_local *)dev->priv;
  502. tp->CMDqueue |= Command;
  503. tms380tr_chk_outstanding_cmds(dev);
  504. return;
  505. }
  506. static void tms380tr_timeout(struct net_device *dev)
  507. {
  508. /*
  509.  * If we get here, some higher level has decided we are broken.
  510.  * There should really be a "kick me" function call instead.
  511.  *
  512.  * Resetting the token ring adapter takes a long time so just
  513.  * fake transmission time and go on trying. Our own timeout
  514.  * routine is in tms380tr_timer_chk()
  515.  */
  516. dev->trans_start = jiffies;
  517. netif_wake_queue(dev);
  518. }
  519. /*
  520.  * Gets skb from system, queues it and checks if it can be sent
  521.  */
  522. static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev)
  523. {
  524. struct net_local *tp = (struct net_local *)dev->priv;
  525. /*
  526.  * Block transmits from overlapping. 
  527.  */
  528.  
  529. netif_stop_queue(dev);
  530. if(tp->QueueSkb == 0)
  531. return (1); /* Return with tbusy set: queue full */
  532. tp->QueueSkb--;
  533. skb_queue_tail(&tp->SendSkbQueue, skb);
  534. tms380tr_hardware_send_packet(dev, tp);
  535. if(tp->QueueSkb > 0)
  536. netif_wake_queue(dev);
  537. return (0);
  538. }
  539. /*
  540.  * Move frames from internal skb queue into adapter tx queue
  541.  */
  542. static void tms380tr_hardware_send_packet(struct net_device *dev, struct net_local* tp)
  543. {
  544. TPL *tpl;
  545. short length;
  546. unsigned char *buf;
  547. struct sk_buff *skb;
  548. int i;
  549. dma_addr_t dmabuf, newbuf;
  550.    
  551. for(;;)
  552. {
  553. /* Try to get a free TPL from the chain.
  554.  *
  555.  * NOTE: We *must* always leave one unused TPL in the chain, 
  556.  * because otherwise the adapter might send frames twice.
  557.  */
  558. if(tp->TplFree->NextTPLPtr->BusyFlag) /* No free TPL */
  559. {
  560. if (tms380tr_debug > 0)
  561. printk(KERN_INFO "%s: No free TPLn", dev->name);
  562. return;
  563. }
  564. /* Send first buffer from queue */
  565. skb = skb_dequeue(&tp->SendSkbQueue);
  566. if(skb == NULL)
  567. return;
  568. tp->QueueSkb++;
  569. dmabuf = 0;
  570. /* Is buffer reachable for Busmaster-DMA? */
  571. length = skb->len;
  572. dmabuf = pci_map_single(tp->pdev, skb->data, length, PCI_DMA_TODEVICE);
  573. if(tp->dmalimit && (dmabuf + length > tp->dmalimit))
  574. {
  575. /* Copy frame to local buffer */
  576. pci_unmap_single(tp->pdev, dmabuf, length, PCI_DMA_TODEVICE);
  577. dmabuf  = 0;
  578. i  = tp->TplFree->TPLIndex;
  579. buf  = tp->LocalTxBuffers[i];
  580. memcpy(buf, skb->data, length);
  581. newbuf  = ((char *)buf - (char *)tp) + tp->dmabuffer;
  582. }
  583. else
  584. {
  585. /* Send direct from skb->data */
  586. newbuf = dmabuf;
  587. buf = skb->data;
  588. }
  589. /* Source address in packet? */
  590. tms380tr_chk_src_addr(buf, dev->dev_addr);
  591. tp->LastSendTime = jiffies;
  592. tpl  = tp->TplFree; /* Get the "free" TPL */
  593. tpl->BusyFlag  = 1; /* Mark TPL as busy */
  594. tp->TplFree  = tpl->NextTPLPtr;
  595.     
  596. /* Save the skb for delayed return of skb to system */
  597. tpl->Skb = skb;
  598. tpl->DMABuff = dmabuf;
  599. tpl->FragList[0].DataCount = cpu_to_be16((unsigned short)length);
  600. tpl->FragList[0].DataAddr  = htonl(newbuf);
  601. /* Write the data length in the transmit list. */
  602. tpl->FrameSize  = cpu_to_be16((unsigned short)length);
  603. tpl->MData  = buf;
  604. /* Transmit the frame and set the status values. */
  605. tms380tr_write_tpl_status(tpl, TX_VALID | TX_START_FRAME
  606. | TX_END_FRAME | TX_PASS_SRC_ADDR
  607. | TX_FRAME_IRQ);
  608. /* Let adapter send the frame. */
  609. tms380tr_exec_sifcmd(dev, CMD_TX_VALID);
  610. }
  611. return;
  612. }
  613. /*
  614.  * Write the given value to the 'Status' field of the specified TPL.
  615.  * NOTE: This function should be used whenever the status of any TPL must be
  616.  * modified by the driver, because the compiler may otherwise change the
  617.  * order of instructions such that writing the TPL status may be executed at
  618.  * an undesireable time. When this function is used, the status is always
  619.  * written when the function is called.
  620.  */
  621. static void tms380tr_write_tpl_status(TPL *tpl, unsigned int Status)
  622. {
  623. tpl->Status = Status;
  624. }
  625. static void tms380tr_chk_src_addr(unsigned char *frame, unsigned char *hw_addr)
  626. {
  627. unsigned char SRBit;
  628. if((((unsigned long)frame[8]) & ~0x80) != 0) /* Compare 4 bytes */
  629. return;
  630. if((unsigned short)frame[12] != 0) /* Compare 2 bytes */
  631. return;
  632. SRBit = frame[8] & 0x80;
  633. memcpy(&frame[8], hw_addr, 6);
  634. frame[8] |= SRBit;
  635. return;
  636. }
  637. /*
  638.  * The timer routine: Check if adapter still open and working, reopen if not. 
  639.  */
  640. static void tms380tr_timer_chk(unsigned long data)
  641. {
  642. struct net_device *dev = (struct net_device*)data;
  643. struct net_local *tp = (struct net_local*)dev->priv;
  644. if(tp->HaltInProgress)
  645. return;
  646. tms380tr_chk_outstanding_cmds(dev);
  647. if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies)
  648. && (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy))
  649. {
  650. /* Anything to send, but stalled to long */
  651. tp->LastSendTime = jiffies;
  652. tms380tr_exec_cmd(dev, OC_CLOSE); /* Does reopen automatically */
  653. }
  654. tp->timer.expires = jiffies + 2*HZ;
  655. add_timer(&tp->timer);
  656. if(tp->AdapterOpenFlag || tp->ReOpenInProgress)
  657. return;
  658. tp->ReOpenInProgress = 1;
  659. tms380tr_open_adapter(dev);
  660. return;
  661. }
  662. /*
  663.  * The typical workload of the driver: Handle the network interface interrupts.
  664.  */
  665. void tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  666. {
  667. struct net_device *dev = dev_id;
  668. struct net_local *tp;
  669. unsigned short irq_type;
  670. if(dev == NULL) {
  671. printk("%s: irq %d for unknown device.n", dev->name, irq);
  672. return;
  673. }
  674. tp = (struct net_local *)dev->priv;
  675. irq_type = SIFREADW(SIFSTS);
  676. while(irq_type & STS_SYSTEM_IRQ) {
  677. irq_type &= STS_IRQ_MASK;
  678. if(!tms380tr_chk_ssb(tp, irq_type)) {
  679. printk(KERN_INFO "%s: DATA LATE occurredn", dev->name);
  680. break;
  681. }
  682. switch(irq_type) {
  683. case STS_IRQ_RECEIVE_STATUS:
  684. tms380tr_reset_interrupt(dev);
  685. tms380tr_rcv_status_irq(dev);
  686. break;
  687. case STS_IRQ_TRANSMIT_STATUS:
  688. /* Check if TRANSMIT.HALT command is complete */
  689. if(tp->ssb.Parm[0] & COMMAND_COMPLETE) {
  690. tp->TransmitCommandActive = 0;
  691. tp->TransmitHaltScheduled = 0;
  692. /* Issue a new transmit command. */
  693. tms380tr_exec_cmd(dev, OC_TRANSMIT);
  694. }
  695. tms380tr_reset_interrupt(dev);
  696. tms380tr_tx_status_irq(dev);
  697. break;
  698. case STS_IRQ_COMMAND_STATUS:
  699. /* The SSB contains status of last command
  700.  * other than receive/transmit.
  701.  */
  702. tms380tr_cmd_status_irq(dev);
  703. break;
  704. case STS_IRQ_SCB_CLEAR:
  705. /* The SCB is free for another command. */
  706. tp->ScbInUse = 0;
  707. tms380tr_chk_outstanding_cmds(dev);
  708. break;
  709. case STS_IRQ_RING_STATUS:
  710. tms380tr_ring_status_irq(dev);
  711. break;
  712. case STS_IRQ_ADAPTER_CHECK:
  713. tms380tr_chk_irq(dev);
  714. break;
  715. case STS_IRQ_LLC_STATUS:
  716. printk(KERN_DEBUG "tms380tr: unexpected LLC status IRQn");
  717. break;
  718. case STS_IRQ_TIMER:
  719. printk(KERN_DEBUG "tms380tr: unexpected Timer IRQn");
  720. break;
  721. case STS_IRQ_RECEIVE_PENDING:
  722. printk(KERN_DEBUG "tms380tr: unexpected Receive Pending IRQn");
  723. break;
  724. default:
  725. printk(KERN_INFO "Unknown Token Ring IRQ (0x%04x)n", irq_type);
  726. break;
  727. }
  728. /* Reset system interrupt if not already done. */
  729. if(irq_type != STS_IRQ_TRANSMIT_STATUS
  730. && irq_type != STS_IRQ_RECEIVE_STATUS) {
  731. tms380tr_reset_interrupt(dev);
  732. }
  733. irq_type = SIFREADW(SIFSTS);
  734. }
  735. return;
  736. }
  737. /*
  738.  *  Reset the INTERRUPT SYSTEM bit and issue SSB CLEAR command.
  739.  */
  740. static void tms380tr_reset_interrupt(struct net_device *dev)
  741. {
  742. struct net_local *tp = (struct net_local *)dev->priv;
  743. SSB *ssb = &tp->ssb;
  744. /*
  745.  * [Workaround for "Data Late"]
  746.  * Set all fields of the SSB to well-defined values so we can
  747.  * check if the adapter has written the SSB.
  748.  */
  749. ssb->STS = (unsigned short) -1;
  750. ssb->Parm[0]  = (unsigned short) -1;
  751. ssb->Parm[1]  = (unsigned short) -1;
  752. ssb->Parm[2]  = (unsigned short) -1;
  753. /* Free SSB by issuing SSB_CLEAR command after reading IRQ code
  754.  * and clear STS_SYSTEM_IRQ bit: enable adapter for further interrupts.
  755.  */
  756. tms380tr_exec_sifcmd(dev, CMD_SSB_CLEAR | CMD_CLEAR_SYSTEM_IRQ);
  757. return;
  758. }
  759. /*
  760.  * Check if the SSB has actually been written by the adapter.
  761.  */
  762. static unsigned char tms380tr_chk_ssb(struct net_local *tp, unsigned short IrqType)
  763. {
  764. SSB *ssb = &tp->ssb; /* The address of the SSB. */
  765. /* C 0 1 2 INTERRUPT CODE
  766.  * - - - - --------------
  767.  * 1 1 1 1 TRANSMIT STATUS
  768.  * 1 1 1 1 RECEIVE STATUS
  769.  * 1 ? ? 0 COMMAND STATUS
  770.  * 0 0 0 0 SCB CLEAR
  771.  * 1 1 0 0 RING STATUS
  772.  * 0 0 0 0 ADAPTER CHECK
  773.  *
  774.  * 0 = SSB field not affected by interrupt
  775.  * 1 = SSB field is affected by interrupt
  776.  *
  777.  * C = SSB ADDRESS +0: COMMAND
  778.  * 0 = SSB ADDRESS +2: STATUS 0
  779.  * 1 = SSB ADDRESS +4: STATUS 1
  780.  * 2 = SSB ADDRESS +6: STATUS 2
  781.  */
  782. /* Check if this interrupt does use the SSB. */
  783. if(IrqType != STS_IRQ_TRANSMIT_STATUS
  784. && IrqType != STS_IRQ_RECEIVE_STATUS
  785. && IrqType != STS_IRQ_COMMAND_STATUS
  786. && IrqType != STS_IRQ_RING_STATUS)
  787. {
  788. return (1); /* SSB not involved. */
  789. }
  790. /* Note: All fields of the SSB have been set to all ones (-1) after it
  791.  * has last been used by the software (see DriverIsr()).
  792.  *
  793.  * Check if the affected SSB fields are still unchanged.
  794.  */
  795. if(ssb->STS == (unsigned short) -1)
  796. return (0); /* Command field not yet available. */
  797. if(IrqType == STS_IRQ_COMMAND_STATUS)
  798. return (1); /* Status fields not always affected. */
  799. if(ssb->Parm[0] == (unsigned short) -1)
  800. return (0); /* Status 1 field not yet available. */
  801. if(IrqType == STS_IRQ_RING_STATUS)
  802. return (1); /* Status 2 & 3 fields not affected. */
  803. /* Note: At this point, the interrupt is either TRANSMIT or RECEIVE. */
  804. if(ssb->Parm[1] == (unsigned short) -1)
  805. return (0); /* Status 2 field not yet available. */
  806. if(ssb->Parm[2] == (unsigned short) -1)
  807. return (0); /* Status 3 field not yet available. */
  808. return (1); /* All SSB fields have been written by the adapter. */
  809. }
  810. /*
  811.  * Evaluates the command results status in the SSB status field.
  812.  */
  813. static void tms380tr_cmd_status_irq(struct net_device *dev)
  814. {
  815. struct net_local *tp = (struct net_local *)dev->priv;
  816. unsigned short ssb_cmd, ssb_parm_0;
  817. unsigned short ssb_parm_1;
  818. char *open_err = "Open error -";
  819. char *code_err = "Open code -";
  820. /* Copy the ssb values to local variables */
  821. ssb_cmd    = tp->ssb.STS;
  822. ssb_parm_0 = tp->ssb.Parm[0];
  823. ssb_parm_1 = tp->ssb.Parm[1];
  824. if(ssb_cmd == OPEN)
  825. {
  826. tp->Sleeping = 0;
  827. if(!tp->ReOpenInProgress)
  828.      wake_up_interruptible(&tp->wait_for_tok_int);
  829. tp->OpenCommandIssued = 0;
  830. tp->ScbInUse = 0;
  831. if((ssb_parm_0 & 0x00FF) == GOOD_COMPLETION)
  832. {
  833. /* Success, the adapter is open. */
  834. tp->LobeWireFaultLogged = 0;
  835. tp->AdapterOpenFlag  = 1;
  836. tp->AdapterVirtOpenFlag = 1;
  837. tp->TransmitCommandActive = 0;
  838. tms380tr_exec_cmd(dev, OC_TRANSMIT);
  839. tms380tr_exec_cmd(dev, OC_RECEIVE);
  840. if(tp->ReOpenInProgress)
  841. tp->ReOpenInProgress = 0;
  842. return;
  843. }
  844. else  /* The adapter did not open. */
  845. {
  846.      if(ssb_parm_0 & NODE_ADDR_ERROR)
  847. printk(KERN_INFO "%s: Node address errorn",
  848. dev->name);
  849.      if(ssb_parm_0 & LIST_SIZE_ERROR)
  850. printk(KERN_INFO "%s: List size errorn",
  851. dev->name);
  852.      if(ssb_parm_0 & BUF_SIZE_ERROR)
  853. printk(KERN_INFO "%s: Buffer size errorn",
  854. dev->name);
  855.      if(ssb_parm_0 & TX_BUF_COUNT_ERROR)
  856. printk(KERN_INFO "%s: Tx buffer count errorn",
  857. dev->name);
  858.      if(ssb_parm_0 & INVALID_OPEN_OPTION)
  859. printk(KERN_INFO "%s: Invalid open optionn",
  860. dev->name);
  861.      if(ssb_parm_0 & OPEN_ERROR)
  862. {
  863. /* Show the open phase. */
  864. switch(ssb_parm_0 & OPEN_PHASES_MASK)
  865. {
  866. case LOBE_MEDIA_TEST:
  867. if(!tp->LobeWireFaultLogged)
  868. {
  869. tp->LobeWireFaultLogged = 1;
  870. printk(KERN_INFO "%s: %s Lobe wire fault (check cable !).n", dev->name, open_err);
  871.      }
  872. tp->ReOpenInProgress = 1;
  873. tp->AdapterOpenFlag  = 0;
  874. tp->AdapterVirtOpenFlag = 1;
  875. tms380tr_open_adapter(dev);
  876. return;
  877. case PHYSICAL_INSERTION:
  878. printk(KERN_INFO "%s: %s Physical insertion.n", dev->name, open_err);
  879. break;
  880. case ADDRESS_VERIFICATION:
  881. printk(KERN_INFO "%s: %s Address verification.n", dev->name, open_err);
  882. break;
  883. case PARTICIPATION_IN_RING_POLL:
  884. printk(KERN_INFO "%s: %s Participation in ring poll.n", dev->name, open_err);
  885. break;
  886. case REQUEST_INITIALISATION:
  887. printk(KERN_INFO "%s: %s Request initialisation.n", dev->name, open_err);
  888. break;
  889. case FULLDUPLEX_CHECK:
  890. printk(KERN_INFO "%s: %s Full duplex check.n", dev->name, open_err);
  891. break;
  892. default:
  893. printk(KERN_INFO "%s: %s Unknown open phasen", dev->name, open_err);
  894. break;
  895. }
  896. /* Show the open errors. */
  897. switch(ssb_parm_0 & OPEN_ERROR_CODES_MASK)
  898. {
  899. case OPEN_FUNCTION_FAILURE:
  900. printk(KERN_INFO "%s: %s OPEN_FUNCTION_FAILURE", dev->name, code_err);
  901. tp->LastOpenStatus =
  902. OPEN_FUNCTION_FAILURE;
  903. break;
  904. case OPEN_SIGNAL_LOSS:
  905. printk(KERN_INFO "%s: %s OPEN_SIGNAL_LOSSn", dev->name, code_err);
  906. tp->LastOpenStatus =
  907. OPEN_SIGNAL_LOSS;
  908. break;
  909. case OPEN_TIMEOUT:
  910. printk(KERN_INFO "%s: %s OPEN_TIMEOUTn", dev->name, code_err);
  911. tp->LastOpenStatus =
  912. OPEN_TIMEOUT;
  913. break;
  914. case OPEN_RING_FAILURE:
  915. printk(KERN_INFO "%s: %s OPEN_RING_FAILUREn", dev->name, code_err);
  916. tp->LastOpenStatus =
  917. OPEN_RING_FAILURE;
  918. break;
  919. case OPEN_RING_BEACONING:
  920. printk(KERN_INFO "%s: %s OPEN_RING_BEACONINGn", dev->name, code_err);
  921. tp->LastOpenStatus =
  922. OPEN_RING_BEACONING;
  923. break;
  924. case OPEN_DUPLICATE_NODEADDR:
  925. printk(KERN_INFO "%s: %s OPEN_DUPLICATE_NODEADDRn", dev->name, code_err);
  926. tp->LastOpenStatus =
  927. OPEN_DUPLICATE_NODEADDR;
  928. break;
  929. case OPEN_REQUEST_INIT:
  930. printk(KERN_INFO "%s: %s OPEN_REQUEST_INITn", dev->name, code_err);
  931. tp->LastOpenStatus =
  932. OPEN_REQUEST_INIT;
  933. break;
  934. case OPEN_REMOVE_RECEIVED:
  935. printk(KERN_INFO "%s: %s OPEN_REMOVE_RECEIVED", dev->name, code_err);
  936. tp->LastOpenStatus =
  937. OPEN_REMOVE_RECEIVED;
  938. break;
  939. case OPEN_FULLDUPLEX_SET:
  940. printk(KERN_INFO "%s: %s OPEN_FULLDUPLEX_SETn", dev->name, code_err);
  941. tp->LastOpenStatus =
  942. OPEN_FULLDUPLEX_SET;
  943. break;
  944. default:
  945. printk(KERN_INFO "%s: %s Unknown open err code", dev->name, code_err);
  946. tp->LastOpenStatus =
  947. OPEN_FUNCTION_FAILURE;
  948. break;
  949. }
  950. }
  951. tp->AdapterOpenFlag  = 0;
  952. tp->AdapterVirtOpenFlag = 0;
  953. return;
  954. }
  955. }
  956. else
  957. {
  958. if(ssb_cmd != READ_ERROR_LOG)
  959. return;
  960. /* Add values from the error log table to the MAC
  961.  * statistics counters and update the errorlogtable
  962.  * memory.
  963.  */
  964. tp->MacStat.line_errors += tp->errorlogtable.Line_Error;
  965. tp->MacStat.burst_errors += tp->errorlogtable.Burst_Error;
  966. tp->MacStat.A_C_errors += tp->errorlogtable.ARI_FCI_Error;
  967. tp->MacStat.lost_frames += tp->errorlogtable.Lost_Frame_Error;
  968. tp->MacStat.recv_congest_count += tp->errorlogtable.Rx_Congest_Error;
  969. tp->MacStat.rx_errors += tp->errorlogtable.Rx_Congest_Error;
  970. tp->MacStat.frame_copied_errors += tp->errorlogtable.Frame_Copied_Error;
  971. tp->MacStat.token_errors += tp->errorlogtable.Token_Error;
  972. tp->MacStat.dummy1 += tp->errorlogtable.DMA_Bus_Error;
  973. tp->MacStat.dummy1 += tp->errorlogtable.DMA_Parity_Error;
  974. tp->MacStat.abort_delimiters += tp->errorlogtable.AbortDelimeters;
  975. tp->MacStat.frequency_errors += tp->errorlogtable.Frequency_Error;
  976. tp->MacStat.internal_errors += tp->errorlogtable.Internal_Error;
  977. }
  978. return;
  979. }
  980. /*
  981.  * The inverse routine to tms380tr_open().
  982.  */
  983. int tms380tr_close(struct net_device *dev)
  984. {
  985. struct net_local *tp = (struct net_local *)dev->priv;
  986. netif_stop_queue(dev);
  987. del_timer(&tp->timer);
  988. /* Flush the Tx and disable Rx here. */
  989. tp->HaltInProgress  = 1;
  990. tms380tr_exec_cmd(dev, OC_CLOSE);
  991. tp->timer.expires = jiffies + 1*HZ;
  992. tp->timer.function  = tms380tr_timer_end_wait;
  993. tp->timer.data  = (unsigned long)dev;
  994. add_timer(&tp->timer);
  995. tms380tr_enable_interrupts(dev);
  996. tp->Sleeping = 1;
  997. interruptible_sleep_on(&tp->wait_for_tok_int);
  998. tp->TransmitCommandActive = 0;
  999.     
  1000. del_timer(&tp->timer);
  1001. tms380tr_disable_interrupts(dev);
  1002.    
  1003. if(dev->dma > 0) 
  1004. {
  1005. unsigned long flags=claim_dma_lock();
  1006. disable_dma(dev->dma);
  1007. release_dma_lock(flags);
  1008. }
  1009. SIFWRITEW(0xFF00, SIFCMD);
  1010. #if 0
  1011. if(dev->dma > 0) /* what the? */
  1012. SIFWRITEB(0xff, POSREG);
  1013. #endif
  1014. tms380tr_cancel_tx_queue(tp);
  1015. return (0);
  1016. }
  1017. /*
  1018.  * Get the current statistics. This may be called with the card open
  1019.  * or closed.
  1020.  */
  1021. static struct net_device_stats *tms380tr_get_stats(struct net_device *dev)
  1022. {
  1023. struct net_local *tp = (struct net_local *)dev->priv;
  1024. return ((struct net_device_stats *)&tp->MacStat);
  1025. }
  1026. /*
  1027.  * Set or clear the multicast filter for this adapter.
  1028.  */
  1029. static void tms380tr_set_multicast_list(struct net_device *dev)
  1030. {
  1031. struct net_local *tp = (struct net_local *)dev->priv;
  1032. unsigned int OpenOptions;
  1033. OpenOptions = tp->ocpl.OPENOptions &
  1034. ~(PASS_ADAPTER_MAC_FRAMES
  1035.   | PASS_ATTENTION_FRAMES
  1036.   | PASS_BEACON_MAC_FRAMES
  1037.   | COPY_ALL_MAC_FRAMES
  1038.   | COPY_ALL_NON_MAC_FRAMES);
  1039. tp->ocpl.FunctAddr = 0;
  1040. if(dev->flags & IFF_PROMISC)
  1041. /* Enable promiscuous mode */
  1042. OpenOptions |= COPY_ALL_NON_MAC_FRAMES |
  1043. COPY_ALL_MAC_FRAMES;
  1044. else
  1045. {
  1046. if(dev->flags & IFF_ALLMULTI)
  1047. {
  1048. /* Disable promiscuous mode, use normal mode. */
  1049. tp->ocpl.FunctAddr = 0xFFFFFFFF;
  1050. }
  1051. else
  1052. {
  1053. int i;
  1054. struct dev_mc_list *mclist = dev->mc_list;
  1055. for (i=0; i< dev->mc_count; i++)
  1056. {
  1057. ((char *)(&tp->ocpl.FunctAddr))[0] |=
  1058. mclist->dmi_addr[2];
  1059. ((char *)(&tp->ocpl.FunctAddr))[1] |=
  1060. mclist->dmi_addr[3];
  1061. ((char *)(&tp->ocpl.FunctAddr))[2] |=
  1062. mclist->dmi_addr[4];
  1063. ((char *)(&tp->ocpl.FunctAddr))[3] |=
  1064. mclist->dmi_addr[5];
  1065. mclist = mclist->next;
  1066. }
  1067. }
  1068. tms380tr_exec_cmd(dev, OC_SET_FUNCT_ADDR);
  1069. }
  1070. tp->ocpl.OPENOptions = OpenOptions;
  1071. tms380tr_exec_cmd(dev, OC_MODIFY_OPEN_PARMS);
  1072. return;
  1073. }
  1074. /*
  1075.  * Wait for some time (microseconds)
  1076.  */
  1077. void tms380tr_wait(unsigned long time)
  1078. {
  1079. #if 0
  1080. long tmp;
  1081. tmp = jiffies + time/(1000000/HZ);
  1082. do {
  1083.    current->state  = TASK_INTERRUPTIBLE;
  1084. tmp = schedule_timeout(tmp);
  1085. } while(time_after(tmp, jiffies));
  1086. #else
  1087. udelay(time);
  1088. #endif
  1089. return;
  1090. }
  1091. /*
  1092.  * Write a command value to the SIFCMD register
  1093.  */
  1094. static void tms380tr_exec_sifcmd(struct net_device *dev, unsigned int WriteValue)
  1095. {
  1096. unsigned short cmd;
  1097. unsigned short SifStsValue;
  1098. unsigned long loop_counter;
  1099. WriteValue = ((WriteValue ^ CMD_SYSTEM_IRQ) | CMD_INTERRUPT_ADAPTER);
  1100. cmd = (unsigned short)WriteValue;
  1101. loop_counter = 0,5 * 800000;
  1102. do {
  1103. SifStsValue = SIFREADW(SIFSTS);
  1104. } while((SifStsValue & CMD_INTERRUPT_ADAPTER) && loop_counter--);
  1105. SIFWRITEW(cmd, SIFCMD);
  1106. return;
  1107. }
  1108. /*
  1109.  * Processes adapter hardware reset, halts adapter and downloads firmware,
  1110.  * clears the halt bit.
  1111.  */
  1112. static int tms380tr_reset_adapter(struct net_device *dev)
  1113. {
  1114. struct net_local *tp = (struct net_local *)dev->priv;
  1115. unsigned short *fw_ptr = (unsigned short *)&tms380tr_code;
  1116. unsigned short count, c;
  1117. /* Hardware adapter reset */
  1118. SIFWRITEW(ACL_ARESET, SIFACL);
  1119. tms380tr_wait(40);
  1120. c = SIFREADW(SIFACL);
  1121. tms380tr_wait(20);
  1122. if(dev->dma == 0) /* For PCI adapters */
  1123. {
  1124. c &= ~(ACL_NSELOUT0 | ACL_NSELOUT1); /* Clear bits */
  1125. if(tp->setnselout)
  1126.   c |= (*tp->setnselout)(dev);
  1127. }
  1128. /* In case a command is pending - forget it */
  1129. tp->ScbInUse = 0;
  1130. c &= ~ACL_ARESET; /* Clear adapter reset bit */
  1131. c |=  ACL_CPHALT; /* Halt adapter CPU, allow download */
  1132. c |= ACL_BOOT;
  1133. c |= ACL_SINTEN;
  1134. c &= ~ACL_PSDMAEN; /* Clear pseudo dma bit */
  1135. SIFWRITEW(c, SIFACL);
  1136. tms380tr_wait(40);
  1137. /* Download firmware via DIO interface: */
  1138. do {
  1139. /* Download first address part */
  1140. SIFWRITEW(*fw_ptr, SIFADX);
  1141. fw_ptr++;
  1142. /* Download second address part */
  1143. SIFWRITEW(*fw_ptr, SIFADD);
  1144. fw_ptr++;
  1145. if((count = *fw_ptr) != 0) /* Load loop counter */
  1146. {
  1147. fw_ptr++; /* Download block data */
  1148. for(; count > 0; count--)
  1149. {
  1150. SIFWRITEW(*fw_ptr, SIFINC);
  1151. fw_ptr++;
  1152. }
  1153. }
  1154. else /* Stop, if last block downloaded */
  1155. {
  1156. c = SIFREADW(SIFACL);
  1157. c &= (~ACL_CPHALT | ACL_SINTEN);
  1158. /* Clear CPHALT and start BUD */
  1159. SIFWRITEW(c, SIFACL);
  1160. return (1);
  1161. }
  1162. } while(count == 0);
  1163. printk(KERN_INFO "%s: Adapter Download Failedn", dev->name);
  1164. return (-1);
  1165. }
  1166. /*
  1167.  * Starts bring up diagnostics of token ring adapter and evaluates
  1168.  * diagnostic results.
  1169.  */
  1170. static int tms380tr_bringup_diags(struct net_device *dev)
  1171. {
  1172. int loop_cnt, retry_cnt;
  1173. unsigned short Status;
  1174. tms380tr_wait(HALF_SECOND);
  1175. tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
  1176. tms380tr_wait(HALF_SECOND);
  1177. retry_cnt = BUD_MAX_RETRIES; /* maximal number of retrys */
  1178. do {
  1179. retry_cnt--;
  1180. if(tms380tr_debug > 3)
  1181. printk(KERN_INFO "BUD-Status: ");
  1182. loop_cnt = BUD_MAX_LOOPCNT; /* maximum: three seconds*/
  1183. do { /* Inspect BUD results */
  1184. loop_cnt--;
  1185. tms380tr_wait(HALF_SECOND);
  1186. Status = SIFREADW(SIFSTS);
  1187. Status &= STS_MASK;
  1188. if(tms380tr_debug > 3)
  1189. printk(KERN_INFO " %04X n", Status);
  1190. /* BUD successfully completed */
  1191. if(Status == STS_INITIALIZE)
  1192. return (1);
  1193. /* Unrecoverable hardware error, BUD not completed? */
  1194. } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST))
  1195. != (STS_ERROR | STS_TEST)));
  1196. /* Error preventing completion of BUD */
  1197. if(retry_cnt > 0)
  1198. {
  1199. printk(KERN_INFO "%s: Adapter Software Reset.n", 
  1200. dev->name);
  1201. tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
  1202. tms380tr_wait(HALF_SECOND);
  1203. }
  1204. } while(retry_cnt > 0);
  1205. Status = SIFREADW(SIFSTS);
  1206. printk(KERN_INFO "%s: Hardware errorn", dev->name);
  1207. /* Hardware error occurred! */
  1208. Status &= 0x001f;
  1209. if (Status & 0x0010)
  1210. printk(KERN_INFO "%s: BUD Error: Timeoutn", dev->name);
  1211. else if ((Status & 0x000f) > 6)
  1212. printk(KERN_INFO "%s: BUD Error: Illegal Failuren", dev->name);
  1213. else
  1214. printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurredn", dev->name, Status & 0x000f);
  1215. return (-1);
  1216. }
  1217. /*
  1218.  * Copy initialisation data to adapter memory, beginning at address
  1219.  * 1:0A00; Starting DMA test and evaluating result bits.
  1220.  */
  1221. static int tms380tr_init_adapter(struct net_device *dev)
  1222. {
  1223. struct net_local *tp = (struct net_local *)dev->priv;
  1224. const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B};
  1225. const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7,
  1226. 0xC5, 0xD9, 0xC3, 0xD4};
  1227. void *ptr = (void *)&tp->ipb;
  1228. unsigned short *ipb_ptr = (unsigned short *)ptr;
  1229. unsigned char *cb_ptr = (unsigned char *) &tp->scb;
  1230. unsigned char *sb_ptr = (unsigned char *) &tp->ssb;
  1231. unsigned short Status;
  1232. int i, loop_cnt, retry_cnt;
  1233. /* Normalize: byte order low/high, word order high/low! (only IPB!) */
  1234. tp->ipb.SCB_Addr = SWAPW(((char *)&tp->scb - (char *)tp) + tp->dmabuffer);
  1235. tp->ipb.SSB_Addr = SWAPW(((char *)&tp->ssb - (char *)tp) + tp->dmabuffer);
  1236. if(tms380tr_debug > 3)
  1237. {
  1238. printk(KERN_INFO "%s: buffer (real): %lxn", dev->name, (long) &tp->scb);
  1239. printk(KERN_INFO "%s: buffer (virt): %lxn", dev->name, (long) ((char *)&tp->scb - (char *)tp) + tp->dmabuffer);
  1240. printk(KERN_INFO "%s: buffer (DMA) : %lxn", dev->name, (long) tp->dmabuffer);
  1241. printk(KERN_INFO "%s: buffer (tp)  : %lxn", dev->name, (long) tp);
  1242. }
  1243. /* Maximum: three initialization retries */
  1244. retry_cnt = INIT_MAX_RETRIES;
  1245. do {
  1246. retry_cnt--;
  1247. /* Transfer initialization block */
  1248. SIFWRITEW(0x0001, SIFADX);
  1249. /* To address 0001:0A00 of adapter RAM */
  1250. SIFWRITEW(0x0A00, SIFADD);
  1251. /* Write 11 words to adapter RAM */
  1252. for(i = 0; i < 11; i++)
  1253. SIFWRITEW(ipb_ptr[i], SIFINC);
  1254. /* Execute SCB adapter command */
  1255. tms380tr_exec_sifcmd(dev, CMD_EXECUTE);
  1256. loop_cnt = INIT_MAX_LOOPCNT; /* Maximum: 11 seconds */
  1257. /* While remaining retries, no error and not completed */
  1258. do {
  1259. Status = 0;
  1260. loop_cnt--;
  1261. tms380tr_wait(HALF_SECOND);
  1262. /* Mask interesting status bits */
  1263. Status = SIFREADW(SIFSTS);
  1264. Status &= STS_MASK;
  1265. } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0)
  1266. && ((Status & STS_ERROR) == 0) && (loop_cnt != 0));
  1267. if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0)
  1268. {
  1269. /* Initialization completed without error */
  1270. i = 0;
  1271. do { /* Test if contents of SCB is valid */
  1272. if(SCB_Test[i] != *(cb_ptr + i))
  1273. {
  1274. printk(KERN_INFO "%s: DMA failedn", dev->name);
  1275. /* DMA data error: wrong data in SCB */
  1276. return (-1);
  1277. }
  1278. i++;
  1279. } while(i < 6);
  1280. i = 0;
  1281. do { /* Test if contents of SSB is valid */
  1282. if(SSB_Test[i] != *(sb_ptr + i))
  1283. /* DMA data error: wrong data in SSB */
  1284. return (-1);
  1285. i++;
  1286. } while (i < 8);
  1287. return (1); /* Adapter successfully initialized */
  1288. }
  1289. else
  1290. {
  1291. if((Status & STS_ERROR) != 0)
  1292. {
  1293. /* Initialization error occurred */
  1294. Status = SIFREADW(SIFSTS);
  1295. Status &= STS_ERROR_MASK;
  1296. /* ShowInitialisationErrorCode(Status); */
  1297. printk(KERN_INFO "%s: Status error: %dn", dev->name, Status);
  1298. return (-1); /* Unrecoverable error */
  1299. }
  1300. else
  1301. {
  1302. if(retry_cnt > 0)
  1303. {
  1304. /* Reset adapter and try init again */
  1305. tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET);
  1306. tms380tr_wait(HALF_SECOND);
  1307. }
  1308. }
  1309. }
  1310. } while(retry_cnt > 0);
  1311. printk(KERN_INFO "%s: Retry exceededn", dev->name);
  1312. return (-1);
  1313. }
  1314. /*
  1315.  * Check for outstanding commands in command queue and tries to execute
  1316.  * command immediately. Corresponding command flag in command queue is cleared.
  1317.  */
  1318. static void tms380tr_chk_outstanding_cmds(struct net_device *dev)
  1319. {
  1320. struct net_local *tp = (struct net_local *)dev->priv;
  1321. unsigned long Addr = 0;
  1322. if(tp->CMDqueue == 0)
  1323. return; /* No command execution */
  1324. /* If SCB in use: no command */
  1325. if(tp->ScbInUse == 1)
  1326. return;
  1327. /* Check if adapter is opened, avoiding COMMAND_REJECT
  1328.  * interrupt by the adapter!
  1329.  */
  1330. if(tp->AdapterOpenFlag == 0)
  1331. {
  1332. if(tp->CMDqueue & OC_OPEN)
  1333. {
  1334. /* Execute OPEN command */
  1335. tp->CMDqueue ^= OC_OPEN;
  1336. Addr = htonl(((char *)&tp->ocpl - (char *)tp) + tp->dmabuffer);
  1337. tp->scb.Parm[0] = LOWORD(Addr);
  1338. tp->scb.Parm[1] = HIWORD(Addr);
  1339. tp->scb.CMD = OPEN;
  1340. }
  1341. else
  1342. /* No OPEN command queued, but adapter closed. Note:
  1343.  * We'll try to re-open the adapter in DriverPoll()
  1344.  */
  1345. return; /* No adapter command issued */
  1346. }
  1347. else
  1348. {
  1349. /* Adapter is open; evaluate command queue: try to execute
  1350.  * outstanding commands (depending on priority!) CLOSE
  1351.  * command queued
  1352.  */
  1353. if(tp->CMDqueue & OC_CLOSE)
  1354. {
  1355. tp->CMDqueue ^= OC_CLOSE;
  1356. tp->AdapterOpenFlag = 0;
  1357. tp->scb.Parm[0] = 0; /* Parm[0], Parm[1] are ignored */
  1358. tp->scb.Parm[1] = 0; /* but should be set to zero! */
  1359. tp->scb.CMD = CLOSE;
  1360. if(!tp->HaltInProgress)
  1361. tp->CMDqueue |= OC_OPEN; /* re-open adapter */
  1362. else
  1363. tp->CMDqueue = 0; /* no more commands */
  1364. }
  1365. else
  1366. {
  1367. if(tp->CMDqueue & OC_RECEIVE)
  1368. {
  1369. tp->CMDqueue ^= OC_RECEIVE;
  1370. Addr = htonl(((char *)tp->RplHead - (char *)tp) + tp->dmabuffer);
  1371. tp->scb.Parm[0] = LOWORD(Addr);
  1372. tp->scb.Parm[1] = HIWORD(Addr);
  1373. tp->scb.CMD = RECEIVE;
  1374. }
  1375. else
  1376. {
  1377. if(tp->CMDqueue & OC_TRANSMIT_HALT)
  1378. {
  1379. /* NOTE: TRANSMIT.HALT must be checked 
  1380.  * before TRANSMIT.
  1381.  */
  1382. tp->CMDqueue ^= OC_TRANSMIT_HALT;
  1383. tp->scb.CMD = TRANSMIT_HALT;
  1384. /* Parm[0] and Parm[1] are ignored
  1385.  * but should be set to zero!
  1386.  */
  1387. tp->scb.Parm[0] = 0;
  1388. tp->scb.Parm[1] = 0;
  1389. }
  1390. else
  1391. {
  1392. if(tp->CMDqueue & OC_TRANSMIT)
  1393. {
  1394. /* NOTE: TRANSMIT must be 
  1395.  * checked after TRANSMIT.HALT
  1396.  */
  1397. if(tp->TransmitCommandActive)
  1398. {
  1399. if(!tp->TransmitHaltScheduled)
  1400. {
  1401. tp->TransmitHaltScheduled = 1;
  1402. tms380tr_exec_cmd(dev, OC_TRANSMIT_HALT) ;
  1403. }
  1404. tp->TransmitCommandActive = 0;
  1405. return;
  1406. }
  1407. tp->CMDqueue ^= OC_TRANSMIT;
  1408. tms380tr_cancel_tx_queue(tp);
  1409. Addr = htonl(((char *)tp->TplBusy - (char *)tp) + tp->dmabuffer);
  1410. tp->scb.Parm[0] = LOWORD(Addr);
  1411. tp->scb.Parm[1] = HIWORD(Addr);
  1412. tp->scb.CMD = TRANSMIT;
  1413. tp->TransmitCommandActive = 1;
  1414. }
  1415. else
  1416. {
  1417. if(tp->CMDqueue & OC_MODIFY_OPEN_PARMS)
  1418. {
  1419. tp->CMDqueue ^= OC_MODIFY_OPEN_PARMS;
  1420. tp->scb.Parm[0] = tp->ocpl.OPENOptions; /* new OPEN options*/
  1421. tp->scb.Parm[0] |= ENABLE_FULL_DUPLEX_SELECTION;
  1422. tp->scb.Parm[1] = 0; /* is ignored but should be zero */
  1423. tp->scb.CMD = MODIFY_OPEN_PARMS;
  1424. }
  1425. else
  1426. {
  1427. if(tp->CMDqueue & OC_SET_FUNCT_ADDR)
  1428. {
  1429. tp->CMDqueue ^= OC_SET_FUNCT_ADDR;
  1430. tp->scb.Parm[0] = LOWORD(tp->ocpl.FunctAddr);
  1431. tp->scb.Parm[1] = HIWORD(tp->ocpl.FunctAddr);
  1432. tp->scb.CMD = SET_FUNCT_ADDR;
  1433. }
  1434. else
  1435. {
  1436. if(tp->CMDqueue & OC_SET_GROUP_ADDR)
  1437. {
  1438. tp->CMDqueue ^= OC_SET_GROUP_ADDR;
  1439. tp->scb.Parm[0] = LOWORD(tp->ocpl.GroupAddr);
  1440. tp->scb.Parm[1] = HIWORD(tp->ocpl.GroupAddr);
  1441. tp->scb.CMD = SET_GROUP_ADDR;
  1442. }
  1443. else
  1444. {
  1445. if(tp->CMDqueue & OC_READ_ERROR_LOG)
  1446. {
  1447. tp->CMDqueue ^= OC_READ_ERROR_LOG;
  1448. Addr = htonl(((char *)&tp->errorlogtable - (char *)tp) + tp->dmabuffer);
  1449. tp->scb.Parm[0] = LOWORD(Addr);
  1450. tp->scb.Parm[1] = HIWORD(Addr);
  1451. tp->scb.CMD = READ_ERROR_LOG;
  1452. }
  1453. else
  1454. {
  1455. printk(KERN_WARNING "CheckForOutstandingCommand: unknown Commandn");
  1456. tp->CMDqueue = 0;
  1457. return;
  1458. }
  1459. }
  1460. }
  1461. }
  1462. }
  1463. }
  1464. }
  1465. }
  1466. }
  1467. tp->ScbInUse = 1; /* Set semaphore: SCB in use. */
  1468. /* Execute SCB and generate IRQ when done. */
  1469. tms380tr_exec_sifcmd(dev, CMD_EXECUTE | CMD_SCB_REQUEST);
  1470. return;
  1471. }
  1472. /*
  1473.  * IRQ conditions: signal loss on the ring, transmit or receive of beacon
  1474.  * frames (disabled if bit 1 of OPEN option is set); report error MAC
  1475.  * frame transmit (disabled if bit 2 of OPEN option is set); open or short
  1476.  * circuit fault on the lobe is detected; remove MAC frame received;
  1477.  * error counter overflow (255); opened adapter is the only station in ring.
  1478.  * After some of the IRQs the adapter is closed!
  1479.  */
  1480. static void tms380tr_ring_status_irq(struct net_device *dev)
  1481. {
  1482. struct net_local *tp = (struct net_local *)dev->priv;
  1483. tp->CurrentRingStatus = be16_to_cpu((unsigned short)tp->ssb.Parm[0]);
  1484. /* First: fill up statistics */
  1485. if(tp->ssb.Parm[0] & SIGNAL_LOSS)
  1486. {
  1487. printk(KERN_INFO "%s: Signal Lossn", dev->name);
  1488. tp->MacStat.line_errors++;
  1489. }
  1490. /* Adapter is closed, but initialized */
  1491. if(tp->ssb.Parm[0] & LOBE_WIRE_FAULT)
  1492. {
  1493. printk(KERN_INFO "%s: Lobe Wire Fault, Reopen Adaptern", 
  1494. dev->name);
  1495. tp->MacStat.line_errors++;
  1496. }
  1497. if(tp->ssb.Parm[0] & RING_RECOVERY)
  1498. printk(KERN_INFO "%s: Ring Recoveryn", dev->name);
  1499. /* Counter overflow: read error log */
  1500. if(tp->ssb.Parm[0] & COUNTER_OVERFLOW)
  1501. {
  1502. printk(KERN_INFO "%s: Counter Overflown", dev->name);
  1503. tms380tr_exec_cmd(dev, OC_READ_ERROR_LOG);
  1504. }
  1505. /* Adapter is closed, but initialized */
  1506. if(tp->ssb.Parm[0] & REMOVE_RECEIVED)
  1507. printk(KERN_INFO "%s: Remove Received, Reopen Adaptern", 
  1508. dev->name);
  1509. /* Adapter is closed, but initialized */
  1510. if(tp->ssb.Parm[0] & AUTO_REMOVAL_ERROR)
  1511. printk(KERN_INFO "%s: Auto Removal Error, Reopen Adaptern", 
  1512. dev->name);
  1513. if(tp->ssb.Parm[0] & HARD_ERROR)
  1514. printk(KERN_INFO "%s: Hard Errorn", dev->name);
  1515. if(tp->ssb.Parm[0] & SOFT_ERROR)
  1516. printk(KERN_INFO "%s: Soft Errorn", dev->name);
  1517. if(tp->ssb.Parm[0] & TRANSMIT_BEACON)
  1518. printk(KERN_INFO "%s: Transmit Beaconn", dev->name);
  1519. if(tp->ssb.Parm[0] & SINGLE_STATION)
  1520. printk(KERN_INFO "%s: Single Stationn", dev->name);
  1521. /* Check if adapter has been closed */
  1522. if(tp->ssb.Parm[0] & ADAPTER_CLOSED)
  1523. {
  1524. printk(KERN_INFO "%s: Adapter closed (Reopening)," 
  1525. "QueueSkb %d, CurrentRingStat %xn",
  1526. dev->name, tp->QueueSkb, tp->CurrentRingStatus);
  1527. tp->AdapterOpenFlag = 0;
  1528. tms380tr_open_adapter(dev);
  1529. }
  1530. return;
  1531. }
  1532. /*
  1533.  * Issued if adapter has encountered an unrecoverable hardware
  1534.  * or software error.
  1535.  */
  1536. static void tms380tr_chk_irq(struct net_device *dev)
  1537. {
  1538. int i;
  1539. unsigned short AdapterCheckBlock[4];
  1540. struct net_local *tp = (struct net_local *)dev->priv;
  1541. tp->AdapterOpenFlag = 0; /* Adapter closed now */
  1542. /* Page number of adapter memory */
  1543. SIFWRITEW(0x0001, SIFADX);
  1544. /* Address offset */
  1545. SIFWRITEW(CHECKADDR, SIFADR);
  1546. /* Reading 8 byte adapter check block. */
  1547. for(i = 0; i < 4; i++)
  1548. AdapterCheckBlock[i] = SIFREADW(SIFINC);
  1549. if(tms380tr_debug > 3)
  1550. {
  1551. printk("%s: AdapterCheckBlock: ", dev->name);
  1552. for (i = 0; i < 4; i++)
  1553. printk("%04X", AdapterCheckBlock[i]);
  1554. printk("n");
  1555. }
  1556. switch(AdapterCheckBlock[0])
  1557. {
  1558. case DIO_PARITY:
  1559. printk(KERN_INFO "%s: DIO parity errorn", dev->name);
  1560. break;
  1561. case DMA_READ_ABORT:
  1562. printk(KERN_INFO "%s DMA read operation aborted:n",
  1563. dev->name);
  1564. switch (AdapterCheckBlock[1])
  1565. {
  1566. case 0:
  1567. printk(KERN_INFO "Timeoutn");
  1568. printk(KERN_INFO "Address: %04X %04Xn",
  1569. AdapterCheckBlock[2],
  1570. AdapterCheckBlock[3]);
  1571. break;
  1572. case 1:
  1573. printk(KERN_INFO "Parity errorn");
  1574. printk(KERN_INFO "Address: %04X %04Xn",
  1575. AdapterCheckBlock[2], 
  1576. AdapterCheckBlock[3]);
  1577. break;
  1578. case 2: 
  1579. printk(KERN_INFO "Bus errorn");
  1580. printk(KERN_INFO "Address: %04X %04Xn",
  1581. AdapterCheckBlock[2], 
  1582. AdapterCheckBlock[3]);
  1583. break;
  1584. default:
  1585. printk(KERN_INFO "Unknown error.n");
  1586. break;
  1587. }
  1588. break;
  1589. case DMA_WRITE_ABORT:
  1590. printk(KERN_INFO "%s: DMA write operation aborted: n",
  1591. dev->name);
  1592. switch (AdapterCheckBlock[1])
  1593. {
  1594. case 0: 
  1595. printk(KERN_INFO "Timeoutn");
  1596. printk(KERN_INFO "Address: %04X %04Xn",
  1597. AdapterCheckBlock[2], 
  1598. AdapterCheckBlock[3]);
  1599. break;
  1600. case 1: 
  1601. printk(KERN_INFO "Parity errorn");
  1602. printk(KERN_INFO "Address: %04X %04Xn",
  1603. AdapterCheckBlock[2], 
  1604. AdapterCheckBlock[3]);
  1605. break;
  1606. case 2: 
  1607. printk(KERN_INFO "Bus errorn");
  1608. printk(KERN_INFO "Address: %04X %04Xn",
  1609. AdapterCheckBlock[2], 
  1610. AdapterCheckBlock[3]);
  1611. break;
  1612. default:
  1613. printk(KERN_INFO "Unknown error.n");
  1614. break;
  1615. }
  1616. break;
  1617. case ILLEGAL_OP_CODE:
  1618. printk("%s: Illegal operation code in firmwaren",
  1619. dev->name);
  1620. /* Parm[0-3]: adapter internal register R13-R15 */
  1621. break;
  1622. case PARITY_ERRORS:
  1623. printk("%s: Adapter internal bus parity errorn",
  1624. dev->name);
  1625. /* Parm[0-3]: adapter internal register R13-R15 */
  1626. break;
  1627. case RAM_DATA_ERROR:
  1628. printk("%s: RAM data errorn", dev->name);
  1629. /* Parm[0-1]: MSW/LSW address of RAM location. */
  1630. break;
  1631. case RAM_PARITY_ERROR:
  1632. printk("%s: RAM parity errorn", dev->name);
  1633. /* Parm[0-1]: MSW/LSW address of RAM location. */
  1634. break;
  1635. case RING_UNDERRUN:
  1636. printk("%s: Internal DMA underrun detectedn",
  1637. dev->name);
  1638. break;
  1639. case INVALID_IRQ:
  1640. printk("%s: Unrecognized interrupt detectedn",
  1641. dev->name);
  1642. /* Parm[0-3]: adapter internal register R13-R15 */
  1643. break;
  1644. case INVALID_ERROR_IRQ:
  1645. printk("%s: Unrecognized error interrupt detectedn",
  1646. dev->name);
  1647. /* Parm[0-3]: adapter internal register R13-R15 */
  1648. break;
  1649. case INVALID_XOP:
  1650. printk("%s: Unrecognized XOP request detectedn",
  1651. dev->name);
  1652. /* Parm[0-3]: adapter internal register R13-R15 */
  1653. break;
  1654. default:
  1655. printk("%s: Unknown status", dev->name);
  1656. break;
  1657. }
  1658. if(tms380tr_chipset_init(dev) == 1)
  1659. {
  1660. /* Restart of firmware successful */
  1661. tp->AdapterOpenFlag = 1;
  1662. }
  1663. return;
  1664. }
  1665. /*
  1666.  * Internal adapter pointer to RAM data are copied from adapter into
  1667.  * host system.
  1668.  */
  1669. static int tms380tr_read_ptr(struct net_device *dev)
  1670. {
  1671. struct net_local *tp = (struct net_local *)dev->priv;
  1672. unsigned short adapterram;
  1673. tms380tr_read_ram(dev, (unsigned char *)&tp->intptrs.BurnedInAddrPtr,
  1674. ADAPTER_INT_PTRS, 16);
  1675. tms380tr_read_ram(dev, (unsigned char *)&adapterram,
  1676. cpu_to_be16((unsigned short)tp->intptrs.AdapterRAMPtr), 2);
  1677. return be16_to_cpu(adapterram); 
  1678. }
  1679. /*
  1680.  * Reads a number of bytes from adapter to system memory.
  1681.  */
  1682. static void tms380tr_read_ram(struct net_device *dev, unsigned char *Data,
  1683. unsigned short Address, int Length)
  1684. {
  1685. int i;
  1686. unsigned short old_sifadx, old_sifadr, InWord;
  1687. /* Save the current values */
  1688. old_sifadx = SIFREADW(SIFADX);
  1689. old_sifadr = SIFREADW(SIFADR);
  1690. /* Page number of adapter memory */
  1691. SIFWRITEW(0x0001, SIFADX);
  1692. /* Address offset in adapter RAM */
  1693.         SIFWRITEW(Address, SIFADR);
  1694. /* Copy len byte from adapter memory to system data area. */
  1695. i = 0;
  1696. for(;;)
  1697. {
  1698. InWord = SIFREADW(SIFINC);
  1699. *(Data + i) = HIBYTE(InWord); /* Write first byte */
  1700. if(++i == Length) /* All is done break */
  1701. break;
  1702. *(Data + i) = LOBYTE(InWord); /* Write second byte */
  1703. if (++i == Length) /* All is done break */
  1704. break;
  1705. }
  1706. /* Restore original values */
  1707. SIFWRITEW(old_sifadx, SIFADX);
  1708. SIFWRITEW(old_sifadr, SIFADR);
  1709. return;
  1710. }
  1711. /*
  1712.  * Cancel all queued packets in the transmission queue.
  1713.  */
  1714. static void tms380tr_cancel_tx_queue(struct net_local* tp)
  1715. {
  1716. TPL *tpl;
  1717. struct sk_buff *skb;
  1718. /*
  1719.  * NOTE: There must not be an active TRANSMIT command pending, when
  1720.  * this function is called.
  1721.  */
  1722. if(tp->TransmitCommandActive)
  1723. return;
  1724. for(;;)
  1725. {
  1726. tpl = tp->TplBusy;
  1727. if(!tpl->BusyFlag)
  1728. break;
  1729. /* "Remove" TPL from busy list. */
  1730. tp->TplBusy = tpl->NextTPLPtr;
  1731. tms380tr_write_tpl_status(tpl, 0); /* Clear VALID bit */
  1732. tpl->BusyFlag = 0; /* "free" TPL */
  1733. printk(KERN_INFO "Cancel tx (%08lXh).n", (unsigned long)tpl);
  1734. if (tpl->DMABuff)
  1735. pci_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, PCI_DMA_TODEVICE);
  1736. dev_kfree_skb_any(tpl->Skb);
  1737. }
  1738. for(;;)
  1739. {
  1740. skb = skb_dequeue(&tp->SendSkbQueue);
  1741. if(skb == NULL)
  1742. break;
  1743. tp->QueueSkb++;
  1744. dev_kfree_skb_any(skb);
  1745. }
  1746. return;
  1747. }
  1748. /*
  1749.  * This function is called whenever a transmit interrupt is generated by the
  1750.  * adapter. For a command complete interrupt, it is checked if we have to
  1751.  * issue a new transmit command or not.
  1752.  */
  1753. static void tms380tr_tx_status_irq(struct net_device *dev)
  1754. {
  1755. struct net_local *tp = (struct net_local *)dev->priv;
  1756. unsigned char HighByte, HighAc, LowAc;
  1757. TPL *tpl;
  1758. /* NOTE: At this point the SSB from TRANSMIT STATUS is no longer
  1759.  * available, because the CLEAR SSB command has already been issued.
  1760.  *
  1761.  * Process all complete transmissions.
  1762.  */
  1763. for(;;)
  1764. {
  1765. tpl = tp->TplBusy;
  1766. if(!tpl->BusyFlag || (tpl->Status
  1767. & (TX_VALID | TX_FRAME_COMPLETE))
  1768. != TX_FRAME_COMPLETE)
  1769. {
  1770. break;
  1771. }
  1772. /* "Remove" TPL from busy list. */
  1773. tp->TplBusy = tpl->NextTPLPtr ;
  1774. /* Check the transmit status field only for directed frames*/
  1775. if(DIRECTED_FRAME(tpl) && (tpl->Status & TX_ERROR) == 0)
  1776. {
  1777. HighByte = GET_TRANSMIT_STATUS_HIGH_BYTE(tpl->Status);
  1778. HighAc   = GET_FRAME_STATUS_HIGH_AC(HighByte);
  1779. LowAc    = GET_FRAME_STATUS_LOW_AC(HighByte);
  1780. if((HighAc != LowAc) || (HighAc == AC_NOT_RECOGNIZED))
  1781. {
  1782. printk(KERN_INFO "%s: (DA=%08lX not recognized)",
  1783. dev->name,
  1784. *(unsigned long *)&tpl->MData[2+2]);
  1785. }
  1786. else
  1787. {
  1788. if(tms380tr_debug > 3)
  1789. printk("%s: Directed frame tx'dn", 
  1790. dev->name);
  1791. }
  1792. }
  1793. else
  1794. {
  1795. if(!DIRECTED_FRAME(tpl))
  1796. {
  1797. if(tms380tr_debug > 3)
  1798. printk("%s: Broadcast frame tx'dn",
  1799. dev->name);
  1800. }
  1801. }
  1802. tp->MacStat.tx_packets++;
  1803. if (tpl->DMABuff)
  1804. pci_unmap_single(tp->pdev, tpl->DMABuff, tpl->Skb->len, PCI_DMA_TODEVICE);
  1805. dev_kfree_skb_irq(tpl->Skb);
  1806. tpl->BusyFlag = 0; /* "free" TPL */
  1807. }
  1808. netif_wake_queue(dev);
  1809. if(tp->QueueSkb < MAX_TX_QUEUE)
  1810. tms380tr_hardware_send_packet(dev, tp);
  1811. return;
  1812. }
  1813. /*
  1814.  * Called if a frame receive interrupt is generated by the adapter.
  1815.  * Check if the frame is valid and indicate it to system.
  1816.  */
  1817. static void tms380tr_rcv_status_irq(struct net_device *dev)
  1818. {
  1819. struct net_local *tp = (struct net_local *)dev->priv;
  1820. unsigned char *ReceiveDataPtr;
  1821. struct sk_buff *skb;
  1822. unsigned int Length, Length2;
  1823. RPL *rpl;
  1824. RPL *SaveHead;
  1825. dma_addr_t dmabuf;
  1826. /* NOTE: At this point the SSB from RECEIVE STATUS is no longer
  1827.  * available, because the CLEAR SSB command has already been issued.
  1828.  *
  1829.  * Process all complete receives.
  1830.  */
  1831. for(;;)
  1832. {
  1833. rpl = tp->RplHead;
  1834. if(rpl->Status & RX_VALID)
  1835. break; /* RPL still in use by adapter */
  1836. /* Forward RPLHead pointer to next list. */
  1837. SaveHead = tp->RplHead;
  1838. tp->RplHead = rpl->NextRPLPtr;
  1839. /* Get the frame size (Byte swap for Intel).
  1840.  * Do this early (see workaround comment below)
  1841.  */
  1842. Length = be16_to_cpu((unsigned short)rpl->FrameSize);
  1843. /* Check if the Frame_Start, Frame_End and
  1844.  * Frame_Complete bits are set.
  1845.  */
  1846. if((rpl->Status & VALID_SINGLE_BUFFER_FRAME)
  1847. == VALID_SINGLE_BUFFER_FRAME)
  1848. {
  1849. ReceiveDataPtr = rpl->MData;
  1850. /* Workaround for delayed write of FrameSize on ISA
  1851.  * (FrameSize is false but valid-bit is reset)
  1852.  * Frame size is set to zero when the RPL is freed.
  1853.  * Length2 is there because there have also been
  1854.  * cases where the FrameSize was partially written
  1855.  */
  1856. Length2 = be16_to_cpu((unsigned short)rpl->FrameSize);
  1857. if(Length == 0 || Length != Length2)
  1858. {
  1859. tp->RplHead = SaveHead;
  1860. break; /* Return to tms380tr_interrupt */
  1861. }
  1862. tms380tr_update_rcv_stats(tp,ReceiveDataPtr,Length);
  1863.   
  1864. if(tms380tr_debug > 3)
  1865. printk("%s: Packet Length %04X (%d)n",
  1866. dev->name, Length, Length);
  1867.   
  1868. /* Indicate the received frame to system the
  1869.  * adapter does the Source-Routing padding for 
  1870.  * us. See: OpenOptions in tms380tr_init_opb()
  1871.  */
  1872. skb = rpl->Skb;
  1873. if(rpl->SkbStat == SKB_UNAVAILABLE)
  1874. {
  1875. /* Try again to allocate skb */
  1876. skb = dev_alloc_skb(tp->MaxPacketSize);
  1877. if(skb == NULL)
  1878. {
  1879. /* Update Stats ?? */
  1880. }
  1881. else
  1882. {
  1883. skb->dev = dev;
  1884. skb_put(skb, tp->MaxPacketSize);
  1885. rpl->SkbStat  = SKB_DATA_COPY;
  1886. ReceiveDataPtr  = rpl->MData;
  1887. }
  1888. }
  1889. if(skb && (rpl->SkbStat == SKB_DATA_COPY
  1890. || rpl->SkbStat == SKB_DMA_DIRECT))
  1891. {
  1892. if(rpl->SkbStat == SKB_DATA_COPY)
  1893. memcpy(skb->data, ReceiveDataPtr, Length);
  1894. /* Deliver frame to system */
  1895. rpl->Skb = NULL;
  1896. skb_trim(skb,Length);
  1897. skb->protocol = tr_type_trans(skb,dev);
  1898. netif_rx(skb);
  1899. dev->last_rx = jiffies;
  1900. }
  1901. }
  1902. else /* Invalid frame */
  1903. {
  1904. if(rpl->Skb != NULL)
  1905. dev_kfree_skb_irq(rpl->Skb);
  1906. /* Skip list. */
  1907. if(rpl->Status & RX_START_FRAME)
  1908. /* Frame start bit is set -> overflow. */
  1909. tp->MacStat.rx_errors++;
  1910. }
  1911. if (rpl->DMABuff)
  1912. pci_unmap_single(tp->pdev, rpl->DMABuff, tp->MaxPacketSize, PCI_DMA_TODEVICE);
  1913. rpl->DMABuff = 0;
  1914. /* Allocate new skb for rpl */
  1915. rpl->Skb = dev_alloc_skb(tp->MaxPacketSize);
  1916. /* skb == NULL ? then use local buffer */
  1917. if(rpl->Skb == NULL)
  1918. {
  1919. rpl->SkbStat = SKB_UNAVAILABLE;
  1920. rpl->FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[rpl->RPLIndex] - (char *)tp) + tp->dmabuffer);
  1921. rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
  1922. }
  1923. else /* skb != NULL */
  1924. {
  1925. rpl->Skb->dev = dev;
  1926. skb_put(rpl->Skb, tp->MaxPacketSize);
  1927. /* Data unreachable for DMA ? then use local buffer */
  1928. dmabuf = pci_map_single(tp->pdev, rpl->Skb->data, tp->MaxPacketSize, PCI_DMA_FROMDEVICE);
  1929. if(tp->dmalimit && (dmabuf + tp->MaxPacketSize > tp->dmalimit))
  1930. {
  1931. rpl->SkbStat = SKB_DATA_COPY;
  1932. rpl->FragList[0].DataAddr = htonl(((char *)tp->LocalRxBuffers[rpl->RPLIndex] - (char *)tp) + tp->dmabuffer);
  1933. rpl->MData = tp->LocalRxBuffers[rpl->RPLIndex];
  1934. }
  1935. else
  1936. {
  1937. /* DMA directly in skb->data */
  1938. rpl->SkbStat = SKB_DMA_DIRECT;
  1939. rpl->FragList[0].DataAddr = htonl(dmabuf);
  1940. rpl->MData = rpl->Skb->data;
  1941. rpl->DMABuff = dmabuf;
  1942. }
  1943. }
  1944. rpl->FragList[0].DataCount = cpu_to_be16((unsigned short)tp->MaxPacketSize);
  1945. rpl->FrameSize = 0;
  1946. /* Pass the last RPL back to the adapter */
  1947. tp->RplTail->FrameSize = 0;
  1948. /* Reset the CSTAT field in the list. */
  1949. tms380tr_write_rpl_status(tp->RplTail, RX_VALID | RX_FRAME_IRQ);
  1950. /* Current RPL becomes last one in list. */
  1951. tp->RplTail = tp->RplTail->NextRPLPtr;
  1952. /* Inform adapter about RPL valid. */
  1953. tms380tr_exec_sifcmd(dev, CMD_RX_VALID);
  1954. }
  1955. return;
  1956. }
  1957. /*
  1958.  * This function should be used whenever the status of any RPL must be
  1959.  * modified by the driver, because the compiler may otherwise change the
  1960.  * order of instructions such that writing the RPL status may be executed
  1961.  * at an undesireable time. When this function is used, the status is
  1962.  * always written when the function is called.
  1963.  */
  1964. static void tms380tr_write_rpl_status(RPL *rpl, unsigned int Status)
  1965. {
  1966. rpl->Status = Status;
  1967. return;
  1968. }
  1969. /*
  1970.  * The function updates the statistic counters in mac->MacStat.
  1971.  * It differtiates between directed and broadcast/multicast ( ==functional)
  1972.  * frames.
  1973.  */
  1974. static void tms380tr_update_rcv_stats(struct net_local *tp, unsigned char DataPtr[],
  1975. unsigned int Length)
  1976. {
  1977. tp->MacStat.rx_packets++;
  1978. tp->MacStat.rx_bytes += Length;
  1979. /* Test functional bit */
  1980. if(DataPtr[2] & GROUP_BIT)
  1981. tp->MacStat.multicast++;
  1982. return;
  1983. }
  1984. static int tms380tr_set_mac_address(struct net_device *dev, void *addr)
  1985. {
  1986. struct net_local *tp = (struct net_local *)dev->priv;
  1987. struct sockaddr *saddr = addr;
  1988. if (tp->AdapterOpenFlag || tp->AdapterVirtOpenFlag) {
  1989. printk(KERN_WARNING "%s: Cannot set MAC/LAA address while card is openn", dev->name);
  1990. return -EIO;
  1991. }
  1992. memcpy(dev->dev_addr, saddr->sa_data, dev->addr_len);
  1993. return 0;
  1994. }
  1995. #if TMS380TR_DEBUG > 0
  1996. /*
  1997.  * Dump Packet (data)
  1998.  */
  1999. static void tms380tr_dump(unsigned char *Data, int length)
  2000. {
  2001. int i, j;
  2002. for (i = 0, j = 0; i < length / 8; i++, j += 8)
  2003. {
  2004. printk(KERN_DEBUG "%02x %02x %02x %02x %02x %02x %02x %02xn",
  2005.        Data[j+0],Data[j+1],Data[j+2],Data[j+3],
  2006.        Data[j+4],Data[j+5],Data[j+6],Data[j+7]);
  2007. }
  2008. return;
  2009. }
  2010. #endif
  2011. void tmsdev_term(struct net_device *dev)
  2012. {
  2013. struct net_local *tp;
  2014. tp = (struct net_local *) dev->priv;
  2015. pci_unmap_single(tp->pdev, tp->dmabuffer, sizeof(struct net_local),
  2016. PCI_DMA_BIDIRECTIONAL);
  2017. kfree(dev->priv);
  2018. }
  2019. int tmsdev_init(struct net_device *dev, unsigned long dmalimit, 
  2020. struct pci_dev *pdev)
  2021. {
  2022. if (dev->priv == NULL)
  2023. {
  2024. struct net_local *tms_local;
  2025. dma_addr_t buffer;
  2026. dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL | GFP_DMA);
  2027. if (dev->priv == NULL)
  2028. {
  2029.                         printk("%s: Out of memory for DMAn",
  2030.                                 dev->name);
  2031. return -ENOMEM;
  2032. }
  2033. memset(dev->priv, 0, sizeof(struct net_local));
  2034. tms_local = (struct net_local *)dev->priv;
  2035. init_waitqueue_head(&tms_local->wait_for_tok_int);
  2036. tms_local->dmalimit = dmalimit;
  2037. tms_local->pdev = pdev;
  2038.                 buffer = pci_map_single(pdev, (void *)tms_local,
  2039.                         sizeof(struct net_local), PCI_DMA_BIDIRECTIONAL);
  2040.                 if (buffer + sizeof(struct net_local) > dmalimit)
  2041.                 {
  2042. printk("%s: Memory not accessible for DMAn",
  2043. dev->name);
  2044. tmsdev_term(dev);
  2045. return -ENOMEM;
  2046. }
  2047. tms_local->dmabuffer = buffer;
  2048. }
  2049. /* These can be overridden by the card driver if needed */
  2050. dev->init = tms380tr_init_card;
  2051. dev->open = tms380tr_open;
  2052. dev->stop = tms380tr_close;
  2053. dev->do_ioctl = NULL; 
  2054. dev->hard_start_xmit = tms380tr_send_packet;
  2055. dev->tx_timeout = tms380tr_timeout;
  2056. dev->watchdog_timeo = HZ;
  2057. dev->get_stats = tms380tr_get_stats;
  2058. dev->set_multicast_list = &tms380tr_set_multicast_list;
  2059. dev->set_mac_address = tms380tr_set_mac_address;
  2060. return 0;
  2061. }
  2062. #ifdef MODULE
  2063. EXPORT_SYMBOL(tms380tr_open);
  2064. EXPORT_SYMBOL(tms380tr_close);
  2065. EXPORT_SYMBOL(tms380tr_interrupt);
  2066. EXPORT_SYMBOL(tmsdev_init);
  2067. EXPORT_SYMBOL(tmsdev_term);
  2068. EXPORT_SYMBOL(tms380tr_wait);
  2069. struct module *TMS380_module = NULL;
  2070. int init_module(void)
  2071. {
  2072. printk("%s", version);
  2073. TMS380_module = &__this_module;
  2074. return 0;
  2075. }
  2076. void cleanup_module(void)
  2077. {
  2078. TMS380_module = NULL;
  2079. }
  2080. #endif
  2081. MODULE_LICENSE("GPL");
  2082. /*
  2083.  * Local variables:
  2084.  *  compile-command: "gcc -DMODVERSIONS  -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/tokenring/ -c tms380tr.c"
  2085.  *  alt-compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer -I/usr/src/linux/drivers/net/tokenring/ -c tms380tr.c"
  2086.  *  c-set-style "K&R"
  2087.  *  c-indent-level: 8
  2088.  *  c-basic-offset: 8
  2089.  *  tab-width: 8
  2090.  * End:
  2091.  */