fjes_main.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517
  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. static int fjes_request_irq(struct fjes_adapter *);
  44. static void fjes_free_irq(struct fjes_adapter *);
  45. static int fjes_open(struct net_device *);
  46. static int fjes_close(struct net_device *);
  47. static int fjes_setup_resources(struct fjes_adapter *);
  48. static void fjes_free_resources(struct fjes_adapter *);
  49. static netdev_tx_t fjes_xmit_frame(struct sk_buff *, struct net_device *);
  50. static void fjes_raise_intr_rxdata_task(struct work_struct *);
  51. static void fjes_tx_stall_task(struct work_struct *);
  52. static void fjes_force_close_task(struct work_struct *);
  53. static irqreturn_t fjes_intr(int, void*);
  54. static struct rtnl_link_stats64 *
  55. 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. {"PNP0C02", 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 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. hw->ep_shm_info[epidx].ep_stats
  306. .send_intr_zoneupdate += 1;
  307. }
  308. }
  309. msleep(FJES_OPEN_ZONE_UPDATE_WAIT * hw->max_epid);
  310. for (epidx = 0; epidx < (hw->max_epid); epidx++) {
  311. if (epidx == hw->my_epid)
  312. continue;
  313. buf_pair = &hw->ep_shm_info[epidx];
  314. spin_lock_irqsave(&hw->rx_status_lock, flags);
  315. fjes_hw_setup_epbuf(&buf_pair->tx, netdev->dev_addr,
  316. netdev->mtu);
  317. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  318. if (fjes_hw_epid_is_same_zone(hw, epidx)) {
  319. mutex_lock(&hw->hw_info.lock);
  320. result =
  321. fjes_hw_register_buff_addr(hw, epidx, buf_pair);
  322. mutex_unlock(&hw->hw_info.lock);
  323. switch (result) {
  324. case 0:
  325. break;
  326. case -ENOMSG:
  327. case -EBUSY:
  328. default:
  329. adapter->force_reset = true;
  330. return result;
  331. }
  332. hw->ep_shm_info[epidx].ep_stats
  333. .com_regist_buf_exec += 1;
  334. }
  335. }
  336. return 0;
  337. }
  338. static void fjes_free_resources(struct fjes_adapter *adapter)
  339. {
  340. struct net_device *netdev = adapter->netdev;
  341. struct fjes_device_command_param param;
  342. struct ep_share_mem_info *buf_pair;
  343. struct fjes_hw *hw = &adapter->hw;
  344. bool reset_flag = false;
  345. unsigned long flags;
  346. int result;
  347. int epidx;
  348. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  349. if (epidx == hw->my_epid)
  350. continue;
  351. mutex_lock(&hw->hw_info.lock);
  352. result = fjes_hw_unregister_buff_addr(hw, epidx);
  353. mutex_unlock(&hw->hw_info.lock);
  354. hw->ep_shm_info[epidx].ep_stats.com_unregist_buf_exec += 1;
  355. if (result)
  356. reset_flag = true;
  357. buf_pair = &hw->ep_shm_info[epidx];
  358. spin_lock_irqsave(&hw->rx_status_lock, flags);
  359. fjes_hw_setup_epbuf(&buf_pair->tx,
  360. netdev->dev_addr, netdev->mtu);
  361. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  362. clear_bit(epidx, &hw->txrx_stop_req_bit);
  363. }
  364. if (reset_flag || adapter->force_reset) {
  365. result = fjes_hw_reset(hw);
  366. adapter->force_reset = false;
  367. if (result)
  368. adapter->open_guard = true;
  369. hw->hw_info.buffer_share_bit = 0;
  370. memset((void *)&param, 0, sizeof(param));
  371. param.req_len = hw->hw_info.req_buf_size;
  372. param.req_start = __pa(hw->hw_info.req_buf);
  373. param.res_len = hw->hw_info.res_buf_size;
  374. param.res_start = __pa(hw->hw_info.res_buf);
  375. param.share_start = __pa(hw->hw_info.share->ep_status);
  376. fjes_hw_init_command_registers(hw, &param);
  377. }
  378. }
  379. static void fjes_tx_stall_task(struct work_struct *work)
  380. {
  381. struct fjes_adapter *adapter = container_of(work,
  382. struct fjes_adapter, tx_stall_task);
  383. struct net_device *netdev = adapter->netdev;
  384. struct fjes_hw *hw = &adapter->hw;
  385. int all_queue_available, sendable;
  386. enum ep_partner_status pstatus;
  387. int max_epid, my_epid, epid;
  388. union ep_buffer_info *info;
  389. int i;
  390. if (((long)jiffies -
  391. dev_trans_start(netdev)) > FJES_TX_TX_STALL_TIMEOUT) {
  392. netif_wake_queue(netdev);
  393. return;
  394. }
  395. my_epid = hw->my_epid;
  396. max_epid = hw->max_epid;
  397. for (i = 0; i < 5; i++) {
  398. all_queue_available = 1;
  399. for (epid = 0; epid < max_epid; epid++) {
  400. if (my_epid == epid)
  401. continue;
  402. pstatus = fjes_hw_get_partner_ep_status(hw, epid);
  403. sendable = (pstatus == EP_PARTNER_SHARED);
  404. if (!sendable)
  405. continue;
  406. info = adapter->hw.ep_shm_info[epid].tx.info;
  407. if (!(info->v1i.rx_status & FJES_RX_MTU_CHANGING_DONE))
  408. return;
  409. if (EP_RING_FULL(info->v1i.head, info->v1i.tail,
  410. info->v1i.count_max)) {
  411. all_queue_available = 0;
  412. break;
  413. }
  414. }
  415. if (all_queue_available) {
  416. netif_wake_queue(netdev);
  417. return;
  418. }
  419. }
  420. usleep_range(50, 100);
  421. queue_work(adapter->txrx_wq, &adapter->tx_stall_task);
  422. }
  423. static void fjes_force_close_task(struct work_struct *work)
  424. {
  425. struct fjes_adapter *adapter = container_of(work,
  426. struct fjes_adapter, force_close_task);
  427. struct net_device *netdev = adapter->netdev;
  428. rtnl_lock();
  429. dev_close(netdev);
  430. rtnl_unlock();
  431. }
  432. static void fjes_raise_intr_rxdata_task(struct work_struct *work)
  433. {
  434. struct fjes_adapter *adapter = container_of(work,
  435. struct fjes_adapter, raise_intr_rxdata_task);
  436. struct fjes_hw *hw = &adapter->hw;
  437. enum ep_partner_status pstatus;
  438. int max_epid, my_epid, epid;
  439. my_epid = hw->my_epid;
  440. max_epid = hw->max_epid;
  441. for (epid = 0; epid < max_epid; epid++)
  442. hw->ep_shm_info[epid].tx_status_work = 0;
  443. for (epid = 0; epid < max_epid; epid++) {
  444. if (epid == my_epid)
  445. continue;
  446. pstatus = fjes_hw_get_partner_ep_status(hw, epid);
  447. if (pstatus == EP_PARTNER_SHARED) {
  448. hw->ep_shm_info[epid].tx_status_work =
  449. hw->ep_shm_info[epid].tx.info->v1i.tx_status;
  450. if (hw->ep_shm_info[epid].tx_status_work ==
  451. FJES_TX_DELAY_SEND_PENDING) {
  452. hw->ep_shm_info[epid].tx.info->v1i.tx_status =
  453. FJES_TX_DELAY_SEND_NONE;
  454. }
  455. }
  456. }
  457. for (epid = 0; epid < max_epid; epid++) {
  458. if (epid == my_epid)
  459. continue;
  460. pstatus = fjes_hw_get_partner_ep_status(hw, epid);
  461. if ((hw->ep_shm_info[epid].tx_status_work ==
  462. FJES_TX_DELAY_SEND_PENDING) &&
  463. (pstatus == EP_PARTNER_SHARED) &&
  464. !(hw->ep_shm_info[epid].rx.info->v1i.rx_status &
  465. FJES_RX_POLL_WORK)) {
  466. fjes_hw_raise_interrupt(hw, epid,
  467. REG_ICTL_MASK_RX_DATA);
  468. hw->ep_shm_info[epid].ep_stats.send_intr_rx += 1;
  469. }
  470. }
  471. usleep_range(500, 1000);
  472. }
  473. static int fjes_tx_send(struct fjes_adapter *adapter, int dest,
  474. void *data, size_t len)
  475. {
  476. int retval;
  477. retval = fjes_hw_epbuf_tx_pkt_send(&adapter->hw.ep_shm_info[dest].tx,
  478. data, len);
  479. if (retval)
  480. return retval;
  481. adapter->hw.ep_shm_info[dest].tx.info->v1i.tx_status =
  482. FJES_TX_DELAY_SEND_PENDING;
  483. if (!work_pending(&adapter->raise_intr_rxdata_task))
  484. queue_work(adapter->txrx_wq,
  485. &adapter->raise_intr_rxdata_task);
  486. retval = 0;
  487. return retval;
  488. }
  489. static netdev_tx_t
  490. fjes_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
  491. {
  492. struct fjes_adapter *adapter = netdev_priv(netdev);
  493. struct fjes_hw *hw = &adapter->hw;
  494. int max_epid, my_epid, dest_epid;
  495. enum ep_partner_status pstatus;
  496. struct netdev_queue *cur_queue;
  497. char shortpkt[VLAN_ETH_HLEN];
  498. bool is_multi, vlan;
  499. struct ethhdr *eth;
  500. u16 queue_no = 0;
  501. u16 vlan_id = 0;
  502. netdev_tx_t ret;
  503. char *data;
  504. int len;
  505. ret = NETDEV_TX_OK;
  506. is_multi = false;
  507. cur_queue = netdev_get_tx_queue(netdev, queue_no);
  508. eth = (struct ethhdr *)skb->data;
  509. my_epid = hw->my_epid;
  510. vlan = (vlan_get_tag(skb, &vlan_id) == 0) ? true : false;
  511. data = skb->data;
  512. len = skb->len;
  513. if (is_multicast_ether_addr(eth->h_dest)) {
  514. dest_epid = 0;
  515. max_epid = hw->max_epid;
  516. is_multi = true;
  517. } else if (is_local_ether_addr(eth->h_dest)) {
  518. dest_epid = eth->h_dest[ETH_ALEN - 1];
  519. max_epid = dest_epid + 1;
  520. if ((eth->h_dest[0] == 0x02) &&
  521. (0x00 == (eth->h_dest[1] | eth->h_dest[2] |
  522. eth->h_dest[3] | eth->h_dest[4])) &&
  523. (dest_epid < hw->max_epid)) {
  524. ;
  525. } else {
  526. dest_epid = 0;
  527. max_epid = 0;
  528. ret = NETDEV_TX_OK;
  529. adapter->stats64.tx_packets += 1;
  530. hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
  531. adapter->stats64.tx_bytes += len;
  532. hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
  533. }
  534. } else {
  535. dest_epid = 0;
  536. max_epid = 0;
  537. ret = NETDEV_TX_OK;
  538. adapter->stats64.tx_packets += 1;
  539. hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
  540. adapter->stats64.tx_bytes += len;
  541. hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
  542. }
  543. for (; dest_epid < max_epid; dest_epid++) {
  544. if (my_epid == dest_epid)
  545. continue;
  546. pstatus = fjes_hw_get_partner_ep_status(hw, dest_epid);
  547. if (pstatus != EP_PARTNER_SHARED) {
  548. if (!is_multi)
  549. hw->ep_shm_info[dest_epid].ep_stats
  550. .tx_dropped_not_shared += 1;
  551. ret = NETDEV_TX_OK;
  552. } else if (!fjes_hw_check_epbuf_version(
  553. &adapter->hw.ep_shm_info[dest_epid].rx, 0)) {
  554. /* version is NOT 0 */
  555. adapter->stats64.tx_carrier_errors += 1;
  556. hw->ep_shm_info[dest_epid].net_stats
  557. .tx_carrier_errors += 1;
  558. hw->ep_shm_info[dest_epid].ep_stats
  559. .tx_dropped_ver_mismatch += 1;
  560. ret = NETDEV_TX_OK;
  561. } else if (!fjes_hw_check_mtu(
  562. &adapter->hw.ep_shm_info[dest_epid].rx,
  563. netdev->mtu)) {
  564. adapter->stats64.tx_dropped += 1;
  565. hw->ep_shm_info[dest_epid].net_stats.tx_dropped += 1;
  566. adapter->stats64.tx_errors += 1;
  567. hw->ep_shm_info[dest_epid].net_stats.tx_errors += 1;
  568. hw->ep_shm_info[dest_epid].ep_stats
  569. .tx_dropped_buf_size_mismatch += 1;
  570. ret = NETDEV_TX_OK;
  571. } else if (vlan &&
  572. !fjes_hw_check_vlan_id(
  573. &adapter->hw.ep_shm_info[dest_epid].rx,
  574. vlan_id)) {
  575. hw->ep_shm_info[dest_epid].ep_stats
  576. .tx_dropped_vlanid_mismatch += 1;
  577. ret = NETDEV_TX_OK;
  578. } else {
  579. if (len < VLAN_ETH_HLEN) {
  580. memset(shortpkt, 0, VLAN_ETH_HLEN);
  581. memcpy(shortpkt, skb->data, skb->len);
  582. len = VLAN_ETH_HLEN;
  583. data = shortpkt;
  584. }
  585. if (adapter->tx_retry_count == 0) {
  586. adapter->tx_start_jiffies = jiffies;
  587. adapter->tx_retry_count = 1;
  588. } else {
  589. adapter->tx_retry_count++;
  590. }
  591. if (fjes_tx_send(adapter, dest_epid, data, len)) {
  592. if (is_multi) {
  593. ret = NETDEV_TX_OK;
  594. } else if (
  595. ((long)jiffies -
  596. (long)adapter->tx_start_jiffies) >=
  597. FJES_TX_RETRY_TIMEOUT) {
  598. adapter->stats64.tx_fifo_errors += 1;
  599. hw->ep_shm_info[dest_epid].net_stats
  600. .tx_fifo_errors += 1;
  601. adapter->stats64.tx_errors += 1;
  602. hw->ep_shm_info[dest_epid].net_stats
  603. .tx_errors += 1;
  604. ret = NETDEV_TX_OK;
  605. } else {
  606. netif_trans_update(netdev);
  607. hw->ep_shm_info[dest_epid].ep_stats
  608. .tx_buffer_full += 1;
  609. netif_tx_stop_queue(cur_queue);
  610. if (!work_pending(&adapter->tx_stall_task))
  611. queue_work(adapter->txrx_wq,
  612. &adapter->tx_stall_task);
  613. ret = NETDEV_TX_BUSY;
  614. }
  615. } else {
  616. if (!is_multi) {
  617. adapter->stats64.tx_packets += 1;
  618. hw->ep_shm_info[dest_epid].net_stats
  619. .tx_packets += 1;
  620. adapter->stats64.tx_bytes += len;
  621. hw->ep_shm_info[dest_epid].net_stats
  622. .tx_bytes += len;
  623. }
  624. adapter->tx_retry_count = 0;
  625. ret = NETDEV_TX_OK;
  626. }
  627. }
  628. }
  629. if (ret == NETDEV_TX_OK) {
  630. dev_kfree_skb(skb);
  631. if (is_multi) {
  632. adapter->stats64.tx_packets += 1;
  633. hw->ep_shm_info[my_epid].net_stats.tx_packets += 1;
  634. adapter->stats64.tx_bytes += 1;
  635. hw->ep_shm_info[my_epid].net_stats.tx_bytes += len;
  636. }
  637. }
  638. return ret;
  639. }
  640. static void fjes_tx_retry(struct net_device *netdev)
  641. {
  642. struct netdev_queue *queue = netdev_get_tx_queue(netdev, 0);
  643. netif_tx_wake_queue(queue);
  644. }
  645. static struct rtnl_link_stats64 *
  646. fjes_get_stats64(struct net_device *netdev, struct rtnl_link_stats64 *stats)
  647. {
  648. struct fjes_adapter *adapter = netdev_priv(netdev);
  649. memcpy(stats, &adapter->stats64, sizeof(struct rtnl_link_stats64));
  650. return stats;
  651. }
  652. static int fjes_change_mtu(struct net_device *netdev, int new_mtu)
  653. {
  654. struct fjes_adapter *adapter = netdev_priv(netdev);
  655. bool running = netif_running(netdev);
  656. struct fjes_hw *hw = &adapter->hw;
  657. unsigned long flags;
  658. int ret = -EINVAL;
  659. int idx, epidx;
  660. for (idx = 0; fjes_support_mtu[idx] != 0; idx++) {
  661. if (new_mtu <= fjes_support_mtu[idx]) {
  662. new_mtu = fjes_support_mtu[idx];
  663. if (new_mtu == netdev->mtu)
  664. return 0;
  665. ret = 0;
  666. break;
  667. }
  668. }
  669. if (ret)
  670. return ret;
  671. if (running) {
  672. spin_lock_irqsave(&hw->rx_status_lock, flags);
  673. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  674. if (epidx == hw->my_epid)
  675. continue;
  676. hw->ep_shm_info[epidx].tx.info->v1i.rx_status &=
  677. ~FJES_RX_MTU_CHANGING_DONE;
  678. }
  679. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  680. netif_tx_stop_all_queues(netdev);
  681. netif_carrier_off(netdev);
  682. cancel_work_sync(&adapter->tx_stall_task);
  683. napi_disable(&adapter->napi);
  684. msleep(1000);
  685. netif_tx_stop_all_queues(netdev);
  686. }
  687. netdev->mtu = new_mtu;
  688. if (running) {
  689. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  690. if (epidx == hw->my_epid)
  691. continue;
  692. spin_lock_irqsave(&hw->rx_status_lock, flags);
  693. fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx,
  694. netdev->dev_addr,
  695. netdev->mtu);
  696. hw->ep_shm_info[epidx].tx.info->v1i.rx_status |=
  697. FJES_RX_MTU_CHANGING_DONE;
  698. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  699. }
  700. netif_tx_wake_all_queues(netdev);
  701. netif_carrier_on(netdev);
  702. napi_enable(&adapter->napi);
  703. napi_schedule(&adapter->napi);
  704. }
  705. return ret;
  706. }
  707. static int fjes_vlan_rx_add_vid(struct net_device *netdev,
  708. __be16 proto, u16 vid)
  709. {
  710. struct fjes_adapter *adapter = netdev_priv(netdev);
  711. bool ret = true;
  712. int epid;
  713. for (epid = 0; epid < adapter->hw.max_epid; epid++) {
  714. if (epid == adapter->hw.my_epid)
  715. continue;
  716. if (!fjes_hw_check_vlan_id(
  717. &adapter->hw.ep_shm_info[epid].tx, vid))
  718. ret = fjes_hw_set_vlan_id(
  719. &adapter->hw.ep_shm_info[epid].tx, vid);
  720. }
  721. return ret ? 0 : -ENOSPC;
  722. }
  723. static int fjes_vlan_rx_kill_vid(struct net_device *netdev,
  724. __be16 proto, u16 vid)
  725. {
  726. struct fjes_adapter *adapter = netdev_priv(netdev);
  727. int epid;
  728. for (epid = 0; epid < adapter->hw.max_epid; epid++) {
  729. if (epid == adapter->hw.my_epid)
  730. continue;
  731. fjes_hw_del_vlan_id(&adapter->hw.ep_shm_info[epid].tx, vid);
  732. }
  733. return 0;
  734. }
  735. static void fjes_txrx_stop_req_irq(struct fjes_adapter *adapter,
  736. int src_epid)
  737. {
  738. struct fjes_hw *hw = &adapter->hw;
  739. enum ep_partner_status status;
  740. unsigned long flags;
  741. status = fjes_hw_get_partner_ep_status(hw, src_epid);
  742. trace_fjes_txrx_stop_req_irq_pre(hw, src_epid, status);
  743. switch (status) {
  744. case EP_PARTNER_UNSHARE:
  745. case EP_PARTNER_COMPLETE:
  746. default:
  747. break;
  748. case EP_PARTNER_WAITING:
  749. if (src_epid < hw->my_epid) {
  750. spin_lock_irqsave(&hw->rx_status_lock, flags);
  751. hw->ep_shm_info[src_epid].tx.info->v1i.rx_status |=
  752. FJES_RX_STOP_REQ_DONE;
  753. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  754. clear_bit(src_epid, &hw->txrx_stop_req_bit);
  755. set_bit(src_epid, &adapter->unshare_watch_bitmask);
  756. if (!work_pending(&adapter->unshare_watch_task))
  757. queue_work(adapter->control_wq,
  758. &adapter->unshare_watch_task);
  759. }
  760. break;
  761. case EP_PARTNER_SHARED:
  762. if (hw->ep_shm_info[src_epid].rx.info->v1i.rx_status &
  763. FJES_RX_STOP_REQ_REQUEST) {
  764. set_bit(src_epid, &hw->epstop_req_bit);
  765. if (!work_pending(&hw->epstop_task))
  766. queue_work(adapter->control_wq,
  767. &hw->epstop_task);
  768. }
  769. break;
  770. }
  771. trace_fjes_txrx_stop_req_irq_post(hw, src_epid);
  772. }
  773. static void fjes_stop_req_irq(struct fjes_adapter *adapter, int src_epid)
  774. {
  775. struct fjes_hw *hw = &adapter->hw;
  776. enum ep_partner_status status;
  777. unsigned long flags;
  778. set_bit(src_epid, &hw->hw_info.buffer_unshare_reserve_bit);
  779. status = fjes_hw_get_partner_ep_status(hw, src_epid);
  780. trace_fjes_stop_req_irq_pre(hw, src_epid, status);
  781. switch (status) {
  782. case EP_PARTNER_WAITING:
  783. spin_lock_irqsave(&hw->rx_status_lock, flags);
  784. hw->ep_shm_info[src_epid].tx.info->v1i.rx_status |=
  785. FJES_RX_STOP_REQ_DONE;
  786. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  787. clear_bit(src_epid, &hw->txrx_stop_req_bit);
  788. /* fall through */
  789. case EP_PARTNER_UNSHARE:
  790. case EP_PARTNER_COMPLETE:
  791. default:
  792. set_bit(src_epid, &adapter->unshare_watch_bitmask);
  793. if (!work_pending(&adapter->unshare_watch_task))
  794. queue_work(adapter->control_wq,
  795. &adapter->unshare_watch_task);
  796. break;
  797. case EP_PARTNER_SHARED:
  798. set_bit(src_epid, &hw->epstop_req_bit);
  799. if (!work_pending(&hw->epstop_task))
  800. queue_work(adapter->control_wq, &hw->epstop_task);
  801. break;
  802. }
  803. trace_fjes_stop_req_irq_post(hw, src_epid);
  804. }
  805. static void fjes_update_zone_irq(struct fjes_adapter *adapter,
  806. int src_epid)
  807. {
  808. struct fjes_hw *hw = &adapter->hw;
  809. if (!work_pending(&hw->update_zone_task))
  810. queue_work(adapter->control_wq, &hw->update_zone_task);
  811. }
  812. static irqreturn_t fjes_intr(int irq, void *data)
  813. {
  814. struct fjes_adapter *adapter = data;
  815. struct fjes_hw *hw = &adapter->hw;
  816. irqreturn_t ret;
  817. u32 icr;
  818. icr = fjes_hw_capture_interrupt_status(hw);
  819. if (icr & REG_IS_MASK_IS_ASSERT) {
  820. if (icr & REG_ICTL_MASK_RX_DATA) {
  821. fjes_rx_irq(adapter, icr & REG_IS_MASK_EPID);
  822. hw->ep_shm_info[icr & REG_IS_MASK_EPID].ep_stats
  823. .recv_intr_rx += 1;
  824. }
  825. if (icr & REG_ICTL_MASK_DEV_STOP_REQ) {
  826. fjes_stop_req_irq(adapter, icr & REG_IS_MASK_EPID);
  827. hw->ep_shm_info[icr & REG_IS_MASK_EPID].ep_stats
  828. .recv_intr_stop += 1;
  829. }
  830. if (icr & REG_ICTL_MASK_TXRX_STOP_REQ) {
  831. fjes_txrx_stop_req_irq(adapter, icr & REG_IS_MASK_EPID);
  832. hw->ep_shm_info[icr & REG_IS_MASK_EPID].ep_stats
  833. .recv_intr_unshare += 1;
  834. }
  835. if (icr & REG_ICTL_MASK_TXRX_STOP_DONE)
  836. fjes_hw_set_irqmask(hw,
  837. REG_ICTL_MASK_TXRX_STOP_DONE, true);
  838. if (icr & REG_ICTL_MASK_INFO_UPDATE) {
  839. fjes_update_zone_irq(adapter, icr & REG_IS_MASK_EPID);
  840. hw->ep_shm_info[icr & REG_IS_MASK_EPID].ep_stats
  841. .recv_intr_zoneupdate += 1;
  842. }
  843. ret = IRQ_HANDLED;
  844. } else {
  845. ret = IRQ_NONE;
  846. }
  847. return ret;
  848. }
  849. static int fjes_rxframe_search_exist(struct fjes_adapter *adapter,
  850. int start_epid)
  851. {
  852. struct fjes_hw *hw = &adapter->hw;
  853. enum ep_partner_status pstatus;
  854. int max_epid, cur_epid;
  855. int i;
  856. max_epid = hw->max_epid;
  857. start_epid = (start_epid + 1 + max_epid) % max_epid;
  858. for (i = 0; i < max_epid; i++) {
  859. cur_epid = (start_epid + i) % max_epid;
  860. if (cur_epid == hw->my_epid)
  861. continue;
  862. pstatus = fjes_hw_get_partner_ep_status(hw, cur_epid);
  863. if (pstatus == EP_PARTNER_SHARED) {
  864. if (!fjes_hw_epbuf_rx_is_empty(
  865. &hw->ep_shm_info[cur_epid].rx))
  866. return cur_epid;
  867. }
  868. }
  869. return -1;
  870. }
  871. static void *fjes_rxframe_get(struct fjes_adapter *adapter, size_t *psize,
  872. int *cur_epid)
  873. {
  874. void *frame;
  875. *cur_epid = fjes_rxframe_search_exist(adapter, *cur_epid);
  876. if (*cur_epid < 0)
  877. return NULL;
  878. frame =
  879. fjes_hw_epbuf_rx_curpkt_get_addr(
  880. &adapter->hw.ep_shm_info[*cur_epid].rx, psize);
  881. return frame;
  882. }
  883. static void fjes_rxframe_release(struct fjes_adapter *adapter, int cur_epid)
  884. {
  885. fjes_hw_epbuf_rx_curpkt_drop(&adapter->hw.ep_shm_info[cur_epid].rx);
  886. }
  887. static void fjes_rx_irq(struct fjes_adapter *adapter, int src_epid)
  888. {
  889. struct fjes_hw *hw = &adapter->hw;
  890. fjes_hw_set_irqmask(hw, REG_ICTL_MASK_RX_DATA, true);
  891. adapter->unset_rx_last = true;
  892. napi_schedule(&adapter->napi);
  893. }
  894. static int fjes_poll(struct napi_struct *napi, int budget)
  895. {
  896. struct fjes_adapter *adapter =
  897. container_of(napi, struct fjes_adapter, napi);
  898. struct net_device *netdev = napi->dev;
  899. struct fjes_hw *hw = &adapter->hw;
  900. struct sk_buff *skb;
  901. int work_done = 0;
  902. int cur_epid = 0;
  903. int epidx;
  904. size_t frame_len;
  905. void *frame;
  906. spin_lock(&hw->rx_status_lock);
  907. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  908. if (epidx == hw->my_epid)
  909. continue;
  910. if (fjes_hw_get_partner_ep_status(hw, epidx) ==
  911. EP_PARTNER_SHARED)
  912. adapter->hw.ep_shm_info[epidx]
  913. .tx.info->v1i.rx_status |= FJES_RX_POLL_WORK;
  914. }
  915. spin_unlock(&hw->rx_status_lock);
  916. while (work_done < budget) {
  917. prefetch(&adapter->hw);
  918. frame = fjes_rxframe_get(adapter, &frame_len, &cur_epid);
  919. if (frame) {
  920. skb = napi_alloc_skb(napi, frame_len);
  921. if (!skb) {
  922. adapter->stats64.rx_dropped += 1;
  923. hw->ep_shm_info[cur_epid].net_stats
  924. .rx_dropped += 1;
  925. adapter->stats64.rx_errors += 1;
  926. hw->ep_shm_info[cur_epid].net_stats
  927. .rx_errors += 1;
  928. } else {
  929. memcpy(skb_put(skb, frame_len),
  930. frame, frame_len);
  931. skb->protocol = eth_type_trans(skb, netdev);
  932. skb->ip_summed = CHECKSUM_UNNECESSARY;
  933. netif_receive_skb(skb);
  934. work_done++;
  935. adapter->stats64.rx_packets += 1;
  936. hw->ep_shm_info[cur_epid].net_stats
  937. .rx_packets += 1;
  938. adapter->stats64.rx_bytes += frame_len;
  939. hw->ep_shm_info[cur_epid].net_stats
  940. .rx_bytes += frame_len;
  941. if (is_multicast_ether_addr(
  942. ((struct ethhdr *)frame)->h_dest)) {
  943. adapter->stats64.multicast += 1;
  944. hw->ep_shm_info[cur_epid].net_stats
  945. .multicast += 1;
  946. }
  947. }
  948. fjes_rxframe_release(adapter, cur_epid);
  949. adapter->unset_rx_last = true;
  950. } else {
  951. break;
  952. }
  953. }
  954. if (work_done < budget) {
  955. napi_complete(napi);
  956. if (adapter->unset_rx_last) {
  957. adapter->rx_last_jiffies = jiffies;
  958. adapter->unset_rx_last = false;
  959. }
  960. if (((long)jiffies - (long)adapter->rx_last_jiffies) < 3) {
  961. napi_reschedule(napi);
  962. } else {
  963. spin_lock(&hw->rx_status_lock);
  964. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  965. if (epidx == hw->my_epid)
  966. continue;
  967. if (fjes_hw_get_partner_ep_status(hw, epidx) ==
  968. EP_PARTNER_SHARED)
  969. adapter->hw.ep_shm_info[epidx].tx
  970. .info->v1i.rx_status &=
  971. ~FJES_RX_POLL_WORK;
  972. }
  973. spin_unlock(&hw->rx_status_lock);
  974. fjes_hw_set_irqmask(hw, REG_ICTL_MASK_RX_DATA, false);
  975. }
  976. }
  977. return work_done;
  978. }
  979. /* fjes_probe - Device Initialization Routine */
  980. static int fjes_probe(struct platform_device *plat_dev)
  981. {
  982. struct fjes_adapter *adapter;
  983. struct net_device *netdev;
  984. struct resource *res;
  985. struct fjes_hw *hw;
  986. int err;
  987. err = -ENOMEM;
  988. netdev = alloc_netdev_mq(sizeof(struct fjes_adapter), "es%d",
  989. NET_NAME_UNKNOWN, fjes_netdev_setup,
  990. FJES_MAX_QUEUES);
  991. if (!netdev)
  992. goto err_out;
  993. SET_NETDEV_DEV(netdev, &plat_dev->dev);
  994. dev_set_drvdata(&plat_dev->dev, netdev);
  995. adapter = netdev_priv(netdev);
  996. adapter->netdev = netdev;
  997. adapter->plat_dev = plat_dev;
  998. hw = &adapter->hw;
  999. hw->back = adapter;
  1000. /* setup the private structure */
  1001. err = fjes_sw_init(adapter);
  1002. if (err)
  1003. goto err_free_netdev;
  1004. INIT_WORK(&adapter->force_close_task, fjes_force_close_task);
  1005. adapter->force_reset = false;
  1006. adapter->open_guard = false;
  1007. adapter->txrx_wq = alloc_workqueue(DRV_NAME "/txrx", WQ_MEM_RECLAIM, 0);
  1008. adapter->control_wq = alloc_workqueue(DRV_NAME "/control",
  1009. WQ_MEM_RECLAIM, 0);
  1010. INIT_WORK(&adapter->tx_stall_task, fjes_tx_stall_task);
  1011. INIT_WORK(&adapter->raise_intr_rxdata_task,
  1012. fjes_raise_intr_rxdata_task);
  1013. INIT_WORK(&adapter->unshare_watch_task, fjes_watch_unshare_task);
  1014. adapter->unshare_watch_bitmask = 0;
  1015. INIT_DELAYED_WORK(&adapter->interrupt_watch_task, fjes_irq_watch_task);
  1016. adapter->interrupt_watch_enable = false;
  1017. res = platform_get_resource(plat_dev, IORESOURCE_MEM, 0);
  1018. hw->hw_res.start = res->start;
  1019. hw->hw_res.size = resource_size(res);
  1020. hw->hw_res.irq = platform_get_irq(plat_dev, 0);
  1021. err = fjes_hw_init(&adapter->hw);
  1022. if (err)
  1023. goto err_free_netdev;
  1024. /* setup MAC address (02:00:00:00:00:[epid])*/
  1025. netdev->dev_addr[0] = 2;
  1026. netdev->dev_addr[1] = 0;
  1027. netdev->dev_addr[2] = 0;
  1028. netdev->dev_addr[3] = 0;
  1029. netdev->dev_addr[4] = 0;
  1030. netdev->dev_addr[5] = hw->my_epid; /* EPID */
  1031. err = register_netdev(netdev);
  1032. if (err)
  1033. goto err_hw_exit;
  1034. netif_carrier_off(netdev);
  1035. fjes_dbg_adapter_init(adapter);
  1036. return 0;
  1037. err_hw_exit:
  1038. fjes_hw_exit(&adapter->hw);
  1039. err_free_netdev:
  1040. free_netdev(netdev);
  1041. err_out:
  1042. return err;
  1043. }
  1044. /* fjes_remove - Device Removal Routine */
  1045. static int fjes_remove(struct platform_device *plat_dev)
  1046. {
  1047. struct net_device *netdev = dev_get_drvdata(&plat_dev->dev);
  1048. struct fjes_adapter *adapter = netdev_priv(netdev);
  1049. struct fjes_hw *hw = &adapter->hw;
  1050. fjes_dbg_adapter_exit(adapter);
  1051. cancel_delayed_work_sync(&adapter->interrupt_watch_task);
  1052. cancel_work_sync(&adapter->unshare_watch_task);
  1053. cancel_work_sync(&adapter->raise_intr_rxdata_task);
  1054. cancel_work_sync(&adapter->tx_stall_task);
  1055. if (adapter->control_wq)
  1056. destroy_workqueue(adapter->control_wq);
  1057. if (adapter->txrx_wq)
  1058. destroy_workqueue(adapter->txrx_wq);
  1059. unregister_netdev(netdev);
  1060. fjes_hw_exit(hw);
  1061. netif_napi_del(&adapter->napi);
  1062. free_netdev(netdev);
  1063. return 0;
  1064. }
  1065. static int fjes_sw_init(struct fjes_adapter *adapter)
  1066. {
  1067. struct net_device *netdev = adapter->netdev;
  1068. netif_napi_add(netdev, &adapter->napi, fjes_poll, 64);
  1069. return 0;
  1070. }
  1071. /* fjes_netdev_setup - netdevice initialization routine */
  1072. static void fjes_netdev_setup(struct net_device *netdev)
  1073. {
  1074. ether_setup(netdev);
  1075. netdev->watchdog_timeo = FJES_TX_RETRY_INTERVAL;
  1076. netdev->netdev_ops = &fjes_netdev_ops;
  1077. fjes_set_ethtool_ops(netdev);
  1078. netdev->mtu = fjes_support_mtu[3];
  1079. netdev->min_mtu = fjes_support_mtu[0];
  1080. netdev->max_mtu = fjes_support_mtu[3];
  1081. netdev->flags |= IFF_BROADCAST;
  1082. netdev->features |= NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_FILTER;
  1083. }
  1084. static void fjes_irq_watch_task(struct work_struct *work)
  1085. {
  1086. struct fjes_adapter *adapter = container_of(to_delayed_work(work),
  1087. struct fjes_adapter, interrupt_watch_task);
  1088. local_irq_disable();
  1089. fjes_intr(adapter->hw.hw_res.irq, adapter);
  1090. local_irq_enable();
  1091. if (fjes_rxframe_search_exist(adapter, 0) >= 0)
  1092. napi_schedule(&adapter->napi);
  1093. if (adapter->interrupt_watch_enable) {
  1094. if (!delayed_work_pending(&adapter->interrupt_watch_task))
  1095. queue_delayed_work(adapter->control_wq,
  1096. &adapter->interrupt_watch_task,
  1097. FJES_IRQ_WATCH_DELAY);
  1098. }
  1099. }
  1100. static void fjes_watch_unshare_task(struct work_struct *work)
  1101. {
  1102. struct fjes_adapter *adapter =
  1103. container_of(work, struct fjes_adapter, unshare_watch_task);
  1104. struct net_device *netdev = adapter->netdev;
  1105. struct fjes_hw *hw = &adapter->hw;
  1106. int unshare_watch, unshare_reserve;
  1107. int max_epid, my_epid, epidx;
  1108. int stop_req, stop_req_done;
  1109. ulong unshare_watch_bitmask;
  1110. unsigned long flags;
  1111. int wait_time = 0;
  1112. int is_shared;
  1113. int ret;
  1114. my_epid = hw->my_epid;
  1115. max_epid = hw->max_epid;
  1116. unshare_watch_bitmask = adapter->unshare_watch_bitmask;
  1117. adapter->unshare_watch_bitmask = 0;
  1118. while ((unshare_watch_bitmask || hw->txrx_stop_req_bit) &&
  1119. (wait_time < 3000)) {
  1120. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  1121. if (epidx == hw->my_epid)
  1122. continue;
  1123. is_shared = fjes_hw_epid_is_shared(hw->hw_info.share,
  1124. epidx);
  1125. stop_req = test_bit(epidx, &hw->txrx_stop_req_bit);
  1126. stop_req_done = hw->ep_shm_info[epidx].rx.info->v1i.rx_status &
  1127. FJES_RX_STOP_REQ_DONE;
  1128. unshare_watch = test_bit(epidx, &unshare_watch_bitmask);
  1129. unshare_reserve = test_bit(epidx,
  1130. &hw->hw_info.buffer_unshare_reserve_bit);
  1131. if ((!stop_req ||
  1132. (is_shared && (!is_shared || !stop_req_done))) &&
  1133. (is_shared || !unshare_watch || !unshare_reserve))
  1134. continue;
  1135. mutex_lock(&hw->hw_info.lock);
  1136. ret = fjes_hw_unregister_buff_addr(hw, epidx);
  1137. switch (ret) {
  1138. case 0:
  1139. break;
  1140. case -ENOMSG:
  1141. case -EBUSY:
  1142. default:
  1143. if (!work_pending(
  1144. &adapter->force_close_task)) {
  1145. adapter->force_reset = true;
  1146. schedule_work(
  1147. &adapter->force_close_task);
  1148. }
  1149. break;
  1150. }
  1151. mutex_unlock(&hw->hw_info.lock);
  1152. hw->ep_shm_info[epidx].ep_stats
  1153. .com_unregist_buf_exec += 1;
  1154. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1155. fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx,
  1156. netdev->dev_addr, netdev->mtu);
  1157. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  1158. clear_bit(epidx, &hw->txrx_stop_req_bit);
  1159. clear_bit(epidx, &unshare_watch_bitmask);
  1160. clear_bit(epidx,
  1161. &hw->hw_info.buffer_unshare_reserve_bit);
  1162. }
  1163. msleep(100);
  1164. wait_time += 100;
  1165. }
  1166. if (hw->hw_info.buffer_unshare_reserve_bit) {
  1167. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  1168. if (epidx == hw->my_epid)
  1169. continue;
  1170. if (test_bit(epidx,
  1171. &hw->hw_info.buffer_unshare_reserve_bit)) {
  1172. mutex_lock(&hw->hw_info.lock);
  1173. ret = fjes_hw_unregister_buff_addr(hw, epidx);
  1174. switch (ret) {
  1175. case 0:
  1176. break;
  1177. case -ENOMSG:
  1178. case -EBUSY:
  1179. default:
  1180. if (!work_pending(
  1181. &adapter->force_close_task)) {
  1182. adapter->force_reset = true;
  1183. schedule_work(
  1184. &adapter->force_close_task);
  1185. }
  1186. break;
  1187. }
  1188. mutex_unlock(&hw->hw_info.lock);
  1189. hw->ep_shm_info[epidx].ep_stats
  1190. .com_unregist_buf_exec += 1;
  1191. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1192. fjes_hw_setup_epbuf(
  1193. &hw->ep_shm_info[epidx].tx,
  1194. netdev->dev_addr, netdev->mtu);
  1195. spin_unlock_irqrestore(&hw->rx_status_lock,
  1196. flags);
  1197. clear_bit(epidx, &hw->txrx_stop_req_bit);
  1198. clear_bit(epidx, &unshare_watch_bitmask);
  1199. clear_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit);
  1200. }
  1201. if (test_bit(epidx, &unshare_watch_bitmask)) {
  1202. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1203. hw->ep_shm_info[epidx].tx.info->v1i.rx_status &=
  1204. ~FJES_RX_STOP_REQ_DONE;
  1205. spin_unlock_irqrestore(&hw->rx_status_lock,
  1206. flags);
  1207. }
  1208. }
  1209. }
  1210. }
  1211. /* fjes_init_module - Driver Registration Routine */
  1212. static int __init fjes_init_module(void)
  1213. {
  1214. int result;
  1215. pr_info("%s - version %s - %s\n",
  1216. fjes_driver_string, fjes_driver_version, fjes_copyright);
  1217. fjes_dbg_init();
  1218. result = platform_driver_register(&fjes_driver);
  1219. if (result < 0) {
  1220. fjes_dbg_exit();
  1221. return result;
  1222. }
  1223. result = acpi_bus_register_driver(&fjes_acpi_driver);
  1224. if (result < 0)
  1225. goto fail_acpi_driver;
  1226. return 0;
  1227. fail_acpi_driver:
  1228. platform_driver_unregister(&fjes_driver);
  1229. fjes_dbg_exit();
  1230. return result;
  1231. }
  1232. module_init(fjes_init_module);
  1233. /* fjes_exit_module - Driver Exit Cleanup Routine */
  1234. static void __exit fjes_exit_module(void)
  1235. {
  1236. acpi_bus_unregister_driver(&fjes_acpi_driver);
  1237. platform_driver_unregister(&fjes_driver);
  1238. fjes_dbg_exit();
  1239. }
  1240. module_exit(fjes_exit_module);