qlcnic_83xx_init.c 65 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616
  1. /*
  2. * QLogic qlcnic NIC Driver
  3. * Copyright (c) 2009-2013 QLogic Corporation
  4. *
  5. * See LICENSE.qlcnic for copyright and licensing details.
  6. */
  7. #include "qlcnic_sriov.h"
  8. #include "qlcnic.h"
  9. #include "qlcnic_hw.h"
  10. /* Reset template definitions */
  11. #define QLC_83XX_RESTART_TEMPLATE_SIZE 0x2000
  12. #define QLC_83XX_RESET_TEMPLATE_ADDR 0x4F0000
  13. #define QLC_83XX_RESET_SEQ_VERSION 0x0101
  14. #define QLC_83XX_OPCODE_NOP 0x0000
  15. #define QLC_83XX_OPCODE_WRITE_LIST 0x0001
  16. #define QLC_83XX_OPCODE_READ_WRITE_LIST 0x0002
  17. #define QLC_83XX_OPCODE_POLL_LIST 0x0004
  18. #define QLC_83XX_OPCODE_POLL_WRITE_LIST 0x0008
  19. #define QLC_83XX_OPCODE_READ_MODIFY_WRITE 0x0010
  20. #define QLC_83XX_OPCODE_SEQ_PAUSE 0x0020
  21. #define QLC_83XX_OPCODE_SEQ_END 0x0040
  22. #define QLC_83XX_OPCODE_TMPL_END 0x0080
  23. #define QLC_83XX_OPCODE_POLL_READ_LIST 0x0100
  24. /* EPORT control registers */
  25. #define QLC_83XX_RESET_CONTROL 0x28084E50
  26. #define QLC_83XX_RESET_REG 0x28084E60
  27. #define QLC_83XX_RESET_PORT0 0x28084E70
  28. #define QLC_83XX_RESET_PORT1 0x28084E80
  29. #define QLC_83XX_RESET_PORT2 0x28084E90
  30. #define QLC_83XX_RESET_PORT3 0x28084EA0
  31. #define QLC_83XX_RESET_SRESHIM 0x28084EB0
  32. #define QLC_83XX_RESET_EPGSHIM 0x28084EC0
  33. #define QLC_83XX_RESET_ETHERPCS 0x28084ED0
  34. static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter);
  35. static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev);
  36. static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter);
  37. static int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev);
  38. static int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *);
  39. static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *);
  40. /* Template header */
  41. struct qlc_83xx_reset_hdr {
  42. #if defined(__LITTLE_ENDIAN)
  43. u16 version;
  44. u16 signature;
  45. u16 size;
  46. u16 entries;
  47. u16 hdr_size;
  48. u16 checksum;
  49. u16 init_offset;
  50. u16 start_offset;
  51. #elif defined(__BIG_ENDIAN)
  52. u16 signature;
  53. u16 version;
  54. u16 entries;
  55. u16 size;
  56. u16 checksum;
  57. u16 hdr_size;
  58. u16 start_offset;
  59. u16 init_offset;
  60. #endif
  61. } __packed;
  62. /* Command entry header. */
  63. struct qlc_83xx_entry_hdr {
  64. #if defined(__LITTLE_ENDIAN)
  65. u16 cmd;
  66. u16 size;
  67. u16 count;
  68. u16 delay;
  69. #elif defined(__BIG_ENDIAN)
  70. u16 size;
  71. u16 cmd;
  72. u16 delay;
  73. u16 count;
  74. #endif
  75. } __packed;
  76. /* Generic poll command */
  77. struct qlc_83xx_poll {
  78. u32 mask;
  79. u32 status;
  80. } __packed;
  81. /* Read modify write command */
  82. struct qlc_83xx_rmw {
  83. u32 mask;
  84. u32 xor_value;
  85. u32 or_value;
  86. #if defined(__LITTLE_ENDIAN)
  87. u8 shl;
  88. u8 shr;
  89. u8 index_a;
  90. u8 rsvd;
  91. #elif defined(__BIG_ENDIAN)
  92. u8 rsvd;
  93. u8 index_a;
  94. u8 shr;
  95. u8 shl;
  96. #endif
  97. } __packed;
  98. /* Generic command with 2 DWORD */
  99. struct qlc_83xx_entry {
  100. u32 arg1;
  101. u32 arg2;
  102. } __packed;
  103. /* Generic command with 4 DWORD */
  104. struct qlc_83xx_quad_entry {
  105. u32 dr_addr;
  106. u32 dr_value;
  107. u32 ar_addr;
  108. u32 ar_value;
  109. } __packed;
  110. static const char *const qlc_83xx_idc_states[] = {
  111. "Unknown",
  112. "Cold",
  113. "Init",
  114. "Ready",
  115. "Need Reset",
  116. "Need Quiesce",
  117. "Failed",
  118. "Quiesce"
  119. };
  120. static int
  121. qlcnic_83xx_idc_check_driver_presence_reg(struct qlcnic_adapter *adapter)
  122. {
  123. u32 val;
  124. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  125. if ((val & 0xFFFF))
  126. return 1;
  127. else
  128. return 0;
  129. }
  130. static void qlcnic_83xx_idc_log_state_history(struct qlcnic_adapter *adapter)
  131. {
  132. u32 cur, prev;
  133. cur = adapter->ahw->idc.curr_state;
  134. prev = adapter->ahw->idc.prev_state;
  135. dev_info(&adapter->pdev->dev,
  136. "current state = %s, prev state = %s\n",
  137. adapter->ahw->idc.name[cur],
  138. adapter->ahw->idc.name[prev]);
  139. }
  140. static int qlcnic_83xx_idc_update_audit_reg(struct qlcnic_adapter *adapter,
  141. u8 mode, int lock)
  142. {
  143. u32 val;
  144. int seconds;
  145. if (lock) {
  146. if (qlcnic_83xx_lock_driver(adapter))
  147. return -EBUSY;
  148. }
  149. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
  150. val |= (adapter->portnum & 0xf);
  151. val |= mode << 7;
  152. if (mode)
  153. seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
  154. else
  155. seconds = jiffies / HZ;
  156. val |= seconds << 8;
  157. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT, val);
  158. adapter->ahw->idc.sec_counter = jiffies / HZ;
  159. if (lock)
  160. qlcnic_83xx_unlock_driver(adapter);
  161. return 0;
  162. }
  163. static void qlcnic_83xx_idc_update_minor_version(struct qlcnic_adapter *adapter)
  164. {
  165. u32 val;
  166. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION);
  167. val = val & ~(0x3 << (adapter->portnum * 2));
  168. val = val | (QLC_83XX_IDC_MINOR_VERSION << (adapter->portnum * 2));
  169. QLCWRX(adapter->ahw, QLC_83XX_IDC_MIN_VERSION, val);
  170. }
  171. static int qlcnic_83xx_idc_update_major_version(struct qlcnic_adapter *adapter,
  172. int lock)
  173. {
  174. u32 val;
  175. if (lock) {
  176. if (qlcnic_83xx_lock_driver(adapter))
  177. return -EBUSY;
  178. }
  179. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
  180. val = val & ~0xFF;
  181. val = val | QLC_83XX_IDC_MAJOR_VERSION;
  182. QLCWRX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION, val);
  183. if (lock)
  184. qlcnic_83xx_unlock_driver(adapter);
  185. return 0;
  186. }
  187. static int
  188. qlcnic_83xx_idc_update_drv_presence_reg(struct qlcnic_adapter *adapter,
  189. int status, int lock)
  190. {
  191. u32 val;
  192. if (lock) {
  193. if (qlcnic_83xx_lock_driver(adapter))
  194. return -EBUSY;
  195. }
  196. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  197. if (status)
  198. val = val | (1 << adapter->portnum);
  199. else
  200. val = val & ~(1 << adapter->portnum);
  201. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  202. qlcnic_83xx_idc_update_minor_version(adapter);
  203. if (lock)
  204. qlcnic_83xx_unlock_driver(adapter);
  205. return 0;
  206. }
  207. static int qlcnic_83xx_idc_check_major_version(struct qlcnic_adapter *adapter)
  208. {
  209. u32 val;
  210. u8 version;
  211. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_MAJ_VERSION);
  212. version = val & 0xFF;
  213. if (version != QLC_83XX_IDC_MAJOR_VERSION) {
  214. dev_info(&adapter->pdev->dev,
  215. "%s:mismatch. version 0x%x, expected version 0x%x\n",
  216. __func__, version, QLC_83XX_IDC_MAJOR_VERSION);
  217. return -EIO;
  218. }
  219. return 0;
  220. }
  221. static int qlcnic_83xx_idc_clear_registers(struct qlcnic_adapter *adapter,
  222. int lock)
  223. {
  224. u32 val;
  225. if (lock) {
  226. if (qlcnic_83xx_lock_driver(adapter))
  227. return -EBUSY;
  228. }
  229. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, 0);
  230. /* Clear graceful reset bit */
  231. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  232. val &= ~QLC_83XX_IDC_GRACEFULL_RESET;
  233. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  234. if (lock)
  235. qlcnic_83xx_unlock_driver(adapter);
  236. return 0;
  237. }
  238. static int qlcnic_83xx_idc_update_drv_ack_reg(struct qlcnic_adapter *adapter,
  239. int flag, int lock)
  240. {
  241. u32 val;
  242. if (lock) {
  243. if (qlcnic_83xx_lock_driver(adapter))
  244. return -EBUSY;
  245. }
  246. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
  247. if (flag)
  248. val = val | (1 << adapter->portnum);
  249. else
  250. val = val & ~(1 << adapter->portnum);
  251. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_ACK, val);
  252. if (lock)
  253. qlcnic_83xx_unlock_driver(adapter);
  254. return 0;
  255. }
  256. static int qlcnic_83xx_idc_check_timeout(struct qlcnic_adapter *adapter,
  257. int time_limit)
  258. {
  259. u64 seconds;
  260. seconds = jiffies / HZ - adapter->ahw->idc.sec_counter;
  261. if (seconds <= time_limit)
  262. return 0;
  263. else
  264. return -EBUSY;
  265. }
  266. /**
  267. * qlcnic_83xx_idc_check_reset_ack_reg
  268. *
  269. * @adapter: adapter structure
  270. *
  271. * Check ACK wait limit and clear the functions which failed to ACK
  272. *
  273. * Return 0 if all functions have acknowledged the reset request.
  274. **/
  275. static int qlcnic_83xx_idc_check_reset_ack_reg(struct qlcnic_adapter *adapter)
  276. {
  277. int timeout;
  278. u32 ack, presence, val;
  279. timeout = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
  280. ack = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_ACK);
  281. presence = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  282. dev_info(&adapter->pdev->dev,
  283. "%s: ack = 0x%x, presence = 0x%x\n", __func__, ack, presence);
  284. if (!((ack & presence) == presence)) {
  285. if (qlcnic_83xx_idc_check_timeout(adapter, timeout)) {
  286. /* Clear functions which failed to ACK */
  287. dev_info(&adapter->pdev->dev,
  288. "%s: ACK wait exceeds time limit\n", __func__);
  289. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  290. val = val & ~(ack ^ presence);
  291. if (qlcnic_83xx_lock_driver(adapter))
  292. return -EBUSY;
  293. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  294. dev_info(&adapter->pdev->dev,
  295. "%s: updated drv presence reg = 0x%x\n",
  296. __func__, val);
  297. qlcnic_83xx_unlock_driver(adapter);
  298. return 0;
  299. } else {
  300. return 1;
  301. }
  302. } else {
  303. dev_info(&adapter->pdev->dev,
  304. "%s: Reset ACK received from all functions\n",
  305. __func__);
  306. return 0;
  307. }
  308. }
  309. /**
  310. * qlcnic_83xx_idc_tx_soft_reset
  311. *
  312. * @adapter: adapter structure
  313. *
  314. * Handle context deletion and recreation request from transmit routine
  315. *
  316. * Returns -EBUSY or Success (0)
  317. *
  318. **/
  319. static int qlcnic_83xx_idc_tx_soft_reset(struct qlcnic_adapter *adapter)
  320. {
  321. struct net_device *netdev = adapter->netdev;
  322. if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
  323. return -EBUSY;
  324. netif_device_detach(netdev);
  325. qlcnic_down(adapter, netdev);
  326. qlcnic_up(adapter, netdev);
  327. netif_device_attach(netdev);
  328. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  329. netdev_info(adapter->netdev, "%s: soft reset complete.\n", __func__);
  330. return 0;
  331. }
  332. /**
  333. * qlcnic_83xx_idc_detach_driver
  334. *
  335. * @adapter: adapter structure
  336. * Detach net interface, stop TX and cleanup resources before the HW reset.
  337. * Returns: None
  338. *
  339. **/
  340. static void qlcnic_83xx_idc_detach_driver(struct qlcnic_adapter *adapter)
  341. {
  342. int i;
  343. struct net_device *netdev = adapter->netdev;
  344. netif_device_detach(netdev);
  345. qlcnic_83xx_detach_mailbox_work(adapter);
  346. /* Disable mailbox interrupt */
  347. qlcnic_83xx_disable_mbx_intr(adapter);
  348. qlcnic_down(adapter, netdev);
  349. for (i = 0; i < adapter->ahw->num_msix; i++) {
  350. adapter->ahw->intr_tbl[i].id = i;
  351. adapter->ahw->intr_tbl[i].enabled = 0;
  352. adapter->ahw->intr_tbl[i].src = 0;
  353. }
  354. if (qlcnic_sriov_pf_check(adapter))
  355. qlcnic_sriov_pf_reset(adapter);
  356. }
  357. /**
  358. * qlcnic_83xx_idc_attach_driver
  359. *
  360. * @adapter: adapter structure
  361. *
  362. * Re-attach and re-enable net interface
  363. * Returns: None
  364. *
  365. **/
  366. static void qlcnic_83xx_idc_attach_driver(struct qlcnic_adapter *adapter)
  367. {
  368. struct net_device *netdev = adapter->netdev;
  369. if (netif_running(netdev)) {
  370. if (qlcnic_up(adapter, netdev))
  371. goto done;
  372. qlcnic_restore_indev_addr(netdev, NETDEV_UP);
  373. }
  374. done:
  375. netif_device_attach(netdev);
  376. }
  377. static int qlcnic_83xx_idc_enter_failed_state(struct qlcnic_adapter *adapter,
  378. int lock)
  379. {
  380. if (lock) {
  381. if (qlcnic_83xx_lock_driver(adapter))
  382. return -EBUSY;
  383. }
  384. qlcnic_83xx_idc_clear_registers(adapter, 0);
  385. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_FAILED);
  386. if (lock)
  387. qlcnic_83xx_unlock_driver(adapter);
  388. qlcnic_83xx_idc_log_state_history(adapter);
  389. dev_info(&adapter->pdev->dev, "Device will enter failed state\n");
  390. return 0;
  391. }
  392. static int qlcnic_83xx_idc_enter_init_state(struct qlcnic_adapter *adapter,
  393. int lock)
  394. {
  395. if (lock) {
  396. if (qlcnic_83xx_lock_driver(adapter))
  397. return -EBUSY;
  398. }
  399. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_INIT);
  400. if (lock)
  401. qlcnic_83xx_unlock_driver(adapter);
  402. return 0;
  403. }
  404. static int qlcnic_83xx_idc_enter_need_quiesce(struct qlcnic_adapter *adapter,
  405. int lock)
  406. {
  407. if (lock) {
  408. if (qlcnic_83xx_lock_driver(adapter))
  409. return -EBUSY;
  410. }
  411. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  412. QLC_83XX_IDC_DEV_NEED_QUISCENT);
  413. if (lock)
  414. qlcnic_83xx_unlock_driver(adapter);
  415. return 0;
  416. }
  417. static int
  418. qlcnic_83xx_idc_enter_need_reset_state(struct qlcnic_adapter *adapter, int lock)
  419. {
  420. if (lock) {
  421. if (qlcnic_83xx_lock_driver(adapter))
  422. return -EBUSY;
  423. }
  424. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  425. QLC_83XX_IDC_DEV_NEED_RESET);
  426. if (lock)
  427. qlcnic_83xx_unlock_driver(adapter);
  428. return 0;
  429. }
  430. static int qlcnic_83xx_idc_enter_ready_state(struct qlcnic_adapter *adapter,
  431. int lock)
  432. {
  433. if (lock) {
  434. if (qlcnic_83xx_lock_driver(adapter))
  435. return -EBUSY;
  436. }
  437. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE, QLC_83XX_IDC_DEV_READY);
  438. if (lock)
  439. qlcnic_83xx_unlock_driver(adapter);
  440. return 0;
  441. }
  442. /**
  443. * qlcnic_83xx_idc_find_reset_owner_id
  444. *
  445. * @adapter: adapter structure
  446. *
  447. * NIC gets precedence over ISCSI and ISCSI has precedence over FCOE.
  448. * Within the same class, function with lowest PCI ID assumes ownership
  449. *
  450. * Returns: reset owner id or failure indication (-EIO)
  451. *
  452. **/
  453. static int qlcnic_83xx_idc_find_reset_owner_id(struct qlcnic_adapter *adapter)
  454. {
  455. u32 reg, reg1, reg2, i, j, owner, class;
  456. reg1 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_1);
  457. reg2 = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_PARTITION_INFO_2);
  458. owner = QLCNIC_TYPE_NIC;
  459. i = 0;
  460. j = 0;
  461. reg = reg1;
  462. do {
  463. class = (((reg & (0xF << j * 4)) >> j * 4) & 0x3);
  464. if (class == owner)
  465. break;
  466. if (i == (QLC_83XX_IDC_MAX_FUNC_PER_PARTITION_INFO - 1)) {
  467. reg = reg2;
  468. j = 0;
  469. } else {
  470. j++;
  471. }
  472. if (i == (QLC_83XX_IDC_MAX_CNA_FUNCTIONS - 1)) {
  473. if (owner == QLCNIC_TYPE_NIC)
  474. owner = QLCNIC_TYPE_ISCSI;
  475. else if (owner == QLCNIC_TYPE_ISCSI)
  476. owner = QLCNIC_TYPE_FCOE;
  477. else if (owner == QLCNIC_TYPE_FCOE)
  478. return -EIO;
  479. reg = reg1;
  480. j = 0;
  481. i = 0;
  482. }
  483. } while (i++ < QLC_83XX_IDC_MAX_CNA_FUNCTIONS);
  484. return i;
  485. }
  486. static int qlcnic_83xx_idc_restart_hw(struct qlcnic_adapter *adapter, int lock)
  487. {
  488. int ret = 0;
  489. ret = qlcnic_83xx_restart_hw(adapter);
  490. if (ret) {
  491. qlcnic_83xx_idc_enter_failed_state(adapter, lock);
  492. } else {
  493. qlcnic_83xx_idc_clear_registers(adapter, lock);
  494. ret = qlcnic_83xx_idc_enter_ready_state(adapter, lock);
  495. }
  496. return ret;
  497. }
  498. static int qlcnic_83xx_idc_check_fan_failure(struct qlcnic_adapter *adapter)
  499. {
  500. u32 status;
  501. status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
  502. if (status & QLCNIC_RCODE_FATAL_ERROR) {
  503. dev_err(&adapter->pdev->dev,
  504. "peg halt status1=0x%x\n", status);
  505. if (QLCNIC_FWERROR_CODE(status) == QLCNIC_FWERROR_FAN_FAILURE) {
  506. dev_err(&adapter->pdev->dev,
  507. "On board active cooling fan failed. "
  508. "Device has been halted.\n");
  509. dev_err(&adapter->pdev->dev,
  510. "Replace the adapter.\n");
  511. return -EIO;
  512. }
  513. }
  514. return 0;
  515. }
  516. int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
  517. {
  518. int err;
  519. qlcnic_83xx_reinit_mbx_work(adapter->ahw->mailbox);
  520. qlcnic_83xx_enable_mbx_interrupt(adapter);
  521. qlcnic_83xx_initialize_nic(adapter, 1);
  522. err = qlcnic_sriov_pf_reinit(adapter);
  523. if (err)
  524. return err;
  525. qlcnic_83xx_enable_mbx_interrupt(adapter);
  526. if (qlcnic_83xx_configure_opmode(adapter)) {
  527. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  528. return -EIO;
  529. }
  530. if (adapter->nic_ops->init_driver(adapter)) {
  531. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  532. return -EIO;
  533. }
  534. if (adapter->portnum == 0)
  535. qlcnic_set_drv_version(adapter);
  536. qlcnic_dcb_get_info(adapter->dcb);
  537. qlcnic_83xx_idc_attach_driver(adapter);
  538. return 0;
  539. }
  540. static void qlcnic_83xx_idc_update_idc_params(struct qlcnic_adapter *adapter)
  541. {
  542. struct qlcnic_hardware_context *ahw = adapter->ahw;
  543. qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 1);
  544. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  545. set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  546. ahw->idc.quiesce_req = 0;
  547. ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
  548. ahw->idc.err_code = 0;
  549. ahw->idc.collect_dump = 0;
  550. ahw->reset_context = 0;
  551. adapter->tx_timeo_cnt = 0;
  552. ahw->idc.delay_reset = 0;
  553. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  554. }
  555. /**
  556. * qlcnic_83xx_idc_ready_state_entry
  557. *
  558. * @adapter: adapter structure
  559. *
  560. * Perform ready state initialization, this routine will get invoked only
  561. * once from READY state.
  562. *
  563. * Returns: Error code or Success(0)
  564. *
  565. **/
  566. int qlcnic_83xx_idc_ready_state_entry(struct qlcnic_adapter *adapter)
  567. {
  568. struct qlcnic_hardware_context *ahw = adapter->ahw;
  569. if (ahw->idc.prev_state != QLC_83XX_IDC_DEV_READY) {
  570. qlcnic_83xx_idc_update_idc_params(adapter);
  571. /* Re-attach the device if required */
  572. if ((ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) ||
  573. (ahw->idc.prev_state == QLC_83XX_IDC_DEV_INIT)) {
  574. if (qlcnic_83xx_idc_reattach_driver(adapter))
  575. return -EIO;
  576. }
  577. }
  578. return 0;
  579. }
  580. /**
  581. * qlcnic_83xx_idc_vnic_pf_entry
  582. *
  583. * @adapter: adapter structure
  584. *
  585. * Ensure vNIC mode privileged function starts only after vNIC mode is
  586. * enabled by management function.
  587. * If vNIC mode is ready, start initialization.
  588. *
  589. * Returns: -EIO or 0
  590. *
  591. **/
  592. int qlcnic_83xx_idc_vnic_pf_entry(struct qlcnic_adapter *adapter)
  593. {
  594. u32 state;
  595. struct qlcnic_hardware_context *ahw = adapter->ahw;
  596. /* Privileged function waits till mgmt function enables VNIC mode */
  597. state = QLCRDX(adapter->ahw, QLC_83XX_VNIC_STATE);
  598. if (state != QLCNIC_DEV_NPAR_OPER) {
  599. if (!ahw->idc.vnic_wait_limit--) {
  600. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  601. return -EIO;
  602. }
  603. dev_info(&adapter->pdev->dev, "vNIC mode disabled\n");
  604. return -EIO;
  605. } else {
  606. /* Perform one time initialization from ready state */
  607. if (ahw->idc.vnic_state != QLCNIC_DEV_NPAR_OPER) {
  608. qlcnic_83xx_idc_update_idc_params(adapter);
  609. /* If the previous state is UNKNOWN, device will be
  610. already attached properly by Init routine*/
  611. if (ahw->idc.prev_state != QLC_83XX_IDC_DEV_UNKNOWN) {
  612. if (qlcnic_83xx_idc_reattach_driver(adapter))
  613. return -EIO;
  614. }
  615. adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_OPER;
  616. dev_info(&adapter->pdev->dev, "vNIC mode enabled\n");
  617. }
  618. }
  619. return 0;
  620. }
  621. static int qlcnic_83xx_idc_unknown_state(struct qlcnic_adapter *adapter)
  622. {
  623. adapter->ahw->idc.err_code = -EIO;
  624. dev_err(&adapter->pdev->dev,
  625. "%s: Device in unknown state\n", __func__);
  626. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  627. return 0;
  628. }
  629. /**
  630. * qlcnic_83xx_idc_cold_state
  631. *
  632. * @adapter: adapter structure
  633. *
  634. * If HW is up and running device will enter READY state.
  635. * If firmware image from host needs to be loaded, device is
  636. * forced to start with the file firmware image.
  637. *
  638. * Returns: Error code or Success(0)
  639. *
  640. **/
  641. static int qlcnic_83xx_idc_cold_state_handler(struct qlcnic_adapter *adapter)
  642. {
  643. qlcnic_83xx_idc_update_drv_presence_reg(adapter, 1, 0);
  644. qlcnic_83xx_idc_update_audit_reg(adapter, 1, 0);
  645. if (qlcnic_load_fw_file) {
  646. qlcnic_83xx_idc_restart_hw(adapter, 0);
  647. } else {
  648. if (qlcnic_83xx_check_hw_status(adapter)) {
  649. qlcnic_83xx_idc_enter_failed_state(adapter, 0);
  650. return -EIO;
  651. } else {
  652. qlcnic_83xx_idc_enter_ready_state(adapter, 0);
  653. }
  654. }
  655. return 0;
  656. }
  657. /**
  658. * qlcnic_83xx_idc_init_state
  659. *
  660. * @adapter: adapter structure
  661. *
  662. * Reset owner will restart the device from this state.
  663. * Device will enter failed state if it remains
  664. * in this state for more than DEV_INIT time limit.
  665. *
  666. * Returns: Error code or Success(0)
  667. *
  668. **/
  669. static int qlcnic_83xx_idc_init_state(struct qlcnic_adapter *adapter)
  670. {
  671. int timeout, ret = 0;
  672. u32 owner;
  673. timeout = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
  674. if (adapter->ahw->idc.prev_state == QLC_83XX_IDC_DEV_NEED_RESET) {
  675. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  676. if (adapter->ahw->pci_func == owner)
  677. ret = qlcnic_83xx_idc_restart_hw(adapter, 1);
  678. } else {
  679. ret = qlcnic_83xx_idc_check_timeout(adapter, timeout);
  680. }
  681. return ret;
  682. }
  683. /**
  684. * qlcnic_83xx_idc_ready_state
  685. *
  686. * @adapter: adapter structure
  687. *
  688. * Perform IDC protocol specicifed actions after monitoring device state and
  689. * events.
  690. *
  691. * Returns: Error code or Success(0)
  692. *
  693. **/
  694. static int qlcnic_83xx_idc_ready_state(struct qlcnic_adapter *adapter)
  695. {
  696. struct qlcnic_hardware_context *ahw = adapter->ahw;
  697. struct qlcnic_mailbox *mbx = ahw->mailbox;
  698. int ret = 0;
  699. u32 val;
  700. /* Perform NIC configuration based ready state entry actions */
  701. if (ahw->idc.state_entry(adapter))
  702. return -EIO;
  703. if (qlcnic_check_temp(adapter)) {
  704. if (ahw->temp == QLCNIC_TEMP_PANIC) {
  705. qlcnic_83xx_idc_check_fan_failure(adapter);
  706. dev_err(&adapter->pdev->dev,
  707. "Error: device temperature %d above limits\n",
  708. adapter->ahw->temp);
  709. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  710. set_bit(__QLCNIC_RESETTING, &adapter->state);
  711. qlcnic_83xx_idc_detach_driver(adapter);
  712. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  713. return -EIO;
  714. }
  715. }
  716. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  717. ret = qlcnic_83xx_check_heartbeat(adapter);
  718. if (ret) {
  719. adapter->flags |= QLCNIC_FW_HANG;
  720. if (!(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
  721. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  722. set_bit(__QLCNIC_RESETTING, &adapter->state);
  723. qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
  724. } else {
  725. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  726. __func__);
  727. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  728. }
  729. return -EIO;
  730. }
  731. if ((val & QLC_83XX_IDC_GRACEFULL_RESET) || ahw->idc.collect_dump) {
  732. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  733. /* Move to need reset state and prepare for reset */
  734. qlcnic_83xx_idc_enter_need_reset_state(adapter, 1);
  735. return ret;
  736. }
  737. /* Check for soft reset request */
  738. if (ahw->reset_context &&
  739. !(val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY)) {
  740. adapter->ahw->reset_context = 0;
  741. qlcnic_83xx_idc_tx_soft_reset(adapter);
  742. return ret;
  743. }
  744. /* Move to need quiesce state if requested */
  745. if (adapter->ahw->idc.quiesce_req) {
  746. qlcnic_83xx_idc_enter_need_quiesce(adapter, 1);
  747. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  748. return ret;
  749. }
  750. return ret;
  751. }
  752. /**
  753. * qlcnic_83xx_idc_need_reset_state
  754. *
  755. * @adapter: adapter structure
  756. *
  757. * Device will remain in this state until:
  758. * Reset request ACK's are received from all the functions
  759. * Wait time exceeds max time limit
  760. *
  761. * Returns: Error code or Success(0)
  762. *
  763. **/
  764. static int qlcnic_83xx_idc_need_reset_state(struct qlcnic_adapter *adapter)
  765. {
  766. struct qlcnic_mailbox *mbx = adapter->ahw->mailbox;
  767. int ret = 0;
  768. if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) {
  769. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  770. set_bit(__QLCNIC_RESETTING, &adapter->state);
  771. clear_bit(QLC_83XX_MBX_READY, &mbx->status);
  772. if (adapter->ahw->nic_mode == QLCNIC_VNIC_MODE)
  773. qlcnic_83xx_disable_vnic_mode(adapter, 1);
  774. if (qlcnic_check_diag_status(adapter)) {
  775. dev_info(&adapter->pdev->dev,
  776. "%s: Wait for diag completion\n", __func__);
  777. adapter->ahw->idc.delay_reset = 1;
  778. return 0;
  779. } else {
  780. qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
  781. qlcnic_83xx_idc_detach_driver(adapter);
  782. }
  783. }
  784. if (qlcnic_check_diag_status(adapter)) {
  785. dev_info(&adapter->pdev->dev,
  786. "%s: Wait for diag completion\n", __func__);
  787. return -1;
  788. } else {
  789. if (adapter->ahw->idc.delay_reset) {
  790. qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
  791. qlcnic_83xx_idc_detach_driver(adapter);
  792. adapter->ahw->idc.delay_reset = 0;
  793. }
  794. /* Check for ACK from other functions */
  795. ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
  796. if (ret) {
  797. dev_info(&adapter->pdev->dev,
  798. "%s: Waiting for reset ACK\n", __func__);
  799. return -1;
  800. }
  801. }
  802. /* Transit to INIT state and restart the HW */
  803. qlcnic_83xx_idc_enter_init_state(adapter, 1);
  804. return ret;
  805. }
  806. static int qlcnic_83xx_idc_need_quiesce_state(struct qlcnic_adapter *adapter)
  807. {
  808. dev_err(&adapter->pdev->dev, "%s: TBD\n", __func__);
  809. return 0;
  810. }
  811. static void qlcnic_83xx_idc_failed_state(struct qlcnic_adapter *adapter)
  812. {
  813. struct qlcnic_hardware_context *ahw = adapter->ahw;
  814. u32 val, owner;
  815. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  816. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  817. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  818. if (ahw->pci_func == owner) {
  819. qlcnic_83xx_stop_hw(adapter);
  820. qlcnic_dump_fw(adapter);
  821. }
  822. }
  823. netdev_warn(adapter->netdev, "%s: Reboot will be required to recover the adapter!!\n",
  824. __func__);
  825. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  826. ahw->idc.err_code = -EIO;
  827. return;
  828. }
  829. static int qlcnic_83xx_idc_quiesce_state(struct qlcnic_adapter *adapter)
  830. {
  831. dev_info(&adapter->pdev->dev, "%s: TBD\n", __func__);
  832. return 0;
  833. }
  834. static int qlcnic_83xx_idc_check_state_validity(struct qlcnic_adapter *adapter,
  835. u32 state)
  836. {
  837. u32 cur, prev, next;
  838. cur = adapter->ahw->idc.curr_state;
  839. prev = adapter->ahw->idc.prev_state;
  840. next = state;
  841. if ((next < QLC_83XX_IDC_DEV_COLD) ||
  842. (next > QLC_83XX_IDC_DEV_QUISCENT)) {
  843. dev_err(&adapter->pdev->dev,
  844. "%s: curr %d, prev %d, next state %d is invalid\n",
  845. __func__, cur, prev, state);
  846. return 1;
  847. }
  848. if ((cur == QLC_83XX_IDC_DEV_UNKNOWN) &&
  849. (prev == QLC_83XX_IDC_DEV_UNKNOWN)) {
  850. if ((next != QLC_83XX_IDC_DEV_COLD) &&
  851. (next != QLC_83XX_IDC_DEV_READY)) {
  852. dev_err(&adapter->pdev->dev,
  853. "%s: failed, cur %d prev %d next %d\n",
  854. __func__, cur, prev, next);
  855. return 1;
  856. }
  857. }
  858. if (next == QLC_83XX_IDC_DEV_INIT) {
  859. if ((prev != QLC_83XX_IDC_DEV_INIT) &&
  860. (prev != QLC_83XX_IDC_DEV_COLD) &&
  861. (prev != QLC_83XX_IDC_DEV_NEED_RESET)) {
  862. dev_err(&adapter->pdev->dev,
  863. "%s: failed, cur %d prev %d next %d\n",
  864. __func__, cur, prev, next);
  865. return 1;
  866. }
  867. }
  868. return 0;
  869. }
  870. #ifdef CONFIG_QLCNIC_VXLAN
  871. #define QLC_83XX_ENCAP_TYPE_VXLAN BIT_1
  872. #define QLC_83XX_MATCH_ENCAP_ID BIT_2
  873. #define QLC_83XX_SET_VXLAN_UDP_DPORT BIT_3
  874. #define QLC_83XX_VXLAN_UDP_DPORT(PORT) ((PORT & 0xffff) << 16)
  875. #define QLCNIC_ENABLE_INGRESS_ENCAP_PARSING 1
  876. #define QLCNIC_DISABLE_INGRESS_ENCAP_PARSING 0
  877. static int qlcnic_set_vxlan_port(struct qlcnic_adapter *adapter)
  878. {
  879. u16 port = adapter->ahw->vxlan_port;
  880. struct qlcnic_cmd_args cmd;
  881. int ret = 0;
  882. memset(&cmd, 0, sizeof(cmd));
  883. ret = qlcnic_alloc_mbx_args(&cmd, adapter,
  884. QLCNIC_CMD_INIT_NIC_FUNC);
  885. if (ret)
  886. return ret;
  887. cmd.req.arg[1] = QLC_83XX_MULTI_TENANCY_INFO;
  888. cmd.req.arg[2] = QLC_83XX_ENCAP_TYPE_VXLAN |
  889. QLC_83XX_SET_VXLAN_UDP_DPORT |
  890. QLC_83XX_VXLAN_UDP_DPORT(port);
  891. ret = qlcnic_issue_cmd(adapter, &cmd);
  892. if (ret)
  893. netdev_err(adapter->netdev,
  894. "Failed to set VXLAN port %d in adapter\n",
  895. port);
  896. qlcnic_free_mbx_args(&cmd);
  897. return ret;
  898. }
  899. static int qlcnic_set_vxlan_parsing(struct qlcnic_adapter *adapter,
  900. bool state)
  901. {
  902. u16 vxlan_port = adapter->ahw->vxlan_port;
  903. struct qlcnic_cmd_args cmd;
  904. int ret = 0;
  905. memset(&cmd, 0, sizeof(cmd));
  906. ret = qlcnic_alloc_mbx_args(&cmd, adapter,
  907. QLCNIC_CMD_SET_INGRESS_ENCAP);
  908. if (ret)
  909. return ret;
  910. cmd.req.arg[1] = state ? QLCNIC_ENABLE_INGRESS_ENCAP_PARSING :
  911. QLCNIC_DISABLE_INGRESS_ENCAP_PARSING;
  912. ret = qlcnic_issue_cmd(adapter, &cmd);
  913. if (ret)
  914. netdev_err(adapter->netdev,
  915. "Failed to %s VXLAN parsing for port %d\n",
  916. state ? "enable" : "disable", vxlan_port);
  917. else
  918. netdev_info(adapter->netdev,
  919. "%s VXLAN parsing for port %d\n",
  920. state ? "Enabled" : "Disabled", vxlan_port);
  921. qlcnic_free_mbx_args(&cmd);
  922. return ret;
  923. }
  924. #endif
  925. static void qlcnic_83xx_periodic_tasks(struct qlcnic_adapter *adapter)
  926. {
  927. if (adapter->fhash.fnum)
  928. qlcnic_prune_lb_filters(adapter);
  929. #ifdef CONFIG_QLCNIC_VXLAN
  930. if (adapter->flags & QLCNIC_ADD_VXLAN_PORT) {
  931. if (qlcnic_set_vxlan_port(adapter))
  932. return;
  933. if (qlcnic_set_vxlan_parsing(adapter, true))
  934. return;
  935. adapter->flags &= ~QLCNIC_ADD_VXLAN_PORT;
  936. } else if (adapter->flags & QLCNIC_DEL_VXLAN_PORT) {
  937. if (qlcnic_set_vxlan_parsing(adapter, false))
  938. return;
  939. adapter->ahw->vxlan_port = 0;
  940. adapter->flags &= ~QLCNIC_DEL_VXLAN_PORT;
  941. }
  942. #endif
  943. }
  944. /**
  945. * qlcnic_83xx_idc_poll_dev_state
  946. *
  947. * @work: kernel work queue structure used to schedule the function
  948. *
  949. * Poll device state periodically and perform state specific
  950. * actions defined by Inter Driver Communication (IDC) protocol.
  951. *
  952. * Returns: None
  953. *
  954. **/
  955. void qlcnic_83xx_idc_poll_dev_state(struct work_struct *work)
  956. {
  957. struct qlcnic_adapter *adapter;
  958. u32 state;
  959. adapter = container_of(work, struct qlcnic_adapter, fw_work.work);
  960. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  961. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  962. qlcnic_83xx_idc_log_state_history(adapter);
  963. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  964. } else {
  965. adapter->ahw->idc.curr_state = state;
  966. }
  967. switch (adapter->ahw->idc.curr_state) {
  968. case QLC_83XX_IDC_DEV_READY:
  969. qlcnic_83xx_idc_ready_state(adapter);
  970. break;
  971. case QLC_83XX_IDC_DEV_NEED_RESET:
  972. qlcnic_83xx_idc_need_reset_state(adapter);
  973. break;
  974. case QLC_83XX_IDC_DEV_NEED_QUISCENT:
  975. qlcnic_83xx_idc_need_quiesce_state(adapter);
  976. break;
  977. case QLC_83XX_IDC_DEV_FAILED:
  978. qlcnic_83xx_idc_failed_state(adapter);
  979. return;
  980. case QLC_83XX_IDC_DEV_INIT:
  981. qlcnic_83xx_idc_init_state(adapter);
  982. break;
  983. case QLC_83XX_IDC_DEV_QUISCENT:
  984. qlcnic_83xx_idc_quiesce_state(adapter);
  985. break;
  986. default:
  987. qlcnic_83xx_idc_unknown_state(adapter);
  988. return;
  989. }
  990. adapter->ahw->idc.prev_state = adapter->ahw->idc.curr_state;
  991. qlcnic_83xx_periodic_tasks(adapter);
  992. /* Re-schedule the function */
  993. if (test_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status))
  994. qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state,
  995. adapter->ahw->idc.delay);
  996. }
  997. static void qlcnic_83xx_setup_idc_parameters(struct qlcnic_adapter *adapter)
  998. {
  999. u32 idc_params, val;
  1000. if (qlcnic_83xx_flash_read32(adapter, QLC_83XX_IDC_FLASH_PARAM_ADDR,
  1001. (u8 *)&idc_params, 1)) {
  1002. dev_info(&adapter->pdev->dev,
  1003. "%s:failed to get IDC params from flash\n", __func__);
  1004. adapter->dev_init_timeo = QLC_83XX_IDC_INIT_TIMEOUT_SECS;
  1005. adapter->reset_ack_timeo = QLC_83XX_IDC_RESET_TIMEOUT_SECS;
  1006. } else {
  1007. adapter->dev_init_timeo = idc_params & 0xFFFF;
  1008. adapter->reset_ack_timeo = ((idc_params >> 16) & 0xFFFF);
  1009. }
  1010. adapter->ahw->idc.curr_state = QLC_83XX_IDC_DEV_UNKNOWN;
  1011. adapter->ahw->idc.prev_state = QLC_83XX_IDC_DEV_UNKNOWN;
  1012. adapter->ahw->idc.delay = QLC_83XX_IDC_FW_POLL_DELAY;
  1013. adapter->ahw->idc.err_code = 0;
  1014. adapter->ahw->idc.collect_dump = 0;
  1015. adapter->ahw->idc.name = (char **)qlc_83xx_idc_states;
  1016. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  1017. set_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  1018. /* Check if reset recovery is disabled */
  1019. if (!qlcnic_auto_fw_reset) {
  1020. /* Propagate do not reset request to other functions */
  1021. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1022. val = val | QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  1023. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1024. }
  1025. }
  1026. static int
  1027. qlcnic_83xx_idc_first_to_load_function_handler(struct qlcnic_adapter *adapter)
  1028. {
  1029. u32 state, val;
  1030. if (qlcnic_83xx_lock_driver(adapter))
  1031. return -EIO;
  1032. /* Clear driver lock register */
  1033. QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, 0);
  1034. if (qlcnic_83xx_idc_update_major_version(adapter, 0)) {
  1035. qlcnic_83xx_unlock_driver(adapter);
  1036. return -EIO;
  1037. }
  1038. state = QLCRDX(adapter->ahw, QLC_83XX_IDC_DEV_STATE);
  1039. if (qlcnic_83xx_idc_check_state_validity(adapter, state)) {
  1040. qlcnic_83xx_unlock_driver(adapter);
  1041. return -EIO;
  1042. }
  1043. if (state != QLC_83XX_IDC_DEV_COLD && qlcnic_load_fw_file) {
  1044. QLCWRX(adapter->ahw, QLC_83XX_IDC_DEV_STATE,
  1045. QLC_83XX_IDC_DEV_COLD);
  1046. state = QLC_83XX_IDC_DEV_COLD;
  1047. }
  1048. adapter->ahw->idc.curr_state = state;
  1049. /* First to load function should cold boot the device */
  1050. if (state == QLC_83XX_IDC_DEV_COLD)
  1051. qlcnic_83xx_idc_cold_state_handler(adapter);
  1052. /* Check if reset recovery is enabled */
  1053. if (qlcnic_auto_fw_reset) {
  1054. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1055. val = val & ~QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY;
  1056. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1057. }
  1058. qlcnic_83xx_unlock_driver(adapter);
  1059. return 0;
  1060. }
  1061. int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter)
  1062. {
  1063. int ret = -EIO;
  1064. qlcnic_83xx_setup_idc_parameters(adapter);
  1065. if (qlcnic_83xx_get_reset_instruction_template(adapter))
  1066. return ret;
  1067. if (!qlcnic_83xx_idc_check_driver_presence_reg(adapter)) {
  1068. if (qlcnic_83xx_idc_first_to_load_function_handler(adapter))
  1069. return -EIO;
  1070. } else {
  1071. if (qlcnic_83xx_idc_check_major_version(adapter))
  1072. return -EIO;
  1073. }
  1074. qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
  1075. return 0;
  1076. }
  1077. void qlcnic_83xx_idc_exit(struct qlcnic_adapter *adapter)
  1078. {
  1079. int id;
  1080. u32 val;
  1081. while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
  1082. usleep_range(10000, 11000);
  1083. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  1084. id = id & 0xFF;
  1085. if (id == adapter->portnum) {
  1086. dev_err(&adapter->pdev->dev,
  1087. "%s: wait for lock recovery.. %d\n", __func__, id);
  1088. msleep(20);
  1089. id = QLCRDX(adapter->ahw, QLC_83XX_DRV_LOCK_ID);
  1090. id = id & 0xFF;
  1091. }
  1092. /* Clear driver presence bit */
  1093. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  1094. val = val & ~(1 << adapter->portnum);
  1095. QLCWRX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE, val);
  1096. clear_bit(QLC_83XX_MODULE_LOADED, &adapter->ahw->idc.status);
  1097. clear_bit(__QLCNIC_RESETTING, &adapter->state);
  1098. cancel_delayed_work_sync(&adapter->fw_work);
  1099. }
  1100. void qlcnic_83xx_idc_request_reset(struct qlcnic_adapter *adapter, u32 key)
  1101. {
  1102. u32 val;
  1103. if (qlcnic_sriov_vf_check(adapter))
  1104. return;
  1105. if (qlcnic_83xx_lock_driver(adapter)) {
  1106. dev_err(&adapter->pdev->dev,
  1107. "%s:failed, please retry\n", __func__);
  1108. return;
  1109. }
  1110. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1111. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  1112. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  1113. __func__);
  1114. qlcnic_83xx_idc_enter_failed_state(adapter, 0);
  1115. qlcnic_83xx_unlock_driver(adapter);
  1116. return;
  1117. }
  1118. if (key == QLCNIC_FORCE_FW_RESET) {
  1119. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1120. val = val | QLC_83XX_IDC_GRACEFULL_RESET;
  1121. QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val);
  1122. } else if (key == QLCNIC_FORCE_FW_DUMP_KEY) {
  1123. adapter->ahw->idc.collect_dump = 1;
  1124. }
  1125. qlcnic_83xx_unlock_driver(adapter);
  1126. return;
  1127. }
  1128. static int qlcnic_83xx_copy_bootloader(struct qlcnic_adapter *adapter)
  1129. {
  1130. u8 *p_cache;
  1131. u32 src, size;
  1132. u64 dest;
  1133. int ret = -EIO;
  1134. src = QLC_83XX_BOOTLOADER_FLASH_ADDR;
  1135. dest = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_ADDR);
  1136. size = QLCRDX(adapter->ahw, QLCNIC_BOOTLOADER_SIZE);
  1137. /* alignment check */
  1138. if (size & 0xF)
  1139. size = (size + 16) & ~0xF;
  1140. p_cache = vzalloc(size);
  1141. if (p_cache == NULL)
  1142. return -ENOMEM;
  1143. ret = qlcnic_83xx_lockless_flash_read32(adapter, src, p_cache,
  1144. size / sizeof(u32));
  1145. if (ret) {
  1146. vfree(p_cache);
  1147. return ret;
  1148. }
  1149. /* 16 byte write to MS memory */
  1150. ret = qlcnic_ms_mem_write128(adapter, dest, (u32 *)p_cache,
  1151. size / 16);
  1152. if (ret) {
  1153. vfree(p_cache);
  1154. return ret;
  1155. }
  1156. vfree(p_cache);
  1157. return ret;
  1158. }
  1159. static int qlcnic_83xx_copy_fw_file(struct qlcnic_adapter *adapter)
  1160. {
  1161. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1162. const struct firmware *fw = fw_info->fw;
  1163. u32 dest, *p_cache, *temp;
  1164. int i, ret = -EIO;
  1165. __le32 *temp_le;
  1166. u8 data[16];
  1167. size_t size;
  1168. u64 addr;
  1169. temp = vzalloc(fw->size);
  1170. if (!temp) {
  1171. release_firmware(fw);
  1172. fw_info->fw = NULL;
  1173. return -ENOMEM;
  1174. }
  1175. temp_le = (__le32 *)fw->data;
  1176. /* FW image in file is in little endian, swap the data to nullify
  1177. * the effect of writel() operation on big endian platform.
  1178. */
  1179. for (i = 0; i < fw->size / sizeof(u32); i++)
  1180. temp[i] = __le32_to_cpu(temp_le[i]);
  1181. dest = QLCRDX(adapter->ahw, QLCNIC_FW_IMAGE_ADDR);
  1182. size = (fw->size & ~0xF);
  1183. p_cache = temp;
  1184. addr = (u64)dest;
  1185. ret = qlcnic_ms_mem_write128(adapter, addr,
  1186. p_cache, size / 16);
  1187. if (ret) {
  1188. dev_err(&adapter->pdev->dev, "MS memory write failed\n");
  1189. goto exit;
  1190. }
  1191. /* alignment check */
  1192. if (fw->size & 0xF) {
  1193. addr = dest + size;
  1194. for (i = 0; i < (fw->size & 0xF); i++)
  1195. data[i] = ((u8 *)temp)[size + i];
  1196. for (; i < 16; i++)
  1197. data[i] = 0;
  1198. ret = qlcnic_ms_mem_write128(adapter, addr,
  1199. (u32 *)data, 1);
  1200. if (ret) {
  1201. dev_err(&adapter->pdev->dev,
  1202. "MS memory write failed\n");
  1203. goto exit;
  1204. }
  1205. }
  1206. exit:
  1207. release_firmware(fw);
  1208. fw_info->fw = NULL;
  1209. vfree(temp);
  1210. return ret;
  1211. }
  1212. static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
  1213. {
  1214. int i, j;
  1215. u32 val = 0, val1 = 0, reg = 0;
  1216. int err = 0;
  1217. val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
  1218. if (err == -EIO)
  1219. return;
  1220. dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
  1221. for (j = 0; j < 2; j++) {
  1222. if (j == 0) {
  1223. dev_info(&adapter->pdev->dev,
  1224. "Port 0 RxB Pause Threshold Regs[TC7..TC0]:");
  1225. reg = QLC_83XX_PORT0_THRESHOLD;
  1226. } else if (j == 1) {
  1227. dev_info(&adapter->pdev->dev,
  1228. "Port 1 RxB Pause Threshold Regs[TC7..TC0]:");
  1229. reg = QLC_83XX_PORT1_THRESHOLD;
  1230. }
  1231. for (i = 0; i < 8; i++) {
  1232. val = QLCRD32(adapter, reg + (i * 0x4), &err);
  1233. if (err == -EIO)
  1234. return;
  1235. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1236. }
  1237. dev_info(&adapter->pdev->dev, "\n");
  1238. }
  1239. for (j = 0; j < 2; j++) {
  1240. if (j == 0) {
  1241. dev_info(&adapter->pdev->dev,
  1242. "Port 0 RxB TC Max Cell Registers[4..1]:");
  1243. reg = QLC_83XX_PORT0_TC_MC_REG;
  1244. } else if (j == 1) {
  1245. dev_info(&adapter->pdev->dev,
  1246. "Port 1 RxB TC Max Cell Registers[4..1]:");
  1247. reg = QLC_83XX_PORT1_TC_MC_REG;
  1248. }
  1249. for (i = 0; i < 4; i++) {
  1250. val = QLCRD32(adapter, reg + (i * 0x4), &err);
  1251. if (err == -EIO)
  1252. return;
  1253. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1254. }
  1255. dev_info(&adapter->pdev->dev, "\n");
  1256. }
  1257. for (j = 0; j < 2; j++) {
  1258. if (j == 0) {
  1259. dev_info(&adapter->pdev->dev,
  1260. "Port 0 RxB Rx TC Stats[TC7..TC0]:");
  1261. reg = QLC_83XX_PORT0_TC_STATS;
  1262. } else if (j == 1) {
  1263. dev_info(&adapter->pdev->dev,
  1264. "Port 1 RxB Rx TC Stats[TC7..TC0]:");
  1265. reg = QLC_83XX_PORT1_TC_STATS;
  1266. }
  1267. for (i = 7; i >= 0; i--) {
  1268. val = QLCRD32(adapter, reg, &err);
  1269. if (err == -EIO)
  1270. return;
  1271. val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
  1272. QLCWR32(adapter, reg, (val | (i << 29)));
  1273. val = QLCRD32(adapter, reg, &err);
  1274. if (err == -EIO)
  1275. return;
  1276. dev_info(&adapter->pdev->dev, "0x%x ", val);
  1277. }
  1278. dev_info(&adapter->pdev->dev, "\n");
  1279. }
  1280. val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
  1281. if (err == -EIO)
  1282. return;
  1283. val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
  1284. if (err == -EIO)
  1285. return;
  1286. dev_info(&adapter->pdev->dev,
  1287. "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
  1288. val, val1);
  1289. }
  1290. static void qlcnic_83xx_disable_pause_frames(struct qlcnic_adapter *adapter)
  1291. {
  1292. u32 reg = 0, i, j;
  1293. if (qlcnic_83xx_lock_driver(adapter)) {
  1294. dev_err(&adapter->pdev->dev,
  1295. "%s:failed to acquire driver lock\n", __func__);
  1296. return;
  1297. }
  1298. qlcnic_83xx_dump_pause_control_regs(adapter);
  1299. QLCWR32(adapter, QLC_83XX_SRE_SHIM_REG, 0x0);
  1300. for (j = 0; j < 2; j++) {
  1301. if (j == 0)
  1302. reg = QLC_83XX_PORT0_THRESHOLD;
  1303. else if (j == 1)
  1304. reg = QLC_83XX_PORT1_THRESHOLD;
  1305. for (i = 0; i < 8; i++)
  1306. QLCWR32(adapter, reg + (i * 0x4), 0x0);
  1307. }
  1308. for (j = 0; j < 2; j++) {
  1309. if (j == 0)
  1310. reg = QLC_83XX_PORT0_TC_MC_REG;
  1311. else if (j == 1)
  1312. reg = QLC_83XX_PORT1_TC_MC_REG;
  1313. for (i = 0; i < 4; i++)
  1314. QLCWR32(adapter, reg + (i * 0x4), 0x03FF03FF);
  1315. }
  1316. QLCWR32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, 0);
  1317. QLCWR32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, 0);
  1318. dev_info(&adapter->pdev->dev,
  1319. "Disabled pause frames successfully on all ports\n");
  1320. qlcnic_83xx_unlock_driver(adapter);
  1321. }
  1322. static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
  1323. {
  1324. QLCWR32(adapter, QLC_83XX_RESET_REG, 0);
  1325. QLCWR32(adapter, QLC_83XX_RESET_PORT0, 0);
  1326. QLCWR32(adapter, QLC_83XX_RESET_PORT1, 0);
  1327. QLCWR32(adapter, QLC_83XX_RESET_PORT2, 0);
  1328. QLCWR32(adapter, QLC_83XX_RESET_PORT3, 0);
  1329. QLCWR32(adapter, QLC_83XX_RESET_SRESHIM, 0);
  1330. QLCWR32(adapter, QLC_83XX_RESET_EPGSHIM, 0);
  1331. QLCWR32(adapter, QLC_83XX_RESET_ETHERPCS, 0);
  1332. QLCWR32(adapter, QLC_83XX_RESET_CONTROL, 1);
  1333. }
  1334. static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
  1335. {
  1336. u32 heartbeat, peg_status;
  1337. int retries, ret = -EIO, err = 0;
  1338. retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
  1339. p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1340. QLCNIC_PEG_ALIVE_COUNTER);
  1341. do {
  1342. msleep(QLCNIC_HEARTBEAT_PERIOD_MSECS);
  1343. heartbeat = QLC_SHARED_REG_RD32(p_dev,
  1344. QLCNIC_PEG_ALIVE_COUNTER);
  1345. if (heartbeat != p_dev->heartbeat) {
  1346. ret = QLCNIC_RCODE_SUCCESS;
  1347. break;
  1348. }
  1349. } while (--retries);
  1350. if (ret) {
  1351. dev_err(&p_dev->pdev->dev, "firmware hang detected\n");
  1352. qlcnic_83xx_take_eport_out_of_reset(p_dev);
  1353. qlcnic_83xx_disable_pause_frames(p_dev);
  1354. peg_status = QLC_SHARED_REG_RD32(p_dev,
  1355. QLCNIC_PEG_HALT_STATUS1);
  1356. dev_info(&p_dev->pdev->dev, "Dumping HW/FW registers\n"
  1357. "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
  1358. "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
  1359. "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
  1360. "PEG_NET_4_PC: 0x%x\n", peg_status,
  1361. QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
  1362. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
  1363. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
  1364. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
  1365. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
  1366. QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
  1367. if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
  1368. dev_err(&p_dev->pdev->dev,
  1369. "Device is being reset err code 0x00006700.\n");
  1370. }
  1371. return ret;
  1372. }
  1373. static int qlcnic_83xx_check_cmd_peg_status(struct qlcnic_adapter *p_dev)
  1374. {
  1375. int retries = QLCNIC_CMDPEG_CHECK_RETRY_COUNT;
  1376. u32 val;
  1377. do {
  1378. val = QLC_SHARED_REG_RD32(p_dev, QLCNIC_CMDPEG_STATE);
  1379. if (val == QLC_83XX_CMDPEG_COMPLETE)
  1380. return 0;
  1381. msleep(QLCNIC_CMDPEG_CHECK_DELAY);
  1382. } while (--retries);
  1383. dev_err(&p_dev->pdev->dev, "%s: failed, state = 0x%x\n", __func__, val);
  1384. return -EIO;
  1385. }
  1386. static int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
  1387. {
  1388. int err;
  1389. err = qlcnic_83xx_check_cmd_peg_status(p_dev);
  1390. if (err)
  1391. return err;
  1392. err = qlcnic_83xx_check_heartbeat(p_dev);
  1393. if (err)
  1394. return err;
  1395. return err;
  1396. }
  1397. static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
  1398. int duration, u32 mask, u32 status)
  1399. {
  1400. int timeout_error, err = 0;
  1401. u32 value;
  1402. u8 retries;
  1403. value = QLCRD32(p_dev, addr, &err);
  1404. if (err == -EIO)
  1405. return err;
  1406. retries = duration / 10;
  1407. do {
  1408. if ((value & mask) != status) {
  1409. timeout_error = 1;
  1410. msleep(duration / 10);
  1411. value = QLCRD32(p_dev, addr, &err);
  1412. if (err == -EIO)
  1413. return err;
  1414. } else {
  1415. timeout_error = 0;
  1416. break;
  1417. }
  1418. } while (retries--);
  1419. if (timeout_error) {
  1420. p_dev->ahw->reset.seq_error++;
  1421. dev_err(&p_dev->pdev->dev,
  1422. "%s: Timeout Err, entry_num = %d\n",
  1423. __func__, p_dev->ahw->reset.seq_index);
  1424. dev_err(&p_dev->pdev->dev,
  1425. "0x%08x 0x%08x 0x%08x\n",
  1426. value, mask, status);
  1427. }
  1428. return timeout_error;
  1429. }
  1430. static int qlcnic_83xx_reset_template_checksum(struct qlcnic_adapter *p_dev)
  1431. {
  1432. u32 sum = 0;
  1433. u16 *buff = (u16 *)p_dev->ahw->reset.buff;
  1434. int count = p_dev->ahw->reset.hdr->size / sizeof(u16);
  1435. while (count-- > 0)
  1436. sum += *buff++;
  1437. while (sum >> 16)
  1438. sum = (sum & 0xFFFF) + (sum >> 16);
  1439. if (~sum) {
  1440. return 0;
  1441. } else {
  1442. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1443. return -1;
  1444. }
  1445. }
  1446. static int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
  1447. {
  1448. struct qlcnic_hardware_context *ahw = p_dev->ahw;
  1449. u32 addr, count, prev_ver, curr_ver;
  1450. u8 *p_buff;
  1451. if (ahw->reset.buff != NULL) {
  1452. prev_ver = p_dev->fw_version;
  1453. curr_ver = qlcnic_83xx_get_fw_version(p_dev);
  1454. if (curr_ver > prev_ver)
  1455. kfree(ahw->reset.buff);
  1456. else
  1457. return 0;
  1458. }
  1459. ahw->reset.seq_error = 0;
  1460. ahw->reset.buff = kzalloc(QLC_83XX_RESTART_TEMPLATE_SIZE, GFP_KERNEL);
  1461. if (p_dev->ahw->reset.buff == NULL)
  1462. return -ENOMEM;
  1463. p_buff = p_dev->ahw->reset.buff;
  1464. addr = QLC_83XX_RESET_TEMPLATE_ADDR;
  1465. count = sizeof(struct qlc_83xx_reset_hdr) / sizeof(u32);
  1466. /* Copy template header from flash */
  1467. if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
  1468. dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
  1469. return -EIO;
  1470. }
  1471. ahw->reset.hdr = (struct qlc_83xx_reset_hdr *)ahw->reset.buff;
  1472. addr = QLC_83XX_RESET_TEMPLATE_ADDR + ahw->reset.hdr->hdr_size;
  1473. p_buff = ahw->reset.buff + ahw->reset.hdr->hdr_size;
  1474. count = (ahw->reset.hdr->size - ahw->reset.hdr->hdr_size) / sizeof(u32);
  1475. /* Copy rest of the template */
  1476. if (qlcnic_83xx_flash_read32(p_dev, addr, p_buff, count)) {
  1477. dev_err(&p_dev->pdev->dev, "%s: flash read failed\n", __func__);
  1478. return -EIO;
  1479. }
  1480. if (qlcnic_83xx_reset_template_checksum(p_dev))
  1481. return -EIO;
  1482. /* Get Stop, Start and Init command offsets */
  1483. ahw->reset.init_offset = ahw->reset.buff + ahw->reset.hdr->init_offset;
  1484. ahw->reset.start_offset = ahw->reset.buff +
  1485. ahw->reset.hdr->start_offset;
  1486. ahw->reset.stop_offset = ahw->reset.buff + ahw->reset.hdr->hdr_size;
  1487. return 0;
  1488. }
  1489. /* Read Write HW register command */
  1490. static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
  1491. u32 raddr, u32 waddr)
  1492. {
  1493. int err = 0;
  1494. u32 value;
  1495. value = QLCRD32(p_dev, raddr, &err);
  1496. if (err == -EIO)
  1497. return;
  1498. qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
  1499. }
  1500. /* Read Modify Write HW register command */
  1501. static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
  1502. u32 raddr, u32 waddr,
  1503. struct qlc_83xx_rmw *p_rmw_hdr)
  1504. {
  1505. int err = 0;
  1506. u32 value;
  1507. if (p_rmw_hdr->index_a) {
  1508. value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
  1509. } else {
  1510. value = QLCRD32(p_dev, raddr, &err);
  1511. if (err == -EIO)
  1512. return;
  1513. }
  1514. value &= p_rmw_hdr->mask;
  1515. value <<= p_rmw_hdr->shl;
  1516. value >>= p_rmw_hdr->shr;
  1517. value |= p_rmw_hdr->or_value;
  1518. value ^= p_rmw_hdr->xor_value;
  1519. qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
  1520. }
  1521. /* Write HW register command */
  1522. static void qlcnic_83xx_write_list(struct qlcnic_adapter *p_dev,
  1523. struct qlc_83xx_entry_hdr *p_hdr)
  1524. {
  1525. int i;
  1526. struct qlc_83xx_entry *entry;
  1527. entry = (struct qlc_83xx_entry *)((char *)p_hdr +
  1528. sizeof(struct qlc_83xx_entry_hdr));
  1529. for (i = 0; i < p_hdr->count; i++, entry++) {
  1530. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->arg1,
  1531. entry->arg2);
  1532. if (p_hdr->delay)
  1533. udelay((u32)(p_hdr->delay));
  1534. }
  1535. }
  1536. /* Read and Write instruction */
  1537. static void qlcnic_83xx_read_write_list(struct qlcnic_adapter *p_dev,
  1538. struct qlc_83xx_entry_hdr *p_hdr)
  1539. {
  1540. int i;
  1541. struct qlc_83xx_entry *entry;
  1542. entry = (struct qlc_83xx_entry *)((char *)p_hdr +
  1543. sizeof(struct qlc_83xx_entry_hdr));
  1544. for (i = 0; i < p_hdr->count; i++, entry++) {
  1545. qlcnic_83xx_read_write_crb_reg(p_dev, entry->arg1,
  1546. entry->arg2);
  1547. if (p_hdr->delay)
  1548. udelay((u32)(p_hdr->delay));
  1549. }
  1550. }
  1551. /* Poll HW register command */
  1552. static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
  1553. struct qlc_83xx_entry_hdr *p_hdr)
  1554. {
  1555. long delay;
  1556. struct qlc_83xx_entry *entry;
  1557. struct qlc_83xx_poll *poll;
  1558. int i, err = 0;
  1559. unsigned long arg1, arg2;
  1560. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1561. sizeof(struct qlc_83xx_entry_hdr));
  1562. entry = (struct qlc_83xx_entry *)((char *)poll +
  1563. sizeof(struct qlc_83xx_poll));
  1564. delay = (long)p_hdr->delay;
  1565. if (!delay) {
  1566. for (i = 0; i < p_hdr->count; i++, entry++)
  1567. qlcnic_83xx_poll_reg(p_dev, entry->arg1,
  1568. delay, poll->mask,
  1569. poll->status);
  1570. } else {
  1571. for (i = 0; i < p_hdr->count; i++, entry++) {
  1572. arg1 = entry->arg1;
  1573. arg2 = entry->arg2;
  1574. if (delay) {
  1575. if (qlcnic_83xx_poll_reg(p_dev,
  1576. arg1, delay,
  1577. poll->mask,
  1578. poll->status)){
  1579. QLCRD32(p_dev, arg1, &err);
  1580. if (err == -EIO)
  1581. return;
  1582. QLCRD32(p_dev, arg2, &err);
  1583. if (err == -EIO)
  1584. return;
  1585. }
  1586. }
  1587. }
  1588. }
  1589. }
  1590. /* Poll and write HW register command */
  1591. static void qlcnic_83xx_poll_write_list(struct qlcnic_adapter *p_dev,
  1592. struct qlc_83xx_entry_hdr *p_hdr)
  1593. {
  1594. int i;
  1595. long delay;
  1596. struct qlc_83xx_quad_entry *entry;
  1597. struct qlc_83xx_poll *poll;
  1598. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1599. sizeof(struct qlc_83xx_entry_hdr));
  1600. entry = (struct qlc_83xx_quad_entry *)((char *)poll +
  1601. sizeof(struct qlc_83xx_poll));
  1602. delay = (long)p_hdr->delay;
  1603. for (i = 0; i < p_hdr->count; i++, entry++) {
  1604. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->dr_addr,
  1605. entry->dr_value);
  1606. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
  1607. entry->ar_value);
  1608. if (delay)
  1609. qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
  1610. poll->mask, poll->status);
  1611. }
  1612. }
  1613. /* Read Modify Write register command */
  1614. static void qlcnic_83xx_read_modify_write(struct qlcnic_adapter *p_dev,
  1615. struct qlc_83xx_entry_hdr *p_hdr)
  1616. {
  1617. int i;
  1618. struct qlc_83xx_entry *entry;
  1619. struct qlc_83xx_rmw *rmw_hdr;
  1620. rmw_hdr = (struct qlc_83xx_rmw *)((char *)p_hdr +
  1621. sizeof(struct qlc_83xx_entry_hdr));
  1622. entry = (struct qlc_83xx_entry *)((char *)rmw_hdr +
  1623. sizeof(struct qlc_83xx_rmw));
  1624. for (i = 0; i < p_hdr->count; i++, entry++) {
  1625. qlcnic_83xx_rmw_crb_reg(p_dev, entry->arg1,
  1626. entry->arg2, rmw_hdr);
  1627. if (p_hdr->delay)
  1628. udelay((u32)(p_hdr->delay));
  1629. }
  1630. }
  1631. static void qlcnic_83xx_pause(struct qlc_83xx_entry_hdr *p_hdr)
  1632. {
  1633. if (p_hdr->delay)
  1634. mdelay((u32)((long)p_hdr->delay));
  1635. }
  1636. /* Read and poll register command */
  1637. static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
  1638. struct qlc_83xx_entry_hdr *p_hdr)
  1639. {
  1640. long delay;
  1641. int index, i, j, err;
  1642. struct qlc_83xx_quad_entry *entry;
  1643. struct qlc_83xx_poll *poll;
  1644. unsigned long addr;
  1645. poll = (struct qlc_83xx_poll *)((char *)p_hdr +
  1646. sizeof(struct qlc_83xx_entry_hdr));
  1647. entry = (struct qlc_83xx_quad_entry *)((char *)poll +
  1648. sizeof(struct qlc_83xx_poll));
  1649. delay = (long)p_hdr->delay;
  1650. for (i = 0; i < p_hdr->count; i++, entry++) {
  1651. qlcnic_83xx_wrt_reg_indirect(p_dev, entry->ar_addr,
  1652. entry->ar_value);
  1653. if (delay) {
  1654. if (!qlcnic_83xx_poll_reg(p_dev, entry->ar_addr, delay,
  1655. poll->mask, poll->status)){
  1656. index = p_dev->ahw->reset.array_index;
  1657. addr = entry->dr_addr;
  1658. j = QLCRD32(p_dev, addr, &err);
  1659. if (err == -EIO)
  1660. return;
  1661. p_dev->ahw->reset.array[index++] = j;
  1662. if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
  1663. p_dev->ahw->reset.array_index = 1;
  1664. }
  1665. }
  1666. }
  1667. }
  1668. static inline void qlcnic_83xx_seq_end(struct qlcnic_adapter *p_dev)
  1669. {
  1670. p_dev->ahw->reset.seq_end = 1;
  1671. }
  1672. static void qlcnic_83xx_template_end(struct qlcnic_adapter *p_dev)
  1673. {
  1674. p_dev->ahw->reset.template_end = 1;
  1675. if (p_dev->ahw->reset.seq_error == 0)
  1676. dev_err(&p_dev->pdev->dev,
  1677. "HW restart process completed successfully.\n");
  1678. else
  1679. dev_err(&p_dev->pdev->dev,
  1680. "HW restart completed with timeout errors.\n");
  1681. }
  1682. /**
  1683. * qlcnic_83xx_exec_template_cmd
  1684. *
  1685. * @p_dev: adapter structure
  1686. * @p_buff: Poiter to instruction template
  1687. *
  1688. * Template provides instructions to stop, restart and initalize firmware.
  1689. * These instructions are abstracted as a series of read, write and
  1690. * poll operations on hardware registers. Register information and operation
  1691. * specifics are not exposed to the driver. Driver reads the template from
  1692. * flash and executes the instructions located at pre-defined offsets.
  1693. *
  1694. * Returns: None
  1695. * */
  1696. static void qlcnic_83xx_exec_template_cmd(struct qlcnic_adapter *p_dev,
  1697. char *p_buff)
  1698. {
  1699. int index, entries;
  1700. struct qlc_83xx_entry_hdr *p_hdr;
  1701. char *entry = p_buff;
  1702. p_dev->ahw->reset.seq_end = 0;
  1703. p_dev->ahw->reset.template_end = 0;
  1704. entries = p_dev->ahw->reset.hdr->entries;
  1705. index = p_dev->ahw->reset.seq_index;
  1706. for (; (!p_dev->ahw->reset.seq_end) && (index < entries); index++) {
  1707. p_hdr = (struct qlc_83xx_entry_hdr *)entry;
  1708. switch (p_hdr->cmd) {
  1709. case QLC_83XX_OPCODE_NOP:
  1710. break;
  1711. case QLC_83XX_OPCODE_WRITE_LIST:
  1712. qlcnic_83xx_write_list(p_dev, p_hdr);
  1713. break;
  1714. case QLC_83XX_OPCODE_READ_WRITE_LIST:
  1715. qlcnic_83xx_read_write_list(p_dev, p_hdr);
  1716. break;
  1717. case QLC_83XX_OPCODE_POLL_LIST:
  1718. qlcnic_83xx_poll_list(p_dev, p_hdr);
  1719. break;
  1720. case QLC_83XX_OPCODE_POLL_WRITE_LIST:
  1721. qlcnic_83xx_poll_write_list(p_dev, p_hdr);
  1722. break;
  1723. case QLC_83XX_OPCODE_READ_MODIFY_WRITE:
  1724. qlcnic_83xx_read_modify_write(p_dev, p_hdr);
  1725. break;
  1726. case QLC_83XX_OPCODE_SEQ_PAUSE:
  1727. qlcnic_83xx_pause(p_hdr);
  1728. break;
  1729. case QLC_83XX_OPCODE_SEQ_END:
  1730. qlcnic_83xx_seq_end(p_dev);
  1731. break;
  1732. case QLC_83XX_OPCODE_TMPL_END:
  1733. qlcnic_83xx_template_end(p_dev);
  1734. break;
  1735. case QLC_83XX_OPCODE_POLL_READ_LIST:
  1736. qlcnic_83xx_poll_read_list(p_dev, p_hdr);
  1737. break;
  1738. default:
  1739. dev_err(&p_dev->pdev->dev,
  1740. "%s: Unknown opcode 0x%04x in template %d\n",
  1741. __func__, p_hdr->cmd, index);
  1742. break;
  1743. }
  1744. entry += p_hdr->size;
  1745. }
  1746. p_dev->ahw->reset.seq_index = index;
  1747. }
  1748. static void qlcnic_83xx_stop_hw(struct qlcnic_adapter *p_dev)
  1749. {
  1750. p_dev->ahw->reset.seq_index = 0;
  1751. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.stop_offset);
  1752. if (p_dev->ahw->reset.seq_end != 1)
  1753. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1754. }
  1755. static void qlcnic_83xx_start_hw(struct qlcnic_adapter *p_dev)
  1756. {
  1757. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.start_offset);
  1758. if (p_dev->ahw->reset.template_end != 1)
  1759. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1760. }
  1761. static void qlcnic_83xx_init_hw(struct qlcnic_adapter *p_dev)
  1762. {
  1763. qlcnic_83xx_exec_template_cmd(p_dev, p_dev->ahw->reset.init_offset);
  1764. if (p_dev->ahw->reset.seq_end != 1)
  1765. dev_err(&p_dev->pdev->dev, "%s: failed\n", __func__);
  1766. }
  1767. /* POST FW related definations*/
  1768. #define QLC_83XX_POST_SIGNATURE_REG 0x41602014
  1769. #define QLC_83XX_POST_MODE_REG 0x41602018
  1770. #define QLC_83XX_POST_FAST_MODE 0
  1771. #define QLC_83XX_POST_MEDIUM_MODE 1
  1772. #define QLC_83XX_POST_SLOW_MODE 2
  1773. /* POST Timeout values in milliseconds */
  1774. #define QLC_83XX_POST_FAST_MODE_TIMEOUT 690
  1775. #define QLC_83XX_POST_MED_MODE_TIMEOUT 2930
  1776. #define QLC_83XX_POST_SLOW_MODE_TIMEOUT 7500
  1777. /* POST result values */
  1778. #define QLC_83XX_POST_PASS 0xfffffff0
  1779. #define QLC_83XX_POST_ASIC_STRESS_TEST_FAIL 0xffffffff
  1780. #define QLC_83XX_POST_DDR_TEST_FAIL 0xfffffffe
  1781. #define QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL 0xfffffffc
  1782. #define QLC_83XX_POST_FLASH_TEST_FAIL 0xfffffff8
  1783. static int qlcnic_83xx_run_post(struct qlcnic_adapter *adapter)
  1784. {
  1785. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1786. struct device *dev = &adapter->pdev->dev;
  1787. int timeout, count, ret = 0;
  1788. u32 signature;
  1789. /* Set timeout values with extra 2 seconds of buffer */
  1790. switch (adapter->ahw->post_mode) {
  1791. case QLC_83XX_POST_FAST_MODE:
  1792. timeout = QLC_83XX_POST_FAST_MODE_TIMEOUT + 2000;
  1793. break;
  1794. case QLC_83XX_POST_MEDIUM_MODE:
  1795. timeout = QLC_83XX_POST_MED_MODE_TIMEOUT + 2000;
  1796. break;
  1797. case QLC_83XX_POST_SLOW_MODE:
  1798. timeout = QLC_83XX_POST_SLOW_MODE_TIMEOUT + 2000;
  1799. break;
  1800. default:
  1801. return -EINVAL;
  1802. }
  1803. strncpy(fw_info->fw_file_name, QLC_83XX_POST_FW_FILE_NAME,
  1804. QLC_FW_FILE_NAME_LEN);
  1805. ret = request_firmware(&fw_info->fw, fw_info->fw_file_name, dev);
  1806. if (ret) {
  1807. dev_err(dev, "POST firmware can not be loaded, skipping POST\n");
  1808. return 0;
  1809. }
  1810. ret = qlcnic_83xx_copy_fw_file(adapter);
  1811. if (ret)
  1812. return ret;
  1813. /* clear QLC_83XX_POST_SIGNATURE_REG register */
  1814. qlcnic_ind_wr(adapter, QLC_83XX_POST_SIGNATURE_REG, 0);
  1815. /* Set POST mode */
  1816. qlcnic_ind_wr(adapter, QLC_83XX_POST_MODE_REG,
  1817. adapter->ahw->post_mode);
  1818. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1819. QLC_83XX_BOOT_FROM_FILE);
  1820. qlcnic_83xx_start_hw(adapter);
  1821. count = 0;
  1822. do {
  1823. msleep(100);
  1824. count += 100;
  1825. signature = qlcnic_ind_rd(adapter, QLC_83XX_POST_SIGNATURE_REG);
  1826. if (signature == QLC_83XX_POST_PASS)
  1827. break;
  1828. } while (timeout > count);
  1829. if (timeout <= count) {
  1830. dev_err(dev, "POST timed out, signature = 0x%08x\n", signature);
  1831. return -EIO;
  1832. }
  1833. switch (signature) {
  1834. case QLC_83XX_POST_PASS:
  1835. dev_info(dev, "POST passed, Signature = 0x%08x\n", signature);
  1836. break;
  1837. case QLC_83XX_POST_ASIC_STRESS_TEST_FAIL:
  1838. dev_err(dev, "POST failed, Test case : ASIC STRESS TEST, Signature = 0x%08x\n",
  1839. signature);
  1840. ret = -EIO;
  1841. break;
  1842. case QLC_83XX_POST_DDR_TEST_FAIL:
  1843. dev_err(dev, "POST failed, Test case : DDT TEST, Signature = 0x%08x\n",
  1844. signature);
  1845. ret = -EIO;
  1846. break;
  1847. case QLC_83XX_POST_ASIC_MEMORY_TEST_FAIL:
  1848. dev_err(dev, "POST failed, Test case : ASIC MEMORY TEST, Signature = 0x%08x\n",
  1849. signature);
  1850. ret = -EIO;
  1851. break;
  1852. case QLC_83XX_POST_FLASH_TEST_FAIL:
  1853. dev_err(dev, "POST failed, Test case : FLASH TEST, Signature = 0x%08x\n",
  1854. signature);
  1855. ret = -EIO;
  1856. break;
  1857. default:
  1858. dev_err(dev, "POST failed, Test case : INVALID, Signature = 0x%08x\n",
  1859. signature);
  1860. ret = -EIO;
  1861. break;
  1862. }
  1863. return ret;
  1864. }
  1865. static int qlcnic_83xx_load_fw_image_from_host(struct qlcnic_adapter *adapter)
  1866. {
  1867. struct qlc_83xx_fw_info *fw_info = adapter->ahw->fw_info;
  1868. int err = -EIO;
  1869. if (request_firmware(&fw_info->fw, fw_info->fw_file_name,
  1870. &(adapter->pdev->dev))) {
  1871. dev_err(&adapter->pdev->dev,
  1872. "No file FW image, loading flash FW image.\n");
  1873. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1874. QLC_83XX_BOOT_FROM_FLASH);
  1875. } else {
  1876. if (qlcnic_83xx_copy_fw_file(adapter))
  1877. return err;
  1878. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1879. QLC_83XX_BOOT_FROM_FILE);
  1880. }
  1881. return 0;
  1882. }
  1883. static int qlcnic_83xx_restart_hw(struct qlcnic_adapter *adapter)
  1884. {
  1885. u32 val;
  1886. int err = -EIO;
  1887. qlcnic_83xx_stop_hw(adapter);
  1888. /* Collect FW register dump if required */
  1889. val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL);
  1890. if (!(val & QLC_83XX_IDC_GRACEFULL_RESET))
  1891. qlcnic_dump_fw(adapter);
  1892. if (val & QLC_83XX_IDC_DISABLE_FW_RESET_RECOVERY) {
  1893. netdev_info(adapter->netdev, "%s: Auto firmware recovery is disabled\n",
  1894. __func__);
  1895. qlcnic_83xx_idc_enter_failed_state(adapter, 1);
  1896. return err;
  1897. }
  1898. qlcnic_83xx_init_hw(adapter);
  1899. if (qlcnic_83xx_copy_bootloader(adapter))
  1900. return err;
  1901. /* Check if POST needs to be run */
  1902. if (adapter->ahw->run_post) {
  1903. err = qlcnic_83xx_run_post(adapter);
  1904. if (err)
  1905. return err;
  1906. /* No need to run POST in next reset sequence */
  1907. adapter->ahw->run_post = false;
  1908. /* Again reset the adapter to load regular firmware */
  1909. qlcnic_83xx_stop_hw(adapter);
  1910. qlcnic_83xx_init_hw(adapter);
  1911. err = qlcnic_83xx_copy_bootloader(adapter);
  1912. if (err)
  1913. return err;
  1914. }
  1915. /* Boot either flash image or firmware image from host file system */
  1916. if (qlcnic_load_fw_file == 1) {
  1917. if (qlcnic_83xx_load_fw_image_from_host(adapter))
  1918. return err;
  1919. } else {
  1920. QLC_SHARED_REG_WR32(adapter, QLCNIC_FW_IMG_VALID,
  1921. QLC_83XX_BOOT_FROM_FLASH);
  1922. }
  1923. qlcnic_83xx_start_hw(adapter);
  1924. if (qlcnic_83xx_check_hw_status(adapter))
  1925. return -EIO;
  1926. return 0;
  1927. }
  1928. static int qlcnic_83xx_get_nic_configuration(struct qlcnic_adapter *adapter)
  1929. {
  1930. int err;
  1931. struct qlcnic_info nic_info;
  1932. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1933. memset(&nic_info, 0, sizeof(struct qlcnic_info));
  1934. err = qlcnic_get_nic_info(adapter, &nic_info, ahw->pci_func);
  1935. if (err)
  1936. return -EIO;
  1937. ahw->physical_port = (u8) nic_info.phys_port;
  1938. ahw->switch_mode = nic_info.switch_mode;
  1939. ahw->max_tx_ques = nic_info.max_tx_ques;
  1940. ahw->max_rx_ques = nic_info.max_rx_ques;
  1941. ahw->capabilities = nic_info.capabilities;
  1942. ahw->max_mac_filters = nic_info.max_mac_filters;
  1943. ahw->max_mtu = nic_info.max_mtu;
  1944. /* eSwitch capability indicates vNIC mode.
  1945. * vNIC and SRIOV are mutually exclusive operational modes.
  1946. * If SR-IOV capability is detected, SR-IOV physical function
  1947. * will get initialized in default mode.
  1948. * SR-IOV virtual function initialization follows a
  1949. * different code path and opmode.
  1950. * SRIOV mode has precedence over vNIC mode.
  1951. */
  1952. if (test_bit(__QLCNIC_SRIOV_CAPABLE, &adapter->state))
  1953. return QLC_83XX_DEFAULT_OPMODE;
  1954. if (ahw->capabilities & QLC_83XX_ESWITCH_CAPABILITY)
  1955. return QLCNIC_VNIC_MODE;
  1956. return QLC_83XX_DEFAULT_OPMODE;
  1957. }
  1958. int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter)
  1959. {
  1960. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1961. u16 max_sds_rings, max_tx_rings;
  1962. int ret;
  1963. ret = qlcnic_83xx_get_nic_configuration(adapter);
  1964. if (ret == -EIO)
  1965. return -EIO;
  1966. if (ret == QLCNIC_VNIC_MODE) {
  1967. ahw->nic_mode = QLCNIC_VNIC_MODE;
  1968. if (qlcnic_83xx_config_vnic_opmode(adapter))
  1969. return -EIO;
  1970. max_sds_rings = QLCNIC_MAX_VNIC_SDS_RINGS;
  1971. max_tx_rings = QLCNIC_MAX_VNIC_TX_RINGS;
  1972. } else if (ret == QLC_83XX_DEFAULT_OPMODE) {
  1973. ahw->nic_mode = QLCNIC_DEFAULT_MODE;
  1974. adapter->nic_ops->init_driver = qlcnic_83xx_init_default_driver;
  1975. ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
  1976. max_sds_rings = QLCNIC_MAX_SDS_RINGS;
  1977. max_tx_rings = QLCNIC_MAX_TX_RINGS;
  1978. } else {
  1979. dev_err(&adapter->pdev->dev, "%s: Invalid opmode %d\n",
  1980. __func__, ret);
  1981. return -EIO;
  1982. }
  1983. adapter->max_sds_rings = min(ahw->max_rx_ques, max_sds_rings);
  1984. adapter->max_tx_rings = min(ahw->max_tx_ques, max_tx_rings);
  1985. return 0;
  1986. }
  1987. static void qlcnic_83xx_config_buff_descriptors(struct qlcnic_adapter *adapter)
  1988. {
  1989. struct qlcnic_hardware_context *ahw = adapter->ahw;
  1990. if (ahw->port_type == QLCNIC_XGBE) {
  1991. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
  1992. adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
  1993. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1994. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
  1995. } else if (ahw->port_type == QLCNIC_GBE) {
  1996. adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
  1997. adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1998. adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
  1999. adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
  2000. }
  2001. adapter->num_txd = MAX_CMD_DESCRIPTORS;
  2002. adapter->max_rds_rings = MAX_RDS_RINGS;
  2003. }
  2004. static int qlcnic_83xx_init_default_driver(struct qlcnic_adapter *adapter)
  2005. {
  2006. int err = -EIO;
  2007. qlcnic_83xx_get_minidump_template(adapter);
  2008. if (qlcnic_83xx_get_port_info(adapter))
  2009. return err;
  2010. qlcnic_83xx_config_buff_descriptors(adapter);
  2011. adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
  2012. adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
  2013. dev_info(&adapter->pdev->dev, "HAL Version: %d\n",
  2014. adapter->ahw->fw_hal_version);
  2015. return 0;
  2016. }
  2017. #define IS_QLC_83XX_USED(a, b, c) (((1 << a->portnum) & b) || ((c >> 6) & 0x1))
  2018. static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter)
  2019. {
  2020. struct qlcnic_cmd_args cmd;
  2021. u32 presence_mask, audit_mask;
  2022. int status;
  2023. presence_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_PRESENCE);
  2024. audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
  2025. if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) {
  2026. status = qlcnic_alloc_mbx_args(&cmd, adapter,
  2027. QLCNIC_CMD_STOP_NIC_FUNC);
  2028. if (status)
  2029. return;
  2030. cmd.req.arg[1] = BIT_31;
  2031. status = qlcnic_issue_cmd(adapter, &cmd);
  2032. if (status)
  2033. dev_err(&adapter->pdev->dev,
  2034. "Failed to clean up the function resources\n");
  2035. qlcnic_free_mbx_args(&cmd);
  2036. }
  2037. }
  2038. static int qlcnic_83xx_get_fw_info(struct qlcnic_adapter *adapter)
  2039. {
  2040. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2041. struct pci_dev *pdev = adapter->pdev;
  2042. struct qlc_83xx_fw_info *fw_info;
  2043. int err = 0;
  2044. ahw->fw_info = kzalloc(sizeof(*fw_info), GFP_KERNEL);
  2045. if (!ahw->fw_info) {
  2046. err = -ENOMEM;
  2047. } else {
  2048. fw_info = ahw->fw_info;
  2049. switch (pdev->device) {
  2050. case PCI_DEVICE_ID_QLOGIC_QLE834X:
  2051. case PCI_DEVICE_ID_QLOGIC_QLE8830:
  2052. strncpy(fw_info->fw_file_name, QLC_83XX_FW_FILE_NAME,
  2053. QLC_FW_FILE_NAME_LEN);
  2054. break;
  2055. case PCI_DEVICE_ID_QLOGIC_QLE844X:
  2056. strncpy(fw_info->fw_file_name, QLC_84XX_FW_FILE_NAME,
  2057. QLC_FW_FILE_NAME_LEN);
  2058. break;
  2059. default:
  2060. dev_err(&pdev->dev, "%s: Invalid device id\n",
  2061. __func__);
  2062. err = -EINVAL;
  2063. break;
  2064. }
  2065. }
  2066. return err;
  2067. }
  2068. static void qlcnic_83xx_init_rings(struct qlcnic_adapter *adapter)
  2069. {
  2070. u8 rx_cnt = QLCNIC_DEF_SDS_RINGS;
  2071. u8 tx_cnt = QLCNIC_DEF_TX_RINGS;
  2072. adapter->max_tx_rings = QLCNIC_MAX_TX_RINGS;
  2073. adapter->max_sds_rings = QLCNIC_MAX_SDS_RINGS;
  2074. if (!adapter->ahw->msix_supported) {
  2075. rx_cnt = QLCNIC_SINGLE_RING;
  2076. tx_cnt = QLCNIC_SINGLE_RING;
  2077. }
  2078. /* compute and set drv sds rings */
  2079. qlcnic_set_tx_ring_count(adapter, tx_cnt);
  2080. qlcnic_set_sds_ring_count(adapter, rx_cnt);
  2081. }
  2082. int qlcnic_83xx_init(struct qlcnic_adapter *adapter, int pci_using_dac)
  2083. {
  2084. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2085. int err = 0;
  2086. adapter->rx_mac_learn = false;
  2087. ahw->msix_supported = !!qlcnic_use_msi_x;
  2088. /* Check if POST needs to be run */
  2089. switch (qlcnic_load_fw_file) {
  2090. case 2:
  2091. ahw->post_mode = QLC_83XX_POST_FAST_MODE;
  2092. ahw->run_post = true;
  2093. break;
  2094. case 3:
  2095. ahw->post_mode = QLC_83XX_POST_MEDIUM_MODE;
  2096. ahw->run_post = true;
  2097. break;
  2098. case 4:
  2099. ahw->post_mode = QLC_83XX_POST_SLOW_MODE;
  2100. ahw->run_post = true;
  2101. break;
  2102. default:
  2103. ahw->run_post = false;
  2104. break;
  2105. }
  2106. qlcnic_83xx_init_rings(adapter);
  2107. err = qlcnic_83xx_init_mailbox_work(adapter);
  2108. if (err)
  2109. goto exit;
  2110. if (qlcnic_sriov_vf_check(adapter)) {
  2111. err = qlcnic_sriov_vf_init(adapter, pci_using_dac);
  2112. if (err)
  2113. goto detach_mbx;
  2114. else
  2115. return err;
  2116. }
  2117. if (qlcnic_83xx_read_flash_descriptor_table(adapter) ||
  2118. qlcnic_83xx_read_flash_mfg_id(adapter)) {
  2119. dev_err(&adapter->pdev->dev, "Failed reading flash mfg id\n");
  2120. err = -ENOTRECOVERABLE;
  2121. goto detach_mbx;
  2122. }
  2123. err = qlcnic_83xx_check_hw_status(adapter);
  2124. if (err)
  2125. goto detach_mbx;
  2126. err = qlcnic_83xx_get_fw_info(adapter);
  2127. if (err)
  2128. goto detach_mbx;
  2129. err = qlcnic_83xx_idc_init(adapter);
  2130. if (err)
  2131. goto detach_mbx;
  2132. err = qlcnic_setup_intr(adapter);
  2133. if (err) {
  2134. dev_err(&adapter->pdev->dev, "Failed to setup interrupt\n");
  2135. goto disable_intr;
  2136. }
  2137. INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
  2138. err = qlcnic_83xx_setup_mbx_intr(adapter);
  2139. if (err)
  2140. goto disable_mbx_intr;
  2141. qlcnic_83xx_clear_function_resources(adapter);
  2142. qlcnic_dcb_enable(adapter->dcb);
  2143. qlcnic_83xx_initialize_nic(adapter, 1);
  2144. qlcnic_dcb_get_info(adapter->dcb);
  2145. /* Configure default, SR-IOV or Virtual NIC mode of operation */
  2146. err = qlcnic_83xx_configure_opmode(adapter);
  2147. if (err)
  2148. goto disable_mbx_intr;
  2149. /* Perform operating mode specific initialization */
  2150. err = adapter->nic_ops->init_driver(adapter);
  2151. if (err)
  2152. goto disable_mbx_intr;
  2153. /* Periodically monitor device status */
  2154. qlcnic_83xx_idc_poll_dev_state(&adapter->fw_work.work);
  2155. return 0;
  2156. disable_mbx_intr:
  2157. qlcnic_83xx_free_mbx_intr(adapter);
  2158. disable_intr:
  2159. qlcnic_teardown_intr(adapter);
  2160. detach_mbx:
  2161. qlcnic_83xx_detach_mailbox_work(adapter);
  2162. qlcnic_83xx_free_mailbox(ahw->mailbox);
  2163. ahw->mailbox = NULL;
  2164. exit:
  2165. return err;
  2166. }
  2167. void qlcnic_83xx_aer_stop_poll_work(struct qlcnic_adapter *adapter)
  2168. {
  2169. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2170. struct qlc_83xx_idc *idc = &ahw->idc;
  2171. clear_bit(QLC_83XX_MBX_READY, &idc->status);
  2172. cancel_delayed_work_sync(&adapter->fw_work);
  2173. if (ahw->nic_mode == QLCNIC_VNIC_MODE)
  2174. qlcnic_83xx_disable_vnic_mode(adapter, 1);
  2175. qlcnic_83xx_idc_detach_driver(adapter);
  2176. qlcnic_83xx_initialize_nic(adapter, 0);
  2177. cancel_delayed_work_sync(&adapter->idc_aen_work);
  2178. }
  2179. int qlcnic_83xx_aer_reset(struct qlcnic_adapter *adapter)
  2180. {
  2181. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2182. struct qlc_83xx_idc *idc = &ahw->idc;
  2183. int ret = 0;
  2184. u32 owner;
  2185. /* Mark the previous IDC state as NEED_RESET so
  2186. * that state_entry() will perform the reattachment
  2187. * and bringup the device
  2188. */
  2189. idc->prev_state = QLC_83XX_IDC_DEV_NEED_RESET;
  2190. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  2191. if (ahw->pci_func == owner) {
  2192. ret = qlcnic_83xx_restart_hw(adapter);
  2193. if (ret < 0)
  2194. return ret;
  2195. qlcnic_83xx_idc_clear_registers(adapter, 0);
  2196. }
  2197. ret = idc->state_entry(adapter);
  2198. return ret;
  2199. }
  2200. void qlcnic_83xx_aer_start_poll_work(struct qlcnic_adapter *adapter)
  2201. {
  2202. struct qlcnic_hardware_context *ahw = adapter->ahw;
  2203. struct qlc_83xx_idc *idc = &ahw->idc;
  2204. u32 owner;
  2205. idc->prev_state = QLC_83XX_IDC_DEV_READY;
  2206. owner = qlcnic_83xx_idc_find_reset_owner_id(adapter);
  2207. if (ahw->pci_func == owner)
  2208. qlcnic_83xx_idc_enter_ready_state(adapter, 0);
  2209. qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state, 0);
  2210. }