fjes_main.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580
  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. memcpy(skb_put(skb, frame_len),
  952. frame, frame_len);
  953. skb->protocol = eth_type_trans(skb, netdev);
  954. skb->ip_summed = CHECKSUM_UNNECESSARY;
  955. netif_receive_skb(skb);
  956. work_done++;
  957. adapter->stats64.rx_packets += 1;
  958. hw->ep_shm_info[cur_epid].net_stats
  959. .rx_packets += 1;
  960. adapter->stats64.rx_bytes += frame_len;
  961. hw->ep_shm_info[cur_epid].net_stats
  962. .rx_bytes += frame_len;
  963. if (is_multicast_ether_addr(
  964. ((struct ethhdr *)frame)->h_dest)) {
  965. adapter->stats64.multicast += 1;
  966. hw->ep_shm_info[cur_epid].net_stats
  967. .multicast += 1;
  968. }
  969. }
  970. fjes_rxframe_release(adapter, cur_epid);
  971. adapter->unset_rx_last = true;
  972. } else {
  973. break;
  974. }
  975. }
  976. if (work_done < budget) {
  977. napi_complete_done(napi, work_done);
  978. if (adapter->unset_rx_last) {
  979. adapter->rx_last_jiffies = jiffies;
  980. adapter->unset_rx_last = false;
  981. }
  982. if (((long)jiffies - (long)adapter->rx_last_jiffies) < 3) {
  983. napi_reschedule(napi);
  984. } else {
  985. spin_lock(&hw->rx_status_lock);
  986. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  987. if (epidx == hw->my_epid)
  988. continue;
  989. if (fjes_hw_get_partner_ep_status(hw, epidx) ==
  990. EP_PARTNER_SHARED)
  991. adapter->hw.ep_shm_info[epidx].tx
  992. .info->v1i.rx_status &=
  993. ~FJES_RX_POLL_WORK;
  994. }
  995. spin_unlock(&hw->rx_status_lock);
  996. fjes_hw_set_irqmask(hw, REG_ICTL_MASK_RX_DATA, false);
  997. }
  998. }
  999. return work_done;
  1000. }
  1001. /* fjes_probe - Device Initialization Routine */
  1002. static int fjes_probe(struct platform_device *plat_dev)
  1003. {
  1004. struct fjes_adapter *adapter;
  1005. struct net_device *netdev;
  1006. struct resource *res;
  1007. struct fjes_hw *hw;
  1008. int err;
  1009. err = -ENOMEM;
  1010. netdev = alloc_netdev_mq(sizeof(struct fjes_adapter), "es%d",
  1011. NET_NAME_UNKNOWN, fjes_netdev_setup,
  1012. FJES_MAX_QUEUES);
  1013. if (!netdev)
  1014. goto err_out;
  1015. SET_NETDEV_DEV(netdev, &plat_dev->dev);
  1016. dev_set_drvdata(&plat_dev->dev, netdev);
  1017. adapter = netdev_priv(netdev);
  1018. adapter->netdev = netdev;
  1019. adapter->plat_dev = plat_dev;
  1020. hw = &adapter->hw;
  1021. hw->back = adapter;
  1022. /* setup the private structure */
  1023. err = fjes_sw_init(adapter);
  1024. if (err)
  1025. goto err_free_netdev;
  1026. INIT_WORK(&adapter->force_close_task, fjes_force_close_task);
  1027. adapter->force_reset = false;
  1028. adapter->open_guard = false;
  1029. adapter->txrx_wq = alloc_workqueue(DRV_NAME "/txrx", WQ_MEM_RECLAIM, 0);
  1030. adapter->control_wq = alloc_workqueue(DRV_NAME "/control",
  1031. WQ_MEM_RECLAIM, 0);
  1032. INIT_WORK(&adapter->tx_stall_task, fjes_tx_stall_task);
  1033. INIT_WORK(&adapter->raise_intr_rxdata_task,
  1034. fjes_raise_intr_rxdata_task);
  1035. INIT_WORK(&adapter->unshare_watch_task, fjes_watch_unshare_task);
  1036. adapter->unshare_watch_bitmask = 0;
  1037. INIT_DELAYED_WORK(&adapter->interrupt_watch_task, fjes_irq_watch_task);
  1038. adapter->interrupt_watch_enable = false;
  1039. res = platform_get_resource(plat_dev, IORESOURCE_MEM, 0);
  1040. hw->hw_res.start = res->start;
  1041. hw->hw_res.size = resource_size(res);
  1042. hw->hw_res.irq = platform_get_irq(plat_dev, 0);
  1043. err = fjes_hw_init(&adapter->hw);
  1044. if (err)
  1045. goto err_free_netdev;
  1046. /* setup MAC address (02:00:00:00:00:[epid])*/
  1047. netdev->dev_addr[0] = 2;
  1048. netdev->dev_addr[1] = 0;
  1049. netdev->dev_addr[2] = 0;
  1050. netdev->dev_addr[3] = 0;
  1051. netdev->dev_addr[4] = 0;
  1052. netdev->dev_addr[5] = hw->my_epid; /* EPID */
  1053. err = register_netdev(netdev);
  1054. if (err)
  1055. goto err_hw_exit;
  1056. netif_carrier_off(netdev);
  1057. fjes_dbg_adapter_init(adapter);
  1058. return 0;
  1059. err_hw_exit:
  1060. fjes_hw_exit(&adapter->hw);
  1061. err_free_netdev:
  1062. free_netdev(netdev);
  1063. err_out:
  1064. return err;
  1065. }
  1066. /* fjes_remove - Device Removal Routine */
  1067. static int fjes_remove(struct platform_device *plat_dev)
  1068. {
  1069. struct net_device *netdev = dev_get_drvdata(&plat_dev->dev);
  1070. struct fjes_adapter *adapter = netdev_priv(netdev);
  1071. struct fjes_hw *hw = &adapter->hw;
  1072. fjes_dbg_adapter_exit(adapter);
  1073. cancel_delayed_work_sync(&adapter->interrupt_watch_task);
  1074. cancel_work_sync(&adapter->unshare_watch_task);
  1075. cancel_work_sync(&adapter->raise_intr_rxdata_task);
  1076. cancel_work_sync(&adapter->tx_stall_task);
  1077. if (adapter->control_wq)
  1078. destroy_workqueue(adapter->control_wq);
  1079. if (adapter->txrx_wq)
  1080. destroy_workqueue(adapter->txrx_wq);
  1081. unregister_netdev(netdev);
  1082. fjes_hw_exit(hw);
  1083. netif_napi_del(&adapter->napi);
  1084. free_netdev(netdev);
  1085. return 0;
  1086. }
  1087. static int fjes_sw_init(struct fjes_adapter *adapter)
  1088. {
  1089. struct net_device *netdev = adapter->netdev;
  1090. netif_napi_add(netdev, &adapter->napi, fjes_poll, 64);
  1091. return 0;
  1092. }
  1093. /* fjes_netdev_setup - netdevice initialization routine */
  1094. static void fjes_netdev_setup(struct net_device *netdev)
  1095. {
  1096. ether_setup(netdev);
  1097. netdev->watchdog_timeo = FJES_TX_RETRY_INTERVAL;
  1098. netdev->netdev_ops = &fjes_netdev_ops;
  1099. fjes_set_ethtool_ops(netdev);
  1100. netdev->mtu = fjes_support_mtu[3];
  1101. netdev->min_mtu = fjes_support_mtu[0];
  1102. netdev->max_mtu = fjes_support_mtu[3];
  1103. netdev->flags |= IFF_BROADCAST;
  1104. netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
  1105. }
  1106. static void fjes_irq_watch_task(struct work_struct *work)
  1107. {
  1108. struct fjes_adapter *adapter = container_of(to_delayed_work(work),
  1109. struct fjes_adapter, interrupt_watch_task);
  1110. local_irq_disable();
  1111. fjes_intr(adapter->hw.hw_res.irq, adapter);
  1112. local_irq_enable();
  1113. if (fjes_rxframe_search_exist(adapter, 0) >= 0)
  1114. napi_schedule(&adapter->napi);
  1115. if (adapter->interrupt_watch_enable) {
  1116. if (!delayed_work_pending(&adapter->interrupt_watch_task))
  1117. queue_delayed_work(adapter->control_wq,
  1118. &adapter->interrupt_watch_task,
  1119. FJES_IRQ_WATCH_DELAY);
  1120. }
  1121. }
  1122. static void fjes_watch_unshare_task(struct work_struct *work)
  1123. {
  1124. struct fjes_adapter *adapter =
  1125. container_of(work, struct fjes_adapter, unshare_watch_task);
  1126. struct net_device *netdev = adapter->netdev;
  1127. struct fjes_hw *hw = &adapter->hw;
  1128. int unshare_watch, unshare_reserve;
  1129. int max_epid, my_epid, epidx;
  1130. int stop_req, stop_req_done;
  1131. ulong unshare_watch_bitmask;
  1132. unsigned long flags;
  1133. int wait_time = 0;
  1134. int is_shared;
  1135. int ret;
  1136. my_epid = hw->my_epid;
  1137. max_epid = hw->max_epid;
  1138. unshare_watch_bitmask = adapter->unshare_watch_bitmask;
  1139. adapter->unshare_watch_bitmask = 0;
  1140. while ((unshare_watch_bitmask || hw->txrx_stop_req_bit) &&
  1141. (wait_time < 3000)) {
  1142. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  1143. if (epidx == hw->my_epid)
  1144. continue;
  1145. is_shared = fjes_hw_epid_is_shared(hw->hw_info.share,
  1146. epidx);
  1147. stop_req = test_bit(epidx, &hw->txrx_stop_req_bit);
  1148. stop_req_done = hw->ep_shm_info[epidx].rx.info->v1i.rx_status &
  1149. FJES_RX_STOP_REQ_DONE;
  1150. unshare_watch = test_bit(epidx, &unshare_watch_bitmask);
  1151. unshare_reserve = test_bit(epidx,
  1152. &hw->hw_info.buffer_unshare_reserve_bit);
  1153. if ((!stop_req ||
  1154. (is_shared && (!is_shared || !stop_req_done))) &&
  1155. (is_shared || !unshare_watch || !unshare_reserve))
  1156. continue;
  1157. mutex_lock(&hw->hw_info.lock);
  1158. ret = fjes_hw_unregister_buff_addr(hw, epidx);
  1159. switch (ret) {
  1160. case 0:
  1161. break;
  1162. case -ENOMSG:
  1163. case -EBUSY:
  1164. default:
  1165. if (!work_pending(
  1166. &adapter->force_close_task)) {
  1167. adapter->force_reset = true;
  1168. schedule_work(
  1169. &adapter->force_close_task);
  1170. }
  1171. break;
  1172. }
  1173. mutex_unlock(&hw->hw_info.lock);
  1174. hw->ep_shm_info[epidx].ep_stats
  1175. .com_unregist_buf_exec += 1;
  1176. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1177. fjes_hw_setup_epbuf(&hw->ep_shm_info[epidx].tx,
  1178. netdev->dev_addr, netdev->mtu);
  1179. spin_unlock_irqrestore(&hw->rx_status_lock, flags);
  1180. clear_bit(epidx, &hw->txrx_stop_req_bit);
  1181. clear_bit(epidx, &unshare_watch_bitmask);
  1182. clear_bit(epidx,
  1183. &hw->hw_info.buffer_unshare_reserve_bit);
  1184. }
  1185. msleep(100);
  1186. wait_time += 100;
  1187. }
  1188. if (hw->hw_info.buffer_unshare_reserve_bit) {
  1189. for (epidx = 0; epidx < hw->max_epid; epidx++) {
  1190. if (epidx == hw->my_epid)
  1191. continue;
  1192. if (test_bit(epidx,
  1193. &hw->hw_info.buffer_unshare_reserve_bit)) {
  1194. mutex_lock(&hw->hw_info.lock);
  1195. ret = fjes_hw_unregister_buff_addr(hw, epidx);
  1196. switch (ret) {
  1197. case 0:
  1198. break;
  1199. case -ENOMSG:
  1200. case -EBUSY:
  1201. default:
  1202. if (!work_pending(
  1203. &adapter->force_close_task)) {
  1204. adapter->force_reset = true;
  1205. schedule_work(
  1206. &adapter->force_close_task);
  1207. }
  1208. break;
  1209. }
  1210. mutex_unlock(&hw->hw_info.lock);
  1211. hw->ep_shm_info[epidx].ep_stats
  1212. .com_unregist_buf_exec += 1;
  1213. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1214. fjes_hw_setup_epbuf(
  1215. &hw->ep_shm_info[epidx].tx,
  1216. netdev->dev_addr, netdev->mtu);
  1217. spin_unlock_irqrestore(&hw->rx_status_lock,
  1218. flags);
  1219. clear_bit(epidx, &hw->txrx_stop_req_bit);
  1220. clear_bit(epidx, &unshare_watch_bitmask);
  1221. clear_bit(epidx, &hw->hw_info.buffer_unshare_reserve_bit);
  1222. }
  1223. if (test_bit(epidx, &unshare_watch_bitmask)) {
  1224. spin_lock_irqsave(&hw->rx_status_lock, flags);
  1225. hw->ep_shm_info[epidx].tx.info->v1i.rx_status &=
  1226. ~FJES_RX_STOP_REQ_DONE;
  1227. spin_unlock_irqrestore(&hw->rx_status_lock,
  1228. flags);
  1229. }
  1230. }
  1231. }
  1232. }
  1233. static acpi_status
  1234. acpi_find_extended_socket_device(acpi_handle obj_handle, u32 level,
  1235. void *context, void **return_value)
  1236. {
  1237. struct acpi_device *device;
  1238. bool *found = context;
  1239. int result;
  1240. result = acpi_bus_get_device(obj_handle, &device);
  1241. if (result)
  1242. return AE_OK;
  1243. if (strcmp(acpi_device_hid(device), ACPI_MOTHERBOARD_RESOURCE_HID))
  1244. return AE_OK;
  1245. if (!is_extended_socket_device(device))
  1246. return AE_OK;
  1247. if (acpi_check_extended_socket_status(device))
  1248. return AE_OK;
  1249. *found = true;
  1250. return AE_CTRL_TERMINATE;
  1251. }
  1252. /* fjes_init_module - Driver Registration Routine */
  1253. static int __init fjes_init_module(void)
  1254. {
  1255. bool found = false;
  1256. int result;
  1257. acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
  1258. acpi_find_extended_socket_device, NULL, &found,
  1259. NULL);
  1260. if (!found)
  1261. return -ENODEV;
  1262. pr_info("%s - version %s - %s\n",
  1263. fjes_driver_string, fjes_driver_version, fjes_copyright);
  1264. fjes_dbg_init();
  1265. result = platform_driver_register(&fjes_driver);
  1266. if (result < 0) {
  1267. fjes_dbg_exit();
  1268. return result;
  1269. }
  1270. result = acpi_bus_register_driver(&fjes_acpi_driver);
  1271. if (result < 0)
  1272. goto fail_acpi_driver;
  1273. return 0;
  1274. fail_acpi_driver:
  1275. platform_driver_unregister(&fjes_driver);
  1276. fjes_dbg_exit();
  1277. return result;
  1278. }
  1279. module_init(fjes_init_module);
  1280. /* fjes_exit_module - Driver Exit Cleanup Routine */
  1281. static void __exit fjes_exit_module(void)
  1282. {
  1283. acpi_bus_unregister_driver(&fjes_acpi_driver);
  1284. platform_driver_unregister(&fjes_driver);
  1285. fjes_dbg_exit();
  1286. }
  1287. module_exit(fjes_exit_module);