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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  Copyright (C) 1997 Cullen Jennings
  3.  *  Copyright (C) 1998 Elmer Joandiu, elmer@ylenurme.ee
  4.  *  GNU General Public License applies
  5.  * This module provides support for the Arlan 655 card made by Aironet
  6.  */
  7. #include <linux/config.h>
  8. #include "arlan.h"
  9. #if BITS_PER_LONG != 32
  10. #  error FIXME: this driver requires a 32-bit platform
  11. #endif
  12. static const char *arlan_version = "C.Jennigs 97 & Elmer.Joandi@ut.ee  Oct'98, http://www.ylenurme.ee/~elmer/655/";
  13. struct net_device *arlan_device[MAX_ARLANS];
  14. int last_arlan;
  15. static int SID = SIDUNKNOWN;
  16. static int radioNodeId = radioNodeIdUNKNOWN;
  17. static char encryptionKey[12] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
  18. static char *siteName = siteNameUNKNOWN;
  19. static int mem = memUNKNOWN;
  20. int arlan_debug = debugUNKNOWN;
  21. static int probe = probeUNKNOWN;
  22. static int numDevices = numDevicesUNKNOWN;
  23. static int spreadingCode = spreadingCodeUNKNOWN;
  24. static int channelNumber = channelNumberUNKNOWN;
  25. static int channelSet = channelSetUNKNOWN;
  26. static int systemId = systemIdUNKNOWN;
  27. static int registrationMode = registrationModeUNKNOWN;
  28. static int keyStart;
  29. static int tx_delay_ms;
  30. static int retries = 5;
  31. static int async = 1;
  32. static int tx_queue_len = 1;
  33. static int arlan_EEPROM_bad;
  34. #ifdef ARLAN_DEBUGGING
  35. static int arlan_entry_debug;
  36. static int arlan_exit_debug;
  37. static int testMemory = testMemoryUNKNOWN;
  38. static int irq = irqUNKNOWN;
  39. static int txScrambled = 1;
  40. static int mdebug;
  41. #endif
  42. #if LINUX_VERSION_CODE > 0x20100
  43. MODULE_PARM(irq, "i");
  44. MODULE_PARM(mem, "i");
  45. MODULE_PARM(probe, "i");
  46. MODULE_PARM(arlan_debug, "i");
  47. MODULE_PARM(numDevices, "i");
  48. MODULE_PARM(testMemory, "i");
  49. MODULE_PARM(spreadingCode, "i");
  50. MODULE_PARM(channelNumber, "i");
  51. MODULE_PARM(channelSet, "i");
  52. MODULE_PARM(systemId, "i");
  53. MODULE_PARM(registrationMode, "i");
  54. MODULE_PARM(radioNodeId, "i");
  55. MODULE_PARM(SID, "i");
  56. MODULE_PARM(txScrambled, "i");
  57. MODULE_PARM(keyStart, "i");
  58. MODULE_PARM(mdebug, "i");
  59. MODULE_PARM(tx_delay_ms, "i");
  60. MODULE_PARM(retries, "i");
  61. MODULE_PARM(async, "i");
  62. MODULE_PARM(tx_queue_len, "i");
  63. MODULE_PARM(arlan_entry_debug, "i");
  64. MODULE_PARM(arlan_exit_debug, "i");
  65. MODULE_PARM(arlan_entry_and_exit_debug, "i");
  66. MODULE_PARM(arlan_EEPROM_bad, "i");
  67. MODULE_PARM_DESC(irq, "(unused)");
  68. MODULE_PARM_DESC(mem, "Arlan memory address for single device probing");
  69. MODULE_PARM_DESC(probe, "Arlan probe at initialization (0-1)");
  70. MODULE_PARM_DESC(arlan_debug, "Arlan debug enable (0-1)");
  71. MODULE_PARM_DESC(numDevices, "Number of Arlan devices; ignored if >1");
  72. MODULE_PARM_DESC(testMemory, "(unused)");
  73. MODULE_PARM_DESC(mdebug, "Arlan multicast debugging (0-1)");
  74. MODULE_PARM_DESC(retries, "Arlan maximum packet retransmisions");
  75. #ifdef ARLAN_ENTRY_EXIT_DEBUGGING
  76. MODULE_PARM_DESC(arlan_entry_debug, "Arlan driver function entry debugging");
  77. MODULE_PARM_DESC(arlan_exit_debug, "Arlan driver function exit debugging");
  78. MODULE_PARM_DESC(arlan_entry_and_exit_debug, "Arlan driver function entry and exit debugging");
  79. #else
  80. MODULE_PARM_DESC(arlan_entry_debug, "(ignored)");
  81. MODULE_PARM_DESC(arlan_exit_debug, "(ignored)");
  82. MODULE_PARM_DESC(arlan_entry_and_exit_debug, "(ignored)");
  83. #endif
  84. EXPORT_SYMBOL(arlan_device);
  85. EXPORT_SYMBOL(arlan_conf);
  86. EXPORT_SYMBOL(last_arlan);
  87. //        #warning kernel 2.1.110 tested
  88. #define myATOMIC_INIT(a,b) atomic_set(&(a),b)
  89. #else
  90. #define test_and_set_bit set_bit
  91. #if LINUX_VERSION_CODE != 0x20024
  92.  //        #warning kernel  2.0.36  tested
  93. #endif
  94. #define myATOMIC_INIT(a,b) a = b;
  95. #endif
  96. struct arlan_conf_stru arlan_conf[MAX_ARLANS];
  97. static int arlans_found;
  98. static  int  arlan_probe_here(struct net_device *dev, int ioaddr);
  99. static  int  arlan_open(struct net_device *dev);
  100. static  int  arlan_tx(struct sk_buff *skb, struct net_device *dev);
  101. static  void  arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  102. static  int  arlan_close(struct net_device *dev);
  103. static  struct net_device_stats *
  104. arlan_statistics (struct net_device *dev);
  105. static  void  arlan_set_multicast (struct net_device *dev);
  106. static  int  arlan_hw_tx (struct net_device* dev, char *buf, int length );
  107. static  int arlan_hw_config (struct net_device * dev);
  108. static  void  arlan_tx_done_interrupt (struct net_device * dev, int status);
  109. static  void arlan_rx_interrupt (struct net_device * dev, u_char rxStatus, u_short, u_short);
  110. static  void arlan_process_interrupt (struct net_device * dev);
  111. static void arlan_tx_timeout (struct net_device *dev);
  112. int arlan_command(struct net_device * dev, int command);
  113. EXPORT_SYMBOL(arlan_command);
  114. extern inline long long arlan_time(void)
  115. {
  116. struct timeval timev;
  117. do_gettimeofday(&timev);
  118. return ((long long) timev.tv_sec * 1000000 + timev.tv_usec);
  119. };
  120. #ifdef ARLAN_ENTRY_EXIT_DEBUGGING
  121. #define ARLAN_DEBUG_ENTRY(name) 
  122. {
  123. struct timeval timev;
  124. do_gettimeofday(&timev);
  125. if (arlan_entry_debug || arlan_entry_and_exit_debug)
  126. printk("--->>>" name " %ld " "n",((long int) timev.tv_sec * 1000000 + timev.tv_usec));
  127. }
  128. #define ARLAN_DEBUG_EXIT(name) 
  129. {
  130. struct timeval timev;
  131. do_gettimeofday(&timev);
  132. if (arlan_exit_debug || arlan_entry_and_exit_debug)
  133. printk("<<<---" name " %ld " "n",((long int) timev.tv_sec * 1000000 + timev.tv_usec) );
  134. }
  135. #else
  136. #define ARLAN_DEBUG_ENTRY(name)
  137. #define ARLAN_DEBUG_EXIT(name)
  138. #endif
  139. #define arlan_interrupt_ack(dev)
  140.         clearClearInterrupt(dev);
  141.         setClearInterrupt(dev);
  142. #define ARLAN_COMMAND_LOCK(dev) 
  143. if (atomic_dec_and_test(&((struct arlan_private * )dev->priv)->card_users))
  144.     arlan_wait_command_complete_short(dev,__LINE__);
  145. #define ARLAN_COMMAND_UNLOCK(dev) 
  146. atomic_inc(&((struct arlan_private * )dev->priv)->card_users);
  147. #define ARLAN_COMMAND_INC(dev) 
  148.   {((struct arlan_private *) dev->priv)->under_command++;}
  149. #define ARLAN_COMMAND_ZERO(dev) 
  150.   {((struct arlan_private *) dev->priv)->under_command =0;}
  151. #define ARLAN_UNDER_COMMAND(dev)
  152. (((struct arlan_private *) dev->priv)->under_command)
  153. #define ARLAN_COMMAND_START(dev) ARLAN_COMMAND_INC(dev)
  154. #define ARLAN_COMMAND_END(dev) ARLAN_COMMAND_ZERO(dev)
  155. #define ARLAN_TOGGLE_START(dev)
  156.   {((struct arlan_private *) dev->priv)->under_toggle++;}
  157. #define ARLAN_TOGGLE_END(dev)
  158.   {((struct arlan_private *) dev->priv)->under_toggle=0;}
  159. #define ARLAN_UNDER_TOGGLE(dev)
  160.   (((struct arlan_private *) dev->priv)->under_toggle)
  161. extern inline int arlan_drop_tx(struct net_device *dev)
  162. {
  163. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  164. priv->stats.tx_errors++;
  165. if (priv->Conf->tx_delay_ms)
  166. {
  167. priv->tx_done_delayed = jiffies + priv->Conf->tx_delay_ms * HZ / 1000 + 1;
  168. }
  169. else
  170. {
  171. priv->waiting_command_mask &= ~ARLAN_COMMAND_TX;
  172. TXHEAD(dev).offset = 0;
  173. TXTAIL(dev).offset = 0;
  174. priv->txLast = 0;
  175. priv->txOffset = 0;
  176. priv->bad = 0;
  177. if (!priv->under_reset && !priv->under_config)
  178. netif_wake_queue (dev);
  179. }
  180. return 1;
  181. };
  182. int arlan_command(struct net_device *dev, int command_p)
  183. {
  184. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  185. struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
  186. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  187. int udelayed = 0;
  188. int i = 0;
  189. long long time_mks = arlan_time();
  190. ARLAN_DEBUG_ENTRY("arlan_command");
  191. if (priv->card_polling_interval)
  192. priv->card_polling_interval = 1;
  193. if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
  194. printk(KERN_DEBUG "arlan_command, %lx lock %lx  commandByte %x waiting %x incoming %x n",
  195. jiffies, priv->command_lock, READSHMB(arlan->commandByte),
  196.        priv->waiting_command_mask, command_p);
  197. priv->waiting_command_mask |= command_p;
  198. if (priv->waiting_command_mask & ARLAN_COMMAND_RESET)
  199. if (jiffies - priv->lastReset < 5 * HZ)
  200. priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET;
  201. if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ACK)
  202. {
  203. arlan_interrupt_ack(dev);
  204. priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ACK;
  205. }
  206. if (priv->waiting_command_mask & ARLAN_COMMAND_INT_ENABLE)
  207. {
  208. setInterruptEnable(dev);
  209. priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_ENABLE;
  210. }
  211. /* Card access serializing lock */
  212. if (test_and_set_bit(0, (void *) &priv->command_lock))
  213. {
  214. if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
  215. printk(KERN_DEBUG "arlan_command: entered when command locked n");
  216. goto command_busy_end;
  217. }
  218. /* Check cards status and waiting */
  219. if (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW))
  220. {
  221. while (priv->waiting_command_mask & (ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW))
  222. {
  223. if (READSHMB(arlan->resetFlag) ||
  224. READSHMB(arlan->commandByte)) /* || 
  225.    (readControlRegister(dev) & ARLAN_ACCESS))
  226.  */
  227. udelay(40);
  228. else
  229. priv->waiting_command_mask &= ~(ARLAN_COMMAND_LONG_WAIT_NOW | ARLAN_COMMAND_WAIT_NOW);
  230. udelayed++;
  231. if (priv->waiting_command_mask & ARLAN_COMMAND_LONG_WAIT_NOW)
  232. {
  233. if (udelayed * 40 > 1000000)
  234. {
  235. printk(KERN_ERR "%s long wait too long n", dev->name);
  236. priv->waiting_command_mask |= ARLAN_COMMAND_RESET;
  237. break;
  238. }
  239. }
  240. else if (priv->waiting_command_mask & ARLAN_COMMAND_WAIT_NOW)
  241. {
  242. if (udelayed * 40 > 1000)
  243. {
  244. printk(KERN_ERR "%s short wait too long n", dev->name);
  245. goto bad_end;
  246. }
  247. }
  248. }
  249. }
  250. else
  251. {
  252. i = 0;
  253. while ((READSHMB(arlan->resetFlag) ||
  254. READSHMB(arlan->commandByte)) &&
  255. conf->pre_Command_Wait > (i++) * 10)
  256. udelay(10);
  257. if ((READSHMB(arlan->resetFlag) ||
  258. READSHMB(arlan->commandByte)) &&
  259. !(priv->waiting_command_mask & ARLAN_COMMAND_RESET))
  260. {
  261. goto card_busy_end;
  262. }
  263. }
  264. if (priv->waiting_command_mask & ARLAN_COMMAND_RESET)
  265. priv->under_reset = 1;
  266. if (priv->waiting_command_mask & ARLAN_COMMAND_CONF)
  267. priv->under_config = 1;
  268. /* Issuing command */
  269. arlan_lock_card_access(dev);
  270. if (priv->waiting_command_mask & ARLAN_COMMAND_POWERUP)
  271. {
  272. //     if (readControlRegister(dev) & (ARLAN_ACCESS && ARLAN_POWER))
  273. setPowerOn(dev);
  274. arlan_interrupt_lancpu(dev);
  275. priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERUP;
  276. priv->waiting_command_mask |= ARLAN_COMMAND_RESET;
  277. priv->card_polling_interval = HZ / 10;
  278. }
  279. else if (priv->waiting_command_mask & ARLAN_COMMAND_ACTIVATE)
  280. {
  281. WRITESHMB(arlan->commandByte, ARLAN_COM_ACTIVATE);
  282. arlan_interrupt_lancpu(dev);
  283. priv->waiting_command_mask &= ~ARLAN_COMMAND_ACTIVATE;
  284. priv->card_polling_interval = HZ / 10;
  285. }
  286. else if (priv->waiting_command_mask & ARLAN_COMMAND_RX_ABORT)
  287. {
  288. if (priv->rx_command_given)
  289. {
  290. WRITESHMB(arlan->commandByte, ARLAN_COM_RX_ABORT);
  291. arlan_interrupt_lancpu(dev);
  292. priv->rx_command_given = 0;
  293. }
  294. priv->waiting_command_mask &= ~ARLAN_COMMAND_RX_ABORT;
  295. priv->card_polling_interval = 1;
  296. }
  297. else if (priv->waiting_command_mask & ARLAN_COMMAND_TX_ABORT)
  298. {
  299. if (priv->tx_command_given)
  300. {
  301. WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ABORT);
  302. arlan_interrupt_lancpu(dev);
  303. priv->tx_command_given = 0;
  304. }
  305. priv->waiting_command_mask &= ~ARLAN_COMMAND_TX_ABORT;
  306. priv->card_polling_interval = 1;
  307. }
  308. else if (priv->waiting_command_mask & ARLAN_COMMAND_RESET)
  309. {
  310. priv->under_reset=1;
  311. netif_stop_queue (dev);
  312. arlan_drop_tx(dev);
  313. if (priv->tx_command_given || priv->rx_command_given)
  314. {
  315. printk(KERN_ERR "%s: Reset under tx or rx command n", dev->name);
  316. };
  317. netif_stop_queue (dev);
  318. if (arlan_debug & ARLAN_DEBUG_RESET)
  319. printk(KERN_ERR "%s: Doing chip resetn", dev->name);
  320. priv->lastReset = jiffies;
  321. WRITESHM(arlan->commandByte, 0, u_char);
  322. /* hold card in reset state */
  323. setHardwareReset(dev);
  324. /* set reset flag and then release reset */
  325. WRITESHM(arlan->resetFlag, 0xff, u_char);
  326. clearChannelAttention(dev);
  327. clearHardwareReset(dev);
  328. priv->numResets++;
  329. priv->card_polling_interval = HZ / 4;
  330. priv->waiting_command_mask &= ~ARLAN_COMMAND_RESET;
  331. priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK;
  332. // priv->waiting_command_mask |= ARLAN_COMMAND_INT_RENABLE; 
  333. // priv->waiting_command_mask |= ARLAN_COMMAND_RX;
  334. }
  335. else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RACK)
  336. {
  337. clearHardwareReset(dev);
  338. clearClearInterrupt(dev);
  339. setClearInterrupt(dev);
  340. setInterruptEnable(dev);
  341. priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RACK;
  342. priv->waiting_command_mask |= ARLAN_COMMAND_CONF;
  343. priv->under_config = 1;
  344. priv->under_reset = 0;
  345. }
  346. else if (priv->waiting_command_mask & ARLAN_COMMAND_INT_RENABLE)
  347. {
  348. setInterruptEnable(dev);
  349. priv->waiting_command_mask &= ~ARLAN_COMMAND_INT_RENABLE;
  350. }
  351. else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF)
  352. {
  353. if (priv->tx_command_given || priv->rx_command_given)
  354. {
  355. printk(KERN_ERR "%s: Reset under tx or rx command n", dev->name);
  356. }
  357. arlan_drop_tx(dev);
  358. setInterruptEnable(dev);
  359. arlan_hw_config(dev);
  360. arlan_interrupt_lancpu(dev);
  361. priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF;
  362. priv->card_polling_interval = HZ / 10;
  363. // priv->waiting_command_mask |= ARLAN_COMMAND_INT_RACK;   
  364. // priv->waiting_command_mask |= ARLAN_COMMAND_INT_ENABLE; 
  365. priv->waiting_command_mask |= ARLAN_COMMAND_CONF_WAIT;
  366. }
  367. else if (priv->waiting_command_mask & ARLAN_COMMAND_CONF_WAIT)
  368. {
  369. if (READSHMB(arlan->configuredStatusFlag) != 0 &&
  370. READSHMB(arlan->diagnosticInfo) == 0xff)
  371. {
  372. priv->waiting_command_mask &= ~ARLAN_COMMAND_CONF_WAIT;
  373. priv->waiting_command_mask |= ARLAN_COMMAND_RX;
  374. priv->waiting_command_mask |= ARLAN_COMMAND_TBUSY_CLEAR;
  375. priv->card_polling_interval = HZ / 10;
  376. priv->tx_command_given = 0;
  377. priv->under_config = 0;
  378. }
  379. else
  380. {
  381. priv->card_polling_interval = 1;
  382. if (arlan_debug & ARLAN_DEBUG_TIMING)
  383. printk(KERN_ERR "configure delayed n");
  384. }
  385. }
  386. else if (priv->waiting_command_mask & ARLAN_COMMAND_RX)
  387. {
  388. if (!registrationBad(dev))
  389. {
  390. setInterruptEnable(dev);
  391. memset_io((void *) arlan->commandParameter, 0, 0xf);
  392. WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_RX_ENABLE);
  393. WRITESHMB(arlan->commandParameter[0], conf->rxParameter);
  394. arlan_interrupt_lancpu(dev);
  395. priv->rx_command_given = 0; // mnjah, bad
  396. priv->last_rx_time = arlan_time();
  397. priv->waiting_command_mask &= ~ARLAN_COMMAND_RX;
  398. priv->card_polling_interval = 1;
  399. }
  400. else
  401. priv->card_polling_interval = 2;
  402. }
  403. else if (priv->waiting_command_mask & ARLAN_COMMAND_TBUSY_CLEAR)
  404. {
  405. if ( !registrationBad(dev) &&
  406.      (netif_queue_stopped(dev) || !netif_running(dev)) )
  407. {
  408. priv->waiting_command_mask &= ~ARLAN_COMMAND_TBUSY_CLEAR;
  409. netif_wake_queue (dev);
  410. };
  411. }
  412. else if (priv->waiting_command_mask & ARLAN_COMMAND_TX)
  413. {
  414. if (!test_and_set_bit(0, (void *) &priv->tx_command_given))
  415. {
  416. if ((time_mks - priv->last_tx_time > conf->rx_tweak1) ||
  417. (time_mks - priv->last_rx_int_ack_time < conf->rx_tweak2))
  418. {
  419. setInterruptEnable(dev);
  420. memset_io((void *) arlan->commandParameter, 0, 0xf);
  421. WRITESHMB(arlan->commandByte, ARLAN_COM_TX_ENABLE | ARLAN_COM_INT);
  422. memcpy_toio((void *) arlan->commandParameter, &TXLAST(dev), 14);
  423. // for ( i=1 ; i < 15 ; i++) printk("%02x:",READSHMB(arlan->commandParameter[i]));
  424. priv->last_command_was_rx = 0;
  425. priv->tx_last_sent = jiffies;
  426. arlan_interrupt_lancpu(dev);
  427. priv->last_tx_time = arlan_time();
  428. priv->tx_command_given = 1;
  429. priv->waiting_command_mask &= ~ARLAN_COMMAND_TX;
  430. priv->card_polling_interval = 1;
  431. }
  432. else
  433. {
  434. priv->tx_command_given = 0;
  435. priv->card_polling_interval = 1;
  436. }
  437. else if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
  438. printk(KERN_ERR "tx command when tx chain locked n");
  439. }
  440. else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOPINT)
  441. {
  442. {
  443. WRITESHMB(arlan->commandByte, ARLAN_COM_NOP | ARLAN_COM_INT);
  444. }
  445. arlan_interrupt_lancpu(dev);
  446. priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOPINT;
  447. priv->card_polling_interval = HZ / 3;
  448. }
  449. else if (priv->waiting_command_mask & ARLAN_COMMAND_NOOP)
  450. {
  451. WRITESHMB(arlan->commandByte, ARLAN_COM_NOP);
  452. arlan_interrupt_lancpu(dev);
  453. priv->waiting_command_mask &= ~ARLAN_COMMAND_NOOP;
  454. priv->card_polling_interval = HZ / 3;
  455. }
  456. else if (priv->waiting_command_mask & ARLAN_COMMAND_SLOW_POLL)
  457. {
  458. WRITESHMB(arlan->commandByte, ARLAN_COM_GOTO_SLOW_POLL);
  459. arlan_interrupt_lancpu(dev);
  460. priv->waiting_command_mask &= ~ARLAN_COMMAND_SLOW_POLL;
  461. priv->card_polling_interval = HZ / 3;
  462. else if (priv->waiting_command_mask & ARLAN_COMMAND_POWERDOWN)
  463. {
  464. setPowerOff(dev);
  465. if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
  466. printk(KERN_WARNING "%s: Arlan Going Standbyn", dev->name);
  467. priv->waiting_command_mask &= ~ARLAN_COMMAND_POWERDOWN;
  468. priv->card_polling_interval = 3 * HZ;
  469. }
  470. arlan_unlock_card_access(dev);
  471. for (i = 0; READSHMB(arlan->commandByte) && i < 20; i++)
  472. udelay(10);
  473. if (READSHMB(arlan->commandByte))
  474. if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
  475. printk(KERN_ERR "card busy leaving command %x n", priv->waiting_command_mask);
  476. priv->command_lock = 0;
  477. ARLAN_DEBUG_EXIT("arlan_command");
  478. priv->last_command_buff_free_time = jiffies;
  479. return 0;
  480. card_busy_end:
  481. if (jiffies - priv->last_command_buff_free_time > HZ)
  482. priv->waiting_command_mask |= ARLAN_COMMAND_CLEAN_AND_RESET;
  483. if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
  484. printk(KERN_ERR "%s arlan_command card busy end n", dev->name);
  485. priv->command_lock = 0;
  486. ARLAN_DEBUG_EXIT("arlan_command");
  487. return 1;
  488. bad_end:
  489. printk(KERN_ERR "%s arlan_command bad end n", dev->name);
  490. priv->command_lock = 0;
  491. ARLAN_DEBUG_EXIT("arlan_command");
  492. return -1;
  493. command_busy_end:
  494. if (arlan_debug & ARLAN_DEBUG_CARD_STATE)
  495. printk(KERN_ERR "%s arlan_command command busy end n", dev->name);
  496. ARLAN_DEBUG_EXIT("arlan_command");
  497. return 2;
  498. };
  499. extern inline void arlan_command_process(struct net_device *dev)
  500. {
  501. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  502. int times = 0;
  503. while (priv->waiting_command_mask && times < 8)
  504. {
  505. if (priv->waiting_command_mask)
  506. {
  507. if (arlan_command(dev, 0))
  508. break;
  509. times++;
  510. }
  511. /* if long command, we wont repeat trying */ ;
  512. if (priv->card_polling_interval > 1)
  513. break;
  514. times++;
  515. }
  516. }
  517. extern inline void arlan_retransmit_now(struct net_device *dev)
  518. {
  519. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  520. ARLAN_DEBUG_ENTRY("arlan_retransmit_now");
  521. if (TXLAST(dev).offset == 0)
  522. {
  523. if (TXHEAD(dev).offset)
  524. {
  525. priv->txLast = 0;
  526. IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to head n");
  527. }
  528. else if (TXTAIL(dev).offset)
  529. {
  530. IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_DEBUG "TX buff switch to tail n");
  531. priv->txLast = 1;
  532. }
  533. else
  534. IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "ReTransmit buff empty");
  535. priv->txOffset = 0;
  536. netif_wake_queue (dev);
  537. return;
  538. }
  539. arlan_command(dev, ARLAN_COMMAND_TX);
  540. priv->nof_tx++;
  541. priv->Conf->driverRetransmissions++;
  542. priv->retransmissions++;
  543. IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("Retransmit %d bytes n", TXLAST(dev).length);
  544. ARLAN_DEBUG_EXIT("arlan_retransmit_now");
  545. }
  546. static void arlan_registration_timer(unsigned long data)
  547. {
  548. struct net_device *dev = (struct net_device *) data;
  549. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  550. int lostTime = ((int) (jiffies - priv->registrationLastSeen)) * 1000 / HZ;
  551. int bh_mark_needed = 0;
  552. int next_tick = 1;
  553. priv->timer_chain_active = 1;
  554. if (registrationBad(dev))
  555. {
  556. //debug=100;
  557. priv->registrationLostCount++;
  558. if (lostTime > 7000 && lostTime < 7200)
  559. {
  560. printk(KERN_NOTICE "%s registration Lost n", dev->name);
  561. }
  562. if (lostTime / priv->reRegisterExp > 2000)
  563. arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF);
  564. if (lostTime / (priv->reRegisterExp) > 3500)
  565. arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);
  566. if (priv->reRegisterExp < 400)
  567. priv->reRegisterExp += 2;
  568. if (lostTime > 7200)
  569. {
  570. next_tick = HZ;
  571. arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);
  572. }
  573. }
  574. else
  575. {
  576. if (priv->Conf->registrationMode && lostTime > 10000 &&
  577. priv->registrationLostCount)
  578. {
  579. printk(KERN_NOTICE "%s registration is back after %d millisecondsn", dev->name,
  580. ((int) (jiffies - priv->registrationLastSeen) * 1000) / HZ);
  581. }
  582. priv->registrationLastSeen = jiffies;
  583. priv->registrationLostCount = 0;
  584. priv->reRegisterExp = 1;
  585. if (!netif_running(dev) )
  586. netif_wake_queue(dev);
  587. if (priv->tx_last_sent > priv->tx_last_cleared &&
  588. jiffies - priv->tx_last_sent > 5*HZ ){
  589. arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);
  590. priv->tx_last_cleared = jiffies;
  591. };
  592. }
  593. if (!registrationBad(dev) && priv->ReTransmitRequested)
  594. {
  595. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  596. printk(KERN_ERR "Retransmit from timer n");
  597. priv->ReTransmitRequested = 0;
  598. arlan_retransmit_now(dev);
  599. }
  600. if (!registrationBad(dev) &&
  601. priv->tx_done_delayed < jiffies &&
  602. priv->tx_done_delayed != 0)
  603. {
  604. TXLAST(dev).offset = 0;
  605. if (priv->txLast)
  606. priv->txLast = 0;
  607. else if (TXTAIL(dev).offset)
  608. priv->txLast = 1;
  609. if (TXLAST(dev).offset)
  610. {
  611. arlan_retransmit_now(dev);
  612. dev->trans_start = jiffies;
  613. }
  614. if (!(TXHEAD(dev).offset && TXTAIL(dev).offset))
  615. {
  616. priv->txOffset = 0;
  617. netif_wake_queue (dev);
  618. }
  619. priv->tx_done_delayed = 0;
  620. bh_mark_needed = 1;
  621. }
  622. if (bh_mark_needed)
  623. {
  624. priv->txOffset = 0;
  625. netif_wake_queue (dev);
  626. }
  627. arlan_process_interrupt(dev);
  628. if (next_tick < priv->card_polling_interval)
  629. next_tick = priv->card_polling_interval;
  630. priv->timer_chain_active = 0;
  631. priv->timer.expires = jiffies + next_tick;
  632. add_timer(&priv->timer);
  633. }
  634. #ifdef ARLAN_DEBUGGING
  635. static void arlan_print_registers(struct net_device *dev, int line)
  636. {
  637. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  638. u_char hostcpuLock, lancpuLock, controlRegister, cntrlRegImage,
  639. txStatus, rxStatus, interruptInProgress, commandByte;
  640. ARLAN_DEBUG_ENTRY("arlan_print_registers");
  641. READSHM(interruptInProgress, arlan->interruptInProgress, u_char);
  642. READSHM(hostcpuLock, arlan->hostcpuLock, u_char);
  643. READSHM(lancpuLock, arlan->lancpuLock, u_char);
  644. READSHM(controlRegister, arlan->controlRegister, u_char);
  645. READSHM(cntrlRegImage, arlan->cntrlRegImage, u_char);
  646. READSHM(txStatus, arlan->txStatus, u_char);
  647. READSHM(rxStatus, arlan->rxStatus, u_char);
  648. READSHM(commandByte, arlan->commandByte, u_char);
  649. printk(KERN_WARNING "line %04d IP %02x HL %02x LL %02x CB %02x CR %02x CRI %02x TX %02x RX %02xn",
  650. line, interruptInProgress, hostcpuLock, lancpuLock, commandByte,
  651. controlRegister, cntrlRegImage, txStatus, rxStatus);
  652. ARLAN_DEBUG_EXIT("arlan_print_registers");
  653. }
  654. #endif
  655. static int arlan_hw_tx(struct net_device *dev, char *buf, int length)
  656. {
  657. int i;
  658. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  659. volatile struct arlan_shmem *arlan = priv->card;
  660. struct arlan_conf_stru *conf = priv->Conf;
  661. int tailStarts = 0x800;
  662. int headEnds = 0x0;
  663. ARLAN_DEBUG_ENTRY("arlan_hw_tx");
  664. if (TXHEAD(dev).offset)
  665. headEnds = (((TXHEAD(dev).offset + TXHEAD(dev).length - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 1) * 64;
  666. if (TXTAIL(dev).offset)
  667. tailStarts = 0x800 - (((TXTAIL(dev).offset - (((int) arlan->txBuffer) - ((int) arlan))) / 64) + 2) * 64;
  668. if (!TXHEAD(dev).offset && length < tailStarts)
  669. {
  670. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  671. printk(KERN_ERR "TXHEAD insert, tailStart %dn", tailStarts);
  672. TXHEAD(dev).offset =
  673. (((int) arlan->txBuffer) - ((int) arlan));
  674. TXHEAD(dev).length = length - ARLAN_FAKE_HDR_LEN;
  675. for (i = 0; i < 6; i++)
  676. TXHEAD(dev).dest[i] = buf[i];
  677. TXHEAD(dev).clear = conf->txClear;
  678. TXHEAD(dev).retries = conf->txRetries; /* 0 is use default */
  679. TXHEAD(dev).routing = conf->txRouting;
  680. TXHEAD(dev).scrambled = conf->txScrambled;
  681. memcpy_toio(((char *) arlan + TXHEAD(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXHEAD(dev).length);
  682. }
  683. else if (!TXTAIL(dev).offset && length < (0x800 - headEnds))
  684. {
  685. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  686. printk(KERN_ERR "TXTAIL insert, headEnd %dn", headEnds);
  687. TXTAIL(dev).offset =
  688. (((int) arlan->txBuffer) - ((int) arlan)) + 0x800 - (length / 64 + 2) * 64;
  689. TXTAIL(dev).length = length - ARLAN_FAKE_HDR_LEN;
  690. for (i = 0; i < 6; i++)
  691. TXTAIL(dev).dest[i] = buf[i];
  692. TXTAIL(dev).clear = conf->txClear;
  693. TXTAIL(dev).retries = conf->txRetries;
  694. TXTAIL(dev).routing = conf->txRouting;
  695. TXTAIL(dev).scrambled = conf->txScrambled;
  696. memcpy_toio(((char *) arlan + TXTAIL(dev).offset), buf + ARLAN_FAKE_HDR_LEN, TXTAIL(dev).length);
  697. }
  698. else
  699. {
  700. netif_stop_queue (dev);
  701. return -1;
  702. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  703. printk(KERN_ERR "TX TAIL & HEAD full, return, tailStart %d headEnd %dn", tailStarts, headEnds);
  704. }
  705. priv->out_bytes += length;
  706. priv->out_bytes10 += length;
  707. if (conf->measure_rate < 1)
  708. conf->measure_rate = 1;
  709. if (jiffies - priv->out_time > conf->measure_rate * HZ)
  710. {
  711. conf->out_speed = priv->out_bytes / conf->measure_rate;
  712. priv->out_bytes = 0;
  713. priv->out_time = jiffies;
  714. }
  715. if (jiffies - priv->out_time10 > conf->measure_rate * HZ * 10)
  716. {
  717. conf->out_speed10 = priv->out_bytes10 / (10 * conf->measure_rate);
  718. priv->out_bytes10 = 0;
  719. priv->out_time10 = jiffies;
  720. }
  721. if (TXHEAD(dev).offset && TXTAIL(dev).offset)
  722. {
  723. netif_stop_queue (dev);
  724. return 0;
  725. }
  726. else
  727. netif_start_queue (dev);
  728. IFDEBUG(ARLAN_DEBUG_HEADER_DUMP)
  729. printk(KERN_WARNING "%s Transmit t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x n", dev->name,
  730.    (unsigned char) buf[0], (unsigned char) buf[1], (unsigned char) buf[2], (unsigned char) buf[3],
  731.    (unsigned char) buf[4], (unsigned char) buf[5], (unsigned char) buf[6], (unsigned char) buf[7],
  732.    (unsigned char) buf[8], (unsigned char) buf[9], (unsigned char) buf[10], (unsigned char) buf[11]);
  733. IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk(KERN_ERR "TX command prepare for buffer %dn", priv->txLast);
  734. arlan_command(dev, ARLAN_COMMAND_TX);
  735. priv->last_command_was_rx = 0;
  736. priv->tx_last_sent = jiffies;
  737. priv->nof_tx++;
  738. IFDEBUG(ARLAN_DEBUG_TX_CHAIN) printk("%s TX Qued %d bytes n", dev->name, length);
  739. ARLAN_DEBUG_EXIT("arlan_hw_tx");
  740. return 0;
  741. }
  742. static int arlan_hw_config(struct net_device *dev)
  743. {
  744. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  745. struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
  746. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  747. ARLAN_DEBUG_ENTRY("arlan_hw_config");
  748. printk(KERN_NOTICE "%s arlan configure called n", dev->name);
  749. if (arlan_EEPROM_bad)
  750. printk(KERN_NOTICE "arlan configure with eeprom bad option n");
  751. WRITESHM(arlan->spreadingCode, conf->spreadingCode, u_char);
  752. WRITESHM(arlan->channelSet, conf->channelSet, u_char);
  753. if (arlan_EEPROM_bad)
  754. WRITESHM(arlan->defaultChannelSet, conf->channelSet, u_char);
  755. WRITESHM(arlan->channelNumber, conf->channelNumber, u_char);
  756. WRITESHM(arlan->scramblingDisable, conf->scramblingDisable, u_char);
  757. WRITESHM(arlan->txAttenuation, conf->txAttenuation, u_char);
  758. WRITESHM(arlan->systemId, conf->systemId, u_int);
  759. WRITESHM(arlan->maxRetries, conf->maxRetries, u_char);
  760. WRITESHM(arlan->receiveMode, conf->receiveMode, u_char);
  761. WRITESHM(arlan->priority, conf->priority, u_char);
  762. WRITESHM(arlan->rootOrRepeater, conf->rootOrRepeater, u_char);
  763. WRITESHM(arlan->SID, conf->SID, u_int);
  764. WRITESHM(arlan->registrationMode, conf->registrationMode, u_char);
  765. WRITESHM(arlan->registrationFill, conf->registrationFill, u_char);
  766. WRITESHM(arlan->localTalkAddress, conf->localTalkAddress, u_char);
  767. WRITESHM(arlan->codeFormat, conf->codeFormat, u_char);
  768. WRITESHM(arlan->numChannels, conf->numChannels, u_char);
  769. WRITESHM(arlan->channel1, conf->channel1, u_char);
  770. WRITESHM(arlan->channel2, conf->channel2, u_char);
  771. WRITESHM(arlan->channel3, conf->channel3, u_char);
  772. WRITESHM(arlan->channel4, conf->channel4, u_char);
  773. WRITESHM(arlan->radioNodeId, conf->radioNodeId, u_short);
  774. WRITESHM(arlan->SID, conf->SID, u_int);
  775. WRITESHM(arlan->waitTime, conf->waitTime, u_short);
  776. WRITESHM(arlan->lParameter, conf->lParameter, u_short);
  777. memcpy_toio(&(arlan->_15), &(conf->_15), 3);
  778. WRITESHM(arlan->_15, conf->_15, u_short);
  779. WRITESHM(arlan->headerSize, conf->headerSize, u_short);
  780. if (arlan_EEPROM_bad)
  781. WRITESHM(arlan->hardwareType, conf->hardwareType, u_char);
  782. WRITESHM(arlan->radioType, conf->radioType, u_char);
  783. if (arlan_EEPROM_bad)
  784. WRITESHM(arlan->radioModule, conf->radioType, u_char);
  785. memcpy_toio(arlan->encryptionKey + keyStart, encryptionKey, 8);
  786. memcpy_toio(arlan->name, conf->siteName, 16);
  787. WRITESHMB(arlan->commandByte, ARLAN_COM_INT | ARLAN_COM_CONF); /* do configure */
  788. memset_io(arlan->commandParameter, 0, 0xf); /* 0xf */
  789. memset_io(arlan->commandParameter + 1, 0, 2);
  790. if (conf->writeEEPROM)
  791. {
  792.   memset_io(arlan->commandParameter, conf->writeEEPROM, 1);
  793. // conf->writeEEPROM=0;
  794. }
  795. if (conf->registrationMode && conf->registrationInterrupts)
  796. memset_io(arlan->commandParameter + 3, 1, 1);
  797. else
  798. memset_io(arlan->commandParameter + 3, 0, 1);
  799. priv->irq_test_done = 0;
  800. if (conf->tx_queue_len)
  801. dev->tx_queue_len = conf->tx_queue_len;
  802. udelay(100);
  803. ARLAN_DEBUG_EXIT("arlan_hw_config");
  804. return 0;
  805. }
  806. static int arlan_read_card_configuration(struct net_device *dev)
  807. {
  808. u_char tlx415;
  809. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  810. struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
  811. ARLAN_DEBUG_ENTRY("arlan_read_card_configuration");
  812. if (radioNodeId == radioNodeIdUNKNOWN)
  813. {
  814. READSHM(conf->radioNodeId, arlan->radioNodeId, u_short);
  815. }
  816. else
  817. conf->radioNodeId = radioNodeId;
  818. if (SID == SIDUNKNOWN)
  819. {
  820. READSHM(conf->SID, arlan->SID, u_int);
  821. }
  822. else conf->SID = SID;
  823. if (spreadingCode == spreadingCodeUNKNOWN)
  824. {
  825.   READSHM(conf->spreadingCode, arlan->spreadingCode, u_char);
  826. }
  827. else
  828. conf->spreadingCode = spreadingCode;
  829. if (channelSet == channelSetUNKNOWN)
  830. {
  831. READSHM(conf->channelSet, arlan->channelSet, u_char);
  832. }
  833. else conf->channelSet = channelSet;
  834. if (channelNumber == channelNumberUNKNOWN)
  835. {
  836. READSHM(conf->channelNumber, arlan->channelNumber, u_char);
  837. }
  838. else conf->channelNumber = channelNumber;
  839. READSHM(conf->scramblingDisable, arlan->scramblingDisable, u_char);
  840. READSHM(conf->txAttenuation, arlan->txAttenuation, u_char);
  841. if (systemId == systemIdUNKNOWN)
  842. {
  843. READSHM(conf->systemId, arlan->systemId, u_int);
  844. else conf->systemId = systemId;
  845. READSHM(conf->maxDatagramSize, arlan->maxDatagramSize, u_short);
  846. READSHM(conf->maxFrameSize, arlan->maxFrameSize, u_short);
  847. READSHM(conf->maxRetries, arlan->maxRetries, u_char);
  848. READSHM(conf->receiveMode, arlan->receiveMode, u_char);
  849. READSHM(conf->priority, arlan->priority, u_char);
  850. READSHM(conf->rootOrRepeater, arlan->rootOrRepeater, u_char);
  851. if (SID == SIDUNKNOWN)
  852. {
  853.   READSHM(conf->SID, arlan->SID, u_int);
  854. }
  855. else conf->SID = SID;
  856. if (registrationMode == registrationModeUNKNOWN)
  857. {
  858.   READSHM(conf->registrationMode, arlan->registrationMode, u_char);
  859. }
  860. else conf->registrationMode = registrationMode;
  861. READSHM(conf->registrationFill, arlan->registrationFill, u_char);
  862. READSHM(conf->localTalkAddress, arlan->localTalkAddress, u_char);
  863. READSHM(conf->codeFormat, arlan->codeFormat, u_char);
  864. READSHM(conf->numChannels, arlan->numChannels, u_char);
  865. READSHM(conf->channel1, arlan->channel1, u_char);
  866. READSHM(conf->channel2, arlan->channel2, u_char);
  867. READSHM(conf->channel3, arlan->channel3, u_char);
  868. READSHM(conf->channel4, arlan->channel4, u_char);
  869. READSHM(conf->waitTime, arlan->waitTime, u_short);
  870. READSHM(conf->lParameter, arlan->lParameter, u_short);
  871. READSHM(conf->_15, arlan->_15, u_short);
  872. READSHM(conf->headerSize, arlan->headerSize, u_short);
  873. READSHM(conf->hardwareType, arlan->hardwareType, u_char);
  874. READSHM(conf->radioType, arlan->radioModule, u_char);
  875. if (conf->radioType == 0)
  876. conf->radioType = 0xc;
  877. WRITESHM(arlan->configStatus, 0xA5, u_char);
  878. READSHM(tlx415, arlan->configStatus, u_char);
  879. if (tlx415 != 0xA5)
  880. printk(KERN_INFO "%s tlx415 chip n", dev->name);
  881. conf->txClear = 0;
  882. conf->txRetries = 1;
  883. conf->txRouting = 1;
  884. conf->txScrambled = 0;
  885. conf->rxParameter = 1;
  886. conf->txTimeoutMs = 4000;
  887. conf->waitCardTimeout = 100000;
  888. conf->receiveMode = ARLAN_RCV_CLEAN;
  889. memcpy_fromio(conf->siteName, arlan->name, 16);
  890. conf->siteName[16] = '';
  891. conf->retries = retries;
  892. conf->tx_delay_ms = tx_delay_ms;
  893. conf->async = async;
  894. conf->ReTransmitPacketMaxSize = 200;
  895. conf->waitReTransmitPacketMaxSize = 200;
  896. conf->txAckTimeoutMs = 900;
  897. conf->fastReTransCount = 3;
  898. ARLAN_DEBUG_EXIT("arlan_read_card_configuration");
  899. return 0;
  900. }
  901. static int lastFoundAt = 0xbe000;
  902. /*
  903.  * This is the real probe routine. Linux has a history of friendly device
  904.  * probes on the ISA bus. A good device probes avoids doing writes, and
  905.  * verifies that the correct device exists and functions.
  906.  */
  907. static int __init arlan_check_fingerprint(int memaddr)
  908. {
  909. static char probeText[] = "TELESYSTEM SLW INC.    ARLAN ";
  910. char tempBuf[49];
  911. volatile struct arlan_shmem *arlan = (struct arlan_shmem *) memaddr;
  912. ARLAN_DEBUG_ENTRY("arlan_check_fingerprint");
  913. if (check_mem_region(virt_to_phys((void *)memaddr),0x2000 )){
  914. // printk(KERN_WARNING "arlan: memory region %lx excluded from probing n",virt_to_phys((void*)memaddr));
  915. return -ENODEV;
  916. };
  917. memcpy_fromio(tempBuf, arlan->textRegion, 29);
  918. tempBuf[30] = 0;
  919. /* check for card at this address */
  920. if (0 != strncmp(tempBuf, probeText, 29)){
  921. // not  release_mem_region(virt_to_phys((void*)memaddr),0x2000);
  922. return -ENODEV;
  923. }
  924. //   printk(KERN_INFO "arlan found at 0x%x n",memaddr);
  925. ARLAN_DEBUG_EXIT("arlan_check_fingerprint");
  926. return 0;
  927. }
  928. static int __init arlan_probe_everywhere(struct net_device *dev)
  929. {
  930. int m;
  931. int probed = 0;
  932. int found = 0;
  933. SET_MODULE_OWNER(dev);
  934. ARLAN_DEBUG_ENTRY("arlan_probe_everywhere");
  935. if (mem != 0 && numDevices == 1) /* Check a single specified location. */
  936. {
  937. if (arlan_probe_here(dev, (int) phys_to_virt(  mem) ) == 0)
  938. return 0;
  939. else
  940. return -ENODEV;
  941. }
  942. for (m = (int)phys_to_virt(lastFoundAt) + 0x2000; m <= (int)phys_to_virt(0xDE000); m += 0x2000)
  943. {
  944. if (arlan_probe_here(dev, m) == 0)
  945. {
  946. found++;
  947. lastFoundAt = (int)virt_to_phys((void*)m);
  948. break;
  949. }
  950. probed++;
  951. }
  952. if (found == 0 && probed != 0)
  953. {
  954. if (lastFoundAt == 0xbe000)
  955. printk(KERN_ERR "arlan: No Arlan devices found n");
  956. return -ENODEV;
  957. }
  958. else
  959. return 0;
  960. ARLAN_DEBUG_EXIT("arlan_probe_everywhere");
  961. return -ENODEV;
  962. }
  963. static int __init arlan_find_devices(void)
  964. {
  965. int m;
  966. int found = 0;
  967. ARLAN_DEBUG_ENTRY("arlan_find_devices");
  968. if (mem != 0 && numDevices == 1) /* Check a single specified location. */
  969. return 1;
  970. for (m =(int) phys_to_virt(0xc0000); m <=(int) phys_to_virt(0xDE000); m += 0x2000)
  971. {
  972. if (arlan_check_fingerprint(m) == 0)
  973. found++;
  974. }
  975. ARLAN_DEBUG_EXIT("arlan_find_devices");
  976. return found;
  977. }
  978. static int arlan_change_mtu(struct net_device *dev, int new_mtu)
  979. {
  980. struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
  981. ARLAN_DEBUG_ENTRY("arlan_change_mtu");
  982. if (new_mtu > 2032)
  983. return -EINVAL;
  984. dev->mtu = new_mtu;
  985. if (new_mtu < 256)
  986. new_mtu = 256; /* cards book suggests 1600 */
  987. conf->maxDatagramSize = new_mtu;
  988. conf->maxFrameSize = new_mtu + 48;
  989. arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_CONF);
  990. printk(KERN_NOTICE "%s mtu changed to %d n", dev->name, new_mtu);
  991. ARLAN_DEBUG_EXIT("arlan_change_mtu");
  992. return 0;
  993. }
  994. static int arlan_mac_addr(struct net_device *dev, void *p)
  995. {
  996. struct sockaddr *addr = p;
  997. ARLAN_DEBUG_ENTRY("arlan_mac_addr");
  998. return -EINVAL;
  999. if (!netif_running(dev))
  1000. return -EBUSY;
  1001. memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
  1002. ARLAN_DEBUG_EXIT("arlan_mac_addr");
  1003. return 0;
  1004. }
  1005. static int __init
  1006.       arlan_allocate_device(int num, struct net_device *devs)
  1007. {
  1008. struct net_device *dev;
  1009. ARLAN_DEBUG_ENTRY("arlan_allocate_device");
  1010. if (!devs)
  1011. dev = init_etherdev(0, sizeof(struct arlan_private));
  1012. else
  1013. {
  1014. dev = devs;
  1015. dev->priv = kmalloc(sizeof(struct arlan_private), GFP_KERNEL);
  1016. };
  1017. if (dev == NULL || dev->priv == NULL)
  1018. {
  1019. printk(KERN_CRIT "init_etherdev failed ");
  1020. return 0;
  1021. }
  1022. memset(dev->priv,0,sizeof(struct arlan_private));
  1023. ((struct arlan_private *) dev->priv)->conf =
  1024.     kmalloc(sizeof(struct arlan_shmem), GFP_KERNEL);
  1025. if (dev == NULL || dev->priv == NULL ||
  1026.     ((struct arlan_private *) dev->priv)->conf == NULL)
  1027. {
  1028. return 0;
  1029. printk(KERN_CRIT " No memory at arlan_allocate_device n");
  1030. }
  1031. /* Fill in the 'dev' fields. */
  1032. dev->base_addr = 0;
  1033. dev->mem_start = 0;
  1034. dev->mem_end = 0;
  1035. dev->mtu = 1500;
  1036. dev->flags = 0; /* IFF_BROADCAST & IFF_MULTICAST & IFF_PROMISC; */
  1037. dev->irq = 0;
  1038. dev->dma = 0;
  1039. dev->tx_queue_len = tx_queue_len;
  1040. ether_setup(dev);
  1041. dev->tx_queue_len = tx_queue_len;
  1042. dev->open = arlan_open;
  1043. dev->stop = arlan_close;
  1044. dev->hard_start_xmit = arlan_tx;
  1045. dev->get_stats = arlan_statistics;
  1046. dev->set_multicast_list = arlan_set_multicast;
  1047. dev->change_mtu = arlan_change_mtu;
  1048. dev->set_mac_address = arlan_mac_addr;
  1049. dev->tx_timeout = arlan_tx_timeout;
  1050. dev->watchdog_timeo = 3*HZ;
  1051. ((struct arlan_private *) dev->priv)->irq_test_done = 0;
  1052. arlan_device[num] = dev;
  1053. ((struct arlan_private *) arlan_device[num]->priv)->Conf = &(arlan_conf[num]);
  1054. ((struct arlan_private *) dev->priv)->Conf->pre_Command_Wait = 40;
  1055. ((struct arlan_private *) dev->priv)->Conf->rx_tweak1 = 30;
  1056. ((struct arlan_private *) dev->priv)->Conf->rx_tweak2 = 0;
  1057. ARLAN_DEBUG_EXIT("arlan_allocate_device");
  1058. return (int) dev;
  1059. }
  1060. static int __init arlan_probe_here(struct net_device *dev, int memaddr)
  1061. {
  1062. volatile struct arlan_shmem *arlan;
  1063. ARLAN_DEBUG_ENTRY("arlan_probe_here");
  1064. if (arlan_check_fingerprint(memaddr))
  1065. return -ENODEV;
  1066. printk(KERN_NOTICE "%s: Arlan found at %x, n ", dev->name, (int) virt_to_phys((void*)memaddr));
  1067. if (!arlan_allocate_device(arlans_found, dev))
  1068. return -1;
  1069. ((struct arlan_private *) dev->priv)->card = (struct arlan_shmem *) memaddr;
  1070. arlan = (void *) memaddr;
  1071. dev->mem_start = memaddr;
  1072. dev->mem_end = memaddr + 0x1FFF;
  1073. if (dev->irq < 2)
  1074. {
  1075. READSHM(dev->irq, arlan->irqLevel, u_char);
  1076. } else if (dev->irq == 2)
  1077. dev->irq = 9;
  1078. arlan_read_card_configuration(dev);
  1079. ARLAN_DEBUG_EXIT("arlan_probe_here");
  1080. return 0;
  1081. }
  1082. static int arlan_open(struct net_device *dev)
  1083. {
  1084. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  1085. volatile struct arlan_shmem *arlan = priv->card;
  1086. int ret = 0;
  1087. ARLAN_DEBUG_ENTRY("arlan_open");
  1088. if (dev->mem_start == 0)
  1089. ret = arlan_probe_everywhere(dev);
  1090. if (ret != 0)
  1091. return ret;
  1092. arlan = ((struct arlan_private *) dev->priv)->card;
  1093. ret = request_irq(dev->irq, &arlan_interrupt, 0, dev->name, dev);
  1094. if (ret)
  1095. {
  1096. printk(KERN_ERR "%s: unable to get IRQ %d .n",
  1097. dev->name, dev->irq);
  1098. return ret;
  1099. }
  1100. priv->bad = 0;
  1101. priv->lastReset = 0;
  1102. priv->reset = 0;
  1103. priv->open_time = jiffies;
  1104. memcpy_fromio(dev->dev_addr, arlan->lanCardNodeId, 6);
  1105. memset(dev->broadcast, 0xff, 6);
  1106. priv->txOffset = 0;
  1107. dev->tx_queue_len = tx_queue_len;
  1108. priv->interrupt_processing_active = 0;
  1109. priv->command_lock = 0;
  1110. netif_start_queue (dev);
  1111. init_MUTEX(&priv->card_lock);
  1112. myATOMIC_INIT(priv->card_users, 1); /* damn 2.0.33 */
  1113. priv->registrationLostCount = 0;
  1114. priv->registrationLastSeen = jiffies;
  1115. priv->txLast = 0;
  1116. priv->tx_command_given = 0;
  1117. priv->rx_command_given = 0;
  1118. priv->reRegisterExp = 1;
  1119. priv->nof_tx = 0;
  1120. priv->nof_tx_ack = 0;
  1121. priv->last_command_was_rx = 0;
  1122. priv->tx_last_sent = jiffies - 1;
  1123. priv->tx_last_cleared = jiffies;
  1124. priv->Conf->writeEEPROM = 0;
  1125. priv->Conf->registrationInterrupts = 1;
  1126. init_timer(&priv->timer);
  1127. priv->timer.expires = jiffies + HZ / 10;
  1128. priv->timer.data = (unsigned long) dev;
  1129. priv->timer.function = &arlan_registration_timer; /* timer handler */
  1130. arlan_command(dev, ARLAN_COMMAND_POWERUP | ARLAN_COMMAND_LONG_WAIT_NOW);
  1131. mdelay(200);
  1132. add_timer(&priv->timer);
  1133. #ifdef CONFIG_PROC_FS
  1134. #ifndef MODULE
  1135. if (arlan_device[0])
  1136. init_arlan_proc();
  1137. #endif
  1138. #endif
  1139. ARLAN_DEBUG_EXIT("arlan_open");
  1140. return 0;
  1141. }
  1142. static void arlan_tx_timeout (struct net_device *dev)
  1143. {
  1144. printk(KERN_ERR "%s: arlan transmit timed out, kernel decidedn", dev->name);
  1145. /* Try to restart the adaptor. */
  1146. arlan_command(dev, ARLAN_COMMAND_CLEAN_AND_RESET);
  1147. // dev->trans_start = jiffies;
  1148. // netif_start_queue (dev);
  1149. }
  1150. static int arlan_tx(struct sk_buff *skb, struct net_device *dev)
  1151. {
  1152. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  1153. short length;
  1154. unsigned char *buf;
  1155. ARLAN_DEBUG_ENTRY("arlan_tx");
  1156. length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
  1157. buf = skb->data;
  1158. if (priv->txOffset + length + 0x12 > 0x800) {
  1159. printk(KERN_ERR "TX RING overflow n");
  1160. netif_stop_queue (dev);
  1161. }
  1162. if (arlan_hw_tx(dev, buf, length) == -1)
  1163. goto bad_end;
  1164. dev->trans_start = jiffies;
  1165. dev_kfree_skb(skb);
  1166. arlan_process_interrupt(dev);
  1167. priv->tx_chain_active = 0;
  1168. ARLAN_DEBUG_EXIT("arlan_tx");
  1169. return 0;
  1170. bad_end:
  1171. arlan_process_interrupt(dev);
  1172. priv->tx_chain_active = 0;
  1173. netif_stop_queue (dev);
  1174. ARLAN_DEBUG_EXIT("arlan_tx");
  1175. return 1;
  1176. }
  1177. extern inline int DoNotReTransmitCrap(struct net_device *dev)
  1178. {
  1179. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  1180. if (TXLAST(dev).length < priv->Conf->ReTransmitPacketMaxSize)
  1181. return 1;
  1182. return 0;
  1183. }
  1184. extern inline int DoNotWaitReTransmitCrap(struct net_device *dev)
  1185. {
  1186. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  1187. if (TXLAST(dev).length < priv->Conf->waitReTransmitPacketMaxSize)
  1188. return 1;
  1189. return 0;
  1190. }
  1191. extern inline void arlan_queue_retransmit(struct net_device *dev)
  1192. {
  1193. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  1194. ARLAN_DEBUG_ENTRY("arlan_queue_retransmit");
  1195. if (DoNotWaitReTransmitCrap(dev))
  1196. {
  1197.   arlan_drop_tx(dev);
  1198. } else
  1199. priv->ReTransmitRequested++;
  1200. ARLAN_DEBUG_EXIT("arlan_queue_retransmit");
  1201. };
  1202. static inline void RetryOrFail(struct net_device *dev)
  1203. {
  1204. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  1205. ARLAN_DEBUG_ENTRY("RetryOrFail");
  1206. if (priv->retransmissions > priv->Conf->retries ||
  1207.     DoNotReTransmitCrap(dev))
  1208. {
  1209. arlan_drop_tx(dev);
  1210. }
  1211. else if (priv->bad <= priv->Conf->fastReTransCount)
  1212. {
  1213. arlan_retransmit_now(dev);
  1214. }
  1215. else arlan_queue_retransmit(dev);
  1216. ARLAN_DEBUG_EXIT("RetryOrFail");
  1217. }
  1218. static void arlan_tx_done_interrupt(struct net_device *dev, int status)
  1219. {
  1220. struct arlan_private *priv = ((struct arlan_private *) dev->priv);
  1221. ARLAN_DEBUG_ENTRY("arlan_tx_done_interrupt");
  1222. priv->tx_last_cleared = jiffies;
  1223. priv->tx_command_given = 0;
  1224. priv->nof_tx_ack++;
  1225. switch (status)
  1226. {
  1227. case 1:
  1228. {
  1229. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1230. printk("arlan intr: transmit OKn");
  1231. priv->stats.tx_packets++;
  1232. priv->bad = 0;
  1233. priv->reset = 0;
  1234. priv->retransmissions = 0;
  1235. if (priv->Conf->tx_delay_ms)
  1236. {
  1237. priv->tx_done_delayed = jiffies + (priv->Conf->tx_delay_ms * HZ) / 1000 + 1;;
  1238. }
  1239. else
  1240. {
  1241. TXLAST(dev).offset = 0;
  1242. if (priv->txLast)
  1243. priv->txLast = 0;
  1244. else if (TXTAIL(dev).offset)
  1245. priv->txLast = 1;
  1246. if (TXLAST(dev).offset)
  1247. {
  1248. arlan_retransmit_now(dev);
  1249. dev->trans_start = jiffies;
  1250. }
  1251. if (!TXHEAD(dev).offset || !TXTAIL(dev).offset)
  1252. {
  1253. priv->txOffset = 0;
  1254. netif_wake_queue (dev);
  1255. }
  1256. }
  1257. }
  1258. break;
  1259. case 2:
  1260. {
  1261. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1262. printk("arlan intr: transmit timed outn");
  1263. priv->bad += 1;
  1264. //arlan_queue_retransmit(dev);
  1265. RetryOrFail(dev);
  1266. }
  1267. break;
  1268. case 3:
  1269. {
  1270. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1271. printk("arlan intr: transmit max retriesn");
  1272. priv->bad += 1;
  1273. priv->reset = 0;
  1274. //arlan_queue_retransmit(dev);
  1275. RetryOrFail(dev);
  1276. }
  1277. break;
  1278. case 4:
  1279. {
  1280. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1281. printk("arlan intr: transmit abortedn");
  1282. priv->bad += 1;
  1283. arlan_queue_retransmit(dev);
  1284. //RetryOrFail(dev);
  1285. }
  1286. break;
  1287. case 5:
  1288. {
  1289. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1290. printk("arlan intr: transmit not registeredn");
  1291. priv->bad += 1;
  1292. //debug=101;
  1293. arlan_queue_retransmit(dev);
  1294. }
  1295. break;
  1296. case 6:
  1297. {
  1298. IFDEBUG(ARLAN_DEBUG_TX_CHAIN) 
  1299. printk("arlan intr: transmit destination fulln");
  1300. priv->bad += 1;
  1301. priv->reset = 0;
  1302. //arlan_drop_tx(dev);
  1303. arlan_queue_retransmit(dev);
  1304. }
  1305. break;
  1306. case 7:
  1307. {
  1308. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1309. printk("arlan intr: transmit unknown ackn");
  1310. priv->bad += 1;
  1311. priv->reset = 0;
  1312. arlan_queue_retransmit(dev);
  1313. }
  1314. break;
  1315. case 8:
  1316. {
  1317. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1318. printk("arlan intr: transmit dest mail box fulln");
  1319. priv->bad += 1;
  1320. priv->reset = 0;
  1321. //arlan_drop_tx(dev);
  1322. arlan_queue_retransmit(dev);
  1323. }
  1324. break;
  1325. case 9:
  1326. {
  1327. IFDEBUG(ARLAN_DEBUG_TX_CHAIN)
  1328. printk("arlan intr: transmit root dest not reg.n");
  1329. priv->bad += 1;
  1330. priv->reset = 1;
  1331. //arlan_drop_tx(dev);
  1332. arlan_queue_retransmit(dev);
  1333. }
  1334. break;
  1335. default:
  1336. {
  1337. printk(KERN_ERR "arlan intr: transmit status unknownn");
  1338. priv->bad += 1;
  1339. priv->reset = 1;
  1340. arlan_drop_tx(dev);
  1341. }
  1342. }
  1343. ARLAN_DEBUG_EXIT("arlan_tx_done_interrupt");
  1344. }
  1345. static void arlan_rx_interrupt(struct net_device *dev, u_char rxStatus, u_short rxOffset, u_short pkt_len)
  1346. {
  1347. char *skbtmp;
  1348. int i = 0;
  1349. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  1350. volatile struct arlan_shmem *arlan = priv->card;
  1351. struct arlan_conf_stru *conf = priv->Conf;
  1352. ARLAN_DEBUG_ENTRY("arlan_rx_interrupt");
  1353. // by spec,   not                WRITESHMB(arlan->rxStatus,0x00);
  1354. // prohibited here              arlan_command(dev, ARLAN_COMMAND_RX);
  1355. if (pkt_len < 10 || pkt_len > 2048)
  1356. {
  1357. printk(KERN_WARNING "%s: got too short or long packet, len %d n", dev->name, pkt_len);
  1358. return;
  1359. }
  1360. if (rxOffset + pkt_len > 0x2000)
  1361. {
  1362. printk("%s: got too long packet, len %d offset %xn", dev->name, pkt_len, rxOffset);
  1363. return;
  1364. }
  1365. priv->in_bytes += pkt_len;
  1366. priv->in_bytes10 += pkt_len;
  1367. if (conf->measure_rate < 1)
  1368. conf->measure_rate = 1;
  1369. if (jiffies - priv->in_time > conf->measure_rate * HZ)
  1370. {
  1371. conf->in_speed = priv->in_bytes / conf->measure_rate;
  1372. priv->in_bytes = 0;
  1373. priv->in_time = jiffies;
  1374. }
  1375. if (jiffies - priv->in_time10 > conf->measure_rate * HZ * 10)
  1376. {
  1377. conf->in_speed10 = priv->in_bytes10 / (10 * conf->measure_rate);
  1378. priv->in_bytes10 = 0;
  1379. priv->in_time10 = jiffies;
  1380. }
  1381. DEBUGSHM(1, "arlan rcv pkt rxStatus= %d ", arlan->rxStatus, u_char);
  1382. switch (rxStatus)
  1383. {
  1384. case 1:
  1385. case 2:
  1386. case 3:
  1387. {
  1388. /* Malloc up new buffer. */
  1389. struct sk_buff *skb;
  1390. DEBUGSHM(50, "arlan recv pkt offs=%dn", arlan->rxOffset, u_short);
  1391. DEBUGSHM(1, "arlan rxFrmType = %d n", arlan->rxFrmType, u_char);
  1392. DEBUGSHM(1, KERN_INFO "arlan rx scrambled = %d n", arlan->scrambled, u_char);
  1393. /* here we do multicast filtering to avoid slow 8-bit memcopy */
  1394. #ifdef ARLAN_MULTICAST
  1395. if (!(dev->flags & IFF_ALLMULTI) &&
  1396. !(dev->flags & IFF_PROMISC) &&
  1397. dev->mc_list)
  1398. {
  1399. char hw_dst_addr[6];
  1400. struct dev_mc_list *dmi = dev->mc_list;
  1401. int i;
  1402. memcpy_fromio(hw_dst_addr, arlan->ultimateDestAddress, 6);
  1403. if (hw_dst_addr[0] == 0x01)
  1404. {
  1405. if (mdebug)
  1406. if (hw_dst_addr[1] == 0x00)
  1407. printk(KERN_ERR "%s mcast 0x0100 n", dev->name);
  1408. else if (hw_dst_addr[1] == 0x40)
  1409. printk(KERN_ERR "%s m/bcast 0x0140 n", dev->name);
  1410. while (dmi)
  1411. { if (dmi->dmi_addrlen == 6)
  1412. {
  1413. if (arlan_debug & ARLAN_DEBUG_HEADER_DUMP)
  1414. printk(KERN_ERR "%s mcl %2x:%2x:%2x:%2x:%2x:%2x n", dev->name,
  1415.  dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2],
  1416.  dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]);
  1417. for (i = 0; i < 6; i++)
  1418. if (dmi->dmi_addr[i] != hw_dst_addr[i])
  1419. break;
  1420. if (i == 6)
  1421. break;
  1422. }
  1423. else
  1424. printk(KERN_ERR "%s: invalid multicast address length given.n", dev->name);
  1425. dmi = dmi->next;
  1426. }
  1427. /* we reach here if multicast filtering is on and packet 
  1428.  * is multicast and not for receive */
  1429. goto end_of_interrupt;
  1430. }
  1431. }
  1432. #endif // ARLAN_MULTICAST
  1433. /* multicast filtering ends here */
  1434. pkt_len += ARLAN_FAKE_HDR_LEN;
  1435. skb = dev_alloc_skb(pkt_len + 4);
  1436. if (skb == NULL)
  1437. {
  1438. printk(KERN_ERR "%s: Memory squeeze, dropping packet.n", dev->name);
  1439. priv->stats.rx_dropped++;
  1440. break;
  1441. }
  1442. skb_reserve(skb, 2);
  1443. skb->dev = dev;
  1444. skbtmp = skb_put(skb, pkt_len);
  1445. memcpy_fromio(skbtmp + ARLAN_FAKE_HDR_LEN, ((char *) arlan) + rxOffset, pkt_len - ARLAN_FAKE_HDR_LEN);
  1446. memcpy_fromio(skbtmp, arlan->ultimateDestAddress, 6);
  1447. memcpy_fromio(skbtmp + 6, arlan->rxSrc, 6);
  1448. WRITESHMB(arlan->rxStatus, 0x00);
  1449. arlan_command(dev, ARLAN_COMMAND_RX);
  1450. IFDEBUG(ARLAN_DEBUG_HEADER_DUMP)
  1451. {
  1452. char immedDestAddress[6];
  1453. char immedSrcAddress[6];
  1454. memcpy_fromio(immedDestAddress, arlan->immedDestAddress, 6);
  1455. memcpy_fromio(immedSrcAddress, arlan->immedSrcAddress, 6);
  1456. printk(KERN_WARNING "%s t %2x:%2x:%2x:%2x:%2x:%2x f %2x:%2x:%2x:%2x:%2x:%2x imd %2x:%2x:%2x:%2x:%2x:%2x ims %2x:%2x:%2x:%2x:%2x:%2xn", dev->name,
  1457. (unsigned char) skbtmp[0], (unsigned char) skbtmp[1], (unsigned char) skbtmp[2], (unsigned char) skbtmp[3],
  1458. (unsigned char) skbtmp[4], (unsigned char) skbtmp[5], (unsigned char) skbtmp[6], (unsigned char) skbtmp[7],
  1459. (unsigned char) skbtmp[8], (unsigned char) skbtmp[9], (unsigned char) skbtmp[10], (unsigned char) skbtmp[11],
  1460. immedDestAddress[0], immedDestAddress[1], immedDestAddress[2],
  1461. immedDestAddress[3], immedDestAddress[4], immedDestAddress[5],
  1462. immedSrcAddress[0], immedSrcAddress[1], immedSrcAddress[2],
  1463. immedSrcAddress[3], immedSrcAddress[4], immedSrcAddress[5]);
  1464. }
  1465. skb->protocol = eth_type_trans(skb, dev);
  1466. IFDEBUG(ARLAN_DEBUG_HEADER_DUMP)
  1467. if (skb->protocol != 0x608 && skb->protocol != 0x8)
  1468. {
  1469. for (i = 0; i <= 22; i++)
  1470. printk("%02x:", (u_char) skbtmp[i + 12]);
  1471. printk(KERN_ERR "n");
  1472. printk(KERN_WARNING "arlan kernel pkt type trans %x n", skb->protocol);
  1473. }
  1474. netif_rx(skb);
  1475. dev->last_rx = jiffies;
  1476. priv->stats.rx_packets++;
  1477. priv->stats.rx_bytes += pkt_len;
  1478. }
  1479. break;
  1480. default:
  1481. printk(KERN_ERR "arlan intr: received unknown statusn");
  1482. priv->stats.rx_crc_errors++;
  1483. break;
  1484. }
  1485. ARLAN_DEBUG_EXIT("arlan_rx_interrupt");
  1486. }
  1487. static void arlan_process_interrupt(struct net_device *dev)
  1488. {
  1489. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  1490. volatile struct arlan_shmem *arlan = priv->card;
  1491. u_char rxStatus = READSHMB(arlan->rxStatus);
  1492. u_char txStatus = READSHMB(arlan->txStatus);
  1493. u_short rxOffset = READSHMS(arlan->rxOffset);
  1494. u_short pkt_len = READSHMS(arlan->rxLength);
  1495. int interrupt_count = 0;
  1496. ARLAN_DEBUG_ENTRY("arlan_process_interrupt");
  1497. if (test_and_set_bit(0, (void *) &priv->interrupt_processing_active))
  1498. {
  1499. if (arlan_debug & ARLAN_DEBUG_CHAIN_LOCKS)
  1500. printk(KERN_ERR "interrupt chain reentering n");
  1501. goto end_int_process;
  1502. }
  1503. while ((rxStatus || txStatus || priv->interrupt_ack_requested)
  1504. && (interrupt_count < 5))
  1505. {
  1506. if (rxStatus)
  1507. priv->last_rx_int_ack_time = arlan_time();
  1508. arlan_command(dev, ARLAN_COMMAND_INT_ACK);
  1509. arlan_command(dev, ARLAN_COMMAND_INT_ENABLE);
  1510. IFDEBUG(ARLAN_DEBUG_INTERRUPT)
  1511. printk(KERN_ERR "%s:  got IRQ rx %x tx %x comm %x rxOff %x rxLen %x n",
  1512. dev->name, rxStatus, txStatus, READSHMB(arlan->commandByte),
  1513. rxOffset, pkt_len);
  1514. if (rxStatus == 0 && txStatus == 0)
  1515. {
  1516. priv->last_command_was_rx = 0;
  1517. if (priv->irq_test_done)
  1518. {
  1519. if (!registrationBad(dev))
  1520. IFDEBUG(ARLAN_DEBUG_INTERRUPT) printk(KERN_ERR "%s unknown interrupt(nop? regLost ?) reason tx %d rx %d ",
  1521.     dev->name, txStatus, rxStatus);
  1522. } else {
  1523. IFDEBUG(ARLAN_DEBUG_INTERRUPT)
  1524. printk(KERN_INFO "%s irq $%d test OK n", dev->name, dev->irq);
  1525. }
  1526. priv->interrupt_ack_requested = 0;
  1527. goto ends;
  1528. }
  1529. if (txStatus != 0)
  1530. {
  1531. WRITESHMB(arlan->txStatus, 0x00);
  1532. arlan_tx_done_interrupt(dev, txStatus);
  1533. goto ends;
  1534. }
  1535. if (rxStatus == 1 || rxStatus == 2)
  1536. { /* a packet waiting */
  1537. arlan_rx_interrupt(dev, rxStatus, rxOffset, pkt_len);
  1538. goto ends;
  1539. }
  1540. if (rxStatus > 2 && rxStatus < 0xff)
  1541. {
  1542. priv->last_command_was_rx = 0;
  1543. WRITESHMB(arlan->rxStatus, 0x00);
  1544. printk(KERN_ERR "%s unknown rxStatus reason tx %d rx %d ",
  1545. dev->name, txStatus, rxStatus);
  1546. goto ends;
  1547. }
  1548. if (rxStatus == 0xff)
  1549. {
  1550. priv->last_command_was_rx = 0;
  1551. WRITESHMB(arlan->rxStatus, 0x00);
  1552. arlan_command(dev, ARLAN_COMMAND_RX);
  1553. if (registrationBad(dev))
  1554. netif_device_detach(dev);
  1555. if (!registrationBad(dev))
  1556. {
  1557. priv->registrationLastSeen = jiffies;
  1558. if (!netif_queue_stopped(dev) && !priv->under_reset && !priv->under_config)
  1559. netif_wake_queue (dev);
  1560. }
  1561. goto ends;
  1562. }
  1563. ends:
  1564. arlan_command_process(dev);
  1565. rxStatus = READSHMB(arlan->rxStatus);
  1566. txStatus = READSHMB(arlan->txStatus);
  1567. rxOffset = READSHMS(arlan->rxOffset);
  1568. pkt_len = READSHMS(arlan->rxLength);
  1569. priv->irq_test_done = 1;
  1570. interrupt_count++;
  1571. }
  1572. priv->interrupt_processing_active = 0;
  1573. end_int_process:
  1574. arlan_command_process(dev);
  1575. ARLAN_DEBUG_EXIT("arlan_process_interrupt");
  1576. return;
  1577. }
  1578. static void arlan_interrupt(int irq, void *dev_id, struct pt_regs *regs)
  1579. {
  1580. struct net_device *dev = dev_id;
  1581. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  1582. volatile struct arlan_shmem *arlan = priv->card;
  1583. u_char rxStatus = READSHMB(arlan->rxStatus);
  1584. u_char txStatus = READSHMB(arlan->txStatus);
  1585. ARLAN_DEBUG_ENTRY("arlan_interrupt");
  1586. if (!rxStatus && !txStatus)
  1587. priv->interrupt_ack_requested++;
  1588. arlan_process_interrupt(dev);
  1589. priv->irq_test_done = 1;
  1590. ARLAN_DEBUG_EXIT("arlan_interrupt");
  1591. return;
  1592. }
  1593. static int arlan_close(struct net_device *dev)
  1594. {
  1595. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  1596. if (!dev)
  1597. {
  1598. printk(KERN_CRIT "arlan: No Devicen");
  1599. return 0;
  1600. }
  1601. priv = (struct arlan_private *) dev->priv;
  1602. if (!priv)
  1603. {
  1604. printk(KERN_CRIT "arlan: No Device priv n");
  1605. return 0;
  1606. }
  1607. ARLAN_DEBUG_ENTRY("arlan_close");
  1608. del_timer(&priv->timer);
  1609. arlan_command(dev, ARLAN_COMMAND_POWERDOWN);
  1610. IFDEBUG(ARLAN_DEBUG_STARTUP)
  1611. printk(KERN_NOTICE "%s: Closing devicen", dev->name);
  1612. priv->open_time = 0;
  1613. netif_stop_queue(dev);
  1614. free_irq(dev->irq, dev);
  1615. ARLAN_DEBUG_EXIT("arlan_close");
  1616. return 0;
  1617. }
  1618. #ifdef ARLAN_DEBUGGING
  1619. static long alignLong(volatile u_char * ptr)
  1620. {
  1621. long ret;
  1622. memcpy_fromio(&ret, (void *) ptr, 4);
  1623. return ret;
  1624. }
  1625. #endif
  1626. /*
  1627.  * Get the current statistics.
  1628.  * This may be called with the card open or closed.
  1629.  */
  1630. static struct net_device_stats *arlan_statistics(struct net_device *dev)
  1631. {
  1632. struct arlan_private *priv = (struct arlan_private *) dev->priv;
  1633. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  1634. ARLAN_DEBUG_ENTRY("arlan_statistics");
  1635. /* Update the statistics from the device registers. */
  1636. READSHM(priv->stats.collisions, arlan->numReTransmissions, u_int);
  1637. READSHM(priv->stats.rx_crc_errors, arlan->numCRCErrors, u_int);
  1638. READSHM(priv->stats.rx_dropped, arlan->numFramesDiscarded, u_int);
  1639. READSHM(priv->stats.rx_fifo_errors, arlan->numRXBufferOverflows, u_int);
  1640. READSHM(priv->stats.rx_frame_errors, arlan->numReceiveFramesLost, u_int);
  1641. READSHM(priv->stats.rx_over_errors, arlan->numRXOverruns, u_int);
  1642. READSHM(priv->stats.rx_packets, arlan->numDatagramsReceived, u_int);
  1643. READSHM(priv->stats.tx_aborted_errors, arlan->numAbortErrors, u_int);
  1644. READSHM(priv->stats.tx_carrier_errors, arlan->numStatusTimeouts, u_int);
  1645. READSHM(priv->stats.tx_dropped, arlan->numDatagramsDiscarded, u_int);
  1646. READSHM(priv->stats.tx_fifo_errors, arlan->numTXUnderruns, u_int);
  1647. READSHM(priv->stats.tx_packets, arlan->numDatagramsTransmitted, u_int);
  1648. READSHM(priv->stats.tx_window_errors, arlan->numHoldOffs, u_int);
  1649. ARLAN_DEBUG_EXIT("arlan_statistics");
  1650. return &priv->stats;
  1651. }
  1652. static void arlan_set_multicast(struct net_device *dev)
  1653. {
  1654. volatile struct arlan_shmem *arlan = ((struct arlan_private *) dev->priv)->card;
  1655. struct arlan_conf_stru *conf = ((struct arlan_private *) dev->priv)->Conf;
  1656. int board_conf_needed = 0;
  1657. ARLAN_DEBUG_ENTRY("arlan_set_multicast");
  1658. if (dev->flags & IFF_PROMISC)
  1659. {
  1660. unsigned char recMode;
  1661. READSHM(recMode, arlan->receiveMode, u_char);
  1662. conf->receiveMode = (ARLAN_RCV_PROMISC | ARLAN_RCV_CONTROL);
  1663. if (conf->receiveMode != recMode)
  1664. board_conf_needed = 1;
  1665. }
  1666. else
  1667. {
  1668. /* turn off promiscuous mode  */
  1669. unsigned char recMode;
  1670. READSHM(recMode, arlan->receiveMode, u_char);
  1671. conf->receiveMode = ARLAN_RCV_CLEAN | ARLAN_RCV_CONTROL;
  1672. if (conf->receiveMode != recMode)
  1673. board_conf_needed = 1;
  1674. }
  1675. if (board_conf_needed)
  1676. arlan_command(dev, ARLAN_COMMAND_CONF);
  1677. ARLAN_DEBUG_EXIT("arlan_set_multicast");
  1678. }
  1679. int __init arlan_probe(struct net_device *dev)
  1680. {
  1681. printk("Arlan driver %sn", arlan_version);
  1682. if (arlan_probe_everywhere(dev))
  1683. return -ENODEV;
  1684. arlans_found++;
  1685. if (arlans_found == 1)
  1686. siteName = kmalloc(100, GFP_KERNEL);
  1687. return 0;
  1688. }
  1689. #ifdef  MODULE
  1690. int init_module(void)
  1691. {
  1692. int i = 0;
  1693. ARLAN_DEBUG_ENTRY("init_module");
  1694. if (channelSet != channelSetUNKNOWN || channelNumber != channelNumberUNKNOWN || systemId != systemIdUNKNOWN)
  1695. {
  1696. printk(KERN_WARNING "arlan: wrong module params for multiple devicesn ");
  1697. return -1;
  1698. }
  1699. numDevices = arlan_find_devices();
  1700. if (numDevices == 0)
  1701. {
  1702. printk(KERN_ERR "arlan: no devices found n");
  1703. return -1;
  1704. }
  1705. siteName = kmalloc(100, GFP_KERNEL);
  1706. if(siteName==NULL)
  1707. {
  1708. printk(KERN_ERR "arlan: No memory for site name.n");
  1709. return -1;
  1710. }
  1711. for (i = 0; i < numDevices && i < MAX_ARLANS; i++)
  1712. {
  1713. if (!arlan_allocate_device(i, NULL))
  1714. return -1;
  1715. if (arlan_device[i] == NULL)
  1716. {
  1717. printk(KERN_CRIT "arlan: Not Enough memory n");
  1718. return -1;
  1719. }
  1720. if (probe)
  1721. arlan_probe_everywhere(arlan_device[i]);
  1722. // arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN );
  1723. }
  1724. printk(KERN_INFO "Arlan driver %sn", arlan_version);
  1725. ARLAN_DEBUG_EXIT("init_module");
  1726. return 0;
  1727. }
  1728. void cleanup_module(void)
  1729. {
  1730. int i = 0;
  1731. ARLAN_DEBUG_ENTRY("cleanup_module");
  1732. IFDEBUG(ARLAN_DEBUG_SHUTDOWN)
  1733. printk(KERN_INFO "arlan: unloading modulen");
  1734. for (i = 0; i < MAX_ARLANS; i++)
  1735. {
  1736. if (arlan_device[i])
  1737. {
  1738. arlan_command(arlan_device[i], ARLAN_COMMAND_POWERDOWN );
  1739. // release_mem_region(virt_to_phys(arlan_device[i]->mem_start), 0x2000 );
  1740. unregister_netdev(arlan_device[i]);
  1741. if (arlan_device[i]->priv)
  1742. {
  1743. if (((struct arlan_private *) arlan_device[i]->priv)->conf)
  1744. kfree(((struct arlan_private *) arlan_device[i]->priv)->conf);
  1745. kfree(arlan_device[i]);
  1746. }
  1747. arlan_device[i] = NULL;
  1748. }
  1749. }
  1750. ARLAN_DEBUG_EXIT("cleanup_module");
  1751. }
  1752. #endif
  1753. MODULE_LICENSE("GPL");