fjes_main.c 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465
  1. /*
  2. * FUJITSU Extended Socket Network Device driver
  3. * Copyright (c) 2015 FUJITSU LIMITED
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, see <http://www.gnu.org/licenses/>.
  16. *
  17. * The full GNU General Public License is included in this distribution in
  18. * the file called "COPYING".
  19. *
  20. */
  21. #include <linux/module.h>
  22. #include <linux/types.h>
  23. #include <linux/nls.h>
  24. #include <linux/platform_device.h>
  25. #include <linux/netdevice.h>
  26. #include <linux/interrupt.h>
  27. #include "fjes.h"
  28. #define MAJ 1
  29. #define MIN 1
  30. #define DRV_VERSION __stringify(MAJ) "." __stringify(MIN)
  31. #define DRV_NAME "fjes"
  32. char fjes_driver_name[] = DRV_NAME;
  33. char fjes_driver_version[] = DRV_VERSION;
  34. static const char fjes_driver_string[] =
  35. "FUJITSU Extended Socket Network Device Driver";
  36. static const char fjes_copyright[] =
  37. "Copyright (c) 2015 FUJITSU LIMITED";
  38. MODULE_AUTHOR("Taku Izumi <izumi.taku@jp.fujitsu.com>");
  39. MODULE_DESCRIPTION("FUJITSU Extended Socket Network Device Driver");
  40. MODULE_LICENSE("GPL");
  41. MODULE_VERSION(DRV_VERSION);
  42. static int fjes_request_irq(struct fjes_adapter *);
  43. static void fjes_free_irq(struct fjes_adapter *);
  44. static int fjes_open(struct net_device *);
  45. static int fjes_close(struct net_device *);
  46. static int fjes_setup_resources(struct fjes_adapter *);
  47. static void fjes_free_resources(struct fjes_adapter *);
  48. static netdev_tx_t fjes_xmit_frame(struct sk_buff *, struct net_device *);
  49. static void fjes_raise_intr_rxdata_task(struct work_struct *);
  50. static void fjes_tx_stall_task(struct work_struct *);
  51. static void fjes_force_close_task(struct work_struct *);
  52. static irqreturn_t fjes_intr(int, void*);
  53. static struct rtnl_link_stats64 *
  54. fjes_get_stats64(struct net_device *, struct rtnl_link_stats64 *);
  55. static int fjes_change_mtu(struct net_device *, int);
  56. static int fjes_vlan_rx_add_vid(struct net_device *, __be16 proto, u16);
  57. static int fjes_vlan_rx_kill_vid(struct net_device *, __be16 proto, u16);
  58. static void fjes_tx_retry(struct net_device *);
  59. static int fjes_acpi_add(struct acpi_device *);
  60. static int fjes_acpi_remove(struct acpi_device *);
  61. static acpi_status fjes_get_acpi_resource(struct acpi_resource *, void*);
  62. static int fjes_probe(struct platform_device *);
  63. static int fjes_remove(struct platform_device *);
  64. static int fjes_sw_init(struct fjes_adapter *);
  65. static void fjes_netdev_setup(struct net_device *);
  66. static void fjes_irq_watch_task(struct work_struct *);
  67. static void fjes_watch_unshare_task(struct work_struct *);
  68. static void fjes_rx_irq(struct fjes_adapter *, int);
  69. static int fjes_poll(struct napi_struct *, int);
  70. static const struct acpi_device_id fjes_acpi_ids[] = {
  71. {"PNP0C02", 0},
  72. {"", 0},
  73. };
  74. MODULE_DEVICE_TABLE(acpi, fjes_acpi_ids);
  75. static struct acpi_driver fjes_acpi_driver = {
  76. .name = DRV_NAME,
  77. .class = DRV_NAME,
  78. .owner = THIS_MODULE,
  79. .ids = fjes_acpi_ids,
  80. .ops = {
  81. .add = fjes_acpi_add,
  82. .remove = fjes_acpi_remove,
  83. },
  84. };
  85. static struct platform_driver fjes_driver = {
  86. .driver = {
  87. .name = DRV_NAME,
  88. .owner = THIS_MODULE,
  89. },
  90. .probe = fjes_probe,
  91. .remove = fjes_remove,
  92. };
  93. static struct resource fjes_resource[] = {
  94. {
  95. .flags = IORESOURCE_MEM,
  96. .start = 0,
  97. .end = 0,
  98. },
  99. {
  100. .flags = IORESOURCE_IRQ,
  101. .start = 0,
  102. .end = 0,
  103. },
  104. };
  105. static int fjes_acpi_add(struct acpi_device *device)
  106. {
  107. struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL};
  108. char str_buf[sizeof(FJES_ACPI_SYMBOL) + 1];
  109. struct platform_device *plat_dev;
  110. union acpi_object *str;
  111. acpi_status status;
  112. int result;
  113. status = acpi_evaluate_object(device->handle, "_STR", NULL, &buffer);
  114. if (ACPI_FAILURE(status))
  115. return -ENODEV;
  116. str = buffer.pointer;
  117. result = utf16s_to_utf8s((wchar_t *)str->string.pointer,
  118. str->string.length, UTF16_LITTLE_ENDIAN,
  119. str_buf, sizeof(str_buf) - 1);
  120. str_buf[result] = 0;
  121. if (strncmp(FJES_ACPI_SYMBOL, str_buf, strlen(FJES_ACPI_SYMBOL)) != 0) {
  122. kfree(buffer.pointer);
  123. return -ENODEV;
  124. }
  125. kfree(buffer.pointer);
  126. status = acpi_walk_resources(device->handle, METHOD_NAME__CRS,
  127. fjes_get_acpi_resource, fjes_resource);
  128. if (ACPI_FAILURE(status))
  129. return -ENODEV;
  130. /* create platform_device */
  131. plat_dev = platform_device_register_simple(DRV_NAME, 0, fjes_resource,
  132. ARRAY_SIZE(fjes_resource));
  133. device->driver_data = plat_dev;
  134. return 0;
  135. }
  136. static int fjes_acpi_remove(struct acpi_device *device)
  137. {
  138. struct platform_device *plat_dev;
  139. plat_dev = (struct platform_device *)acpi_driver_data(device);
  140. platform_device_unregister(plat_dev);
  141. return 0;
  142. }
  143. static acpi_status
  144. fjes_get_acpi_resource(struct acpi_resource *acpi_res, void *data)
  145. {
  146. struct acpi_resource_address32 *addr;
  147. struct acpi_resource_irq *irq;
  148. struct resource *res = data;
  149. switch (acpi_res->type) {
  150. case ACPI_RESOURCE_TYPE_ADDRESS32:
  151. addr = &acpi_res->data.address32;
  152. res[0].start = addr->address.minimum;
  153. res[0].end = addr->address.minimum +
  154. addr->address.address_length - 1;
  155. break;
  156. case ACPI_RESOURCE_TYPE_IRQ:
  157. irq = &acpi_res->data.irq;
  158. if (irq->interrupt_count != 1)
  159. return AE_ERROR;
  160. res[1].start = irq->interrupts[0];
  161. res[1].end = irq->interrupts[0];
  162. break;
  163. default:
  164. break;
  165. }
  166. return AE_OK;
  167. }
  168. static int fjes_request_irq(struct fjes_adapter *adapter)
  169. {
  170. struct net_device *netdev = adapter->netdev;
  171. int result = -1;
  172. adapter->interrupt_watch_enable = true;
  173. if (!delayed_work_pending(&adapter->interrupt_watch_task)) {
  174. queue_delayed_work(adapter->control_wq,
  175. &adapter->interrupt_watch_task,
  176. FJES_IRQ_WATCH_DELAY);
  177. }
  178. if (!adapter->irq_registered) {
  179. result = request_irq(adapter->hw.hw_res.irq, fjes_intr,
  180. IRQF_SHARED, netdev->name, adapter);
  181. if (result)
  182. adapter->irq_registered = false;
  183. else
  184. adapter->irq_registered = true;
  185. }
  186. return result;
  187. }
  188. static void fjes_free_irq(struct fjes_adapter *adapter)
  189. {
  190. struct fjes_hw *hw = &adapter->hw;
  191. adapter->interrupt_watch_enable = false;
  192. cancel_delayed_work_sync(&adapter->interrupt_watch_task);
  193. fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, true);
  194. if (adapter->irq_registered) {
  195. free_irq(adapter->hw.hw_res.irq, adapter);
  196. adapter->irq_registered = false;
  197. }
  198. }
  199. static const struct net_device_ops fjes_netdev_ops = {
  200. .ndo_open = fjes_open,
  201. .ndo_stop = fjes_close,
  202. .ndo_start_xmit = fjes_xmit_frame,
  203. .ndo_get_stats64 = fjes_get_stats64,
  204. .ndo_change_mtu = fjes_change_mtu,
  205. .ndo_tx_timeout = fjes_tx_retry,
  206. .ndo_vlan_rx_add_vid = fjes_vlan_rx_add_vid,
  207. .ndo_vlan_rx_kill_vid = fjes_vlan_rx_kill_vid,
  208. };
  209. /* fjes_open - Called when a network interface is made active */
  210. static int fjes_open(struct net_device *netdev)
  211. {
  212. struct fjes_adapter *adapter = netdev_priv(netdev);
  213. struct fjes_hw *hw = &adapter->hw;
  214. int result;
  215. if (adapter->open_guard)
  216. return -ENXIO;
  217. result = fjes_setup_resources(adapter);
  218. if (result)
  219. goto err_setup_res;
  220. hw->txrx_stop_req_bit = 0;
  221. hw->epstop_req_bit = 0;
  222. napi_enable(&adapter->napi);
  223. fjes_hw_capture_interrupt_status(hw);
  224. result = fjes_request_irq(adapter);
  225. if (result)
  226. goto err_req_irq;
  227. fjes_hw_set_irqmask(hw, REG_ICTL_MASK_ALL, false);
  228. netif_tx_start_all_queues(netdev);
  229. netif_carrier_on(netdev);
  230. return 0;
  231. err_req_irq:
  232. fjes_free_irq(adapter);
  233. napi_disable(&adapter->napi);
  234. err_setup_res:
  235. fjes_free_resources(adapter);
  236. return result;
  237. }
  238. /* fjes_close - Disables a network interface */
  239. static int fjes_close(struct net_device *netdev)
  240. {
  241. struct fjes_adapter *adapter = netdev_priv(netdev);
  242. struct fjes_hw *hw = &adapter->hw;
  243. unsigned long flags;
  244. int epidx;
  245. netif_tx_stop_all_queues(netdev);
  246. netif_carrier_off(netdev);
  247. fjes_hw_raise_epstop(hw);
  248. napi_disable(&adapter->napi);
  249. spin_lock_irqsave(&hw->rx_status_lock, flags);
  250. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  251. if (epidx == hw->my_epid)
  252. continue;
  253. if (fjes_hw_get_partner_ep_status(hw, epidx) ==
  254. EP_PARTNER_SHARED)
  255. adapter->hw.ep_shm_info[epidx]
  256. .tx.info->v1i.rx_status &=
  257. ~FJES_RX_POLL_WORK;
  258. }
  259. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  260. fjes_free_irq(adapter);
  261. cancel_delayed_work_sync(&adapter->interrupt_watch_task);
  262. cancel_work_sync(&adapter->unshare_watch_task);
  263. adapter->unshare_watch_bitmask = 0;
  264. cancel_work_sync(&adapter->raise_intr_rxdata_task);
  265. cancel_work_sync(&adapter->tx_stall_task);
  266. cancel_work_sync(&hw->update_zone_task);
  267. cancel_work_sync(&hw->epstop_task);
  268. fjes_hw_wait_epstop(hw);
  269. fjes_free_resources(adapter);
  270. return 0;
  271. }
  272. static int fjes_setup_resources(struct fjes_adapter *adapter)
  273. {
  274. struct net_device *netdev = adapter->netdev;
  275. struct ep_share_mem_info *buf_pair;
  276. struct fjes_hw *hw = &adapter->hw;
  277. unsigned long flags;
  278. int result;
  279. int epidx;
  280. mutex_lock(&hw->hw_info.lock);
  281. result = fjes_hw_request_info(hw);
  282. switch (result) {
  283. case 0:
  284. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  285. hw->ep_shm_info[epidx].es_status =
  286. hw->hw_info.res_buf->info.info[epidx].es_status;
  287. hw->ep_shm_info[epidx].zone =
  288. hw->hw_info.res_buf->info.info[epidx].zone;
  289. }
  290. break;
  291. default:
  292. case -ENOMSG:
  293. case -EBUSY:
  294. adapter->force_reset = true;
  295. mutex_unlock(&hw->hw_info.lock);
  296. return result;
  297. }
  298. mutex_unlock(&hw->hw_info.lock);
  299. for (epidx = 0; epidx < (hw->max_epid); epidx++) {
  300. if ((epidx != hw->my_epid) &&
  301. (hw->ep_shm_info[epidx].es_status ==
  302. FJES_ZONING_STATUS_ENABLE)) {
  303. fjes_hw_raise_interrupt(hw, epidx,
  304. REG_ICTL_MASK_INFO_UPDATE);
  305. }
  306. }
  307. msleep(FJES_OPEN_ZONE_UPDATE_WAIT * hw->max_epid);
  308. for (epidx = 0; epidx < (hw->max_epid); epidx++) {
  309. if (epidx == hw->my_epid)
  310. continue;
  311. buf_pair = &hw->ep_shm_info[epidx];
  312. spin_lock_irqsave(&hw->rx_status_lock, flags);
  313. fjes_hw_setup_epbuf(&buf_pair->tx, netdev->dev_addr,
  314. netdev->mtu);
  315. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  316. if (fjes_hw_epid_is_same_zone(hw, epidx)) {
  317. mutex_lock(&hw->hw_info.lock);
  318. result =
  319. fjes_hw_register_buff_addr(hw, epidx, buf_pair);
  320. mutex_unlock(&hw->hw_info.lock);
  321. switch (result) {
  322. case 0:
  323. break;
  324. case -ENOMSG:
  325. case -EBUSY:
  326. default:
  327. adapter->force_reset = true;
  328. return result;
  329. }
  330. }
  331. }
  332. return 0;
  333. }
  334. static void fjes_free_resources(struct fjes_adapter *adapter)
  335. {
  336. struct net_device *netdev = adapter->netdev;
  337. struct fjes_device_command_param param;
  338. struct ep_share_mem_info *buf_pair;
  339. struct fjes_hw *hw = &adapter->hw;
  340. bool reset_flag = false;
  341. unsigned long flags;
  342. int result;
  343. int epidx;
  344. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  345. if (epidx == hw->my_epid)
  346. continue;
  347. mutex_lock(&hw->hw_info.lock);
  348. result = fjes_hw_unregister_buff_addr(hw, epidx);
  349. mutex_unlock(&hw->hw_info.lock);
  350. if (result)
  351. reset_flag = true;
  352. buf_pair = &hw->ep_shm_info[epidx];
  353. spin_lock_irqsave(&hw->rx_status_lock, flags);
  354. fjes_hw_setup_epbuf(&buf_pair->tx,
  355. netdev->dev_addr, netdev->mtu);
  356. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  357. clear_bit(epidx, &hw->txrx_stop_req_bit);
  358. }
  359. if (reset_flag || adapter->force_reset) {
  360. result = fjes_hw_reset(hw);
  361. adapter->force_reset = false;
  362. if (result)
  363. adapter->open_guard = true;
  364. hw->hw_info.buffer_share_bit = 0;
  365. memset((void *)&param, 0, sizeof(param));
  366. param.req_len = hw->hw_info.req_buf_size;
  367. param.req_start = __pa(hw->hw_info.req_buf);
  368. param.res_len = hw->hw_info.res_buf_size;
  369. param.res_start = __pa(hw->hw_info.res_buf);
  370. param.share_start = __pa(hw->hw_info.share->ep_status);
  371. fjes_hw_init_command_registers(hw, &param);
  372. }
  373. }
  374. static void fjes_tx_stall_task(struct work_struct *work)
  375. {
  376. struct fjes_adapter *adapter = container_of(work,
  377. struct fjes_adapter, tx_stall_task);
  378. struct net_device *netdev = adapter->netdev;
  379. struct fjes_hw *hw = &adapter->hw;
  380. int all_queue_available, sendable;
  381. enum ep_partner_status pstatus;
  382. int max_epid, my_epid, epid;
  383. union ep_buffer_info *info;
  384. int i;
  385. if (((long)jiffies -
  386. dev_trans_start(netdev)) > FJES_TX_TX_STALL_TIMEOUT) {
  387. netif_wake_queue(netdev);
  388. return;
  389. }
  390. my_epid = hw->my_epid;
  391. max_epid = hw->max_epid;
  392. for (i = 0; i < 5; i++) {
  393. all_queue_available = 1;
  394. for (epid = 0; epid < max_epid; epid++) {
  395. if (my_epid == epid)
  396. continue;
  397. pstatus = fjes_hw_get_partner_ep_status(hw, epid);
  398. sendable = (pstatus == EP_PARTNER_SHARED);
  399. if (!sendable)
  400. continue;
  401. info = adapter->hw.ep_shm_info[epid].tx.info;
  402. if (!(info->v1i.rx_status & FJES_RX_MTU_CHANGING_DONE))
  403. return;
  404. if (EP_RING_FULL(info->v1i.head, info->v1i.tail,
  405. info->v1i.count_max)) {
  406. all_queue_available = 0;
  407. break;
  408. }
  409. }
  410. if (all_queue_available) {
  411. netif_wake_queue(netdev);
  412. return;
  413. }
  414. }
  415. usleep_range(50, 100);
  416. queue_work(adapter->txrx_wq, &adapter->tx_stall_task);
  417. }
  418. static void fjes_force_close_task(struct work_struct *work)
  419. {
  420. struct fjes_adapter *adapter = container_of(work,
  421. struct fjes_adapter, force_close_task);
  422. struct net_device *netdev = adapter->netdev;
  423. rtnl_lock();
  424. dev_close(netdev);
  425. rtnl_unlock();
  426. }
  427. static void fjes_raise_intr_rxdata_task(struct work_struct *work)
  428. {
  429. struct fjes_adapter *adapter = container_of(work,
  430. struct fjes_adapter, raise_intr_rxdata_task);
  431. struct fjes_hw *hw = &adapter->hw;
  432. enum ep_partner_status pstatus;
  433. int max_epid, my_epid, epid;
  434. my_epid = hw->my_epid;
  435. max_epid = hw->max_epid;
  436. for (epid = 0; epid < max_epid; epid++)
  437. hw->ep_shm_info[epid].tx_status_work = 0;
  438. for (epid = 0; epid < max_epid; epid++) {
  439. if (epid == my_epid)
  440. continue;
  441. pstatus = fjes_hw_get_partner_ep_status(hw, epid);
  442. if (pstatus == EP_PARTNER_SHARED) {
  443. hw->ep_shm_info[epid].tx_status_work =
  444. hw->ep_shm_info[epid].tx.info->v1i.tx_status;
  445. if (hw->ep_shm_info[epid].tx_status_work ==
  446. FJES_TX_DELAY_SEND_PENDING) {
  447. hw->ep_shm_info[epid].tx.info->v1i.tx_status =
  448. FJES_TX_DELAY_SEND_NONE;
  449. }
  450. }
  451. }
  452. for (epid = 0; epid < max_epid; epid++) {
  453. if (epid == my_epid)
  454. continue;
  455. pstatus = fjes_hw_get_partner_ep_status(hw, epid);
  456. if ((hw->ep_shm_info[epid].tx_status_work ==
  457. FJES_TX_DELAY_SEND_PENDING) &&
  458. (pstatus == EP_PARTNER_SHARED) &&
  459. !(hw->ep_shm_info[epid].rx.info->v1i.rx_status &
  460. FJES_RX_POLL_WORK)) {
  461. fjes_hw_raise_interrupt(hw, epid,
  462. REG_ICTL_MASK_RX_DATA);
  463. }
  464. }
  465. usleep_range(500, 1000);
  466. }
  467. static int fjes_tx_send(struct fjes_adapter *adapter, int dest,
  468. void *data, size_t len)
  469. {
  470. int retval;
  471. retval = fjes_hw_epbuf_tx_pkt_send(&adapter->hw.ep_shm_info[dest].tx,
  472. data, len);
  473. if (retval)
  474. return retval;
  475. adapter->hw.ep_shm_info[dest].tx.info->v1i.tx_status =
  476. FJES_TX_DELAY_SEND_PENDING;
  477. if (!work_pending(&adapter->raise_intr_rxdata_task))
  478. queue_work(adapter->txrx_wq,
  479. &adapter->raise_intr_rxdata_task);
  480. retval = 0;
  481. return retval;
  482. }
  483. static netdev_tx_t
  484. fjes_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
  485. {
  486. struct fjes_adapter *adapter = netdev_priv(netdev);
  487. struct fjes_hw *hw = &adapter->hw;
  488. int max_epid, my_epid, dest_epid;
  489. enum ep_partner_status pstatus;
  490. struct netdev_queue *cur_queue;
  491. char shortpkt[VLAN_ETH_HLEN];
  492. bool is_multi, vlan;
  493. struct ethhdr *eth;
  494. u16 queue_no = 0;
  495. u16 vlan_id = 0;
  496. netdev_tx_t ret;
  497. char *data;
  498. int len;
  499. ret = NETDEV_TX_OK;
  500. is_multi = false;
  501. cur_queue = netdev_get_tx_queue(netdev, queue_no);
  502. eth = (struct ethhdr *)skb->data;
  503. my_epid = hw->my_epid;
  504. vlan = (vlan_get_tag(skb, &vlan_id) == 0) ? true : false;
  505. data = skb->data;
  506. len = skb->len;
  507. if (is_multicast_ether_addr(eth->h_dest)) {
  508. dest_epid = 0;
  509. max_epid = hw->max_epid;
  510. is_multi = true;
  511. } else if (is_local_ether_addr(eth->h_dest)) {
  512. dest_epid = eth->h_dest[ETH_ALEN - 1];
  513. max_epid = dest_epid + 1;
  514. if ((eth->h_dest[0] == 0x02) &&
  515. (0x00 == (eth->h_dest[1] | eth->h_dest[2] |
  516. eth->h_dest[3] | eth->h_dest[4])) &&
  517. (dest_epid < hw->max_epid)) {
  518. ;
  519. } else {
  520. dest_epid = 0;
  521. max_epid = 0;
  522. ret = NETDEV_TX_OK;
  523. adapter->stats64.tx_packets += 1;
  524. hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
  525. adapter->stats64.tx_bytes += len;
  526. hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
  527. }
  528. } else {
  529. dest_epid = 0;
  530. max_epid = 0;
  531. ret = NETDEV_TX_OK;
  532. adapter->stats64.tx_packets += 1;
  533. hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
  534. adapter->stats64.tx_bytes += len;
  535. hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
  536. }
  537. for (; dest_epid < max_epid; dest_epid++) {
  538. if (my_epid == dest_epid)
  539. continue;
  540. pstatus = fjes_hw_get_partner_ep_status(hw, dest_epid);
  541. if (pstatus != EP_PARTNER_SHARED) {
  542. ret = NETDEV_TX_OK;
  543. } else if (!fjes_hw_check_epbuf_version(
  544. &adapter->hw.ep_shm_info[dest_epid].rx, 0)) {
  545. /* version is NOT 0 */
  546. adapter->stats64.tx_carrier_errors += 1;
  547. hw->ep_shm_info[dest_epid].net_stats
  548. .tx_carrier_errors += 1;
  549. ret = NETDEV_TX_OK;
  550. } else if (!fjes_hw_check_mtu(
  551. &adapter->hw.ep_shm_info[dest_epid].rx,
  552. netdev->mtu)) {
  553. adapter->stats64.tx_dropped += 1;
  554. hw->ep_shm_info[dest_epid].net_stats.tx_dropped += 1;
  555. adapter->stats64.tx_errors += 1;
  556. hw->ep_shm_info[dest_epid].net_stats.tx_errors += 1;
  557. ret = NETDEV_TX_OK;
  558. } else if (vlan &&
  559. !fjes_hw_check_vlan_id(
  560. &adapter->hw.ep_shm_info[dest_epid].rx,
  561. vlan_id)) {
  562. ret = NETDEV_TX_OK;
  563. } else {
  564. if (len < VLAN_ETH_HLEN) {
  565. memset(shortpkt, 0, VLAN_ETH_HLEN);
  566. memcpy(shortpkt, skb->data, skb->len);
  567. len = VLAN_ETH_HLEN;
  568. data = shortpkt;
  569. }
  570. if (adapter->tx_retry_count == 0) {
  571. adapter->tx_start_jiffies = jiffies;
  572. adapter->tx_retry_count = 1;
  573. } else {
  574. adapter->tx_retry_count++;
  575. }
  576. if (fjes_tx_send(adapter, dest_epid, data, len)) {
  577. if (is_multi) {
  578. ret = NETDEV_TX_OK;
  579. } else if (
  580. ((long)jiffies -
  581. (long)adapter->tx_start_jiffies) >=
  582. FJES_TX_RETRY_TIMEOUT) {
  583. adapter->stats64.tx_fifo_errors += 1;
  584. hw->ep_shm_info[dest_epid].net_stats
  585. .tx_fifo_errors += 1;
  586. adapter->stats64.tx_errors += 1;
  587. hw->ep_shm_info[dest_epid].net_stats
  588. .tx_errors += 1;
  589. ret = NETDEV_TX_OK;
  590. } else {
  591. netif_trans_update(netdev);
  592. netif_tx_stop_queue(cur_queue);
  593. if (!work_pending(&adapter->tx_stall_task))
  594. queue_work(adapter->txrx_wq,
  595. &adapter->tx_stall_task);
  596. ret = NETDEV_TX_BUSY;
  597. }
  598. } else {
  599. if (!is_multi) {
  600. adapter->stats64.tx_packets += 1;
  601. hw->ep_shm_info[dest_epid].net_stats
  602. .tx_packets += 1;
  603. adapter->stats64.tx_bytes += len;
  604. hw->ep_shm_info[dest_epid].net_stats
  605. .tx_bytes += len;
  606. }
  607. adapter->tx_retry_count = 0;
  608. ret = NETDEV_TX_OK;
  609. }
  610. }
  611. }
  612. if (ret == NETDEV_TX_OK) {
  613. dev_kfree_skb(skb);
  614. if (is_multi) {
  615. adapter->stats64.tx_packets += 1;
  616. hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
  617. adapter->stats64.tx_bytes += 1;
  618. hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
  619. }
  620. }
  621. return ret;
  622. }
  623. static void fjes_tx_retry(struct net_device *netdev)
  624. {
  625. struct netdev_queue *queue = netdev_get_tx_queue(netdev, 0);
  626. netif_tx_wake_queue(queue);
  627. }
  628. static struct rtnl_link_stats64 *
  629. fjes_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
  630. {
  631. struct fjes_adapter *adapter = netdev_priv(netdev);
  632. memcpy(stats, &adapter->stats64, sizeof(struct rtnl_link_stats64));
  633. return stats;
  634. }
  635. static int fjes_change_mtu(struct net_device *netdev, int new_mtu)
  636. {
  637. struct fjes_adapter *adapter = netdev_priv(netdev);
  638. bool running = netif_running(netdev);
  639. struct fjes_hw *hw = &adapter->hw;
  640. unsigned long flags;
  641. int ret = -EINVAL;
  642. int idx, epidx;
  643. for (idx = 0; fjes_support_mtu[idx] != 0; idx++) {
  644. if (new_mtu <= fjes_support_mtu[idx]) {
  645. new_mtu = fjes_support_mtu[idx];
  646. if (new_mtu == netdev->mtu)
  647. return 0;
  648. ret = 0;
  649. break;
  650. }
  651. }
  652. if (ret)
  653. return ret;
  654. if (running) {
  655. spin_lock_irqsave(&hw->rx_status_lock, flags);
  656. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  657. if (epidx == hw->my_epid)
  658. continue;
  659. hw->ep_shm_info[epidx].tx.info->v1i.rx_status &=
  660. ~FJES_RX_MTU_CHANGING_DONE;
  661. }
  662. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  663. netif_tx_stop_all_queues(netdev);
  664. netif_carrier_off(netdev);
  665. cancel_work_sync(&adapter->tx_stall_task);
  666. napi_disable(&adapter->napi);
  667. msleep(1000);
  668. netif_tx_stop_all_queues(netdev);
  669. }
  670. netdev->mtu = new_mtu;
  671. if (running) {
  672. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  673. if (epidx == hw->my_epid)
  674. continue;
  675. spin_lock_irqsave(&hw->rx_status_lock, flags);
  676. fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx,
  677. netdev->dev_addr,
  678. netdev->mtu);
  679. hw->ep_shm_info[epidx].tx.info->v1i.rx_status |=
  680. FJES_RX_MTU_CHANGING_DONE;
  681. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  682. }
  683. netif_tx_wake_all_queues(netdev);
  684. netif_carrier_on(netdev);
  685. napi_enable(&adapter->napi);
  686. napi_schedule(&adapter->napi);
  687. }
  688. return ret;
  689. }
  690. static int fjes_vlan_rx_add_vid(struct net_device *netdev,
  691. __be16 proto, u16 vid)
  692. {
  693. struct fjes_adapter *adapter = netdev_priv(netdev);
  694. bool ret = true;
  695. int epid;
  696. for (epid = 0; epid < adapter->hw.max_epid; epid++) {
  697. if (epid == adapter->hw.my_epid)
  698. continue;
  699. if (!fjes_hw_check_vlan_id(
  700. &adapter->hw.ep_shm_info[epid].tx, vid))
  701. ret = fjes_hw_set_vlan_id(
  702. &adapter->hw.ep_shm_info[epid].tx, vid);
  703. }
  704. return ret ? 0 : -ENOSPC;
  705. }
  706. static int fjes_vlan_rx_kill_vid(struct net_device *netdev,
  707. __be16 proto, u16 vid)
  708. {
  709. struct fjes_adapter *adapter = netdev_priv(netdev);
  710. int epid;
  711. for (epid = 0; epid < adapter->hw.max_epid; epid++) {
  712. if (epid == adapter->hw.my_epid)
  713. continue;
  714. fjes_hw_del_vlan_id(&adapter->hw.ep_shm_info[epid].tx, vid);
  715. }
  716. return 0;
  717. }
  718. static void fjes_txrx_stop_req_irq(struct fjes_adapter *adapter,
  719. int src_epid)
  720. {
  721. struct fjes_hw *hw = &adapter->hw;
  722. enum ep_partner_status status;
  723. unsigned long flags;
  724. status = fjes_hw_get_partner_ep_status(hw, src_epid);
  725. switch (status) {
  726. case EP_PARTNER_UNSHARE:
  727. case EP_PARTNER_COMPLETE:
  728. default:
  729. break;
  730. case EP_PARTNER_WAITING:
  731. if (src_epid < hw->my_epid) {
  732. spin_lock_irqsave(&hw->rx_status_lock, flags);
  733. hw->ep_shm_info[src_epid].tx.info->v1i.rx_status |=
  734. FJES_RX_STOP_REQ_DONE;
  735. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  736. clear_bit(src_epid, &hw->txrx_stop_req_bit);
  737. set_bit(src_epid, &adapter->unshare_watch_bitmask);
  738. if (!work_pending(&adapter->unshare_watch_task))
  739. queue_work(adapter->control_wq,
  740. &adapter->unshare_watch_task);
  741. }
  742. break;
  743. case EP_PARTNER_SHARED:
  744. if (hw->ep_shm_info[src_epid].rx.info->v1i.rx_status &
  745. FJES_RX_STOP_REQ_REQUEST) {
  746. set_bit(src_epid, &hw->epstop_req_bit);
  747. if (!work_pending(&hw->epstop_task))
  748. queue_work(adapter->control_wq,
  749. &hw->epstop_task);
  750. }
  751. break;
  752. }
  753. }
  754. static void fjes_stop_req_irq(struct fjes_adapter *adapter, int src_epid)
  755. {
  756. struct fjes_hw *hw = &adapter->hw;
  757. enum ep_partner_status status;
  758. unsigned long flags;
  759. set_bit(src_epid, &hw->hw_info.buffer_unshare_reserve_bit);
  760. status = fjes_hw_get_partner_ep_status(hw, src_epid);
  761. switch (status) {
  762. case EP_PARTNER_WAITING:
  763. spin_lock_irqsave(&hw->rx_status_lock, flags);
  764. hw->ep_shm_info[src_epid].tx.info->v1i.rx_status |=
  765. FJES_RX_STOP_REQ_DONE;
  766. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  767. clear_bit(src_epid, &hw->txrx_stop_req_bit);
  768. /* fall through */
  769. case EP_PARTNER_UNSHARE:
  770. case EP_PARTNER_COMPLETE:
  771. default:
  772. set_bit(src_epid, &adapter->unshare_watch_bitmask);
  773. if (!work_pending(&adapter->unshare_watch_task))
  774. queue_work(adapter->control_wq,
  775. &adapter->unshare_watch_task);
  776. break;
  777. case EP_PARTNER_SHARED:
  778. set_bit(src_epid, &hw->epstop_req_bit);
  779. if (!work_pending(&hw->epstop_task))
  780. queue_work(adapter->control_wq, &hw->epstop_task);
  781. break;
  782. }
  783. }
  784. static void fjes_update_zone_irq(struct fjes_adapter *adapter,
  785. int src_epid)
  786. {
  787. struct fjes_hw *hw = &adapter->hw;
  788. if (!work_pending(&hw->update_zone_task))
  789. queue_work(adapter->control_wq, &hw->update_zone_task);
  790. }
  791. static irqreturn_t fjes_intr(int irq, void *data)
  792. {
  793. struct fjes_adapter *adapter = data;
  794. struct fjes_hw *hw = &adapter->hw;
  795. irqreturn_t ret;
  796. u32 icr;
  797. icr = fjes_hw_capture_interrupt_status(hw);
  798. if (icr & REG_IS_MASK_IS_ASSERT) {
  799. if (icr & REG_ICTL_MASK_RX_DATA)
  800. fjes_rx_irq(adapter, icr & REG_IS_MASK_EPID);
  801. if (icr & REG_ICTL_MASK_DEV_STOP_REQ)
  802. fjes_stop_req_irq(adapter, icr & REG_IS_MASK_EPID);
  803. if (icr & REG_ICTL_MASK_TXRX_STOP_REQ)
  804. fjes_txrx_stop_req_irq(adapter, icr & REG_IS_MASK_EPID);
  805. if (icr & REG_ICTL_MASK_TXRX_STOP_DONE)
  806. fjes_hw_set_irqmask(hw,
  807. REG_ICTL_MASK_TXRX_STOP_DONE, true);
  808. if (icr & REG_ICTL_MASK_INFO_UPDATE)
  809. fjes_update_zone_irq(adapter, icr & REG_IS_MASK_EPID);
  810. ret = IRQ_HANDLED;
  811. } else {
  812. ret = IRQ_NONE;
  813. }
  814. return ret;
  815. }
  816. static int fjes_rxframe_search_exist(struct fjes_adapter *adapter,
  817. int start_epid)
  818. {
  819. struct fjes_hw *hw = &adapter->hw;
  820. enum ep_partner_status pstatus;
  821. int max_epid, cur_epid;
  822. int i;
  823. max_epid = hw->max_epid;
  824. start_epid = (start_epid + 1 + max_epid) % max_epid;
  825. for (i = 0; i < max_epid; i++) {
  826. cur_epid = (start_epid + i) % max_epid;
  827. if (cur_epid == hw->my_epid)
  828. continue;
  829. pstatus = fjes_hw_get_partner_ep_status(hw, cur_epid);
  830. if (pstatus == EP_PARTNER_SHARED) {
  831. if (!fjes_hw_epbuf_rx_is_empty(
  832. &hw->ep_shm_info[cur_epid].rx))
  833. return cur_epid;
  834. }
  835. }
  836. return -1;
  837. }
  838. static void *fjes_rxframe_get(struct fjes_adapter *adapter, size_t *psize,
  839. int *cur_epid)
  840. {
  841. void *frame;
  842. *cur_epid = fjes_rxframe_search_exist(adapter, *cur_epid);
  843. if (*cur_epid < 0)
  844. return NULL;
  845. frame =
  846. fjes_hw_epbuf_rx_curpkt_get_addr(
  847. &adapter->hw.ep_shm_info[*cur_epid].rx, psize);
  848. return frame;
  849. }
  850. static void fjes_rxframe_release(struct fjes_adapter *adapter, int cur_epid)
  851. {
  852. fjes_hw_epbuf_rx_curpkt_drop(&adapter->hw.ep_shm_info[cur_epid].rx);
  853. }
  854. static void fjes_rx_irq(struct fjes_adapter *adapter, int src_epid)
  855. {
  856. struct fjes_hw *hw = &adapter->hw;
  857. fjes_hw_set_irqmask(hw, REG_ICTL_MASK_RX_DATA, true);
  858. adapter->unset_rx_last = true;
  859. napi_schedule(&adapter->napi);
  860. }
  861. static int fjes_poll(struct napi_struct *napi, int budget)
  862. {
  863. struct fjes_adapter *adapter =
  864. container_of(napi, struct fjes_adapter, napi);
  865. struct net_device *netdev = napi->dev;
  866. struct fjes_hw *hw = &adapter->hw;
  867. struct sk_buff *skb;
  868. int work_done = 0;
  869. int cur_epid = 0;
  870. int epidx;
  871. size_t frame_len;
  872. void *frame;
  873. spin_lock(&hw->rx_status_lock);
  874. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  875. if (epidx == hw->my_epid)
  876. continue;
  877. if (fjes_hw_get_partner_ep_status(hw, epidx) ==
  878. EP_PARTNER_SHARED)
  879. adapter->hw.ep_shm_info[epidx]
  880. .tx.info->v1i.rx_status |= FJES_RX_POLL_WORK;
  881. }
  882. spin_unlock(&hw->rx_status_lock);
  883. while (work_done < budget) {
  884. prefetch(&adapter->hw);
  885. frame = fjes_rxframe_get(adapter, &frame_len, &cur_epid);
  886. if (frame) {
  887. skb = napi_alloc_skb(napi, frame_len);
  888. if (!skb) {
  889. adapter->stats64.rx_dropped += 1;
  890. hw->ep_shm_info[cur_epid].net_stats
  891. .rx_dropped += 1;
  892. adapter->stats64.rx_errors += 1;
  893. hw->ep_shm_info[cur_epid].net_stats
  894. .rx_errors += 1;
  895. } else {
  896. memcpy(skb_put(skb, frame_len),
  897. frame, frame_len);
  898. skb->protocol = eth_type_trans(skb, netdev);
  899. skb->ip_summed = CHECKSUM_UNNECESSARY;
  900. netif_receive_skb(skb);
  901. work_done++;
  902. adapter->stats64.rx_packets += 1;
  903. hw->ep_shm_info[cur_epid].net_stats
  904. .rx_packets += 1;
  905. adapter->stats64.rx_bytes += frame_len;
  906. hw->ep_shm_info[cur_epid].net_stats
  907. .rx_bytes += frame_len;
  908. if (is_multicast_ether_addr(
  909. ((struct ethhdr *)frame)->h_dest)) {
  910. adapter->stats64.multicast += 1;
  911. hw->ep_shm_info[cur_epid].net_stats
  912. .multicast += 1;
  913. }
  914. }
  915. fjes_rxframe_release(adapter, cur_epid);
  916. adapter->unset_rx_last = true;
  917. } else {
  918. break;
  919. }
  920. }
  921. if (work_done < budget) {
  922. napi_complete(napi);
  923. if (adapter->unset_rx_last) {
  924. adapter->rx_last_jiffies = jiffies;
  925. adapter->unset_rx_last = false;
  926. }
  927. if (((long)jiffies - (long)adapter->rx_last_jiffies) < 3) {
  928. napi_reschedule(napi);
  929. } else {
  930. spin_lock(&hw->rx_status_lock);
  931. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  932. if (epidx == hw->my_epid)
  933. continue;
  934. if (fjes_hw_get_partner_ep_status(hw, epidx) ==
  935. EP_PARTNER_SHARED)
  936. adapter->hw.ep_shm_info[epidx].tx
  937. .info->v1i.rx_status &=
  938. ~FJES_RX_POLL_WORK;
  939. }
  940. spin_unlock(&hw->rx_status_lock);
  941. fjes_hw_set_irqmask(hw, REG_ICTL_MASK_RX_DATA, false);
  942. }
  943. }
  944. return work_done;
  945. }
  946. /* fjes_probe - Device Initialization Routine */
  947. static int fjes_probe(struct platform_device *plat_dev)
  948. {
  949. struct fjes_adapter *adapter;
  950. struct net_device *netdev;
  951. struct resource *res;
  952. struct fjes_hw *hw;
  953. int err;
  954. err = -ENOMEM;
  955. netdev = alloc_netdev_mq(sizeof(struct fjes_adapter), "es%d",
  956. NET_NAME_UNKNOWN, fjes_netdev_setup,
  957. FJES_MAX_QUEUES);
  958. if (!netdev)
  959. goto err_out;
  960. SET_NETDEV_DEV(netdev, &plat_dev->dev);
  961. dev_set_drvdata(&plat_dev->dev, netdev);
  962. adapter = netdev_priv(netdev);
  963. adapter->netdev = netdev;
  964. adapter->plat_dev = plat_dev;
  965. hw = &adapter->hw;
  966. hw->back = adapter;
  967. /* setup the private structure */
  968. err = fjes_sw_init(adapter);
  969. if (err)
  970. goto err_free_netdev;
  971. INIT_WORK(&adapter->force_close_task, fjes_force_close_task);
  972. adapter->force_reset = false;
  973. adapter->open_guard = false;
  974. adapter->txrx_wq = alloc_workqueue(DRV_NAME "/txrx", WQ_MEM_RECLAIM, 0);
  975. adapter->control_wq = alloc_workqueue(DRV_NAME "/control",
  976. WQ_MEM_RECLAIM, 0);
  977. INIT_WORK(&adapter->tx_stall_task, fjes_tx_stall_task);
  978. INIT_WORK(&adapter->raise_intr_rxdata_task,
  979. fjes_raise_intr_rxdata_task);
  980. INIT_WORK(&adapter->unshare_watch_task, fjes_watch_unshare_task);
  981. adapter->unshare_watch_bitmask = 0;
  982. INIT_DELAYED_WORK(&adapter->interrupt_watch_task, fjes_irq_watch_task);
  983. adapter->interrupt_watch_enable = false;
  984. res = platform_get_resource(plat_dev, IORESOURCE_MEM, 0);
  985. hw->hw_res.start = res->start;
  986. hw->hw_res.size = resource_size(res);
  987. hw->hw_res.irq = platform_get_irq(plat_dev, 0);
  988. err = fjes_hw_init(&adapter->hw);
  989. if (err)
  990. goto err_free_netdev;
  991. /* setup MAC address (02:00:00:00:00:[epid])*/
  992. netdev->dev_addr[0] = 2;
  993. netdev->dev_addr[1] = 0;
  994. netdev->dev_addr[2] = 0;
  995. netdev->dev_addr[3] = 0;
  996. netdev->dev_addr[4] = 0;
  997. netdev->dev_addr[5] = hw->my_epid; /* EPID */
  998. err = register_netdev(netdev);
  999. if (err)
  1000. goto err_hw_exit;
  1001. netif_carrier_off(netdev);
  1002. return 0;
  1003. err_hw_exit:
  1004. fjes_hw_exit(&adapter->hw);
  1005. err_free_netdev:
  1006. free_netdev(netdev);
  1007. err_out:
  1008. return err;
  1009. }
  1010. /* fjes_remove - Device Removal Routine */
  1011. static int fjes_remove(struct platform_device *plat_dev)
  1012. {
  1013. struct net_device *netdev = dev_get_drvdata(&plat_dev->dev);
  1014. struct fjes_adapter *adapter = netdev_priv(netdev);
  1015. struct fjes_hw *hw = &adapter->hw;
  1016. cancel_delayed_work_sync(&adapter->interrupt_watch_task);
  1017. cancel_work_sync(&adapter->unshare_watch_task);
  1018. cancel_work_sync(&adapter->raise_intr_rxdata_task);
  1019. cancel_work_sync(&adapter->tx_stall_task);
  1020. if (adapter->control_wq)
  1021. destroy_workqueue(adapter->control_wq);
  1022. if (adapter->txrx_wq)
  1023. destroy_workqueue(adapter->txrx_wq);
  1024. unregister_netdev(netdev);
  1025. fjes_hw_exit(hw);
  1026. netif_napi_del(&adapter->napi);
  1027. free_netdev(netdev);
  1028. return 0;
  1029. }
  1030. static int fjes_sw_init(struct fjes_adapter *adapter)
  1031. {
  1032. struct net_device *netdev = adapter->netdev;
  1033. netif_napi_add(netdev, &adapter->napi, fjes_poll, 64);
  1034. return 0;
  1035. }
  1036. /* fjes_netdev_setup - netdevice initialization routine */
  1037. static void fjes_netdev_setup(struct net_device *netdev)
  1038. {
  1039. ether_setup(netdev);
  1040. netdev->watchdog_timeo = FJES_TX_RETRY_INTERVAL;
  1041. netdev->netdev_ops = &fjes_netdev_ops;
  1042. fjes_set_ethtool_ops(netdev);
  1043. netdev->mtu = fjes_support_mtu[3];
  1044. netdev->flags |= IFF_BROADCAST;
  1045. netdev->features |= NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_FILTER;
  1046. }
  1047. static void fjes_irq_watch_task(struct work_struct *work)
  1048. {
  1049. struct fjes_adapter *adapter = container_of(to_delayed_work(work),
  1050. struct fjes_adapter, interrupt_watch_task);
  1051. local_irq_disable();
  1052. fjes_intr(adapter->hw.hw_res.irq, adapter);
  1053. local_irq_enable();
  1054. if (fjes_rxframe_search_exist(adapter, 0) >= 0)
  1055. napi_schedule(&adapter->napi);
  1056. if (adapter->interrupt_watch_enable) {
  1057. if (!delayed_work_pending(&adapter->interrupt_watch_task))
  1058. queue_delayed_work(adapter->control_wq,
  1059. &adapter->interrupt_watch_task,
  1060. FJES_IRQ_WATCH_DELAY);
  1061. }
  1062. }
  1063. static void fjes_watch_unshare_task(struct work_struct *work)
  1064. {
  1065. struct fjes_adapter *adapter =
  1066. container_of(work, struct fjes_adapter, unshare_watch_task);
  1067. struct net_device *netdev = adapter->netdev;
  1068. struct fjes_hw *hw = &adapter->hw;
  1069. int unshare_watch, unshare_reserve;
  1070. int max_epid, my_epid, epidx;
  1071. int stop_req, stop_req_done;
  1072. ulong unshare_watch_bitmask;
  1073. unsigned long flags;
  1074. int wait_time = 0;
  1075. int is_shared;
  1076. int ret;
  1077. my_epid = hw->my_epid;
  1078. max_epid = hw->max_epid;
  1079. unshare_watch_bitmask = adapter->unshare_watch_bitmask;
  1080. adapter->unshare_watch_bitmask = 0;
  1081. while ((unshare_watch_bitmask || hw->txrx_stop_req_bit) &&
  1082. (wait_time < 3000)) {
  1083. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  1084. if (epidx == hw->my_epid)
  1085. continue;
  1086. is_shared = fjes_hw_epid_is_shared(hw->hw_info.share,
  1087. epidx);
  1088. stop_req = test_bit(epidx, &hw->txrx_stop_req_bit);
  1089. stop_req_done = hw->ep_shm_info[epidx].rx.info->v1i.rx_status &
  1090. FJES_RX_STOP_REQ_DONE;
  1091. unshare_watch = test_bit(epidx, &unshare_watch_bitmask);
  1092. unshare_reserve = test_bit(epidx,
  1093. &hw->hw_info.buffer_unshare_reserve_bit);
  1094. if ((!stop_req ||
  1095. (is_shared && (!is_shared || !stop_req_done))) &&
  1096. (is_shared || !unshare_watch || !unshare_reserve))
  1097. continue;
  1098. mutex_lock(&hw->hw_info.lock);
  1099. ret = fjes_hw_unregister_buff_addr(hw, epidx);
  1100. switch (ret) {
  1101. case 0:
  1102. break;
  1103. case -ENOMSG:
  1104. case -EBUSY:
  1105. default:
  1106. if (!work_pending(
  1107. &adapter->force_close_task)) {
  1108. adapter->force_reset = true;
  1109. schedule_work(
  1110. &adapter->force_close_task);
  1111. }
  1112. break;
  1113. }
  1114. mutex_unlock(&hw->hw_info.lock);
  1115. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1116. fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx,
  1117. netdev->dev_addr, netdev->mtu);
  1118. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  1119. clear_bit(epidx, &hw->txrx_stop_req_bit);
  1120. clear_bit(epidx, &unshare_watch_bitmask);
  1121. clear_bit(epidx,
  1122. &hw->hw_info.buffer_unshare_reserve_bit);
  1123. }
  1124. msleep(100);
  1125. wait_time += 100;
  1126. }
  1127. if (hw->hw_info.buffer_unshare_reserve_bit) {
  1128. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  1129. if (epidx == hw->my_epid)
  1130. continue;
  1131. if (test_bit(epidx,
  1132. &hw->hw_info.buffer_unshare_reserve_bit)) {
  1133. mutex_lock(&hw->hw_info.lock);
  1134. ret = fjes_hw_unregister_buff_addr(hw, epidx);
  1135. switch (ret) {
  1136. case 0:
  1137. break;
  1138. case -ENOMSG:
  1139. case -EBUSY:
  1140. default:
  1141. if (!work_pending(
  1142. &adapter->force_close_task)) {
  1143. adapter->force_reset = true;
  1144. schedule_work(
  1145. &adapter->force_close_task);
  1146. }
  1147. break;
  1148. }
  1149. mutex_unlock(&hw->hw_info.lock);
  1150. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1151. fjes_hw_setup_epbuf(
  1152. &hw->ep_shm_info[epidx].tx,
  1153. netdev->dev_addr, netdev->mtu);
  1154. spin_unlock_irqrestore(&hw->rx_status_lock,
  1155. flags);
  1156. clear_bit(epidx, &hw->txrx_stop_req_bit);
  1157. clear_bit(epidx, &unshare_watch_bitmask);
  1158. clear_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit);
  1159. }
  1160. if (test_bit(epidx, &unshare_watch_bitmask)) {
  1161. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1162. hw->ep_shm_info[epidx].tx.info->v1i.rx_status &=
  1163. ~FJES_RX_STOP_REQ_DONE;
  1164. spin_unlock_irqrestore(&hw->rx_status_lock,
  1165. flags);
  1166. }
  1167. }
  1168. }
  1169. }
  1170. /* fjes_init_module - Driver Registration Routine */
  1171. static int __init fjes_init_module(void)
  1172. {
  1173. int result;
  1174. pr_info("%s - version %s - %s\n",
  1175. fjes_driver_string, fjes_driver_version, fjes_copyright);
  1176. result = platform_driver_register(&fjes_driver);
  1177. if (result < 0)
  1178. return result;
  1179. result = acpi_bus_register_driver(&fjes_acpi_driver);
  1180. if (result < 0)
  1181. goto fail_acpi_driver;
  1182. return 0;
  1183. fail_acpi_driver:
  1184. platform_driver_unregister(&fjes_driver);
  1185. return result;
  1186. }
  1187. module_init(fjes_init_module);
  1188. /* fjes_exit_module - Driver Exit Cleanup Routine */
  1189. static void __exit fjes_exit_module(void)
  1190. {
  1191. acpi_bus_unregister_driver(&fjes_acpi_driver);
  1192. platform_driver_unregister(&fjes_driver);
  1193. }
  1194. module_exit(fjes_exit_module);