f_gsi.c 104 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022,2024 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/module.h>
  7. #include "f_gsi.h"
  8. #include "rndis.h"
  9. static struct usb_gsi_debugfs {
  10. struct dentry *debugfs_root;
  11. bool qti_packet_debug;
  12. } debugfs;
  13. static struct workqueue_struct *ipa_usb_wq;
  14. static struct gsi_inst_status {
  15. struct mutex gsi_lock;
  16. bool inst_exist;
  17. struct gsi_opts *opts;
  18. } inst_status[IPA_USB_MAX_TETH_PROT_SIZE];
  19. #define MAX_CDEV_INSTANCES 3
  20. static int major;
  21. static struct class *gsi_class;
  22. static DEFINE_IDA(gsi_ida);
  23. static DECLARE_COMPLETION(wait_for_ipa_ready);
  24. struct ipa_usb_ops ipa_ops;
  25. /* Deregister misc device and free instance structures */
  26. static void gsi_inst_clean(struct gsi_opts *opts);
  27. static void gsi_rndis_ipa_reset_trigger(struct gsi_data_port *d_port);
  28. static int gsi_ctrl_send_notification(struct f_gsi *gsi);
  29. static struct gsi_ctrl_pkt *gsi_ctrl_pkt_alloc(unsigned int len, gfp_t flags);
  30. static void gsi_ctrl_pkt_free(struct gsi_ctrl_pkt *pkt);
  31. static inline bool usb_gsi_remote_wakeup_allowed(struct usb_function *f)
  32. {
  33. bool remote_wakeup_allowed = true;
  34. struct f_gsi *gsi = func_to_gsi(f);
  35. if (f->config->cdev->gadget->speed >= USB_SPEED_SUPER)
  36. remote_wakeup_allowed = gsi->func_wakeup_allowed;
  37. log_event_dbg("%s: remote_wakeup_allowed:%s", __func__,
  38. (remote_wakeup_allowed ? "true" : "false"));
  39. return remote_wakeup_allowed;
  40. }
  41. static void post_event(struct gsi_data_port *port, u8 event)
  42. {
  43. unsigned long flags;
  44. struct f_gsi *gsi = d_port_to_gsi(port);
  45. spin_lock_irqsave(&port->evt_q.q_lock, flags);
  46. port->evt_q.tail++;
  47. /* Check for wraparound and make room */
  48. port->evt_q.tail = port->evt_q.tail % MAXQUEUELEN;
  49. /* Check for overflow */
  50. if (port->evt_q.tail == port->evt_q.head) {
  51. log_event_err("%s: event queue overflow error", __func__);
  52. spin_unlock_irqrestore(&port->evt_q.q_lock, flags);
  53. return;
  54. }
  55. /* Add event to queue */
  56. port->evt_q.event[port->evt_q.tail] = event;
  57. spin_unlock_irqrestore(&port->evt_q.q_lock, flags);
  58. }
  59. static void __maybe_unused post_event_to_evt_queue(struct gsi_data_port *port,
  60. u8 event)
  61. {
  62. post_event(port, event);
  63. queue_delayed_work(port->ipa_usb_wq, &port->usb_ipa_w, 0);
  64. }
  65. static u8 read_event(struct gsi_data_port *port)
  66. {
  67. u8 event;
  68. unsigned long flags;
  69. struct f_gsi *gsi = d_port_to_gsi(port);
  70. spin_lock_irqsave(&port->evt_q.q_lock, flags);
  71. if (port->evt_q.head == port->evt_q.tail) {
  72. log_event_dbg("%s: event queue empty", __func__);
  73. spin_unlock_irqrestore(&port->evt_q.q_lock, flags);
  74. return EVT_NONE;
  75. }
  76. port->evt_q.head++;
  77. /* Check for wraparound and make room */
  78. port->evt_q.head = port->evt_q.head % MAXQUEUELEN;
  79. event = port->evt_q.event[port->evt_q.head];
  80. spin_unlock_irqrestore(&port->evt_q.q_lock, flags);
  81. return event;
  82. }
  83. static u8 peek_event(struct gsi_data_port *port)
  84. {
  85. u8 event;
  86. unsigned long flags;
  87. u8 peek_index = 0;
  88. struct f_gsi *gsi = d_port_to_gsi(port);
  89. spin_lock_irqsave(&port->evt_q.q_lock, flags);
  90. if (port->evt_q.head == port->evt_q.tail) {
  91. log_event_dbg("%s: event queue empty", __func__);
  92. spin_unlock_irqrestore(&port->evt_q.q_lock, flags);
  93. return EVT_NONE;
  94. }
  95. peek_index = (port->evt_q.head + 1) % MAXQUEUELEN;
  96. event = port->evt_q.event[peek_index];
  97. spin_unlock_irqrestore(&port->evt_q.q_lock, flags);
  98. return event;
  99. }
  100. static void __maybe_unused reset_event_queue(struct gsi_data_port *port)
  101. {
  102. unsigned long flags;
  103. spin_lock_irqsave(&port->evt_q.q_lock, flags);
  104. port->evt_q.head = port->evt_q.tail = MAXQUEUELEN - 1;
  105. memset(&port->evt_q.event[0], EVT_NONE, MAXQUEUELEN);
  106. spin_unlock_irqrestore(&port->evt_q.q_lock, flags);
  107. }
  108. static int gsi_wakeup_host(struct f_gsi *gsi)
  109. {
  110. int ret;
  111. struct usb_gadget *gadget;
  112. struct usb_function *func;
  113. func = &gsi->function;
  114. gadget = gsi->function.config->cdev->gadget;
  115. log_event_dbg("Entering %s", __func__);
  116. if (!gadget) {
  117. log_event_err("FAILED: d_port->cdev->gadget == NULL");
  118. return -ENODEV;
  119. }
  120. /*
  121. * In Super-Speed mode, remote wakeup is not allowed for suspended
  122. * functions which have been disallowed by the host to issue Function
  123. * Remote Wakeup.
  124. * Note - We deviate here from the USB 3.0 spec and allow
  125. * non-suspended functions to issue remote-wakeup even if they were not
  126. * allowed to do so by the host. This is done in order to support non
  127. * fully USB 3.0 compatible hosts.
  128. */
  129. if ((gadget->speed >= USB_SPEED_SUPER) && (gsi->func_is_suspended)) {
  130. ret = -EOPNOTSUPP;
  131. #if IS_ENABLED(CONFIG_USB_FUNC_WAKEUP_SUPPORTED)
  132. log_event_dbg("%s: Calling usb_func_wakeup", __func__);
  133. ret = usb_func_wakeup(func);
  134. #endif
  135. } else {
  136. log_event_dbg("%s: Calling usb_gadget_wakeup", __func__);
  137. ret = usb_gadget_wakeup(gadget);
  138. }
  139. if ((ret == -EBUSY) || (ret == -EAGAIN))
  140. log_event_dbg("RW delayed due to LPM exit.");
  141. else if (ret)
  142. log_event_err("wakeup failed. ret=%d.", ret);
  143. return ret;
  144. }
  145. static void gsi_rw_timer_func(struct timer_list *t)
  146. {
  147. struct f_gsi *gsi = from_timer(gsi, t, gsi_rw_timer);
  148. if (!atomic_read(&gsi->connected)) {
  149. log_event_dbg("%s: gsi not connected.. bail-out\n", __func__);
  150. gsi->debugfs_rw_timer_enable = 0;
  151. return;
  152. }
  153. log_event_dbg("%s: calling gsi_wakeup_host\n", __func__);
  154. gsi_wakeup_host(gsi);
  155. if (gsi->debugfs_rw_timer_enable) {
  156. log_event_dbg("%s: re-arm the timer\n", __func__);
  157. mod_timer(&gsi->gsi_rw_timer,
  158. jiffies + msecs_to_jiffies(gsi->gsi_rw_timer_interval));
  159. }
  160. }
  161. static struct f_gsi *get_connected_gsi(void)
  162. {
  163. struct f_gsi *connected_gsi;
  164. bool gsi_connected = false;
  165. int i;
  166. for (i = 0; i < IPA_USB_MAX_TETH_PROT_SIZE; i++) {
  167. if (inst_status[i].opts)
  168. connected_gsi = inst_status[i].opts->gsi;
  169. else
  170. continue;
  171. if (connected_gsi && atomic_read(&connected_gsi->connected)) {
  172. gsi_connected = true;
  173. break;
  174. }
  175. }
  176. if (!gsi_connected)
  177. connected_gsi = NULL;
  178. return connected_gsi;
  179. }
  180. #define DEFAULT_RW_TIMER_INTERVAL 500 /* in ms */
  181. static ssize_t usb_gsi_rw_write(struct file *file,
  182. const char __user *ubuf, size_t count, loff_t *ppos)
  183. {
  184. struct f_gsi *gsi;
  185. u8 input;
  186. int ret;
  187. gsi = get_connected_gsi();
  188. if (!gsi) {
  189. log_event_dbg("%s: gsi not connected\n", __func__);
  190. goto err;
  191. }
  192. if (ubuf == NULL) {
  193. log_event_dbg("%s: buffer is Null.\n", __func__);
  194. goto err;
  195. }
  196. ret = kstrtou8_from_user(ubuf, count, 0, &input);
  197. if (ret) {
  198. log_event_err("%s: Invalid value. err:%d\n", __func__, ret);
  199. goto err;
  200. }
  201. if (gsi->debugfs_rw_timer_enable == !!input) {
  202. if (!!input)
  203. log_event_dbg("%s: RW already enabled\n", __func__);
  204. else
  205. log_event_dbg("%s: RW already disabled\n", __func__);
  206. goto err;
  207. }
  208. gsi->debugfs_rw_timer_enable = !!input;
  209. if (gsi->debugfs_rw_timer_enable) {
  210. mod_timer(&gsi->gsi_rw_timer, jiffies +
  211. msecs_to_jiffies(gsi->gsi_rw_timer_interval));
  212. log_event_dbg("%s: timer initialized\n", __func__);
  213. } else {
  214. del_timer_sync(&gsi->gsi_rw_timer);
  215. log_event_dbg("%s: timer deleted\n", __func__);
  216. }
  217. err:
  218. return count;
  219. }
  220. static int usb_gsi_rw_show(struct seq_file *s, void *unused)
  221. {
  222. struct f_gsi *gsi;
  223. gsi = get_connected_gsi();
  224. if (!gsi) {
  225. log_event_dbg("%s: gsi not connected\n", __func__);
  226. return 0;
  227. }
  228. seq_printf(s, "%d\n", gsi->debugfs_rw_timer_enable);
  229. return 0;
  230. }
  231. static int usb_gsi_rw_open(struct inode *inode, struct file *f)
  232. {
  233. return single_open(f, usb_gsi_rw_show, inode->i_private);
  234. }
  235. static const struct file_operations fops_usb_gsi_rw = {
  236. .open = usb_gsi_rw_open,
  237. .read = seq_read,
  238. .write = usb_gsi_rw_write,
  239. .owner = THIS_MODULE,
  240. .llseek = seq_lseek,
  241. .release = seq_release,
  242. };
  243. static ssize_t usb_gsi_rw_timer_write(struct file *file,
  244. const char __user *ubuf, size_t count, loff_t *ppos)
  245. {
  246. struct f_gsi *gsi;
  247. u16 timer_val;
  248. int ret;
  249. gsi = get_connected_gsi();
  250. if (!gsi) {
  251. log_event_dbg("%s: gsi not connected\n", __func__);
  252. goto err;
  253. }
  254. if (ubuf == NULL) {
  255. log_event_dbg("%s: buffer is NULL.\n", __func__);
  256. goto err;
  257. }
  258. ret = kstrtou16_from_user(ubuf, count, 0, &timer_val);
  259. if (ret) {
  260. log_event_err("%s: Invalid value. err:%d\n", __func__, ret);
  261. goto err;
  262. }
  263. if (timer_val <= 0 || timer_val > 10000) {
  264. log_event_err("%s: value must be > 0 and < 10000.\n", __func__);
  265. goto err;
  266. }
  267. gsi->gsi_rw_timer_interval = timer_val;
  268. err:
  269. return count;
  270. }
  271. static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused)
  272. {
  273. struct f_gsi *gsi;
  274. gsi = get_connected_gsi();
  275. if (!gsi) {
  276. log_event_dbg("%s: gsi not connected\n", __func__);
  277. return 0;
  278. }
  279. seq_printf(s, "%ums\n", gsi->gsi_rw_timer_interval);
  280. return 0;
  281. }
  282. static int usb_gsi_rw_timer_open(struct inode *inode, struct file *f)
  283. {
  284. return single_open(f, usb_gsi_rw_timer_show, inode->i_private);
  285. }
  286. static const struct file_operations fops_usb_gsi_rw_timer = {
  287. .open = usb_gsi_rw_timer_open,
  288. .read = seq_read,
  289. .write = usb_gsi_rw_timer_write,
  290. .owner = THIS_MODULE,
  291. .llseek = seq_lseek,
  292. .release = seq_release,
  293. };
  294. static int usb_gsi_debugfs_init(void)
  295. {
  296. debugfs.debugfs_root = debugfs_create_dir("usb_gsi", NULL);
  297. if (!debugfs.debugfs_root)
  298. return -ENOMEM;
  299. debugfs_create_file("remote_wakeup_enable", 0600,
  300. debugfs.debugfs_root,
  301. inst_status, &fops_usb_gsi_rw);
  302. debugfs_create_file("remote_wakeup_interval", 0600,
  303. debugfs.debugfs_root,
  304. inst_status,
  305. &fops_usb_gsi_rw_timer);
  306. debugfs_create_bool("log_ctrl_packets", 0644, debugfs.debugfs_root,
  307. &debugfs.qti_packet_debug);
  308. return 0;
  309. }
  310. static void usb_gsi_debugfs_exit(void)
  311. {
  312. debugfs_remove_recursive(debugfs.debugfs_root);
  313. }
  314. /*
  315. * Callback for when network interface is up and userspace is ready
  316. * to answer DHCP requests or remote wakeup.
  317. */
  318. static int ipa_usb_notify_cb(enum ipa_usb_notify_event event,
  319. void *driver_data)
  320. {
  321. struct f_gsi *gsi = driver_data;
  322. unsigned long flags;
  323. struct gsi_ctrl_pkt *cpkt_notify_connect, *cpkt_notify_speed;
  324. if (!gsi) {
  325. log_event_err("%s: invalid driver data", __func__);
  326. return -EINVAL;
  327. }
  328. spin_lock_irqsave(&gsi->d_port.lock, flags);
  329. switch (event) {
  330. case IPA_USB_DEVICE_READY:
  331. if (gsi->d_port.net_ready_trigger) {
  332. spin_unlock_irqrestore(&gsi->d_port.lock, flags);
  333. log_event_dbg("%s: Already triggered", __func__);
  334. return 1;
  335. }
  336. log_event_err("%s: Set net_ready_trigger", __func__);
  337. gsi->d_port.net_ready_trigger = true;
  338. if (gsi->prot_id == IPA_USB_ECM) {
  339. cpkt_notify_connect = gsi_ctrl_pkt_alloc(0, GFP_ATOMIC);
  340. if (IS_ERR(cpkt_notify_connect)) {
  341. spin_unlock_irqrestore(&gsi->d_port.lock,
  342. flags);
  343. log_event_dbg("%s: err cpkt_notify_connect\n",
  344. __func__);
  345. return -ENOMEM;
  346. }
  347. cpkt_notify_connect->type = GSI_CTRL_NOTIFY_CONNECT;
  348. cpkt_notify_speed = gsi_ctrl_pkt_alloc(0, GFP_ATOMIC);
  349. if (IS_ERR(cpkt_notify_speed)) {
  350. spin_unlock_irqrestore(&gsi->d_port.lock,
  351. flags);
  352. gsi_ctrl_pkt_free(cpkt_notify_connect);
  353. log_event_dbg("%s: err cpkt_notify_speed\n",
  354. __func__);
  355. return -ENOMEM;
  356. }
  357. cpkt_notify_speed->type = GSI_CTRL_NOTIFY_SPEED;
  358. spin_lock(&gsi->c_port.lock);
  359. list_add_tail(&cpkt_notify_connect->list,
  360. &gsi->c_port.cpkt_resp_q);
  361. list_add_tail(&cpkt_notify_speed->list,
  362. &gsi->c_port.cpkt_resp_q);
  363. spin_unlock(&gsi->c_port.lock);
  364. gsi_ctrl_send_notification(gsi);
  365. }
  366. /*
  367. * Do not post EVT_CONNECTED for RNDIS.
  368. * Data path for RNDIS is enabled on EVT_HOST_READY.
  369. */
  370. if (gsi->prot_id != IPA_USB_RNDIS) {
  371. post_event(&gsi->d_port, EVT_IPA_READY);
  372. queue_delayed_work(gsi->d_port.ipa_usb_wq,
  373. &gsi->d_port.usb_ipa_w, 0);
  374. }
  375. break;
  376. case IPA_USB_REMOTE_WAKEUP:
  377. gsi_wakeup_host(gsi);
  378. break;
  379. case IPA_USB_SUSPEND_COMPLETED:
  380. post_event(&gsi->d_port, EVT_IPA_SUSPEND);
  381. queue_delayed_work(gsi->d_port.ipa_usb_wq,
  382. &gsi->d_port.usb_ipa_w, 0);
  383. break;
  384. }
  385. spin_unlock_irqrestore(&gsi->d_port.lock, flags);
  386. return 1;
  387. }
  388. static int ipa_connect_channels(struct gsi_data_port *d_port)
  389. {
  390. int ret;
  391. struct f_gsi *gsi = d_port_to_gsi(d_port);
  392. struct ipa_usb_xdci_chan_params *in_params =
  393. &d_port->ipa_in_channel_params;
  394. struct ipa_usb_xdci_chan_params *out_params =
  395. &d_port->ipa_out_channel_params;
  396. struct ipa_usb_xdci_connect_params *conn_params =
  397. &d_port->ipa_conn_pms;
  398. struct usb_composite_dev *cdev = gsi->function.config->cdev;
  399. struct gsi_channel_info gsi_channel_info;
  400. struct ipa_req_chan_out_params ipa_in_channel_out_params;
  401. struct ipa_req_chan_out_params ipa_out_channel_out_params;
  402. log_event_dbg("IN: num_bufs:=%zu, buf_len=%zu\n",
  403. d_port->in_request.num_bufs, d_port->in_request.buf_len);
  404. ret = usb_gsi_ep_op(d_port->in_ep, &d_port->in_request,
  405. GSI_EP_OP_PREPARE_TRBS);
  406. if (ret) {
  407. log_event_err("%s: GSI_EP_OP_PREPARE_TRBS failed: %d\n",
  408. __func__, ret);
  409. return ret;
  410. }
  411. ret = usb_gsi_ep_op(d_port->in_ep, &d_port->in_request,
  412. GSI_EP_OP_STARTXFER);
  413. if (ret) {
  414. log_event_err("%s: GSI_EP_OP_STARTXFER failed: %d\n",
  415. __func__, ret);
  416. goto free_trb_ep_in;
  417. }
  418. d_port->in_xfer_rsc_index = usb_gsi_ep_op(d_port->in_ep, NULL,
  419. GSI_EP_OP_GET_XFER_IDX);
  420. memset(in_params, 0x0, sizeof(*in_params));
  421. gsi_channel_info.ch_req = &d_port->in_request;
  422. usb_gsi_ep_op(d_port->in_ep, (void *)&gsi_channel_info,
  423. GSI_EP_OP_GET_CH_INFO);
  424. log_event_dbg("%s: USB GSI IN OPS Completed", __func__);
  425. in_params->teth_prot = gsi->prot_id;
  426. in_params->gevntcount_low_addr =
  427. gsi_channel_info.gevntcount_low_addr;
  428. in_params->gevntcount_hi_addr =
  429. gsi_channel_info.gevntcount_hi_addr;
  430. in_params->dir = CHAN_DIR_FROM_GSI;
  431. in_params->xfer_ring_len = gsi_channel_info.xfer_ring_len;
  432. in_params->xfer_scratch.last_trb_addr_iova =
  433. gsi_channel_info.last_trb_addr;
  434. in_params->xfer_ring_base_addr_iova =
  435. gsi_channel_info.xfer_ring_base_addr;
  436. in_params->data_buff_base_len = d_port->in_request.buf_len *
  437. d_port->in_request.num_bufs;
  438. in_params->data_buff_base_addr_iova = d_port->in_request.dma;
  439. in_params->sgt_xfer_rings = &d_port->in_request.sgt_trb_xfer_ring;
  440. in_params->sgt_data_buff = &d_port->in_request.sgt_data_buff;
  441. log_event_dbg("%s(): IN: sgt_xfer_rings:%pK sgt_data_buff:%pK\n",
  442. __func__, in_params->sgt_xfer_rings, in_params->sgt_data_buff);
  443. in_params->xfer_scratch.const_buffer_size =
  444. gsi_channel_info.const_buffer_size;
  445. in_params->xfer_scratch.depcmd_low_addr =
  446. gsi_channel_info.depcmd_low_addr;
  447. in_params->xfer_scratch.depcmd_hi_addr =
  448. gsi_channel_info.depcmd_hi_addr;
  449. if (d_port->out_ep) {
  450. log_event_dbg("OUT: num_bufs:=%zu, buf_len=%zu\n",
  451. d_port->out_request.num_bufs,
  452. d_port->out_request.buf_len);
  453. ret = usb_gsi_ep_op(d_port->out_ep, &d_port->out_request,
  454. GSI_EP_OP_PREPARE_TRBS);
  455. if (ret) {
  456. log_event_err("%s: GSI_EP_OP_PREPARE_TRBS failed: %d\n",
  457. __func__, ret);
  458. goto end_xfer_ep_in;
  459. }
  460. ret = usb_gsi_ep_op(d_port->out_ep, &d_port->out_request,
  461. GSI_EP_OP_STARTXFER);
  462. if (ret) {
  463. log_event_err("%s: GSI_EP_OP_STARTXFER failed: %d\n",
  464. __func__, ret);
  465. goto free_trb_ep_out;
  466. }
  467. d_port->out_xfer_rsc_index =
  468. usb_gsi_ep_op(d_port->out_ep,
  469. NULL, GSI_EP_OP_GET_XFER_IDX);
  470. memset(out_params, 0x0, sizeof(*out_params));
  471. gsi_channel_info.ch_req = &d_port->out_request;
  472. usb_gsi_ep_op(d_port->out_ep, (void *)&gsi_channel_info,
  473. GSI_EP_OP_GET_CH_INFO);
  474. log_event_dbg("%s: USB GSI OUT OPS Completed", __func__);
  475. out_params->teth_prot = gsi->prot_id;
  476. out_params->gevntcount_low_addr =
  477. gsi_channel_info.gevntcount_low_addr;
  478. out_params->gevntcount_hi_addr =
  479. gsi_channel_info.gevntcount_hi_addr;
  480. out_params->dir = CHAN_DIR_TO_GSI;
  481. out_params->xfer_ring_len =
  482. gsi_channel_info.xfer_ring_len;
  483. out_params->xfer_ring_base_addr_iova =
  484. gsi_channel_info.xfer_ring_base_addr;
  485. out_params->data_buff_base_len = d_port->out_request.buf_len *
  486. d_port->out_request.num_bufs;
  487. out_params->data_buff_base_addr_iova =
  488. d_port->out_request.dma;
  489. out_params->sgt_xfer_rings =
  490. &d_port->out_request.sgt_trb_xfer_ring;
  491. out_params->sgt_data_buff = &d_port->out_request.sgt_data_buff;
  492. log_event_dbg("%s(): OUT: sgt_xfer_rings:%pK sgt_data_buff:%pK\n",
  493. __func__, out_params->sgt_xfer_rings,
  494. out_params->sgt_data_buff);
  495. out_params->xfer_scratch.last_trb_addr_iova =
  496. gsi_channel_info.last_trb_addr;
  497. out_params->xfer_scratch.const_buffer_size =
  498. gsi_channel_info.const_buffer_size;
  499. out_params->xfer_scratch.depcmd_low_addr =
  500. gsi_channel_info.depcmd_low_addr;
  501. out_params->xfer_scratch.depcmd_hi_addr =
  502. gsi_channel_info.depcmd_hi_addr;
  503. }
  504. /* Populate connection params */
  505. conn_params->max_pkt_size =
  506. (cdev->gadget->speed >= USB_SPEED_SUPER) ?
  507. IPA_USB_SUPER_SPEED_1024B : IPA_USB_HIGH_SPEED_512B;
  508. conn_params->ipa_to_usb_xferrscidx =
  509. d_port->in_xfer_rsc_index;
  510. conn_params->usb_to_ipa_xferrscidx =
  511. d_port->out_xfer_rsc_index;
  512. conn_params->usb_to_ipa_xferrscidx_valid =
  513. (gsi->prot_id != IPA_USB_DIAG) ? true : false;
  514. conn_params->ipa_to_usb_xferrscidx_valid = true;
  515. conn_params->teth_prot = gsi->prot_id;
  516. conn_params->teth_prot_params.max_xfer_size_bytes_to_dev = 23700;
  517. conn_params->teth_prot_params.max_xfer_size_bytes_to_dev
  518. = d_port->out_aggr_size;
  519. conn_params->teth_prot_params.max_xfer_size_bytes_to_host
  520. = d_port->in_aggr_size;
  521. conn_params->teth_prot_params.max_packet_number_to_dev =
  522. DEFAULT_MAX_PKT_PER_XFER;
  523. conn_params->max_supported_bandwidth_mbps =
  524. (cdev->gadget->speed >= USB_SPEED_SUPER) ? 3600 : 400;
  525. memset(&ipa_in_channel_out_params, 0x0,
  526. sizeof(ipa_in_channel_out_params));
  527. memset(&ipa_out_channel_out_params, 0x0,
  528. sizeof(ipa_out_channel_out_params));
  529. log_event_dbg("%s: Calling xdci_connect", __func__);
  530. ret = d_port->ipa_ops->xdci_connect(out_params, in_params,
  531. &ipa_out_channel_out_params,
  532. &ipa_in_channel_out_params,
  533. conn_params);
  534. if (ret) {
  535. log_event_err("%s: IPA connect failed %d", __func__, ret);
  536. goto end_xfer_ep_out;
  537. }
  538. log_event_dbg("%s: xdci_connect done", __func__);
  539. log_event_dbg("%s: IN CH HDL %x", __func__,
  540. ipa_in_channel_out_params.clnt_hdl);
  541. log_event_dbg("%s: IN CH DBL addr %x", __func__,
  542. ipa_in_channel_out_params.db_reg_phs_addr_lsb);
  543. log_event_dbg("%s: OUT CH HDL %x", __func__,
  544. ipa_out_channel_out_params.clnt_hdl);
  545. log_event_dbg("%s: OUT CH DBL addr %x", __func__,
  546. ipa_out_channel_out_params.db_reg_phs_addr_lsb);
  547. d_port->in_channel_handle = ipa_in_channel_out_params.clnt_hdl;
  548. d_port->in_request.db_reg_phs_addr_lsb =
  549. ipa_in_channel_out_params.db_reg_phs_addr_lsb;
  550. d_port->in_request.db_reg_phs_addr_msb =
  551. ipa_in_channel_out_params.db_reg_phs_addr_msb;
  552. if (gsi->prot_id != IPA_USB_DIAG) {
  553. d_port->out_channel_handle =
  554. ipa_out_channel_out_params.clnt_hdl;
  555. d_port->out_request.db_reg_phs_addr_lsb =
  556. ipa_out_channel_out_params.db_reg_phs_addr_lsb;
  557. d_port->out_request.db_reg_phs_addr_msb =
  558. ipa_out_channel_out_params.db_reg_phs_addr_msb;
  559. }
  560. return ret;
  561. end_xfer_ep_out:
  562. if (d_port->out_ep)
  563. usb_gsi_ep_op(d_port->out_ep, NULL,
  564. GSI_EP_OP_ENDXFER);
  565. free_trb_ep_out:
  566. if (d_port->out_ep)
  567. usb_gsi_ep_op(d_port->out_ep, &d_port->out_request,
  568. GSI_EP_OP_FREE_TRBS);
  569. end_xfer_ep_in:
  570. usb_gsi_ep_op(d_port->in_ep, NULL,
  571. GSI_EP_OP_ENDXFER);
  572. free_trb_ep_in:
  573. usb_gsi_ep_op(d_port->in_ep, &d_port->in_request,
  574. GSI_EP_OP_FREE_TRBS);
  575. return ret;
  576. }
  577. static void ipa_data_path_enable(struct gsi_data_port *d_port)
  578. {
  579. struct f_gsi *gsi = d_port_to_gsi(d_port);
  580. bool block_db = false;
  581. log_event_dbg("IN: db_reg_phs_addr_lsb = %x",
  582. gsi->d_port.in_request.db_reg_phs_addr_lsb);
  583. usb_gsi_ep_op(gsi->d_port.in_ep,
  584. &gsi->d_port.in_request,
  585. GSI_EP_OP_STORE_DBL_INFO);
  586. if (gsi->d_port.out_ep) {
  587. log_event_dbg("OUT: db_reg_phs_addr_lsb = %x",
  588. gsi->d_port.out_request.db_reg_phs_addr_lsb);
  589. usb_gsi_ep_op(gsi->d_port.out_ep,
  590. &gsi->d_port.out_request,
  591. GSI_EP_OP_STORE_DBL_INFO);
  592. usb_gsi_ep_op(gsi->d_port.out_ep, &gsi->d_port.out_request,
  593. GSI_EP_OP_ENABLE_GSI);
  594. }
  595. /* Unblock doorbell to GSI */
  596. usb_gsi_ep_op(d_port->in_ep, (void *)&block_db,
  597. GSI_EP_OP_SET_CLR_BLOCK_DBL);
  598. usb_gsi_ep_op(gsi->d_port.in_ep, &gsi->d_port.in_request,
  599. GSI_EP_OP_RING_DB);
  600. if (gsi->d_port.out_ep)
  601. usb_gsi_ep_op(gsi->d_port.out_ep, &gsi->d_port.out_request,
  602. GSI_EP_OP_RING_DB);
  603. }
  604. static void ipa_data_path_disable(struct gsi_data_port *d_port)
  605. {
  606. struct f_gsi *gsi = d_port_to_gsi(d_port);
  607. bool block_db = true;
  608. log_event_dbg("%s: Disable eps", __func__);
  609. if (gsi->d_port.in_ep)
  610. usb_gsi_ep_op(gsi->d_port.in_ep,
  611. &gsi->d_port.in_request, GSI_EP_OP_DISABLE);
  612. if (gsi->d_port.out_ep)
  613. usb_gsi_ep_op(gsi->d_port.out_ep,
  614. &gsi->d_port.out_request, GSI_EP_OP_DISABLE);
  615. if (gsi->d_port.in_ep)
  616. usb_gsi_ep_op(d_port->in_ep, (void *)&block_db,
  617. GSI_EP_OP_SET_CLR_BLOCK_DBL);
  618. }
  619. static void ipa_disconnect_channel(struct gsi_data_port *d_port)
  620. {
  621. int ret;
  622. struct f_gsi *gsi = d_port_to_gsi(d_port);
  623. log_event_dbg("%s: Calling xdci_disconnect", __func__);
  624. ret = d_port->ipa_ops->xdci_disconnect(gsi->d_port.out_channel_handle,
  625. gsi->d_port.in_channel_handle, gsi->prot_id);
  626. if (ret)
  627. log_event_err("%s: IPA disconnect failed %d",
  628. __func__, ret);
  629. log_event_dbg("%s: xdci_disconnect done", __func__);
  630. /* invalidate channel handles*/
  631. gsi->d_port.in_channel_handle = -EINVAL;
  632. gsi->d_port.out_channel_handle = -EINVAL;
  633. if (gsi->d_port.in_ep) {
  634. usb_gsi_ep_op(gsi->d_port.in_ep, &gsi->d_port.in_request,
  635. GSI_EP_OP_FREE_TRBS);
  636. msm_ep_set_mode(gsi->d_port.in_ep, USB_EP_NONE);
  637. }
  638. if (gsi->d_port.out_ep) {
  639. usb_gsi_ep_op(gsi->d_port.out_ep, &gsi->d_port.out_request,
  640. GSI_EP_OP_FREE_TRBS);
  641. msm_ep_set_mode(gsi->d_port.out_ep, USB_EP_NONE);
  642. }
  643. }
  644. static int ipa_suspend_work_handler(struct gsi_data_port *d_port)
  645. {
  646. int ret = 0;
  647. bool block_db, f_suspend;
  648. struct f_gsi *gsi = d_port_to_gsi(d_port);
  649. struct usb_function *f = &gsi->function;
  650. f_suspend = gsi->func_wakeup_allowed;
  651. log_event_dbg("%s: f_suspend:%d", __func__, f_suspend);
  652. if (!usb_gsi_ep_op(gsi->d_port.in_ep, (void *) &f_suspend,
  653. GSI_EP_OP_CHECK_FOR_SUSPEND)) {
  654. ret = -EFAULT;
  655. block_db = false;
  656. usb_gsi_ep_op(d_port->in_ep, (void *)&block_db,
  657. GSI_EP_OP_SET_CLR_BLOCK_DBL);
  658. goto done;
  659. }
  660. log_event_dbg("%s: Calling xdci_suspend", __func__);
  661. ret = d_port->ipa_ops->xdci_suspend(gsi->d_port.out_channel_handle,
  662. gsi->d_port.in_channel_handle, gsi->prot_id,
  663. usb_gsi_remote_wakeup_allowed(f));
  664. if (!ret) {
  665. d_port->sm_state = STATE_SUSPENDED;
  666. log_event_dbg("%s: STATE SUSPENDED", __func__);
  667. goto done;
  668. }
  669. if (ret == -EFAULT) {
  670. block_db = false;
  671. usb_gsi_ep_op(d_port->in_ep, (void *)&block_db,
  672. GSI_EP_OP_SET_CLR_BLOCK_DBL);
  673. gsi_wakeup_host(gsi);
  674. } else if (ret == -EINPROGRESS) {
  675. d_port->sm_state = STATE_SUSPEND_IN_PROGRESS;
  676. } else {
  677. log_event_err("%s: Error %d for %d", __func__, ret,
  678. gsi->prot_id);
  679. }
  680. done:
  681. log_event_dbg("%s: xdci_suspend ret %d", __func__, ret);
  682. return ret;
  683. }
  684. static void ipa_resume_work_handler(struct gsi_data_port *d_port)
  685. {
  686. bool block_db;
  687. struct f_gsi *gsi = d_port_to_gsi(d_port);
  688. int ret;
  689. log_event_dbg("%s: Calling xdci_resume", __func__);
  690. ret = d_port->ipa_ops->xdci_resume(gsi->d_port.out_channel_handle,
  691. gsi->d_port.in_channel_handle,
  692. gsi->prot_id);
  693. if (ret)
  694. log_event_dbg("%s: xdci_resume ret %d", __func__, ret);
  695. log_event_dbg("%s: xdci_resume done", __func__);
  696. block_db = false;
  697. usb_gsi_ep_op(d_port->in_ep, (void *)&block_db,
  698. GSI_EP_OP_SET_CLR_BLOCK_DBL);
  699. }
  700. static int gsi_ep_enable(struct f_gsi *gsi)
  701. {
  702. int ret;
  703. if (gsi->d_port.in_ep && !gsi->d_port.in_ep->desc) {
  704. ret = config_ep_by_speed(gsi->d_port.gadget, &gsi->function,
  705. gsi->d_port.in_ep);
  706. if (ret)
  707. return ret;
  708. log_event_dbg("%s: Enable IN ep", __func__);
  709. ret = usb_gsi_ep_op(gsi->d_port.in_ep,
  710. &gsi->d_port.in_request, GSI_EP_OP_CONFIG);
  711. if (ret)
  712. return ret;
  713. }
  714. if (gsi->d_port.out_ep && !gsi->d_port.out_ep->desc) {
  715. ret = config_ep_by_speed(gsi->d_port.gadget, &gsi->function,
  716. gsi->d_port.out_ep);
  717. if (ret)
  718. return ret;
  719. log_event_dbg("%s: Enable OUT ep", __func__);
  720. ret = usb_gsi_ep_op(gsi->d_port.out_ep,
  721. &gsi->d_port.out_request, GSI_EP_OP_CONFIG);
  722. if (ret) {
  723. if (gsi->d_port.in_ep)
  724. usb_gsi_ep_op(gsi->d_port.in_ep,
  725. &gsi->d_port.in_request,
  726. GSI_EP_OP_DISABLE);
  727. return ret;
  728. }
  729. }
  730. return 0;
  731. }
  732. static void ipa_work_handler(struct work_struct *w)
  733. {
  734. struct gsi_data_port *d_port = container_of(w, struct gsi_data_port,
  735. usb_ipa_w.work);
  736. u8 event;
  737. int ret = 0;
  738. struct usb_gadget *gadget = d_port->gadget;
  739. struct device *dev;
  740. struct device *gad_dev;
  741. struct f_gsi *gsi = d_port_to_gsi(d_port);
  742. bool block_db;
  743. event = read_event(d_port);
  744. log_event_dbg("%s: event = %x sm_state %x", __func__,
  745. event, d_port->sm_state);
  746. if (gadget) {
  747. dev = &gadget->dev;
  748. if (!dev || !dev->parent) {
  749. log_event_err("%s(): dev or dev->parent is NULL.\n",
  750. __func__);
  751. return;
  752. }
  753. gad_dev = dev->parent;
  754. } else {
  755. log_event_err("%s(): gadget is NULL.\n", __func__);
  756. return;
  757. }
  758. switch (d_port->sm_state) {
  759. case STATE_UNINITIALIZED:
  760. break;
  761. case STATE_INITIALIZED:
  762. if (event == EVT_SET_ALT) {
  763. if (!atomic_read(&gsi->connected)) {
  764. log_event_err("USB cable not connected\n");
  765. break;
  766. }
  767. usb_gadget_autopm_get(d_port->gadget);
  768. log_event_dbg("%s: get = %d", __func__,
  769. atomic_read(&gad_dev->power.usage_count));
  770. /* Configure EPs for GSI */
  771. ret = gsi_ep_enable(gsi);
  772. if (ret) {
  773. log_event_err("%s:ep enable err %d", __func__,
  774. ret);
  775. usb_composite_setup_continue(gsi->d_port.cdev);
  776. usb_gadget_autopm_put_async(d_port->gadget);
  777. break;
  778. }
  779. usb_composite_setup_continue(gsi->d_port.cdev);
  780. /*
  781. * Skip rest for RNDIS and wait for EVT_HOST_READY
  782. * which is invoked when the host sends the
  783. * GEN_CURRENT_PACKET_FILTER message.
  784. */
  785. if (gsi->prot_id == IPA_USB_RNDIS) {
  786. d_port->sm_state = STATE_HOST_NRDY;
  787. usb_gadget_autopm_put_async(d_port->gadget);
  788. break;
  789. }
  790. ret = ipa_connect_channels(d_port);
  791. if (ret) {
  792. log_event_err("%s: ipa_connect_channels failed\n",
  793. __func__);
  794. ipa_data_path_disable(d_port);
  795. usb_gadget_autopm_put_async(d_port->gadget);
  796. d_port->sm_state = STATE_INITIALIZED;
  797. break;
  798. }
  799. d_port->sm_state = STATE_WAIT_FOR_IPA_RDY;
  800. log_event_dbg("%s: ST_INIT_EVT_SET_ALT",
  801. __func__);
  802. }
  803. break;
  804. case STATE_WAIT_FOR_IPA_RDY:
  805. if (event == EVT_IPA_READY) {
  806. if (peek_event(d_port) == EVT_SUSPEND) {
  807. log_event_dbg("%s: ST_WAIT_IPARDY_EVT_SUSPEND",
  808. __func__);
  809. break;
  810. }
  811. ipa_data_path_enable(d_port);
  812. d_port->sm_state = STATE_CONNECTED;
  813. log_event_dbg("%s: ST_WAIT_IPARDY_EVT_IPARDY %d",
  814. __func__, __LINE__);
  815. } else if (event == EVT_SUSPEND) {
  816. if (peek_event(d_port) == EVT_DISCONNECTED) {
  817. read_event(d_port);
  818. ipa_data_path_disable(d_port);
  819. ipa_disconnect_channel(d_port);
  820. d_port->sm_state = STATE_INITIALIZED;
  821. usb_gadget_autopm_put_async(d_port->gadget);
  822. log_event_dbg("%s: ST_WAIT_IPARDY_EVT_SUS_DIS",
  823. __func__);
  824. log_event_dbg("%s: put_async1 = %d", __func__,
  825. atomic_read(
  826. &gad_dev->power.usage_count));
  827. break;
  828. }
  829. ret = ipa_suspend_work_handler(d_port);
  830. if (!ret) {
  831. usb_gadget_autopm_put_async(d_port->gadget);
  832. log_event_dbg("%s: ST_WAIT_IPARDY_EVT_SUS",
  833. __func__);
  834. log_event_dbg("%s: put_async2 = %d", __func__,
  835. atomic_read(
  836. &gad_dev->power.usage_count));
  837. }
  838. } else if (event == EVT_DISCONNECTED) {
  839. ipa_data_path_disable(d_port);
  840. ipa_disconnect_channel(d_port);
  841. d_port->sm_state = STATE_INITIALIZED;
  842. usb_gadget_autopm_put_async(d_port->gadget);
  843. log_event_dbg("%s: ST_WAIT_IPARDY_EVT_DIS",
  844. __func__);
  845. log_event_dbg("%s: put_async3 = %d",
  846. __func__, atomic_read(
  847. &gad_dev->power.usage_count));
  848. }
  849. break;
  850. case STATE_CONNECTED:
  851. if (event == EVT_DISCONNECTED || event == EVT_HOST_NRDY) {
  852. if (peek_event(d_port) == EVT_HOST_READY) {
  853. read_event(d_port);
  854. log_event_dbg("%s: NO_OP NRDY_RDY", __func__);
  855. break;
  856. }
  857. if (event == EVT_HOST_NRDY) {
  858. log_event_dbg("%s: ST_CON_HOST_NRDY\n",
  859. __func__);
  860. block_db = true;
  861. /* stop USB ringing doorbell to GSI(OUT_EP) */
  862. usb_gsi_ep_op(d_port->in_ep, (void *)&block_db,
  863. GSI_EP_OP_SET_CLR_BLOCK_DBL);
  864. gsi_rndis_ipa_reset_trigger(d_port);
  865. usb_gsi_ep_op(d_port->in_ep, NULL,
  866. GSI_EP_OP_ENDXFER);
  867. usb_gsi_ep_op(d_port->out_ep, NULL,
  868. GSI_EP_OP_ENDXFER);
  869. /*
  870. * don't disable endpoints for RNDIS flow
  871. * control enable
  872. */
  873. ipa_disconnect_channel(d_port);
  874. d_port->sm_state = STATE_HOST_NRDY;
  875. log_event_dbg("%s: ST_CON_EVT_HNRDY", __func__);
  876. } else {
  877. ipa_data_path_disable(d_port);
  878. ipa_disconnect_channel(d_port);
  879. d_port->sm_state = STATE_INITIALIZED;
  880. log_event_dbg("%s: ST_CON_EVT_DIS", __func__);
  881. }
  882. usb_gadget_autopm_put_async(d_port->gadget);
  883. log_event_dbg("%s: put_async4 = %d",
  884. __func__, atomic_read(
  885. &gad_dev->power.usage_count));
  886. } else if (event == EVT_SUSPEND) {
  887. if (peek_event(d_port) == EVT_DISCONNECTED) {
  888. read_event(d_port);
  889. ipa_data_path_disable(d_port);
  890. ipa_disconnect_channel(d_port);
  891. d_port->sm_state = STATE_INITIALIZED;
  892. usb_gadget_autopm_put_async(d_port->gadget);
  893. log_event_dbg("%s: ST_CON_EVT_SUS_DIS",
  894. __func__);
  895. log_event_dbg("%s: put_async5 = %d",
  896. __func__, atomic_read(
  897. &gad_dev->power.usage_count));
  898. break;
  899. }
  900. ret = ipa_suspend_work_handler(d_port);
  901. if (!ret) {
  902. usb_gadget_autopm_put_async(d_port->gadget);
  903. log_event_dbg("%s: ST_CON_EVT_SUS",
  904. __func__);
  905. log_event_dbg("%s: put_async6 = %d",
  906. __func__, atomic_read(
  907. &gad_dev->power.usage_count));
  908. }
  909. }
  910. break;
  911. case STATE_HOST_NRDY:
  912. if (event == EVT_DISCONNECTED) {
  913. usb_gadget_autopm_get(d_port->gadget);
  914. ipa_data_path_disable(d_port);
  915. d_port->sm_state = STATE_INITIALIZED;
  916. usb_gadget_autopm_put_async(d_port->gadget);
  917. log_event_dbg("%s: ST_HOST_NRDY_EVT_DIS", __func__);
  918. log_event_dbg("%s: put_async = %d",
  919. __func__, atomic_read(
  920. &gad_dev->power.usage_count));
  921. } else if (event == EVT_HOST_READY) {
  922. /*
  923. * When in a composition such as RNDIS + ADB,
  924. * RNDIS host sends a GEN_CURRENT_PACKET_FILTER msg
  925. * to enable/disable flow control eg. during RNDIS
  926. * adaptor disable/enable from device manager.
  927. * In the case of the msg to disable flow control,
  928. * connect IPA channels and enable data path.
  929. * EVT_HOST_READY is posted to the state machine
  930. * in the handler for this msg.
  931. */
  932. usb_gadget_autopm_get(d_port->gadget);
  933. log_event_dbg("%s: get = %d", __func__,
  934. atomic_read(&gad_dev->power.usage_count));
  935. ret = ipa_connect_channels(d_port);
  936. if (ret) {
  937. log_event_err("%s: ipa_connect_channels failed\n",
  938. __func__);
  939. usb_gadget_autopm_put_async(d_port->gadget);
  940. break;
  941. }
  942. ipa_data_path_enable(d_port);
  943. d_port->sm_state = STATE_CONNECTED;
  944. log_event_dbg("%s: ST_HOST_NRDY_EVT_HRDY_", __func__);
  945. }
  946. break;
  947. case STATE_SUSPEND_IN_PROGRESS:
  948. if (event == EVT_IPA_SUSPEND) {
  949. d_port->sm_state = STATE_SUSPENDED;
  950. usb_gadget_autopm_put_async(d_port->gadget);
  951. log_event_dbg("%s: ST_SUS_IN_PROG_EVT_IPA_SUS",
  952. __func__);
  953. log_event_dbg("%s: put_async6 = %d",
  954. __func__, atomic_read(
  955. &gad_dev->power.usage_count));
  956. } else if (event == EVT_RESUMED) {
  957. ipa_resume_work_handler(d_port);
  958. d_port->sm_state = STATE_CONNECTED;
  959. /*
  960. * Increment usage count here to disallow gadget
  961. * parent suspend. This counter will decrement
  962. * after IPA disconnect is done in disconnect work
  963. * (due to cable disconnect) or in suspended state.
  964. */
  965. usb_gadget_autopm_get_noresume(d_port->gadget);
  966. log_event_dbg("%s: ST_SUS_IN_PROG_EVT_RES", __func__);
  967. log_event_dbg("%s: get_nores1 = %d", __func__,
  968. atomic_read(
  969. &gad_dev->power.usage_count));
  970. } else if (event == EVT_DISCONNECTED) {
  971. ipa_data_path_disable(d_port);
  972. ipa_disconnect_channel(d_port);
  973. d_port->sm_state = STATE_INITIALIZED;
  974. usb_gadget_autopm_put_async(d_port->gadget);
  975. log_event_dbg("%s: ST_SUS_IN_PROG_EVT_DIS", __func__);
  976. log_event_dbg("%s: put_async7 = %d", __func__,
  977. atomic_read(
  978. &gad_dev->power.usage_count));
  979. }
  980. break;
  981. case STATE_SUSPENDED:
  982. if (event == EVT_RESUMED) {
  983. usb_gadget_autopm_get(d_port->gadget);
  984. log_event_dbg("%s: ST_SUS_EVT_RES", __func__);
  985. log_event_dbg("%s: get = %d", __func__,
  986. atomic_read(&gad_dev->power.usage_count));
  987. ipa_resume_work_handler(d_port);
  988. d_port->sm_state = STATE_CONNECTED;
  989. } else if (event == EVT_DISCONNECTED) {
  990. usb_gadget_autopm_get(d_port->gadget);
  991. ipa_data_path_disable(d_port);
  992. ipa_disconnect_channel(d_port);
  993. d_port->sm_state = STATE_INITIALIZED;
  994. log_event_dbg("%s: ST_SUS_EVT_DIS", __func__);
  995. usb_gadget_autopm_put_async(d_port->gadget);
  996. }
  997. break;
  998. default:
  999. log_event_dbg("%s: Invalid state to SM", __func__);
  1000. }
  1001. if (peek_event(d_port) != EVT_NONE) {
  1002. log_event_dbg("%s: New events to process", __func__);
  1003. queue_delayed_work(d_port->ipa_usb_wq, &d_port->usb_ipa_w, 0);
  1004. }
  1005. }
  1006. static struct gsi_ctrl_pkt *gsi_ctrl_pkt_alloc(unsigned int len, gfp_t flags)
  1007. {
  1008. struct gsi_ctrl_pkt *pkt;
  1009. pkt = kzalloc(sizeof(struct gsi_ctrl_pkt), flags);
  1010. if (!pkt)
  1011. return ERR_PTR(-ENOMEM);
  1012. pkt->buf = kmalloc(len, flags);
  1013. if (!pkt->buf) {
  1014. kfree(pkt);
  1015. return ERR_PTR(-ENOMEM);
  1016. }
  1017. pkt->len = len;
  1018. return pkt;
  1019. }
  1020. static void gsi_ctrl_pkt_free(struct gsi_ctrl_pkt *pkt)
  1021. {
  1022. if (pkt) {
  1023. kfree(pkt->buf);
  1024. kfree(pkt);
  1025. }
  1026. }
  1027. static void gsi_ctrl_clear_cpkt_queues(struct f_gsi *gsi, bool skip_req_q)
  1028. {
  1029. struct gsi_ctrl_pkt *cpkt = NULL;
  1030. struct list_head *act, *tmp;
  1031. unsigned long flags;
  1032. spin_lock_irqsave(&gsi->c_port.lock, flags);
  1033. if (skip_req_q)
  1034. goto clean_resp_q;
  1035. list_for_each_safe(act, tmp, &gsi->c_port.cpkt_req_q) {
  1036. cpkt = list_entry(act, struct gsi_ctrl_pkt, list);
  1037. list_del(&cpkt->list);
  1038. gsi_ctrl_pkt_free(cpkt);
  1039. }
  1040. clean_resp_q:
  1041. list_for_each_safe(act, tmp, &gsi->c_port.cpkt_resp_q) {
  1042. cpkt = list_entry(act, struct gsi_ctrl_pkt, list);
  1043. list_del(&cpkt->list);
  1044. gsi_ctrl_pkt_free(cpkt);
  1045. }
  1046. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1047. }
  1048. static int gsi_ctrl_send_cpkt_tomodem(struct f_gsi *gsi, void *buf, size_t len)
  1049. {
  1050. unsigned long flags;
  1051. struct gsi_ctrl_port *c_port = &gsi->c_port;
  1052. struct gsi_ctrl_pkt *cpkt;
  1053. spin_lock_irqsave(&c_port->lock, flags);
  1054. /* drop cpkt if port is not open */
  1055. if (!gsi->c_port.is_open) {
  1056. log_event_dbg("%s: ctrl device %s is not open",
  1057. __func__, gsi->c_port.name);
  1058. c_port->cpkt_drop_cnt++;
  1059. spin_unlock_irqrestore(&c_port->lock, flags);
  1060. return -ENODEV;
  1061. }
  1062. cpkt = gsi_ctrl_pkt_alloc(len, GFP_ATOMIC);
  1063. if (IS_ERR(cpkt)) {
  1064. log_event_err("%s: Reset func pkt allocation failed", __func__);
  1065. spin_unlock_irqrestore(&c_port->lock, flags);
  1066. return -ENOMEM;
  1067. }
  1068. memcpy(cpkt->buf, buf, len);
  1069. cpkt->len = len;
  1070. list_add_tail(&cpkt->list, &c_port->cpkt_req_q);
  1071. c_port->host_to_modem++;
  1072. spin_unlock_irqrestore(&c_port->lock, flags);
  1073. log_event_dbg("%s: Wake up read queue", __func__);
  1074. wake_up(&c_port->read_wq);
  1075. return 0;
  1076. }
  1077. static int gsi_ctrl_dev_open(struct inode *ip, struct file *fp)
  1078. {
  1079. struct gsi_ctrl_port *c_port = container_of(ip->i_cdev,
  1080. struct gsi_ctrl_port, cdev);
  1081. struct f_gsi *gsi;
  1082. struct gsi_inst_status *inst_cur;
  1083. if (!c_port) {
  1084. pr_err_ratelimited("%s: gsi ctrl port %pK\n", __func__, c_port);
  1085. return -ENODEV;
  1086. }
  1087. gsi = container_of(c_port, struct f_gsi, c_port);
  1088. inst_cur = &inst_status[gsi->prot_id];
  1089. log_event_dbg("%s: open ctrl dev %s", __func__, c_port->name);
  1090. mutex_lock(&inst_cur->gsi_lock);
  1091. fp->private_data = &gsi->prot_id;
  1092. if (!inst_cur->inst_exist) {
  1093. mutex_unlock(&inst_cur->gsi_lock);
  1094. log_event_err("%s: [prot_id = %d], GSI instance freed already\n",
  1095. __func__, gsi->prot_id);
  1096. return -ENODEV;
  1097. }
  1098. if (c_port->is_open) {
  1099. mutex_unlock(&inst_cur->gsi_lock);
  1100. log_event_dbg("%s: Already opened\n", __func__);
  1101. return -EBUSY;
  1102. }
  1103. c_port->is_open = true;
  1104. mutex_unlock(&inst_cur->gsi_lock);
  1105. return 0;
  1106. }
  1107. static int gsi_ctrl_dev_release(struct inode *ip, struct file *fp)
  1108. {
  1109. enum ipa_usb_teth_prot prot_id =
  1110. *(enum ipa_usb_teth_prot *)(fp->private_data);
  1111. struct gsi_inst_status *inst_cur = &inst_status[prot_id];
  1112. struct f_gsi *gsi;
  1113. mutex_lock(&inst_cur->gsi_lock);
  1114. if (unlikely(!inst_cur->inst_exist)) {
  1115. if (inst_cur->opts) {
  1116. /* GSI instance clean up */
  1117. gsi_inst_clean(inst_cur->opts);
  1118. inst_cur->opts = NULL;
  1119. }
  1120. mutex_unlock(&inst_cur->gsi_lock);
  1121. pr_err_ratelimited("%s: prot_id:%d: delayed free memory\n",
  1122. __func__, prot_id);
  1123. return -ENODEV;
  1124. }
  1125. inst_cur->opts->gsi->c_port.is_open = false;
  1126. gsi = inst_cur->opts->gsi;
  1127. mutex_unlock(&inst_cur->gsi_lock);
  1128. log_event_dbg("close ctrl dev %s\n",
  1129. inst_cur->opts->gsi->c_port.name);
  1130. return 0;
  1131. }
  1132. static ssize_t
  1133. gsi_ctrl_dev_read(struct file *fp, char __user *buf, size_t count, loff_t *pos)
  1134. {
  1135. struct gsi_ctrl_port *c_port;
  1136. struct gsi_ctrl_pkt *cpkt = NULL;
  1137. enum ipa_usb_teth_prot prot_id =
  1138. *(enum ipa_usb_teth_prot *)(fp->private_data);
  1139. struct gsi_inst_status *inst_cur = &inst_status[prot_id];
  1140. struct f_gsi *gsi;
  1141. unsigned long flags;
  1142. int ret = 0;
  1143. pr_debug("%s: Enter %zu\n", __func__, count);
  1144. mutex_lock(&inst_cur->gsi_lock);
  1145. if (unlikely(!inst_cur->inst_exist)) {
  1146. mutex_unlock(&inst_cur->gsi_lock);
  1147. pr_err_ratelimited("%s: free_inst is called and being freed\n",
  1148. __func__);
  1149. return -ENODEV;
  1150. }
  1151. mutex_unlock(&inst_cur->gsi_lock);
  1152. gsi = inst_cur->opts->gsi;
  1153. c_port = &inst_cur->opts->gsi->c_port;
  1154. if (!c_port) {
  1155. log_event_err("%s: gsi ctrl port %pK", __func__, c_port);
  1156. return -ENODEV;
  1157. }
  1158. if (count > GSI_MAX_CTRL_PKT_SIZE) {
  1159. log_event_err("Large buff size %zu, should be %d",
  1160. count, GSI_MAX_CTRL_PKT_SIZE);
  1161. return -EINVAL;
  1162. }
  1163. /* block until a new packet is available */
  1164. spin_lock_irqsave(&c_port->lock, flags);
  1165. while (list_empty(&c_port->cpkt_req_q)) {
  1166. log_event_dbg("Requests list is empty. Wait.");
  1167. spin_unlock_irqrestore(&c_port->lock, flags);
  1168. ret = wait_event_interruptible(c_port->read_wq,
  1169. !list_empty(&c_port->cpkt_req_q));
  1170. if (ret < 0) {
  1171. log_event_err("Waiting failed");
  1172. return -ERESTARTSYS;
  1173. }
  1174. log_event_dbg("Received request packet");
  1175. spin_lock_irqsave(&c_port->lock, flags);
  1176. }
  1177. cpkt = list_first_entry(&c_port->cpkt_req_q, struct gsi_ctrl_pkt,
  1178. list);
  1179. list_del(&cpkt->list);
  1180. spin_unlock_irqrestore(&c_port->lock, flags);
  1181. if (cpkt->len > count) {
  1182. log_event_err("cpkt size large:%d > buf size:%zu",
  1183. cpkt->len, count);
  1184. gsi_ctrl_pkt_free(cpkt);
  1185. return -ENOMEM;
  1186. }
  1187. log_event_dbg("%s: cpkt size:%d", __func__, cpkt->len);
  1188. if (debugfs.qti_packet_debug)
  1189. print_hex_dump(KERN_DEBUG, "READ:", DUMP_PREFIX_OFFSET, 16, 1,
  1190. cpkt->buf, min_t(int, 30, cpkt->len), false);
  1191. ret = copy_to_user(buf, cpkt->buf, cpkt->len);
  1192. if (ret) {
  1193. log_event_err("copy_to_user failed: err %d", ret);
  1194. ret = -EFAULT;
  1195. } else {
  1196. log_event_dbg("%s: copied %d bytes to user", __func__,
  1197. cpkt->len);
  1198. ret = cpkt->len;
  1199. c_port->copied_to_modem++;
  1200. }
  1201. gsi_ctrl_pkt_free(cpkt);
  1202. log_event_dbg("%s: Exit %zu", __func__, count);
  1203. return ret;
  1204. }
  1205. static ssize_t gsi_ctrl_dev_write(struct file *fp, const char __user *buf,
  1206. size_t count, loff_t *pos)
  1207. {
  1208. int ret = 0;
  1209. unsigned long flags;
  1210. struct gsi_ctrl_pkt *cpkt;
  1211. struct gsi_ctrl_port *c_port;
  1212. enum ipa_usb_teth_prot prot_id =
  1213. *(enum ipa_usb_teth_prot *)(fp->private_data);
  1214. struct gsi_inst_status *inst_cur = &inst_status[prot_id];
  1215. struct f_gsi *gsi;
  1216. if (prot_id == IPA_USB_DIAG)
  1217. return -EINVAL;
  1218. pr_debug("Enter %zu\n", count);
  1219. mutex_lock(&inst_cur->gsi_lock);
  1220. if (unlikely(!inst_cur->inst_exist)) {
  1221. mutex_unlock(&inst_cur->gsi_lock);
  1222. pr_err_ratelimited("%s: free_inst is called and being freed\n",
  1223. __func__);
  1224. return -ENODEV;
  1225. }
  1226. mutex_unlock(&inst_cur->gsi_lock);
  1227. gsi = inst_cur->opts->gsi;
  1228. c_port = &gsi->c_port;
  1229. if (!count || count > GSI_MAX_CTRL_PKT_SIZE) {
  1230. log_event_err("error: ctrl pkt length %zu", count);
  1231. return -EINVAL;
  1232. }
  1233. if (!atomic_read(&gsi->connected)) {
  1234. log_event_err("USB cable not connected\n");
  1235. return -ECONNRESET;
  1236. }
  1237. if (gsi->func_is_suspended && !gsi->func_wakeup_allowed) {
  1238. c_port->cpkt_drop_cnt++;
  1239. log_event_err("drop ctrl pkt of len %zu", count);
  1240. return -EOPNOTSUPP;
  1241. }
  1242. cpkt = gsi_ctrl_pkt_alloc(count, GFP_KERNEL);
  1243. if (IS_ERR(cpkt)) {
  1244. log_event_err("failed to allocate ctrl pkt");
  1245. return -ENOMEM;
  1246. }
  1247. ret = copy_from_user(cpkt->buf, buf, count);
  1248. if (ret) {
  1249. log_event_err("copy_from_user failed err:%d", ret);
  1250. gsi_ctrl_pkt_free(cpkt);
  1251. return ret;
  1252. }
  1253. cpkt->type = GSI_CTRL_NOTIFY_RESPONSE_AVAILABLE;
  1254. c_port->copied_from_modem++;
  1255. if (debugfs.qti_packet_debug)
  1256. print_hex_dump(KERN_DEBUG, "WRITE:", DUMP_PREFIX_OFFSET, 16, 1,
  1257. cpkt->buf, min_t(int, 30, count), false);
  1258. spin_lock_irqsave(&c_port->lock, flags);
  1259. list_add_tail(&cpkt->list, &c_port->cpkt_resp_q);
  1260. spin_unlock_irqrestore(&c_port->lock, flags);
  1261. if (!gsi_ctrl_send_notification(gsi))
  1262. c_port->modem_to_host++;
  1263. log_event_dbg("Exit %zu", count);
  1264. return ret ? ret : count;
  1265. }
  1266. static long gsi_ctrl_dev_ioctl(struct file *fp, unsigned int cmd,
  1267. unsigned long arg)
  1268. {
  1269. struct gsi_ctrl_port *c_port;
  1270. struct f_gsi *gsi;
  1271. struct gsi_ctrl_pkt *cpkt;
  1272. struct ep_info info;
  1273. struct data_buf_info data_info = {0};
  1274. enum ipa_usb_teth_prot prot_id =
  1275. *(enum ipa_usb_teth_prot *)(fp->private_data);
  1276. struct gsi_inst_status *inst_cur = &inst_status[prot_id];
  1277. int val, ret = 0;
  1278. unsigned long flags;
  1279. mutex_lock(&inst_cur->gsi_lock);
  1280. if (unlikely(!inst_cur->inst_exist)) {
  1281. mutex_unlock(&inst_cur->gsi_lock);
  1282. pr_err_ratelimited("%s: free_inst is called and being freed\n",
  1283. __func__);
  1284. return -ENODEV;
  1285. }
  1286. mutex_unlock(&inst_cur->gsi_lock);
  1287. gsi = inst_cur->opts->gsi;
  1288. c_port = &gsi->c_port;
  1289. if (!atomic_read(&gsi->connected) && cmd != QTI_CTRL_GET_LINE_STATE
  1290. && cmd != GSI_MBIM_GPS_USB_STATUS) {
  1291. log_event_err("%s:cmd %u failed, USB not connected\n",
  1292. __func__, cmd);
  1293. return -ECONNRESET;
  1294. }
  1295. switch (cmd) {
  1296. case QTI_CTRL_MODEM_OFFLINE:
  1297. if (gsi->prot_id == IPA_USB_DIAG) {
  1298. log_event_dbg("%s:Modem Offline not handled", __func__);
  1299. goto exit_ioctl;
  1300. }
  1301. atomic_set(&c_port->ctrl_online, 0);
  1302. gsi_ctrl_clear_cpkt_queues(gsi, true);
  1303. cpkt = gsi_ctrl_pkt_alloc(0, GFP_KERNEL);
  1304. if (IS_ERR(cpkt)) {
  1305. log_event_err("%s: err allocating cpkt\n", __func__);
  1306. return -ENOMEM;
  1307. }
  1308. cpkt->type = GSI_CTRL_NOTIFY_OFFLINE;
  1309. spin_lock_irqsave(&c_port->lock, flags);
  1310. list_add_tail(&cpkt->list, &c_port->cpkt_resp_q);
  1311. spin_unlock_irqrestore(&c_port->lock, flags);
  1312. gsi_ctrl_send_notification(gsi);
  1313. break;
  1314. case QTI_CTRL_MODEM_ONLINE:
  1315. if (gsi->prot_id == IPA_USB_DIAG) {
  1316. log_event_dbg("%s:Modem Online not handled", __func__);
  1317. goto exit_ioctl;
  1318. }
  1319. atomic_set(&c_port->ctrl_online, 1);
  1320. break;
  1321. case QTI_CTRL_GET_LINE_STATE:
  1322. val = atomic_read(&gsi->connected);
  1323. if (gsi->prot_id == IPA_USB_RMNET)
  1324. val = gsi->rmnet_dtr_status;
  1325. ret = copy_to_user((void __user *)arg, &val, sizeof(val));
  1326. if (ret) {
  1327. log_event_err("copy_to_user fail LINE_STATE");
  1328. ret = -EFAULT;
  1329. }
  1330. log_event_dbg("%s: Sent line_state: %d for prot id:%d",
  1331. __func__, val, gsi->prot_id);
  1332. break;
  1333. case QTI_CTRL_EP_LOOKUP:
  1334. case GSI_MBIM_EP_LOOKUP:
  1335. log_event_dbg("%s: EP_LOOKUP for prot id:%d", __func__,
  1336. gsi->prot_id);
  1337. if (gsi->prot_id == IPA_USB_DIAG &&
  1338. (gsi->d_port.in_channel_handle == -EINVAL)) {
  1339. ret = -EAGAIN;
  1340. break;
  1341. }
  1342. if (gsi->d_port.in_channel_handle == -EINVAL &&
  1343. gsi->d_port.out_channel_handle == -EINVAL) {
  1344. ret = -EAGAIN;
  1345. break;
  1346. }
  1347. info.ph_ep_info.ep_type = GSI_MBIM_DATA_EP_TYPE_HSUSB;
  1348. info.ph_ep_info.peripheral_iface_id = gsi->data_id;
  1349. info.ipa_ep_pair.cons_pipe_num =
  1350. (gsi->prot_id == IPA_USB_DIAG) ? -1 :
  1351. gsi->d_port.out_channel_handle;
  1352. info.ipa_ep_pair.prod_pipe_num = gsi->d_port.in_channel_handle;
  1353. log_event_dbg("%s: prot id :%d ep_type:%d intf:%d",
  1354. __func__, gsi->prot_id, info.ph_ep_info.ep_type,
  1355. info.ph_ep_info.peripheral_iface_id);
  1356. log_event_dbg("%s: ipa_cons_idx:%d ipa_prod_idx:%d",
  1357. __func__, info.ipa_ep_pair.cons_pipe_num,
  1358. info.ipa_ep_pair.prod_pipe_num);
  1359. ret = copy_to_user((void __user *)arg, &info,
  1360. sizeof(info));
  1361. if (ret) {
  1362. log_event_err("copy_to_user fail MBIM");
  1363. ret = -EFAULT;
  1364. }
  1365. break;
  1366. case GSI_MBIM_GET_NTB_SIZE:
  1367. ret = copy_to_user((void __user *)arg,
  1368. &gsi->d_port.ntb_info.ntb_input_size,
  1369. sizeof(gsi->d_port.ntb_info.ntb_input_size));
  1370. if (ret) {
  1371. log_event_err("copy_to_user failNTB_SIZE");
  1372. ret = -EFAULT;
  1373. }
  1374. log_event_dbg("Sent NTB size %d",
  1375. gsi->d_port.ntb_info.ntb_input_size);
  1376. break;
  1377. case GSI_MBIM_GET_DATAGRAM_COUNT:
  1378. ret = copy_to_user((void __user *)arg,
  1379. &gsi->d_port.ntb_info.ntb_max_datagrams,
  1380. sizeof(gsi->d_port.ntb_info.ntb_max_datagrams));
  1381. if (ret) {
  1382. log_event_err("copy_to_user fail DATAGRAM");
  1383. ret = -EFAULT;
  1384. }
  1385. log_event_dbg("Sent NTB datagrams count %d",
  1386. gsi->d_port.ntb_info.ntb_max_datagrams);
  1387. break;
  1388. case QTI_CTRL_DATA_BUF_INFO:
  1389. if (gsi->d_port.out_ep) {
  1390. data_info.epout_buf_len =
  1391. gsi->d_port.out_request.buf_len;
  1392. data_info.epout_total_buf_len =
  1393. gsi->d_port.out_request.buf_len *
  1394. gsi->d_port.out_request.num_bufs;
  1395. log_event_dbg("prot id :%d OUT: buf_len:%u total_len: %u",
  1396. gsi->prot_id, data_info.epout_buf_len,
  1397. data_info.epout_total_buf_len);
  1398. }
  1399. if (gsi->d_port.in_ep) {
  1400. data_info.epin_buf_len =
  1401. gsi->d_port.in_request.buf_len;
  1402. data_info.epin_total_buf_len =
  1403. gsi->d_port.in_request.buf_len *
  1404. gsi->d_port.in_request.num_bufs;
  1405. log_event_dbg("prot id :%d IN: buf_len:%u total_len:%u\n",
  1406. gsi->prot_id, data_info.epin_buf_len,
  1407. data_info.epin_total_buf_len);
  1408. }
  1409. ret = copy_to_user((void __user *)arg, &data_info,
  1410. sizeof(data_info));
  1411. if (ret) {
  1412. log_event_err("QTI_CTRL_DATA_BUF_INFO: copy_to_user failed");
  1413. ret = -EFAULT;
  1414. }
  1415. break;
  1416. default:
  1417. log_event_err("wrong parameter");
  1418. ret = -EINVAL;
  1419. }
  1420. exit_ioctl:
  1421. return ret;
  1422. }
  1423. static __poll_t gsi_ctrl_dev_poll(struct file *fp, poll_table *wait)
  1424. {
  1425. struct gsi_ctrl_port *c_port;
  1426. enum ipa_usb_teth_prot prot_id =
  1427. *(enum ipa_usb_teth_prot *)(fp->private_data);
  1428. struct gsi_inst_status *inst_cur = &inst_status[prot_id];
  1429. struct f_gsi *gsi;
  1430. unsigned long flags;
  1431. __poll_t mask = 0;
  1432. mutex_lock(&inst_cur->gsi_lock);
  1433. if (unlikely(!inst_cur->inst_exist)) {
  1434. mutex_unlock(&inst_cur->gsi_lock);
  1435. pr_err_ratelimited("%s: free_inst is called and being freed\n",
  1436. __func__);
  1437. mask = EPOLLHUP;
  1438. goto out;
  1439. }
  1440. mutex_unlock(&inst_cur->gsi_lock);
  1441. gsi = inst_cur->opts->gsi;
  1442. c_port = &inst_cur->opts->gsi->c_port;
  1443. if (!c_port) {
  1444. log_event_err("%s: gsi ctrl port %pK", __func__, c_port);
  1445. mask = EPOLLHUP;
  1446. goto out;
  1447. }
  1448. poll_wait(fp, &c_port->read_wq, wait);
  1449. spin_lock_irqsave(&c_port->lock, flags);
  1450. if (!list_empty(&c_port->cpkt_req_q)) {
  1451. mask = EPOLLIN | EPOLLRDNORM;
  1452. log_event_dbg("%s sets POLLIN for %s", __func__, c_port->name);
  1453. }
  1454. spin_unlock_irqrestore(&c_port->lock, flags);
  1455. out:
  1456. return mask;
  1457. }
  1458. /* file operations for rmnet/mbim/dpl devices */
  1459. static const struct file_operations gsi_ctrl_dev_fops = {
  1460. .owner = THIS_MODULE,
  1461. .open = gsi_ctrl_dev_open,
  1462. .release = gsi_ctrl_dev_release,
  1463. .read = gsi_ctrl_dev_read,
  1464. .write = gsi_ctrl_dev_write,
  1465. .unlocked_ioctl = gsi_ctrl_dev_ioctl,
  1466. #ifdef CONFIG_COMPAT
  1467. .compat_ioctl = gsi_ctrl_dev_ioctl,
  1468. #endif
  1469. .poll = gsi_ctrl_dev_poll,
  1470. };
  1471. /* peak (theoretical) bulk transfer rate in bits-per-second */
  1472. static unsigned int gsi_xfer_bitrate(struct usb_gadget *g)
  1473. {
  1474. if (gadget_is_superspeed(g) && g->speed >= USB_SPEED_SUPER)
  1475. return 13 * 1024 * 8 * 1000 * 8;
  1476. else if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
  1477. return 13 * 512 * 8 * 1000 * 8;
  1478. else
  1479. return 19 * 64 * 1 * 1000 * 8;
  1480. }
  1481. static int gsi_function_ctrl_port_init(struct f_gsi *gsi)
  1482. {
  1483. int ret;
  1484. int sz = GSI_CTRL_NAME_LEN;
  1485. int minor;
  1486. struct device *dev;
  1487. bool ctrl_dev_create = true;
  1488. if (!gsi) {
  1489. log_event_err("%s: gsi prot ctx is NULL", __func__);
  1490. return -EINVAL;
  1491. }
  1492. INIT_LIST_HEAD(&gsi->c_port.cpkt_req_q);
  1493. INIT_LIST_HEAD(&gsi->c_port.cpkt_resp_q);
  1494. spin_lock_init(&gsi->c_port.lock);
  1495. init_waitqueue_head(&gsi->c_port.read_wq);
  1496. if (gsi->prot_id == IPA_USB_RMNET)
  1497. strlcat(gsi->c_port.name, GSI_RMNET_CTRL_NAME, sz);
  1498. else if (gsi->prot_id == IPA_USB_MBIM)
  1499. strlcat(gsi->c_port.name, GSI_MBIM_CTRL_NAME, sz);
  1500. else if (gsi->prot_id == IPA_USB_DIAG)
  1501. strlcat(gsi->c_port.name, GSI_DPL_CTRL_NAME, sz);
  1502. else
  1503. ctrl_dev_create = false;
  1504. if (!ctrl_dev_create)
  1505. return 0;
  1506. minor = ida_simple_get(&gsi_ida, 0, MAX_CDEV_INSTANCES, GFP_KERNEL);
  1507. if (minor < 0) {
  1508. pr_err("%s: No more minor numbers left! rc:%d\n", __func__,
  1509. minor);
  1510. return minor;
  1511. }
  1512. cdev_init(&gsi->c_port.cdev, &gsi_ctrl_dev_fops);
  1513. ret = cdev_add(&gsi->c_port.cdev, MKDEV(major, minor), 1);
  1514. if (ret) {
  1515. log_event_err("%s: Failed to add cdev for (%s)\n", __func__,
  1516. gsi->c_port.name);
  1517. goto err_cdev_add;
  1518. }
  1519. dev = device_create(gsi_class, NULL, MKDEV(major, minor), NULL,
  1520. gsi->c_port.name);
  1521. if (IS_ERR(dev)) {
  1522. log_event_err("%s: device_create failed for (%s)\n", __func__,
  1523. gsi->c_port.name);
  1524. ret = PTR_ERR(dev);
  1525. goto err_create_dev;
  1526. }
  1527. return 0;
  1528. err_create_dev:
  1529. cdev_del(&gsi->c_port.cdev);
  1530. err_cdev_add:
  1531. ida_simple_remove(&gsi_ida, minor);
  1532. return ret;
  1533. }
  1534. static struct net_device *gsi_rndis_get_netdev(const char *netname)
  1535. {
  1536. struct net_device *net_dev;
  1537. net_dev = dev_get_by_name(&init_net, netname);
  1538. if (!net_dev)
  1539. return ERR_PTR(-EINVAL);
  1540. /*
  1541. * Decrement net_dev refcount as it was incremented in
  1542. * dev_get_by_name().
  1543. */
  1544. dev_put(net_dev);
  1545. return net_dev;
  1546. }
  1547. static void gsi_rndis_open(struct f_gsi *gsi)
  1548. {
  1549. struct usb_composite_dev *cdev = gsi->function.config->cdev;
  1550. rndis_set_param_medium(gsi->params, RNDIS_MEDIUM_802_3,
  1551. gsi_xfer_bitrate(cdev->gadget) / 100);
  1552. rndis_signal_connect(gsi->params);
  1553. }
  1554. static void gsi_rndis_ipa_reset_trigger(struct gsi_data_port *d_port)
  1555. {
  1556. unsigned long flags;
  1557. struct f_gsi *gsi = d_port_to_gsi(d_port);
  1558. log_event_dbg("%s: setting net_ready_trigger\n", __func__);
  1559. spin_lock_irqsave(&d_port->lock, flags);
  1560. d_port->net_ready_trigger = false;
  1561. spin_unlock_irqrestore(&d_port->lock, flags);
  1562. }
  1563. static void gsi_rndis_flow_ctrl_enable(bool enable, struct rndis_params *param)
  1564. {
  1565. struct f_gsi *gsi = param->v;
  1566. struct gsi_data_port *d_port;
  1567. if (!gsi) {
  1568. pr_err("%s: gsi prot ctx is %pK\n", __func__, gsi);
  1569. return;
  1570. }
  1571. d_port = &gsi->d_port;
  1572. if (enable) {
  1573. log_event_dbg("%s: posting HOST_NRDY\n", __func__);
  1574. post_event(d_port, EVT_HOST_NRDY);
  1575. } else {
  1576. log_event_dbg("%s: posting HOST_READY\n", __func__);
  1577. post_event(d_port, EVT_HOST_READY);
  1578. /*
  1579. * If host supports flow control with RNDIS_MSG_INIT then
  1580. * mark the flag to true. This flag will be used further to
  1581. * enable the flow control on resume path.
  1582. */
  1583. gsi->host_supports_flow_control = true;
  1584. }
  1585. queue_delayed_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w, 0);
  1586. }
  1587. static int queue_notification_request(struct f_gsi *gsi)
  1588. {
  1589. int ret;
  1590. unsigned long flags;
  1591. if (!gsi->func_is_suspended) {
  1592. ret = usb_ep_queue(gsi->c_port.notify,
  1593. gsi->c_port.notify_req, GFP_ATOMIC);
  1594. } else {
  1595. ret = -EOPNOTSUPP;
  1596. #if IS_ENABLED(CONFIG_USB_FUNC_WAKEUP_SUPPORTED)
  1597. if (gsi->func_wakeup_allowed)
  1598. ret = usb_func_wakeup(&gsi->function);
  1599. #endif
  1600. }
  1601. if (ret < 0 || gsi->func_is_suspended) {
  1602. spin_lock_irqsave(&gsi->c_port.lock, flags);
  1603. gsi->c_port.notify_req_queued = false;
  1604. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1605. }
  1606. log_event_dbg("%s: ret:%d req_queued:%d",
  1607. __func__, ret, gsi->c_port.notify_req_queued);
  1608. return ret;
  1609. }
  1610. static int gsi_ctrl_send_notification(struct f_gsi *gsi)
  1611. {
  1612. __le32 *data;
  1613. struct usb_cdc_notification *event;
  1614. struct usb_request *req = gsi->c_port.notify_req;
  1615. struct usb_composite_dev *cdev;
  1616. struct gsi_ctrl_pkt *cpkt;
  1617. unsigned long flags;
  1618. bool del_free_cpkt = false;
  1619. if (!atomic_read(&gsi->connected)) {
  1620. log_event_dbg("%s: cable disconnect", __func__);
  1621. return -ENODEV;
  1622. }
  1623. spin_lock_irqsave(&gsi->c_port.lock, flags);
  1624. if (list_empty(&gsi->c_port.cpkt_resp_q)) {
  1625. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1626. log_event_dbg("%s: cpkt_resp_q is empty\n", __func__);
  1627. return 0;
  1628. }
  1629. log_event_dbg("%s: notify_req_queued:%d\n",
  1630. __func__, gsi->c_port.notify_req_queued);
  1631. if (gsi->c_port.notify_req_queued) {
  1632. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1633. log_event_dbg("%s: notify_req is already queued.\n", __func__);
  1634. return 0;
  1635. }
  1636. cpkt = list_first_entry(&gsi->c_port.cpkt_resp_q,
  1637. struct gsi_ctrl_pkt, list);
  1638. log_event_dbg("%s: cpkt->type:%d\n", __func__, cpkt->type);
  1639. event = req->buf;
  1640. cdev = gsi->function.config->cdev;
  1641. switch (cpkt->type) {
  1642. case GSI_CTRL_NOTIFY_CONNECT:
  1643. del_free_cpkt = true;
  1644. event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION;
  1645. event->wValue = cpu_to_le16(1);
  1646. event->wLength = cpu_to_le16(0);
  1647. break;
  1648. case GSI_CTRL_NOTIFY_SPEED:
  1649. del_free_cpkt = true;
  1650. event->bNotificationType = USB_CDC_NOTIFY_SPEED_CHANGE;
  1651. event->wValue = cpu_to_le16(0);
  1652. event->wLength = cpu_to_le16(8);
  1653. /* SPEED_CHANGE data is up/down speeds in bits/sec */
  1654. data = req->buf + sizeof(*event);
  1655. data[0] = cpu_to_le32(gsi_xfer_bitrate(cdev->gadget));
  1656. data[1] = data[0];
  1657. log_event_dbg("notify speed %d",
  1658. gsi_xfer_bitrate(cdev->gadget));
  1659. break;
  1660. case GSI_CTRL_NOTIFY_OFFLINE:
  1661. del_free_cpkt = true;
  1662. event->bNotificationType = USB_CDC_NOTIFY_NETWORK_CONNECTION;
  1663. event->wValue = cpu_to_le16(0);
  1664. event->wLength = cpu_to_le16(0);
  1665. break;
  1666. case GSI_CTRL_NOTIFY_RESPONSE_AVAILABLE:
  1667. event->bNotificationType = USB_CDC_NOTIFY_RESPONSE_AVAILABLE;
  1668. event->wValue = cpu_to_le16(0);
  1669. event->wLength = cpu_to_le16(0);
  1670. if (gsi->prot_id == IPA_USB_RNDIS) {
  1671. data = req->buf;
  1672. data[0] = cpu_to_le32(1);
  1673. data[1] = cpu_to_le32(0);
  1674. /*
  1675. * we need to free dummy packet for RNDIS as sending
  1676. * notification about response available multiple time,
  1677. * RNDIS host driver doesn't like. All SEND/GET
  1678. * ENCAPSULATED response is one-to-one for RNDIS case
  1679. * and host expects to have below sequence:
  1680. * ep0: USB_CDC_SEND_ENCAPSULATED_COMMAND
  1681. * int_ep: device->host: RESPONSE_AVAILABLE
  1682. * ep0: USB_GET_SEND_ENCAPSULATED_COMMAND
  1683. * For RMNET case: host ignores multiple notification.
  1684. */
  1685. del_free_cpkt = true;
  1686. }
  1687. break;
  1688. default:
  1689. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1690. log_event_err("%s:unknown notify state", __func__);
  1691. WARN_ON(1);
  1692. return -EINVAL;
  1693. }
  1694. /*
  1695. * Delete and free cpkt related to non NOTIFY_RESPONSE_AVAILABLE
  1696. * notification whereas NOTIFY_RESPONSE_AVAILABLE related cpkt is
  1697. * deleted from USB_CDC_GET_ENCAPSULATED_RESPONSE setup request
  1698. */
  1699. if (del_free_cpkt) {
  1700. list_del(&cpkt->list);
  1701. gsi_ctrl_pkt_free(cpkt);
  1702. }
  1703. gsi->c_port.notify_req_queued = true;
  1704. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1705. log_event_dbg("send Notify type %02x", event->bNotificationType);
  1706. return queue_notification_request(gsi);
  1707. }
  1708. static void gsi_ctrl_notify_resp_complete(struct usb_ep *ep,
  1709. struct usb_request *req)
  1710. {
  1711. struct f_gsi *gsi = req->context;
  1712. struct usb_cdc_notification *event = req->buf;
  1713. int status = req->status;
  1714. unsigned long flags;
  1715. spin_lock_irqsave(&gsi->c_port.lock, flags);
  1716. gsi->c_port.notify_req_queued = false;
  1717. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1718. switch (status) {
  1719. case -ECONNRESET:
  1720. case -ESHUTDOWN:
  1721. /* connection gone */
  1722. log_event_dbg("ESHUTDOWN/ECONNRESET, connection gone");
  1723. gsi_ctrl_clear_cpkt_queues(gsi, false);
  1724. gsi_ctrl_send_cpkt_tomodem(gsi, NULL, 0);
  1725. break;
  1726. default:
  1727. log_event_err("Unknown event %02x --> %d",
  1728. event->bNotificationType, req->status);
  1729. fallthrough;
  1730. case 0:
  1731. break;
  1732. }
  1733. }
  1734. static void gsi_rndis_response_available(void *_rndis)
  1735. {
  1736. struct f_gsi *gsi = _rndis;
  1737. struct gsi_ctrl_pkt *cpkt;
  1738. unsigned long flags;
  1739. cpkt = gsi_ctrl_pkt_alloc(0, GFP_ATOMIC);
  1740. if (IS_ERR(cpkt)) {
  1741. log_event_err("%s: err allocating cpkt\n", __func__);
  1742. return;
  1743. }
  1744. cpkt->type = GSI_CTRL_NOTIFY_RESPONSE_AVAILABLE;
  1745. spin_lock_irqsave(&gsi->c_port.lock, flags);
  1746. list_add_tail(&cpkt->list, &gsi->c_port.cpkt_resp_q);
  1747. spin_unlock_irqrestore(&gsi->c_port.lock, flags);
  1748. gsi_ctrl_send_notification(gsi);
  1749. }
  1750. static void gsi_rndis_command_complete(struct usb_ep *ep,
  1751. struct usb_request *req)
  1752. {
  1753. struct f_gsi *gsi = req->context;
  1754. struct usb_composite_dev *cdev = gsi->function.config->cdev;
  1755. int status;
  1756. u32 MsgType;
  1757. if (!req->buf || !gsi->params)
  1758. return;
  1759. MsgType = get_unaligned_le32((__le32 *)req->buf);
  1760. /* intercept halt message to perform flow control */
  1761. if (MsgType == RNDIS_MSG_HALT) {
  1762. log_event_dbg("RNDIS_MSG_HALT, state:%d\n",
  1763. gsi->params->state);
  1764. if (gsi->params->state == RNDIS_DATA_INITIALIZED)
  1765. gsi_rndis_flow_ctrl_enable(true, gsi->params);
  1766. gsi->params->state = RNDIS_UNINITIALIZED;
  1767. return;
  1768. }
  1769. status = rndis_msg_parser(gsi->params, (u8 *) req->buf);
  1770. if (status < 0)
  1771. log_event_err("RNDIS command error %d, %d/%d",
  1772. status, req->actual, req->length);
  1773. if (MsgType == RNDIS_MSG_INIT) {
  1774. rndis_init_msg_type *buf = (rndis_init_msg_type *)req->buf;
  1775. log_event_dbg("RNDIS host major:%d minor:%d version\n",
  1776. le32_to_cpu(buf->MajorVersion),
  1777. le32_to_cpu(buf->MinorVersion));
  1778. /* honor host dl aggr size */
  1779. gsi->d_port.in_aggr_size = le32_to_cpu(buf->MaxTransferSize);
  1780. log_event_dbg("RNDIS host DL MaxTransferSize:%d\n",
  1781. le32_to_cpu(buf->MaxTransferSize));
  1782. } else if (MsgType == RNDIS_MSG_SET) {
  1783. rndis_set_msg_type *buf = (rndis_set_msg_type *)req->buf;
  1784. if (le32_to_cpu(buf->OID) ==
  1785. RNDIS_OID_GEN_CURRENT_PACKET_FILTER)
  1786. gsi_rndis_flow_ctrl_enable(!(*gsi->params->filter),
  1787. gsi->params);
  1788. }
  1789. cdev->setup_pending = false;
  1790. }
  1791. static void
  1792. gsi_ctrl_set_ntb_cmd_complete(struct usb_ep *ep, struct usb_request *req)
  1793. {
  1794. /* now for SET_NTB_INPUT_SIZE only */
  1795. unsigned int in_size = 0;
  1796. struct f_gsi *gsi = req->context;
  1797. struct gsi_ntb_info *ntb = NULL;
  1798. log_event_dbg("dev:%pK", gsi);
  1799. req->context = NULL;
  1800. if (req->status || req->actual != req->length) {
  1801. log_event_err("Bad control-OUT transfer");
  1802. goto invalid;
  1803. }
  1804. if (req->length == 4) {
  1805. in_size = get_unaligned_le32(req->buf);
  1806. if (in_size < USB_CDC_NCM_NTB_MIN_IN_SIZE ||
  1807. in_size > le32_to_cpu(mbim_gsi_ntb_parameters.dwNtbInMaxSize))
  1808. goto invalid;
  1809. } else if (req->length == 8) {
  1810. ntb = (struct gsi_ntb_info *)req->buf;
  1811. in_size = get_unaligned_le32(&(ntb->ntb_input_size));
  1812. if (in_size < USB_CDC_NCM_NTB_MIN_IN_SIZE ||
  1813. in_size > le32_to_cpu(mbim_gsi_ntb_parameters.dwNtbInMaxSize))
  1814. goto invalid;
  1815. gsi->d_port.ntb_info.ntb_max_datagrams =
  1816. get_unaligned_le16(&(ntb->ntb_max_datagrams));
  1817. } else {
  1818. goto invalid;
  1819. }
  1820. log_event_dbg("Set NTB INPUT SIZE %d", in_size);
  1821. gsi->d_port.ntb_info.ntb_input_size = in_size;
  1822. return;
  1823. invalid:
  1824. log_event_err("Illegal NTB INPUT SIZE %d from host", in_size);
  1825. usb_ep_set_halt(ep);
  1826. }
  1827. static void gsi_ctrl_cmd_complete(struct usb_ep *ep, struct usb_request *req)
  1828. {
  1829. struct f_gsi *gsi = req->context;
  1830. struct usb_composite_dev *cdev = gsi->function.config->cdev;
  1831. gsi_ctrl_send_cpkt_tomodem(gsi, req->buf, req->actual);
  1832. cdev->setup_pending = false;
  1833. }
  1834. static void gsi_ctrl_reset_cmd_complete(struct usb_ep *ep,
  1835. struct usb_request *req)
  1836. {
  1837. struct f_gsi *gsi = req->context;
  1838. gsi_ctrl_send_cpkt_tomodem(gsi, req->buf, 0);
  1839. }
  1840. static void gsi_ctrl_send_response_complete(struct usb_ep *ep,
  1841. struct usb_request *req)
  1842. {
  1843. struct f_gsi *gsi = req->context;
  1844. gsi_ctrl_send_notification(gsi);
  1845. }
  1846. static int
  1847. gsi_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
  1848. {
  1849. struct f_gsi *gsi = func_to_gsi(f);
  1850. struct usb_composite_dev *cdev = f->config->cdev;
  1851. struct usb_request *req = cdev->req;
  1852. int id, value = -EOPNOTSUPP;
  1853. u16 w_index = le16_to_cpu(ctrl->wIndex);
  1854. u16 w_value = le16_to_cpu(ctrl->wValue);
  1855. u16 w_length = le16_to_cpu(ctrl->wLength);
  1856. struct gsi_ctrl_pkt *cpkt;
  1857. u8 *buf;
  1858. u32 n;
  1859. bool line_state;
  1860. if (!atomic_read(&gsi->connected)) {
  1861. log_event_dbg("usb cable is not connected");
  1862. return -ENOTCONN;
  1863. }
  1864. /* rmnet and dpl does not have ctrl_id */
  1865. if (gsi->ctrl_id == -ENODEV)
  1866. id = gsi->data_id;
  1867. else
  1868. id = gsi->ctrl_id;
  1869. /* composite driver infrastructure handles everything except
  1870. * CDC class messages; interface activation uses set_alt().
  1871. */
  1872. switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
  1873. case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1874. | USB_CDC_RESET_FUNCTION:
  1875. log_event_dbg("USB_CDC_RESET_FUNCTION");
  1876. value = 0;
  1877. req->complete = gsi_ctrl_reset_cmd_complete;
  1878. req->context = gsi;
  1879. break;
  1880. case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1881. | USB_CDC_SEND_ENCAPSULATED_COMMAND:
  1882. log_event_dbg("USB_CDC_SEND_ENCAPSULATED_COMMAND");
  1883. if (w_value || w_index != id)
  1884. goto invalid;
  1885. /* read the request; process it later */
  1886. value = w_length;
  1887. req->context = gsi;
  1888. if (gsi->prot_id == IPA_USB_RNDIS)
  1889. req->complete = gsi_rndis_command_complete;
  1890. else
  1891. req->complete = gsi_ctrl_cmd_complete;
  1892. /* later, rndis_response_available() sends a notification */
  1893. break;
  1894. case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1895. | USB_CDC_GET_ENCAPSULATED_RESPONSE:
  1896. log_event_dbg("USB_CDC_GET_ENCAPSULATED_RESPONSE");
  1897. if (w_value || w_index != id)
  1898. goto invalid;
  1899. if (gsi->prot_id == IPA_USB_RNDIS) {
  1900. rndis_init_cmplt_type *res;
  1901. /* return the result */
  1902. buf = rndis_get_next_response(gsi->params, &n);
  1903. if (!buf)
  1904. break;
  1905. res = (rndis_init_cmplt_type *)buf;
  1906. if (le32_to_cpu(res->MessageType) == RNDIS_MSG_INIT_C) {
  1907. log_event_dbg("%s: max_pkt_per_xfer : %d",
  1908. __func__, DEFAULT_MAX_PKT_PER_XFER);
  1909. res->MaxPacketsPerTransfer =
  1910. cpu_to_le32(DEFAULT_MAX_PKT_PER_XFER);
  1911. res->MaxTransferSize = cpu_to_le32(
  1912. le32_to_cpu(res->MaxTransferSize)
  1913. * DEFAULT_MAX_PKT_PER_XFER);
  1914. /* In case of aggregated packets QC device
  1915. * will request aliment to 4 (2^2).
  1916. */
  1917. log_event_dbg("%s: pkt_alignment_factor : %d",
  1918. __func__, DEFAULT_PKT_ALIGNMENT_FACTOR);
  1919. res->PacketAlignmentFactor =
  1920. cpu_to_le32(
  1921. DEFAULT_PKT_ALIGNMENT_FACTOR);
  1922. }
  1923. memcpy(req->buf, buf, n);
  1924. rndis_free_response(gsi->params, buf);
  1925. value = n;
  1926. break;
  1927. }
  1928. spin_lock(&gsi->c_port.lock);
  1929. if (list_empty(&gsi->c_port.cpkt_resp_q)) {
  1930. log_event_dbg("ctrl resp queue empty");
  1931. spin_unlock(&gsi->c_port.lock);
  1932. break;
  1933. }
  1934. cpkt = list_first_entry(&gsi->c_port.cpkt_resp_q,
  1935. struct gsi_ctrl_pkt, list);
  1936. list_del(&cpkt->list);
  1937. gsi->c_port.get_encap_cnt++;
  1938. spin_unlock(&gsi->c_port.lock);
  1939. value = min_t(unsigned int, w_length, cpkt->len);
  1940. memcpy(req->buf, cpkt->buf, value);
  1941. gsi_ctrl_pkt_free(cpkt);
  1942. req->complete = gsi_ctrl_send_response_complete;
  1943. req->context = gsi;
  1944. log_event_dbg("copied encap_resp %d bytes",
  1945. value);
  1946. break;
  1947. case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1948. | USB_CDC_REQ_SET_CONTROL_LINE_STATE:
  1949. line_state = (w_value & GSI_CTRL_DTR ? true : false);
  1950. if (gsi->prot_id == IPA_USB_RMNET)
  1951. gsi->rmnet_dtr_status = line_state;
  1952. log_event_dbg("%s: USB_CDC_REQ_SET_CONTROL_LINE_STATE DTR:%d\n",
  1953. __func__, line_state);
  1954. gsi_ctrl_send_cpkt_tomodem(gsi, NULL, 0);
  1955. value = 0;
  1956. break;
  1957. case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1958. | USB_CDC_SET_ETHERNET_PACKET_FILTER:
  1959. /* see 6.2.30: no data, wIndex = interface,
  1960. * wValue = packet filter bitmap
  1961. */
  1962. if (w_length != 0 || w_index != id)
  1963. goto invalid;
  1964. log_event_dbg("packet filter %02x", w_value);
  1965. /* REVISIT locking of cdc_filter. This assumes the UDC
  1966. * driver won't have a concurrent packet TX irq running on
  1967. * another CPU; or that if it does, this write is atomic...
  1968. */
  1969. gsi->d_port.cdc_filter = w_value;
  1970. value = 0;
  1971. break;
  1972. case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1973. | USB_CDC_GET_NTB_PARAMETERS:
  1974. log_event_dbg("USB_CDC_GET_NTB_PARAMETERS");
  1975. if (w_length == 0 || w_value != 0 || w_index != id)
  1976. break;
  1977. value = w_length > sizeof(mbim_gsi_ntb_parameters) ?
  1978. sizeof(mbim_gsi_ntb_parameters) : w_length;
  1979. memcpy(req->buf, &mbim_gsi_ntb_parameters, value);
  1980. break;
  1981. case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1982. | USB_CDC_GET_NTB_INPUT_SIZE:
  1983. log_event_dbg("USB_CDC_GET_NTB_INPUT_SIZE");
  1984. if (w_length < 4 || w_value != 0 || w_index != id)
  1985. break;
  1986. put_unaligned_le32(gsi->d_port.ntb_info.ntb_input_size,
  1987. req->buf);
  1988. value = 4;
  1989. log_event_dbg("Reply to host INPUT SIZE %d",
  1990. gsi->d_port.ntb_info.ntb_input_size);
  1991. break;
  1992. case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
  1993. | USB_CDC_SET_NTB_INPUT_SIZE:
  1994. log_event_dbg("USB_CDC_SET_NTB_INPUT_SIZE");
  1995. if (w_length != 4 && w_length != 8) {
  1996. log_event_err("wrong NTB length %d", w_length);
  1997. break;
  1998. }
  1999. if (w_value != 0 || w_index != id)
  2000. break;
  2001. req->complete = gsi_ctrl_set_ntb_cmd_complete;
  2002. req->length = w_length;
  2003. req->context = gsi;
  2004. value = req->length;
  2005. break;
  2006. default:
  2007. invalid:
  2008. log_event_err("inval ctrl req%02x.%02x v%04x i%04x l%d",
  2009. ctrl->bRequestType, ctrl->bRequest,
  2010. w_value, w_index, w_length);
  2011. }
  2012. /* respond with data transfer or status phase? */
  2013. if (value >= 0) {
  2014. log_event_dbg("req%02x.%02x v%04x i%04x l%d",
  2015. ctrl->bRequestType, ctrl->bRequest,
  2016. w_value, w_index, w_length);
  2017. req->zero = (value < w_length);
  2018. req->length = value;
  2019. value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
  2020. if (value < 0)
  2021. log_event_err("response on err %d", value);
  2022. else
  2023. cdev->setup_pending = true;
  2024. }
  2025. /* device either stalls (value < 0) or reports success */
  2026. return value;
  2027. }
  2028. /*
  2029. * Because the data interface supports multiple altsettings,
  2030. * function *MUST* implement a get_alt() method.
  2031. */
  2032. static int gsi_get_alt(struct usb_function *f, unsigned int intf)
  2033. {
  2034. struct f_gsi *gsi = func_to_gsi(f);
  2035. /* RNDIS, RMNET and DPL only support alt 0*/
  2036. if (intf == gsi->ctrl_id || gsi->prot_id == IPA_USB_RNDIS ||
  2037. gsi->prot_id == IPA_USB_RMNET ||
  2038. gsi->prot_id == IPA_USB_DIAG)
  2039. return 0;
  2040. else if (intf == gsi->data_id)
  2041. return gsi->data_interface_up;
  2042. return -EINVAL;
  2043. }
  2044. static int gsi_set_alt(struct usb_function *f, unsigned int intf,
  2045. unsigned int alt)
  2046. {
  2047. struct f_gsi *gsi = func_to_gsi(f);
  2048. struct usb_composite_dev *cdev = f->config->cdev;
  2049. struct net_device *net;
  2050. int ret = 0;
  2051. log_event_dbg("intf=%u, alt=%u", intf, alt);
  2052. /* Control interface has only altsetting 0 */
  2053. if (intf == gsi->ctrl_id || gsi->prot_id == IPA_USB_RMNET) {
  2054. if (alt != 0)
  2055. goto fail;
  2056. if (!gsi->c_port.notify)
  2057. goto fail;
  2058. if (gsi->c_port.notify->driver_data) {
  2059. log_event_dbg("reset gsi control %d", intf);
  2060. usb_ep_disable(gsi->c_port.notify);
  2061. }
  2062. ret = config_ep_by_speed(cdev->gadget, f,
  2063. gsi->c_port.notify);
  2064. if (ret) {
  2065. gsi->c_port.notify->desc = NULL;
  2066. log_event_err("Config-fail notify ep %s: err %d",
  2067. gsi->c_port.notify->name, ret);
  2068. goto fail;
  2069. }
  2070. ret = usb_ep_enable(gsi->c_port.notify);
  2071. if (ret) {
  2072. log_event_err("usb ep#%s enable failed, err#%d",
  2073. gsi->c_port.notify->name, ret);
  2074. goto fail;
  2075. }
  2076. gsi->c_port.notify->driver_data = gsi;
  2077. }
  2078. /* Data interface has two altsettings, 0 and 1 */
  2079. if (intf == gsi->data_id) {
  2080. gsi->d_port.net_ready_trigger = false;
  2081. /* for rndis and rmnet alt is always 0 update alt accordingly */
  2082. if (gsi->prot_id == IPA_USB_RNDIS ||
  2083. gsi->prot_id == IPA_USB_RMNET ||
  2084. gsi->prot_id == IPA_USB_DIAG) {
  2085. if (gsi->d_port.in_ep &&
  2086. !gsi->d_port.in_ep->driver_data)
  2087. alt = 1;
  2088. else
  2089. alt = 0;
  2090. }
  2091. if (alt > 1)
  2092. goto notify_ep_disable;
  2093. if (gsi->data_interface_up == alt)
  2094. return 0;
  2095. if (gsi->d_port.in_ep && gsi->d_port.in_ep->driver_data)
  2096. gsi->d_port.ntb_info.ntb_input_size =
  2097. MBIM_NTB_DEFAULT_IN_SIZE;
  2098. if (alt == 1) {
  2099. if (gsi->d_port.in_ep) {
  2100. if (gsi->prot_id == IPA_USB_DIAG)
  2101. gsi->d_port.in_request.ep_intr_num = 3;
  2102. else
  2103. gsi->d_port.in_request.ep_intr_num = 2;
  2104. }
  2105. if (gsi->d_port.out_ep)
  2106. gsi->d_port.out_request.ep_intr_num = 1;
  2107. gsi->d_port.gadget = cdev->gadget;
  2108. gsi->d_port.cdev = cdev;
  2109. if (gsi->prot_id == IPA_USB_RNDIS) {
  2110. gsi_rndis_open(gsi);
  2111. net = gsi_rndis_get_netdev("rndis0");
  2112. if (IS_ERR(net))
  2113. goto notify_ep_disable;
  2114. log_event_dbg("RNDIS RX/TX early activation");
  2115. gsi->d_port.cdc_filter = 0;
  2116. rndis_set_param_dev(gsi->params, net,
  2117. &gsi->d_port.cdc_filter);
  2118. }
  2119. if (gsi->prot_id == IPA_USB_ECM)
  2120. gsi->d_port.cdc_filter = DEFAULT_FILTER;
  2121. post_event(&gsi->d_port, EVT_SET_ALT);
  2122. /*
  2123. * delay until delayed status is returned to
  2124. * composite layer.
  2125. */
  2126. queue_delayed_work(gsi->d_port.ipa_usb_wq,
  2127. &gsi->d_port.usb_ipa_w,
  2128. msecs_to_jiffies(1));
  2129. ret = USB_GADGET_DELAYED_STATUS;
  2130. }
  2131. if (alt == 0 && ((gsi->d_port.in_ep &&
  2132. !gsi->d_port.in_ep->driver_data) ||
  2133. (gsi->d_port.out_ep &&
  2134. !gsi->d_port.out_ep->driver_data))) {
  2135. post_event(&gsi->d_port, EVT_DISCONNECTED);
  2136. queue_delayed_work(gsi->d_port.ipa_usb_wq,
  2137. &gsi->d_port.usb_ipa_w, 0);
  2138. log_event_dbg("%s: Disconnecting\n", __func__);
  2139. }
  2140. gsi->data_interface_up = alt;
  2141. log_event_dbg("DATA_INTERFACE id = %d, status = %d",
  2142. gsi->data_id, gsi->data_interface_up);
  2143. }
  2144. atomic_set(&gsi->connected, 1);
  2145. /* send 0 len pkt to qti to notify state change */
  2146. if (gsi->prot_id == IPA_USB_DIAG)
  2147. gsi_ctrl_send_cpkt_tomodem(gsi, NULL, 0);
  2148. return ret;
  2149. notify_ep_disable:
  2150. if (gsi->c_port.notify && gsi->c_port.notify->driver_data)
  2151. usb_ep_disable(gsi->c_port.notify);
  2152. fail:
  2153. return -EINVAL;
  2154. }
  2155. static void gsi_disable(struct usb_function *f)
  2156. {
  2157. struct f_gsi *gsi = func_to_gsi(f);
  2158. atomic_set(&gsi->connected, 0);
  2159. if (gsi->prot_id == IPA_USB_RNDIS)
  2160. rndis_uninit(gsi->params);
  2161. if (gsi->prot_id == IPA_USB_RMNET)
  2162. gsi->rmnet_dtr_status = false;
  2163. /* Disable Control Path */
  2164. if (gsi->c_port.notify &&
  2165. gsi->c_port.notify->driver_data) {
  2166. usb_ep_disable(gsi->c_port.notify);
  2167. gsi->c_port.notify->driver_data = NULL;
  2168. }
  2169. gsi_ctrl_clear_cpkt_queues(gsi, false);
  2170. /* send 0 len pkt to qti/qbi to notify state change */
  2171. gsi_ctrl_send_cpkt_tomodem(gsi, NULL, 0);
  2172. gsi->c_port.notify_req_queued = false;
  2173. /* Disable Data Path - only if it was initialized already (alt=1) */
  2174. if (!gsi->data_interface_up) {
  2175. log_event_dbg("%s: data intf is closed", __func__);
  2176. return;
  2177. }
  2178. gsi->data_interface_up = false;
  2179. gsi->host_supports_flow_control = false;
  2180. log_event_dbg("%s deactivated", gsi->function.name);
  2181. gsi->d_port.net_ready_trigger = false;
  2182. post_event(&gsi->d_port, EVT_DISCONNECTED);
  2183. queue_delayed_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w, 0);
  2184. }
  2185. static void gsi_suspend(struct usb_function *f)
  2186. {
  2187. bool block_db;
  2188. struct f_gsi *gsi = func_to_gsi(f);
  2189. /* Check if function is already suspended in gsi_func_suspend() */
  2190. if (gsi->func_is_suspended) {
  2191. log_event_dbg("%s: func already suspended, return\n", __func__);
  2192. return;
  2193. }
  2194. block_db = true;
  2195. usb_gsi_ep_op(gsi->d_port.in_ep, (void *)&block_db,
  2196. GSI_EP_OP_SET_CLR_BLOCK_DBL);
  2197. post_event(&gsi->d_port, EVT_SUSPEND);
  2198. queue_delayed_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w, 0);
  2199. log_event_dbg("gsi suspended");
  2200. }
  2201. static void gsi_resume(struct usb_function *f)
  2202. {
  2203. struct f_gsi *gsi = func_to_gsi(f);
  2204. struct usb_composite_dev *cdev = f->config->cdev;
  2205. log_event_dbg("%s for prot_id:%d", __func__, gsi->prot_id);
  2206. /*
  2207. * If the function is in USB3 Function Suspend state, resume is
  2208. * canceled. In this case resume is done by a Function Resume request.
  2209. */
  2210. if ((cdev->gadget->speed >= USB_SPEED_SUPER) &&
  2211. gsi->func_is_suspended)
  2212. return;
  2213. if (gsi->c_port.notify && !gsi->c_port.notify->desc)
  2214. config_ep_by_speed(cdev->gadget, f, gsi->c_port.notify);
  2215. /* Check any pending cpkt, and queue immediately on resume */
  2216. gsi_ctrl_send_notification(gsi);
  2217. /*
  2218. * Linux host does not send RNDIS_MSG_INIT or non-zero
  2219. * RNDIS_MESSAGE_PACKET_FILTER after performing bus resume.
  2220. * Check whether host supports flow_control are not. If yes
  2221. * Trigger state machine explicitly on resume.
  2222. */
  2223. if (gsi->prot_id == IPA_USB_RNDIS &&
  2224. !usb_gsi_remote_wakeup_allowed(f) &&
  2225. gsi->host_supports_flow_control && gsi->params) {
  2226. if (gsi->params->state != RNDIS_DATA_INITIALIZED)
  2227. gsi_rndis_flow_ctrl_enable(false, gsi->params);
  2228. gsi->params->state = RNDIS_DATA_INITIALIZED;
  2229. }
  2230. post_event(&gsi->d_port, EVT_RESUMED);
  2231. queue_delayed_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w, 0);
  2232. log_event_dbg("%s: for prot_id:%d completed", __func__, gsi->prot_id);
  2233. }
  2234. static int gsi_get_status(struct usb_function *f)
  2235. {
  2236. #ifdef CONFIG_USB_FUNC_WAKEUP_SUPPORTED
  2237. struct f_gsi *gsi = func_to_gsi(f);
  2238. return (gsi->func_wakeup_allowed ? USB_INTRF_STAT_FUNC_RW : 0) |
  2239. USB_INTRF_STAT_FUNC_RW_CAP;
  2240. #else
  2241. return 0;
  2242. #endif
  2243. }
  2244. static int gsi_func_suspend(struct usb_function *f, u8 options)
  2245. {
  2246. bool func_wakeup_allowed;
  2247. struct f_gsi *gsi = func_to_gsi(f);
  2248. log_event_dbg("func susp %u cmd for %s",
  2249. options, f->name ? f->name : "");
  2250. func_wakeup_allowed = !!(options & (USB_INTRF_FUNC_SUSPEND_RW >> 8));
  2251. if (options & (USB_INTRF_FUNC_SUSPEND_LP >> 8)) {
  2252. gsi->func_wakeup_allowed = func_wakeup_allowed;
  2253. if (!gsi->func_is_suspended) {
  2254. gsi_suspend(f);
  2255. gsi->func_is_suspended = true;
  2256. }
  2257. } else {
  2258. if (gsi->func_is_suspended) {
  2259. gsi->func_is_suspended = false;
  2260. gsi_resume(f);
  2261. }
  2262. gsi->func_wakeup_allowed = func_wakeup_allowed;
  2263. }
  2264. return 0;
  2265. }
  2266. static int gsi_assign_string_ids(struct f_gsi *gsi,
  2267. struct usb_composite_dev *cdev,
  2268. struct gsi_function_bind_info *info)
  2269. {
  2270. int status;
  2271. if (info->ctrl_str_idx >= 0 && info->ctrl_desc) {
  2272. /* ctrl interface label */
  2273. status = usb_string_id(cdev);
  2274. if (status < 0)
  2275. return status;
  2276. info->string_defs[info->ctrl_str_idx].id = status;
  2277. info->ctrl_desc->iInterface = status;
  2278. }
  2279. if (info->data_str_idx >= 0 && info->data_desc) {
  2280. /* data interface label */
  2281. status = usb_string_id(cdev);
  2282. if (status < 0)
  2283. return status;
  2284. info->string_defs[info->data_str_idx].id = status;
  2285. info->data_desc->iInterface = status;
  2286. }
  2287. if (info->iad_str_idx >= 0 && info->iad_desc) {
  2288. /* IAD iFunction label */
  2289. status = usb_string_id(cdev);
  2290. if (status < 0)
  2291. return status;
  2292. info->string_defs[info->iad_str_idx].id = status;
  2293. info->iad_desc->iFunction = status;
  2294. }
  2295. if (info->mac_str_idx >= 0 && info->cdc_eth_desc) {
  2296. /* IAD iFunction label */
  2297. status = usb_string_id(cdev);
  2298. if (status < 0)
  2299. return status;
  2300. info->string_defs[info->mac_str_idx].id = status;
  2301. info->cdc_eth_desc->iMACAddress = status;
  2302. }
  2303. if (info->ctrl_desc)
  2304. info->ctrl_desc->bInterfaceNumber = gsi->ctrl_id;
  2305. if (info->iad_desc)
  2306. info->iad_desc->bFirstInterface = gsi->ctrl_id;
  2307. if (info->union_desc) {
  2308. info->union_desc->bMasterInterface0 = gsi->ctrl_id;
  2309. info->union_desc->bSlaveInterface0 = gsi->data_id;
  2310. }
  2311. if (info->data_desc)
  2312. info->data_desc->bInterfaceNumber = gsi->data_id;
  2313. if (info->data_nop_desc)
  2314. info->data_nop_desc->bInterfaceNumber = gsi->data_id;
  2315. return 0;
  2316. }
  2317. static int gsi_update_function_bind_params(struct f_gsi *gsi,
  2318. struct usb_composite_dev *cdev,
  2319. struct gsi_function_bind_info *info)
  2320. {
  2321. struct usb_ep *ep;
  2322. struct usb_cdc_notification *event;
  2323. struct usb_function *f = &gsi->function;
  2324. int status;
  2325. status = gsi_assign_string_ids(gsi, cdev, info);
  2326. if (status < 0)
  2327. return status;
  2328. /* allocate instance-specific endpoints */
  2329. if (info->fs_in_desc) {
  2330. ep = usb_ep_autoconfig(cdev->gadget, info->fs_in_desc);
  2331. if (!ep)
  2332. goto fail;
  2333. gsi->d_port.in_ep = ep;
  2334. msm_ep_set_mode(gsi->d_port.in_ep, USB_EP_GSI);
  2335. ep->driver_data = cdev; /* claim */
  2336. }
  2337. if (info->fs_out_desc) {
  2338. ep = usb_ep_autoconfig(cdev->gadget, info->fs_out_desc);
  2339. if (!ep)
  2340. goto fail;
  2341. gsi->d_port.out_ep = ep;
  2342. msm_ep_set_mode(gsi->d_port.out_ep, USB_EP_GSI);
  2343. ep->driver_data = cdev; /* claim */
  2344. }
  2345. if (info->fs_notify_desc) {
  2346. ep = usb_ep_autoconfig(cdev->gadget, info->fs_notify_desc);
  2347. if (!ep)
  2348. goto fail;
  2349. gsi->c_port.notify = ep;
  2350. ep->driver_data = cdev; /* claim */
  2351. /* allocate notification request and buffer */
  2352. gsi->c_port.notify_req = usb_ep_alloc_request(ep, GFP_KERNEL);
  2353. if (!gsi->c_port.notify_req)
  2354. goto fail;
  2355. gsi->c_port.notify_req->buf =
  2356. kmalloc(info->notify_buf_len, GFP_KERNEL);
  2357. if (!gsi->c_port.notify_req->buf)
  2358. goto free_req;
  2359. gsi->c_port.notify_req->length = info->notify_buf_len;
  2360. gsi->c_port.notify_req->context = gsi;
  2361. gsi->c_port.notify_req->complete =
  2362. gsi_ctrl_notify_resp_complete;
  2363. event = gsi->c_port.notify_req->buf;
  2364. event->bmRequestType = USB_DIR_IN | USB_TYPE_CLASS
  2365. | USB_RECIP_INTERFACE;
  2366. if (gsi->ctrl_id == -ENODEV)
  2367. event->wIndex = cpu_to_le16(gsi->data_id);
  2368. else
  2369. event->wIndex = cpu_to_le16(gsi->ctrl_id);
  2370. event->wLength = cpu_to_le16(0);
  2371. }
  2372. gsi->d_port.in_request.buf_len = info->in_req_buf_len;
  2373. gsi->d_port.in_request.num_bufs = info->in_req_num_buf;
  2374. if (gsi->d_port.out_ep) {
  2375. gsi->d_port.out_request.buf_len = info->out_req_buf_len;
  2376. gsi->d_port.out_request.num_bufs = info->out_req_num_buf;
  2377. }
  2378. /* Initialize event queue */
  2379. spin_lock_init(&gsi->d_port.evt_q.q_lock);
  2380. gsi->d_port.evt_q.head = gsi->d_port.evt_q.tail = MAXQUEUELEN - 1;
  2381. if (info->fs_in_desc) {
  2382. info->hs_in_desc->bEndpointAddress =
  2383. info->fs_in_desc->bEndpointAddress;
  2384. info->ss_in_desc->bEndpointAddress =
  2385. info->fs_in_desc->bEndpointAddress;
  2386. }
  2387. if (info->fs_out_desc) {
  2388. info->hs_out_desc->bEndpointAddress =
  2389. info->fs_out_desc->bEndpointAddress;
  2390. info->ss_out_desc->bEndpointAddress =
  2391. info->fs_out_desc->bEndpointAddress;
  2392. }
  2393. if (info->fs_notify_desc) {
  2394. info->hs_notify_desc->bEndpointAddress =
  2395. info->fs_notify_desc->bEndpointAddress;
  2396. info->ss_notify_desc->bEndpointAddress =
  2397. info->fs_notify_desc->bEndpointAddress;
  2398. }
  2399. status = usb_assign_descriptors(f, info->fs_desc_hdr, info->hs_desc_hdr,
  2400. info->ss_desc_hdr, info->ss_desc_hdr);
  2401. if (status)
  2402. goto free_req_buf;
  2403. return 0;
  2404. free_req_buf:
  2405. if (gsi->c_port.notify_req && gsi->c_port.notify_req->buf)
  2406. kfree(gsi->c_port.notify_req->buf);
  2407. free_req:
  2408. if (gsi->c_port.notify_req)
  2409. usb_ep_free_request(gsi->c_port.notify, gsi->c_port.notify_req);
  2410. fail:
  2411. /* we might as well release our claims on endpoints */
  2412. if (gsi->c_port.notify)
  2413. gsi->c_port.notify->driver_data = NULL;
  2414. if (gsi->d_port.out_ep && gsi->d_port.out_ep->desc) {
  2415. msm_ep_set_mode(gsi->d_port.out_ep, USB_EP_NONE);
  2416. gsi->d_port.out_ep->driver_data = NULL;
  2417. }
  2418. if (gsi->d_port.in_ep && gsi->d_port.in_ep->desc) {
  2419. msm_ep_set_mode(gsi->d_port.in_ep, USB_EP_NONE);
  2420. gsi->d_port.in_ep->driver_data = NULL;
  2421. }
  2422. log_event_err("%s: bind failed for %s", __func__, f->name);
  2423. return -ENOMEM;
  2424. }
  2425. void ipa_ready_callback(void *ops)
  2426. {
  2427. memcpy(&ipa_ops, ops, sizeof(struct ipa_usb_ops));
  2428. complete_all(&wait_for_ipa_ready);
  2429. }
  2430. EXPORT_SYMBOL(ipa_ready_callback);
  2431. static int gsi_bind(struct usb_configuration *c, struct usb_function *f)
  2432. {
  2433. struct usb_composite_dev *cdev = c->cdev;
  2434. struct gsi_function_bind_info info = {0};
  2435. struct f_gsi *gsi = func_to_gsi(f);
  2436. struct rndis_params *params;
  2437. int status;
  2438. __u8 class;
  2439. __u8 subclass;
  2440. __u8 proto;
  2441. if (gsi->prot_id == IPA_USB_RMNET ||
  2442. gsi->prot_id == IPA_USB_DIAG)
  2443. gsi->ctrl_id = -ENODEV;
  2444. else {
  2445. status = gsi->ctrl_id = usb_interface_id(c, f);
  2446. if (status < 0)
  2447. goto fail;
  2448. }
  2449. status = gsi->data_id = usb_interface_id(c, f);
  2450. if (status < 0)
  2451. goto fail;
  2452. switch (gsi->prot_id) {
  2453. case IPA_USB_RNDIS:
  2454. info.string_defs = rndis_gsi_string_defs;
  2455. info.ctrl_desc = &rndis_gsi_control_intf;
  2456. info.ctrl_str_idx = 0;
  2457. info.data_desc = &rndis_gsi_data_intf;
  2458. info.data_str_idx = 1;
  2459. info.iad_desc = &rndis_gsi_iad_descriptor;
  2460. info.iad_str_idx = 2;
  2461. info.union_desc = &rndis_gsi_union_desc;
  2462. info.fs_in_desc = &rndis_gsi_fs_in_desc;
  2463. info.fs_out_desc = &rndis_gsi_fs_out_desc;
  2464. info.fs_notify_desc = &rndis_gsi_fs_notify_desc;
  2465. info.hs_in_desc = &rndis_gsi_hs_in_desc;
  2466. info.hs_out_desc = &rndis_gsi_hs_out_desc;
  2467. info.hs_notify_desc = &rndis_gsi_hs_notify_desc;
  2468. info.ss_in_desc = &rndis_gsi_ss_in_desc;
  2469. info.ss_out_desc = &rndis_gsi_ss_out_desc;
  2470. info.ss_notify_desc = &rndis_gsi_ss_notify_desc;
  2471. info.fs_desc_hdr = gsi_eth_fs_function;
  2472. info.hs_desc_hdr = gsi_eth_hs_function;
  2473. info.ss_desc_hdr = gsi_eth_ss_function;
  2474. info.in_epname = "gsi-epin";
  2475. info.out_epname = "gsi-epout";
  2476. info.in_req_buf_len = GSI_IN_RNDIS_BUFF_SIZE;
  2477. gsi->d_port.in_aggr_size = GSI_IN_RNDIS_AGGR_SIZE;
  2478. info.in_req_num_buf = GSI_NUM_IN_RNDIS_BUFFERS;
  2479. gsi->d_port.out_aggr_size = GSI_OUT_AGGR_SIZE;
  2480. info.out_req_buf_len = GSI_OUT_AGGR_SIZE;
  2481. info.out_req_num_buf = GSI_NUM_OUT_BUFFERS;
  2482. info.notify_buf_len = sizeof(struct usb_cdc_notification);
  2483. params = rndis_register(gsi_rndis_response_available, gsi);
  2484. if (IS_ERR(params))
  2485. goto fail;
  2486. gsi->params = params;
  2487. rndis_set_param_medium(gsi->params, RNDIS_MEDIUM_802_3, 0);
  2488. /* export host's Ethernet address in CDC format */
  2489. eth_random_addr(gsi->d_port.ipa_init_params.device_ethaddr);
  2490. eth_random_addr(gsi->d_port.ipa_init_params.host_ethaddr);
  2491. log_event_dbg("setting host_ethaddr=%pM, device_ethaddr = %pM",
  2492. gsi->d_port.ipa_init_params.host_ethaddr,
  2493. gsi->d_port.ipa_init_params.device_ethaddr);
  2494. memcpy(gsi->ethaddr, &gsi->d_port.ipa_init_params.host_ethaddr,
  2495. ETH_ALEN);
  2496. rndis_set_host_mac(gsi->params, gsi->ethaddr);
  2497. if (gsi->manufacturer && gsi->vendorID &&
  2498. rndis_set_param_vendor(gsi->params, gsi->vendorID,
  2499. gsi->manufacturer))
  2500. goto dereg_rndis;
  2501. /* Windows7/Windows10 automatically loads RNDIS drivers for
  2502. * class drivers which represents MISC_ACTIVE_SYNC,
  2503. * MISC_RNDIS_OVER_ETHERNET & WIRELESS_CONTROLLER_REMOTE_NDIS.
  2504. * All the codes listed below are from
  2505. * http://www.usb.org/developers/defined_class and its unknown
  2506. * why windows loads rndis class driver for some of them.
  2507. * Note that, Windows loads NDIS6 stack automatically for
  2508. * MISC_RNDIS_OVER_ETHERNET. Windows loads NDIS5 stack for
  2509. * MISC_ACTIVE_SYNC and WIRELESS_CONTROLLER_REMOTE_NDIS.
  2510. * For other class codes, NDIS stack can be selected using
  2511. * customized INF file but that defeats the purpose as its
  2512. * expected to load drivers automatically for known class
  2513. * drivers published by usbif.
  2514. * Linux rndis host driver supports MISC_ACTIVE_SYNC and
  2515. * WIRELESS_CONTROLLER_REMOTE_NDIS as of now.
  2516. * Default to rndis over ethernet which loads NDIS6 drivers
  2517. * for windows7/windows10 to avoid data stall issues
  2518. */
  2519. if (gsi->rndis_id == RNDIS_ID_UNKNOWN)
  2520. gsi->rndis_id = MISC_RNDIS_OVER_ETHERNET;
  2521. switch (gsi->rndis_id) {
  2522. default:
  2523. /* fall throug */
  2524. case WIRELESS_CONTROLLER_REMOTE_NDIS:
  2525. class = USB_CLASS_WIRELESS_CONTROLLER;
  2526. subclass = 0x01;
  2527. proto = 0x03;
  2528. break;
  2529. case MISC_ACTIVE_SYNC:
  2530. class = USB_CLASS_MISC;
  2531. subclass = 0x01;
  2532. proto = 0x01;
  2533. break;
  2534. case MISC_RNDIS_OVER_ETHERNET:
  2535. class = USB_CLASS_MISC;
  2536. subclass = 0x04;
  2537. proto = 0x01;
  2538. break;
  2539. case MISC_RNDIS_OVER_WIFI:
  2540. class = USB_CLASS_MISC;
  2541. subclass = 0x04;
  2542. proto = 0x02;
  2543. break;
  2544. case MISC_RNDIS_OVER_WIMAX:
  2545. class = USB_CLASS_MISC;
  2546. subclass = 0x04;
  2547. proto = 0x03;
  2548. break;
  2549. case MISC_RNDIS_OVER_WWAN:
  2550. class = USB_CLASS_MISC;
  2551. subclass = 0x04;
  2552. proto = 0x04;
  2553. break;
  2554. case MISC_RNDIS_FOR_IPV4:
  2555. class = USB_CLASS_MISC;
  2556. subclass = 0x04;
  2557. proto = 0x05;
  2558. break;
  2559. case MISC_RNDIS_FOR_IPV6:
  2560. class = USB_CLASS_MISC;
  2561. subclass = 0x04;
  2562. proto = 0x06;
  2563. break;
  2564. case MISC_RNDIS_FOR_GPRS:
  2565. class = USB_CLASS_MISC;
  2566. subclass = 0x04;
  2567. proto = 0x07;
  2568. break;
  2569. }
  2570. info.iad_desc->bFunctionClass = class;
  2571. info.iad_desc->bFunctionSubClass = subclass;
  2572. info.iad_desc->bFunctionProtocol = proto;
  2573. info.ctrl_desc->bInterfaceClass = class;
  2574. info.ctrl_desc->bInterfaceSubClass = subclass;
  2575. info.ctrl_desc->bInterfaceProtocol = proto;
  2576. break;
  2577. case IPA_USB_MBIM:
  2578. info.string_defs = mbim_gsi_string_defs;
  2579. info.ctrl_desc = &mbim_gsi_control_intf;
  2580. info.ctrl_str_idx = 0;
  2581. info.data_desc = &mbim_gsi_data_intf;
  2582. info.data_str_idx = 1;
  2583. info.data_nop_desc = &mbim_gsi_data_nop_intf;
  2584. info.iad_desc = &mbim_gsi_iad_desc;
  2585. info.iad_str_idx = -1;
  2586. info.union_desc = &mbim_gsi_union_desc;
  2587. info.fs_in_desc = &mbim_gsi_fs_in_desc;
  2588. info.fs_out_desc = &mbim_gsi_fs_out_desc;
  2589. info.fs_notify_desc = &mbim_gsi_fs_notify_desc;
  2590. info.hs_in_desc = &mbim_gsi_hs_in_desc;
  2591. info.hs_out_desc = &mbim_gsi_hs_out_desc;
  2592. info.hs_notify_desc = &mbim_gsi_hs_notify_desc;
  2593. info.ss_in_desc = &mbim_gsi_ss_in_desc;
  2594. info.ss_out_desc = &mbim_gsi_ss_out_desc;
  2595. info.ss_notify_desc = &mbim_gsi_ss_notify_desc;
  2596. info.fs_desc_hdr = mbim_gsi_fs_function;
  2597. info.hs_desc_hdr = mbim_gsi_hs_function;
  2598. info.ss_desc_hdr = mbim_gsi_ss_function;
  2599. info.in_epname = "gsi-epin";
  2600. info.out_epname = "gsi-epout";
  2601. gsi->d_port.in_aggr_size = GSI_IN_MBIM_AGGR_SIZE;
  2602. info.in_req_buf_len = GSI_IN_MBIM_AGGR_SIZE;
  2603. info.in_req_num_buf = GSI_NUM_IN_BUFFERS;
  2604. gsi->d_port.out_aggr_size = GSI_OUT_AGGR_SIZE;
  2605. info.out_req_buf_len = GSI_OUT_MBIM_BUF_LEN;
  2606. info.out_req_num_buf = GSI_NUM_OUT_BUFFERS;
  2607. info.notify_buf_len = sizeof(struct usb_cdc_notification);
  2608. mbim_gsi_desc.wMaxSegmentSize = cpu_to_le16(0x800);
  2609. /*
  2610. * If MBIM is bound in a config other than the first, tell
  2611. * Windows about it by returning the num as a string in the
  2612. * OS descriptor's subCompatibleID field. Windows only supports
  2613. * up to config #4.
  2614. */
  2615. if (c->bConfigurationValue >= 2 &&
  2616. c->bConfigurationValue <= 4) {
  2617. log_event_dbg("MBIM in configuration %d",
  2618. c->bConfigurationValue);
  2619. mbim_gsi_ext_config_desc.function.subCompatibleID[0] =
  2620. c->bConfigurationValue + '0';
  2621. }
  2622. break;
  2623. case IPA_USB_RMNET:
  2624. info.string_defs = rmnet_gsi_string_defs;
  2625. info.data_desc = &rmnet_gsi_interface_desc;
  2626. info.data_str_idx = 0;
  2627. info.fs_in_desc = &rmnet_gsi_fs_in_desc;
  2628. info.fs_out_desc = &rmnet_gsi_fs_out_desc;
  2629. info.fs_notify_desc = &rmnet_gsi_fs_notify_desc;
  2630. info.hs_in_desc = &rmnet_gsi_hs_in_desc;
  2631. info.hs_out_desc = &rmnet_gsi_hs_out_desc;
  2632. info.hs_notify_desc = &rmnet_gsi_hs_notify_desc;
  2633. info.ss_in_desc = &rmnet_gsi_ss_in_desc;
  2634. info.ss_out_desc = &rmnet_gsi_ss_out_desc;
  2635. info.ss_notify_desc = &rmnet_gsi_ss_notify_desc;
  2636. info.fs_desc_hdr = rmnet_gsi_fs_function;
  2637. info.hs_desc_hdr = rmnet_gsi_hs_function;
  2638. info.ss_desc_hdr = rmnet_gsi_ss_function;
  2639. info.in_epname = "gsi-epin";
  2640. info.out_epname = "gsi-epout";
  2641. gsi->d_port.in_aggr_size = GSI_IN_RMNET_AGGR_SIZE;
  2642. info.in_req_buf_len = GSI_IN_RMNET_BUFF_SIZE;
  2643. info.in_req_num_buf = GSI_NUM_IN_RMNET_BUFFERS;
  2644. gsi->d_port.out_aggr_size = GSI_OUT_AGGR_SIZE;
  2645. info.out_req_buf_len = GSI_OUT_RMNET_BUF_LEN;
  2646. info.out_req_num_buf = GSI_NUM_OUT_BUFFERS;
  2647. info.notify_buf_len = sizeof(struct usb_cdc_notification);
  2648. break;
  2649. case IPA_USB_ECM:
  2650. info.string_defs = ecm_gsi_string_defs;
  2651. info.ctrl_desc = &ecm_gsi_control_intf;
  2652. info.ctrl_str_idx = 0;
  2653. info.data_desc = &ecm_gsi_data_intf;
  2654. info.data_str_idx = 2;
  2655. info.data_nop_desc = &ecm_gsi_data_nop_intf;
  2656. info.cdc_eth_desc = &ecm_gsi_desc;
  2657. info.mac_str_idx = 1;
  2658. info.union_desc = &ecm_gsi_union_desc;
  2659. info.fs_in_desc = &ecm_gsi_fs_in_desc;
  2660. info.fs_out_desc = &ecm_gsi_fs_out_desc;
  2661. info.fs_notify_desc = &ecm_gsi_fs_notify_desc;
  2662. info.hs_in_desc = &ecm_gsi_hs_in_desc;
  2663. info.hs_out_desc = &ecm_gsi_hs_out_desc;
  2664. info.hs_notify_desc = &ecm_gsi_hs_notify_desc;
  2665. info.ss_in_desc = &ecm_gsi_ss_in_desc;
  2666. info.ss_out_desc = &ecm_gsi_ss_out_desc;
  2667. info.ss_notify_desc = &ecm_gsi_ss_notify_desc;
  2668. info.fs_desc_hdr = ecm_gsi_fs_function;
  2669. info.hs_desc_hdr = ecm_gsi_hs_function;
  2670. info.ss_desc_hdr = ecm_gsi_ss_function;
  2671. info.in_epname = "gsi-epin";
  2672. info.out_epname = "gsi-epout";
  2673. gsi->d_port.in_aggr_size = GSI_ECM_AGGR_SIZE;
  2674. info.in_req_buf_len = GSI_IN_BUFF_SIZE;
  2675. info.in_req_num_buf = GSI_NUM_IN_BUFFERS;
  2676. gsi->d_port.out_aggr_size = GSI_ECM_AGGR_SIZE;
  2677. info.out_req_buf_len = GSI_OUT_ECM_BUF_LEN;
  2678. info.out_req_num_buf = GSI_NUM_OUT_BUFFERS;
  2679. info.notify_buf_len = GSI_CTRL_NOTIFY_BUFF_LEN;
  2680. /* export host's Ethernet address in CDC format */
  2681. eth_random_addr(gsi->d_port.ipa_init_params.device_ethaddr);
  2682. eth_random_addr(gsi->d_port.ipa_init_params.host_ethaddr);
  2683. log_event_dbg("setting host_ethaddr=%pM, device_ethaddr = %pM",
  2684. gsi->d_port.ipa_init_params.host_ethaddr,
  2685. gsi->d_port.ipa_init_params.device_ethaddr);
  2686. scnprintf(gsi->ethaddr, sizeof(gsi->ethaddr),
  2687. "%02X%02X%02X%02X%02X%02X",
  2688. gsi->d_port.ipa_init_params.host_ethaddr[0],
  2689. gsi->d_port.ipa_init_params.host_ethaddr[1],
  2690. gsi->d_port.ipa_init_params.host_ethaddr[2],
  2691. gsi->d_port.ipa_init_params.host_ethaddr[3],
  2692. gsi->d_port.ipa_init_params.host_ethaddr[4],
  2693. gsi->d_port.ipa_init_params.host_ethaddr[5]);
  2694. info.string_defs[1].s = gsi->ethaddr;
  2695. break;
  2696. case IPA_USB_DIAG:
  2697. info.string_defs = qdss_gsi_string_defs;
  2698. info.data_desc = &qdss_gsi_data_intf_desc;
  2699. info.data_str_idx = 0;
  2700. info.fs_in_desc = &qdss_gsi_fs_data_desc;
  2701. info.hs_in_desc = &qdss_gsi_hs_data_desc;
  2702. info.ss_in_desc = &qdss_gsi_ss_data_desc;
  2703. info.fs_desc_hdr = qdss_gsi_fs_data_only_desc;
  2704. info.hs_desc_hdr = qdss_gsi_hs_data_only_desc;
  2705. info.ss_desc_hdr = qdss_gsi_ss_data_only_desc;
  2706. info.in_epname = "gsi-epin";
  2707. info.out_epname = "";
  2708. info.in_req_buf_len = 16384;
  2709. info.in_req_num_buf = GSI_NUM_IN_BUFFERS;
  2710. info.notify_buf_len = sizeof(struct usb_cdc_notification);
  2711. break;
  2712. default:
  2713. log_event_err("%s: Invalid prot id %d", __func__,
  2714. gsi->prot_id);
  2715. return -EINVAL;
  2716. }
  2717. status = gsi_update_function_bind_params(gsi, cdev, &info);
  2718. if (status)
  2719. goto dereg_rndis;
  2720. status = wait_for_completion_timeout(&wait_for_ipa_ready,
  2721. msecs_to_jiffies(GSI_IPA_READY_TIMEOUT));
  2722. if (!status) {
  2723. log_event_err("%s: ipa ready timeout", __func__);
  2724. status = -ETIMEDOUT;
  2725. goto dereg_rndis;
  2726. }
  2727. gsi->d_port.ipa_ops = &ipa_ops;
  2728. gsi->d_port.ipa_usb_notify_cb = ipa_usb_notify_cb;
  2729. status = gsi->d_port.ipa_ops->init_teth_prot(gsi->prot_id,
  2730. &gsi->d_port.ipa_init_params, gsi->d_port.ipa_usb_notify_cb,
  2731. gsi);
  2732. if (status) {
  2733. log_event_err("%s: failed to init teth prot(%d) with err:%d",
  2734. __func__, gsi->prot_id, status);
  2735. goto dereg_rndis;
  2736. }
  2737. gsi->d_port.sm_state = STATE_INITIALIZED;
  2738. DBG(cdev, "%s: %s speed IN/%s OUT/%s NOTIFY/%s\n",
  2739. f->name,
  2740. gadget_is_superspeed(c->cdev->gadget) ? "super" :
  2741. gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full",
  2742. (gsi->d_port.in_ep == NULL ? "NULL" :
  2743. gsi->d_port.in_ep->name),
  2744. (gsi->d_port.out_ep == NULL ? "NULL" :
  2745. gsi->d_port.out_ep->name),
  2746. (gsi->c_port.notify == NULL ? "NULL" :
  2747. gsi->c_port.notify->name));
  2748. return 0;
  2749. dereg_rndis:
  2750. rndis_deregister(gsi->params);
  2751. fail:
  2752. return status;
  2753. }
  2754. static void gsi_unbind(struct usb_configuration *c, struct usb_function *f)
  2755. {
  2756. struct f_gsi *gsi = func_to_gsi(f);
  2757. log_event_dbg("%s:id:%d: dwq start", __func__, gsi->prot_id);
  2758. if (atomic_read(&gsi->connected))
  2759. gsi_disable(f);
  2760. /*
  2761. * Use drain_workqueue to accomplish below conditions:
  2762. * 1. Make sure that any running work completed
  2763. * 2. Make sure to wait until all pending work completed i.e. workqueue
  2764. * is not having any pending work.
  2765. * Above conditions are making sure that deinit_teth_prot()
  2766. * with ipa driver shall not fail due to unexpected state.
  2767. */
  2768. drain_workqueue(gsi->d_port.ipa_usb_wq);
  2769. log_event_dbg("%s:id:%d: dwq end", __func__, gsi->prot_id);
  2770. gsi->d_port.ipa_ops->deinit_teth_prot(gsi->prot_id);
  2771. /* Reset string ids */
  2772. rndis_gsi_string_defs[0].id = 0;
  2773. ecm_gsi_string_defs[0].id = 0;
  2774. rmnet_gsi_string_defs[0].id = 0;
  2775. mbim_gsi_string_defs[0].id = 0;
  2776. qdss_gsi_string_defs[0].id = 0;
  2777. if (gsi->prot_id == IPA_USB_RNDIS) {
  2778. gsi->d_port.sm_state = STATE_UNINITIALIZED;
  2779. rndis_deregister(gsi->params);
  2780. }
  2781. if (gsi->prot_id == IPA_USB_MBIM)
  2782. mbim_gsi_ext_config_desc.function.subCompatibleID[0] = 0;
  2783. usb_free_all_descriptors(f);
  2784. if (gsi->c_port.notify) {
  2785. kfree(gsi->c_port.notify_req->buf);
  2786. usb_ep_free_request(gsi->c_port.notify, gsi->c_port.notify_req);
  2787. }
  2788. }
  2789. static void gsi_free_func(struct usb_function *f)
  2790. { }
  2791. static int gsi_bind_config(struct f_gsi *gsi)
  2792. {
  2793. int status = 0;
  2794. enum ipa_usb_teth_prot prot_id = gsi->prot_id;
  2795. log_event_dbg("%s: prot id %d", __func__, prot_id);
  2796. switch (prot_id) {
  2797. case IPA_USB_RNDIS:
  2798. gsi->function.name = "rndis";
  2799. gsi->function.strings = rndis_gsi_strings;
  2800. break;
  2801. case IPA_USB_ECM:
  2802. gsi->function.name = "cdc_ethernet";
  2803. gsi->function.strings = ecm_gsi_strings;
  2804. break;
  2805. case IPA_USB_RMNET:
  2806. gsi->function.name = "rmnet";
  2807. gsi->function.strings = rmnet_gsi_strings;
  2808. break;
  2809. case IPA_USB_MBIM:
  2810. gsi->function.name = "mbim";
  2811. gsi->function.strings = mbim_gsi_strings;
  2812. break;
  2813. case IPA_USB_DIAG:
  2814. gsi->function.name = "dpl";
  2815. gsi->function.strings = qdss_gsi_strings;
  2816. break;
  2817. default:
  2818. log_event_err("%s: invalid prot id %d", __func__, prot_id);
  2819. return -EINVAL;
  2820. }
  2821. /* descriptors are per-instance copies */
  2822. gsi->function.bind = gsi_bind;
  2823. gsi->function.unbind = gsi_unbind;
  2824. gsi->function.set_alt = gsi_set_alt;
  2825. gsi->function.get_alt = gsi_get_alt;
  2826. gsi->function.setup = gsi_setup;
  2827. gsi->function.disable = gsi_disable;
  2828. gsi->function.free_func = gsi_free_func;
  2829. gsi->function.suspend = gsi_suspend;
  2830. gsi->function.get_status = gsi_get_status;
  2831. gsi->function.func_suspend = gsi_func_suspend;
  2832. gsi->function.resume = gsi_resume;
  2833. return status;
  2834. }
  2835. static struct f_gsi *gsi_function_init(enum ipa_usb_teth_prot prot_id)
  2836. {
  2837. struct f_gsi *gsi;
  2838. int ret = 0;
  2839. if (prot_id >= IPA_USB_MAX_TETH_PROT_SIZE) {
  2840. pr_err("%s: invalid prot id %d\n", __func__, prot_id);
  2841. ret = -EINVAL;
  2842. goto error;
  2843. }
  2844. gsi = kzalloc(sizeof(*gsi), GFP_KERNEL);
  2845. if (!gsi) {
  2846. ret = -ENOMEM;
  2847. goto error;
  2848. }
  2849. spin_lock_init(&gsi->d_port.lock);
  2850. INIT_DELAYED_WORK(&gsi->d_port.usb_ipa_w, ipa_work_handler);
  2851. gsi->d_port.in_channel_handle = -EINVAL;
  2852. gsi->d_port.out_channel_handle = -EINVAL;
  2853. gsi->prot_id = prot_id;
  2854. gsi->d_port.ipa_usb_wq = ipa_usb_wq;
  2855. ret = gsi_function_ctrl_port_init(gsi);
  2856. if (ret) {
  2857. kfree(gsi);
  2858. goto error;
  2859. }
  2860. gsi->gsi_rw_timer_interval = DEFAULT_RW_TIMER_INTERVAL;
  2861. timer_setup(&gsi->gsi_rw_timer, gsi_rw_timer_func, 0);
  2862. return gsi;
  2863. error:
  2864. return ERR_PTR(ret);
  2865. }
  2866. static void gsi_opts_release(struct config_item *item)
  2867. {
  2868. struct gsi_opts *opts = to_gsi_opts(item);
  2869. struct f_gsi *gsi;
  2870. gsi = opts->gsi;
  2871. log_event_dbg("%s: releasing %s instance\n",
  2872. __func__, gsi->function.name);
  2873. usb_put_function_instance(&opts->func_inst);
  2874. }
  2875. static struct configfs_item_operations gsi_item_ops = {
  2876. .release = gsi_opts_release,
  2877. };
  2878. static ssize_t gsi_info_show(struct config_item *item, char *page)
  2879. {
  2880. struct ipa_usb_xdci_chan_params *ipa_chnl_params;
  2881. struct ipa_usb_xdci_connect_params *con_pms;
  2882. struct f_gsi *gsi = to_gsi_opts(item)->gsi;
  2883. int ret, j = 0;
  2884. unsigned int len = 0;
  2885. char *buf;
  2886. buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
  2887. if (!buf)
  2888. return -ENOMEM;
  2889. if (gsi && atomic_read(&gsi->connected)) {
  2890. len += scnprintf(buf + len, PAGE_SIZE - len,
  2891. "Info: Prot_id:%d\n", gsi->prot_id);
  2892. ipa_chnl_params = &gsi->d_port.ipa_in_channel_params;
  2893. con_pms = &gsi->d_port.ipa_conn_pms;
  2894. len += scnprintf(buf + len, PAGE_SIZE - len, "%55s\n",
  2895. "==================================================");
  2896. len += scnprintf(buf + len, PAGE_SIZE - len,
  2897. "%25s %10s\n", "Ctrl Name: ", gsi->c_port.name);
  2898. len += scnprintf(buf + len, PAGE_SIZE - len,
  2899. "%25s %10u\n", "Ctrl Online: ",
  2900. gsi->c_port.ctrl_online.counter);
  2901. len += scnprintf(buf + len, PAGE_SIZE - len,
  2902. "%25s %10u\n", "Ctrl Open: ",
  2903. gsi->c_port.is_open);
  2904. len += scnprintf(buf + len, PAGE_SIZE - len,
  2905. "%25s %10u\n", "Ctrl Host to Modem: ",
  2906. gsi->c_port.host_to_modem);
  2907. len += scnprintf(buf + len, PAGE_SIZE - len,
  2908. "%25s %10u\n", "Ctrl Modem to Host: ",
  2909. gsi->c_port.modem_to_host);
  2910. len += scnprintf(buf + len, PAGE_SIZE - len,
  2911. "%25s %10u\n", "Ctrl Cpd to Modem: ",
  2912. gsi->c_port.copied_to_modem);
  2913. len += scnprintf(buf + len, PAGE_SIZE - len,
  2914. "%25s %10u\n", "Ctrl Cpd From Modem: ",
  2915. gsi->c_port.copied_from_modem);
  2916. len += scnprintf(buf + len, PAGE_SIZE - len,
  2917. "%25s %10u\n", "Ctrl Pkt Drops: ",
  2918. gsi->c_port.cpkt_drop_cnt);
  2919. len += scnprintf(buf + len, PAGE_SIZE - len, "%25s\n",
  2920. "==============");
  2921. len += scnprintf(buf + len, PAGE_SIZE - len,
  2922. "%25s %10u\n", "Protocol ID: ", gsi->prot_id);
  2923. len += scnprintf(buf + len, PAGE_SIZE - len,
  2924. "%25s %10u\n", "SM State: ", gsi->d_port.sm_state);
  2925. len += scnprintf(buf + len, PAGE_SIZE - len,
  2926. "%25s %10u\n", "IN XferRscIndex: ",
  2927. gsi->d_port.in_xfer_rsc_index);
  2928. len += scnprintf(buf + len, PAGE_SIZE - len,
  2929. "%25s %10d\n", "IN Chnl Hdl: ",
  2930. gsi->d_port.in_channel_handle);
  2931. len += scnprintf(buf + len, PAGE_SIZE - len,
  2932. "%25s %10x\n", "IN Chnl Dbl Addr: ",
  2933. gsi->d_port.in_request.db_reg_phs_addr_lsb);
  2934. len += scnprintf(buf + len, PAGE_SIZE - len,
  2935. "%25s %10u\n", "IN TRB Ring Len: ",
  2936. ipa_chnl_params->xfer_ring_len);
  2937. len += scnprintf(buf + len, PAGE_SIZE - len,
  2938. "%25s %10x\n", "IN TRB Base Addr: ", (unsigned int)
  2939. ipa_chnl_params->xfer_ring_base_addr_iova);
  2940. len += scnprintf(buf + len, PAGE_SIZE - len,
  2941. "%25s %10x\n", "GEVENTCNTLO IN Addr: ",
  2942. ipa_chnl_params->gevntcount_low_addr);
  2943. len += scnprintf(buf + len, PAGE_SIZE - len,
  2944. "%25s %10x\n", "DEPCMDLO IN Addr: ",
  2945. ipa_chnl_params->xfer_scratch.depcmd_low_addr);
  2946. len += scnprintf(buf + len, PAGE_SIZE - len,
  2947. "%25s %10x\n", "IN LastTRB Addr Off: ",
  2948. ipa_chnl_params->xfer_scratch.last_trb_addr_iova);
  2949. len += scnprintf(buf + len, PAGE_SIZE - len,
  2950. "%25s %10u\n", "IN Buffer Size: ",
  2951. ipa_chnl_params->xfer_scratch.const_buffer_size);
  2952. len += scnprintf(buf + len, PAGE_SIZE - len,
  2953. "%25s %10u\n", "IN/DL Aggr Size: ",
  2954. con_pms->teth_prot_params.max_xfer_size_bytes_to_host);
  2955. ipa_chnl_params = &gsi->d_port.ipa_out_channel_params;
  2956. len += scnprintf(buf + len, PAGE_SIZE - len, "%25s\n",
  2957. "==============");
  2958. len += scnprintf(buf + len, PAGE_SIZE - len,
  2959. "%25s %10u\n", "OUT XferRscIndex: ",
  2960. gsi->d_port.out_xfer_rsc_index);
  2961. len += scnprintf(buf + len, PAGE_SIZE - len,
  2962. "%25s %10d\n", "OUT Channel Hdl: ",
  2963. gsi->d_port.out_channel_handle);
  2964. len += scnprintf(buf + len, PAGE_SIZE - len,
  2965. "%25s %10x\n", "OUT Channel Dbl Addr: ",
  2966. gsi->d_port.out_request.db_reg_phs_addr_lsb);
  2967. len += scnprintf(buf + len, PAGE_SIZE - len,
  2968. "%25s %10u\n", "OUT TRB Ring Len: ",
  2969. ipa_chnl_params->xfer_ring_len);
  2970. len += scnprintf(buf + len, PAGE_SIZE - len,
  2971. "%25s %10x\n", "OUT TRB Base Addr: ", (unsigned int)
  2972. ipa_chnl_params->xfer_ring_base_addr_iova);
  2973. len += scnprintf(buf + len, PAGE_SIZE - len,
  2974. "%25s %10x\n", "GEVENTCNTLO OUT Addr: ",
  2975. ipa_chnl_params->gevntcount_low_addr);
  2976. len += scnprintf(buf + len, PAGE_SIZE - len,
  2977. "%25s %10x\n", "DEPCMDLO OUT Addr: ",
  2978. ipa_chnl_params->xfer_scratch.depcmd_low_addr);
  2979. len += scnprintf(buf + len, PAGE_SIZE - len,
  2980. "%25s %10x\n", "OUT LastTRB Addr Off: ",
  2981. ipa_chnl_params->xfer_scratch.last_trb_addr_iova);
  2982. len += scnprintf(buf + len, PAGE_SIZE - len,
  2983. "%25s %10u\n", "OUT Buffer Size: ",
  2984. ipa_chnl_params->xfer_scratch.const_buffer_size);
  2985. len += scnprintf(buf + len, PAGE_SIZE - len,
  2986. "%25s %10u\n", "OUT/UL Aggr Size: ",
  2987. con_pms->teth_prot_params.max_xfer_size_bytes_to_dev);
  2988. len += scnprintf(buf + len, PAGE_SIZE - len,
  2989. "%25s %10u\n", "OUT/UL Packets to dev: ",
  2990. con_pms->teth_prot_params.max_packet_number_to_dev);
  2991. len += scnprintf(buf + len, PAGE_SIZE - len,
  2992. "%25s %10u\n", "Net_ready_trigger:",
  2993. gsi->d_port.net_ready_trigger);
  2994. len += scnprintf(buf + len, PAGE_SIZE - len, "%25s\n",
  2995. "USB Bus Events");
  2996. for (j = 0; j < MAXQUEUELEN; j++)
  2997. len += scnprintf(buf + len, PAGE_SIZE - len,
  2998. "%d\t", gsi->d_port.evt_q.event[j]);
  2999. len += scnprintf(buf + len, PAGE_SIZE - len, "\n");
  3000. len += scnprintf(buf + len, PAGE_SIZE - len,
  3001. "%25s %10u\n", "Eventq head: ",
  3002. gsi->d_port.evt_q.head);
  3003. len += scnprintf(buf + len, PAGE_SIZE - len,
  3004. "%25s %10u\n", "Eventq tail: ",
  3005. gsi->d_port.evt_q.tail);
  3006. }
  3007. if (len > PAGE_SIZE)
  3008. len = PAGE_SIZE;
  3009. ret = scnprintf(page, len, buf);
  3010. kfree(buf);
  3011. return ret;
  3012. }
  3013. CONFIGFS_ATTR_RO(gsi_, info);
  3014. static struct configfs_attribute *gsi_attrs[] = {
  3015. &gsi_attr_info,
  3016. NULL,
  3017. };
  3018. static struct config_item_type gsi_func_type = {
  3019. .ct_item_ops = &gsi_item_ops,
  3020. .ct_attrs = gsi_attrs,
  3021. .ct_owner = THIS_MODULE,
  3022. };
  3023. static ssize_t gsi_rndis_class_id_show(struct config_item *item, char *page)
  3024. {
  3025. struct f_gsi *gsi = to_gsi_opts(item)->gsi;
  3026. return scnprintf(page, PAGE_SIZE, "%d\n", gsi->rndis_id);
  3027. }
  3028. static ssize_t gsi_rndis_class_id_store(struct config_item *item,
  3029. const char *page, size_t len)
  3030. {
  3031. struct f_gsi *gsi = to_gsi_opts(item)->gsi;
  3032. u8 id;
  3033. if (kstrtou8(page, 0, &id))
  3034. return -EINVAL;
  3035. if (id > RNDIS_ID_UNKNOWN && id < RNDIS_ID_MAX)
  3036. gsi->rndis_id = id;
  3037. else
  3038. return -EINVAL;
  3039. return len;
  3040. }
  3041. CONFIGFS_ATTR(gsi_, rndis_class_id);
  3042. static struct configfs_attribute *gsi_rndis_attrs[] = {
  3043. &gsi_attr_info,
  3044. &gsi_attr_rndis_class_id,
  3045. NULL,
  3046. };
  3047. static struct config_item_type gsi_func_rndis_type = {
  3048. .ct_item_ops = &gsi_item_ops,
  3049. .ct_attrs = gsi_rndis_attrs,
  3050. .ct_owner = THIS_MODULE,
  3051. };
  3052. static void gsi_inst_clean(struct gsi_opts *opts)
  3053. {
  3054. if (opts->gsi->c_port.cdev.dev) {
  3055. struct cdev *cdev = &opts->gsi->c_port.cdev;
  3056. int minor = MINOR(cdev->dev);
  3057. device_destroy(gsi_class, cdev->dev);
  3058. cdev_del(cdev);
  3059. cdev->dev = 0;
  3060. ida_simple_remove(&gsi_ida, minor);
  3061. }
  3062. kfree(opts->gsi);
  3063. kfree(opts);
  3064. }
  3065. static int gsi_set_inst_name(struct usb_function_instance *fi,
  3066. const char *name)
  3067. {
  3068. int prot_id, name_len;
  3069. struct f_gsi *gsi;
  3070. char gsi_inst_name[MAX_INST_NAME_LEN + sizeof("gsi.") + 1];
  3071. void *ipc_log_ctxt;
  3072. struct gsi_opts *opts, *opts_prev;
  3073. opts = container_of(fi, struct gsi_opts, func_inst);
  3074. name_len = strlen(name) + 1;
  3075. if (name_len > MAX_INST_NAME_LEN)
  3076. return -ENAMETOOLONG;
  3077. prot_id = name_to_prot_id(name);
  3078. if (prot_id < 0) {
  3079. pr_err("%s: failed to find prot id for %s instance\n",
  3080. __func__, name);
  3081. return -EINVAL;
  3082. }
  3083. mutex_lock(&inst_status[prot_id].gsi_lock);
  3084. opts_prev = inst_status[prot_id].opts;
  3085. if (opts_prev) {
  3086. mutex_unlock(&inst_status[prot_id].gsi_lock);
  3087. pr_err("%s: prot_id = %d, prev inst do not freed yet\n",
  3088. __func__, prot_id);
  3089. return -EBUSY;
  3090. }
  3091. mutex_unlock(&inst_status[prot_id].gsi_lock);
  3092. if (prot_id == IPA_USB_RNDIS)
  3093. config_group_init_type_name(&opts->func_inst.group,
  3094. fi->group.cg_item.ci_name,
  3095. &gsi_func_rndis_type);
  3096. gsi = gsi_function_init(prot_id);
  3097. if (IS_ERR(gsi))
  3098. return PTR_ERR(gsi);
  3099. opts->gsi = gsi;
  3100. /*
  3101. * create instance name with prefixing "gsi." to differentiate
  3102. * ipc log debugfs entry
  3103. */
  3104. scnprintf(gsi_inst_name, sizeof(gsi_inst_name), "gsi.%s", name);
  3105. ipc_log_ctxt = ipc_log_context_create(NUM_LOG_PAGES, gsi_inst_name, 0);
  3106. if (!ipc_log_ctxt)
  3107. pr_err("%s: Err allocating ipc_log_ctxt for prot:%s\n",
  3108. __func__, gsi_inst_name);
  3109. opts->gsi->ipc_log_ctxt = ipc_log_ctxt;
  3110. /* Set instance status */
  3111. mutex_lock(&inst_status[prot_id].gsi_lock);
  3112. inst_status[prot_id].inst_exist = true;
  3113. inst_status[prot_id].opts = opts;
  3114. mutex_unlock(&inst_status[prot_id].gsi_lock);
  3115. return 0;
  3116. }
  3117. static void gsi_free_inst(struct usb_function_instance *f)
  3118. {
  3119. struct gsi_opts *opts = container_of(f, struct gsi_opts, func_inst);
  3120. enum ipa_usb_teth_prot prot_id;
  3121. struct f_gsi *gsi;
  3122. if (!opts->gsi)
  3123. return;
  3124. prot_id = opts->gsi->prot_id;
  3125. gsi = opts->gsi;
  3126. mutex_lock(&inst_status[prot_id].gsi_lock);
  3127. if (opts->gsi->c_port.is_open) {
  3128. /* Mark instance exist as false */
  3129. inst_status[prot_id].inst_exist = false;
  3130. mutex_unlock(&inst_status[prot_id].gsi_lock);
  3131. log_event_err(
  3132. "%s: [prot_id = %d] Dev is open, free mem when dev close\n",
  3133. __func__, prot_id);
  3134. return;
  3135. }
  3136. ipc_log_context_destroy(opts->gsi->ipc_log_ctxt);
  3137. /* Clear instance status */
  3138. gsi_inst_clean(opts);
  3139. inst_status[prot_id].inst_exist = false;
  3140. inst_status[prot_id].opts = NULL;
  3141. mutex_unlock(&inst_status[prot_id].gsi_lock);
  3142. }
  3143. static struct usb_function_instance *gsi_alloc_inst(void)
  3144. {
  3145. struct gsi_opts *opts;
  3146. opts = kzalloc(sizeof(*opts), GFP_KERNEL);
  3147. if (!opts)
  3148. return ERR_PTR(-ENOMEM);
  3149. opts->func_inst.set_inst_name = gsi_set_inst_name;
  3150. opts->func_inst.free_func_inst = gsi_free_inst;
  3151. config_group_init_type_name(&opts->func_inst.group, "",
  3152. &gsi_func_type);
  3153. return &opts->func_inst;
  3154. }
  3155. static struct usb_function *gsi_alloc(struct usb_function_instance *fi)
  3156. {
  3157. struct gsi_opts *opts;
  3158. int ret;
  3159. opts = container_of(fi, struct gsi_opts, func_inst);
  3160. ret = gsi_bind_config(opts->gsi);
  3161. if (ret)
  3162. return ERR_PTR(ret);
  3163. return &opts->gsi->function;
  3164. }
  3165. DECLARE_USB_FUNCTION(gsi, gsi_alloc_inst, gsi_alloc);
  3166. MODULE_LICENSE("GPL");
  3167. MODULE_DESCRIPTION("GSI function driver");
  3168. static int fgsi_init(void)
  3169. {
  3170. int i;
  3171. int ret;
  3172. dev_t dev;
  3173. ipa_usb_wq = alloc_workqueue("k_ipa_usb",
  3174. WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_FREEZABLE, 1);
  3175. if (!ipa_usb_wq) {
  3176. pr_err("%s(): Failed to create workqueue\n", __func__);
  3177. return -ENOMEM;
  3178. }
  3179. for (i = 0; i < IPA_USB_MAX_TETH_PROT_SIZE; i++)
  3180. mutex_init(&inst_status[i].gsi_lock);
  3181. gsi_class = class_create(THIS_MODULE, "gsi_usb");
  3182. if (IS_ERR(gsi_class)) {
  3183. ret = PTR_ERR(gsi_class);
  3184. gsi_class = NULL;
  3185. pr_err("%s: class_create() failed:%d\n", __func__, ret);
  3186. return ret;
  3187. }
  3188. ret = alloc_chrdev_region(&dev, 0, MAX_CDEV_INSTANCES, "gsi_usb");
  3189. if (ret) {
  3190. pr_err("%s: alloc_chrdev_region() failed:%d\n", __func__, ret);
  3191. class_destroy(gsi_class);
  3192. gsi_class = NULL;
  3193. return ret;
  3194. }
  3195. major = MAJOR(dev);
  3196. usb_gsi_debugfs_init();
  3197. return usb_function_register(&gsiusb_func);
  3198. }
  3199. module_init(fgsi_init);
  3200. static void __exit fgsi_exit(void)
  3201. {
  3202. if (ipa_usb_wq)
  3203. destroy_workqueue(ipa_usb_wq);
  3204. usb_function_unregister(&gsiusb_func);
  3205. if (major) {
  3206. unregister_chrdev_region(MKDEV(major, 0), MAX_CDEV_INSTANCES);
  3207. major = 0;
  3208. }
  3209. class_destroy(gsi_class);
  3210. usb_gsi_debugfs_exit();
  3211. }
  3212. module_exit(fgsi_exit);