fjes_main.c 39 KB

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