ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ /* SPDX-License-Identifier: GPL-2.0-only */ /* * SAS structures and definitions header file * * Copyright (C) 2005 Adaptec, Inc. All rights reserved. * Copyright (C) 2005 Luben Tuikov */ #ifndef _SAS_H_ #define _SAS_H_ #include #include #define SAS_ADDR_SIZE 8 #define HASHED_SAS_ADDR_SIZE 3 #define SAS_ADDR(_sa) ((unsigned long long) be64_to_cpu(*(__be64 *)(_sa))) #define SMP_REQUEST 0x40 #define SMP_RESPONSE 0x41 #define SSP_DATA 0x01 #define SSP_XFER_RDY 0x05 #define SSP_COMMAND 0x06 #define SSP_RESPONSE 0x07 #define SSP_TASK 0x16 #define SMP_REPORT_GENERAL 0x00 #define SMP_REPORT_MANUF_INFO 0x01 #define SMP_READ_GPIO_REG 0x02 #define SMP_DISCOVER 0x10 #define SMP_REPORT_PHY_ERR_LOG 0x11 #define SMP_REPORT_PHY_SATA 0x12 #define SMP_REPORT_ROUTE_INFO 0x13 #define SMP_WRITE_GPIO_REG 0x82 #define SMP_CONF_ROUTE_INFO 0x90 #define SMP_PHY_CONTROL 0x91 #define SMP_PHY_TEST_FUNCTION 0x92 #define SMP_RESP_FUNC_ACC 0x00 #define SMP_RESP_FUNC_UNK 0x01 #define SMP_RESP_FUNC_FAILED 0x02 #define SMP_RESP_INV_FRM_LEN 0x03 #define SMP_RESP_NO_PHY 0x10 #define SMP_RESP_NO_INDEX 0x11 #define SMP_RESP_PHY_NO_SATA 0x12 #define SMP_RESP_PHY_UNK_OP 0x13 #define SMP_RESP_PHY_UNK_TESTF 0x14 #define SMP_RESP_PHY_TEST_INPROG 0x15 #define SMP_RESP_PHY_VACANT 0x16 /* SAM TMFs */ #define TMF_ABORT_TASK 0x01 #define TMF_ABORT_TASK_SET 0x02 #define TMF_CLEAR_TASK_SET 0x04 #define TMF_LU_RESET 0x08 #define TMF_CLEAR_ACA 0x40 #define TMF_QUERY_TASK 0x80 /* SAS TMF responses */ #define TMF_RESP_FUNC_COMPLETE 0x00 #define TMF_RESP_INVALID_FRAME 0x02 #define TMF_RESP_FUNC_ESUPP 0x04 #define TMF_RESP_FUNC_FAILED 0x05 #define TMF_RESP_FUNC_SUCC 0x08 #define TMF_RESP_NO_LUN 0x09 #define TMF_RESP_OVERLAPPED_TAG 0x0A enum sas_oob_mode { OOB_NOT_CONNECTED, SATA_OOB_MODE, SAS_OOB_MODE }; /* See sas_discover.c if you plan on changing these */ enum sas_device_type { /* these are SAS protocol defined (attached device type field) */ SAS_PHY_UNUSED = 0, SAS_END_DEVICE = 1, SAS_EDGE_EXPANDER_DEVICE = 2, SAS_FANOUT_EXPANDER_DEVICE = 3, /* these are internal to libsas */ SAS_HA = 4, SAS_SATA_DEV = 5, SAS_SATA_PM = 7, SAS_SATA_PM_PORT = 8, SAS_SATA_PENDING = 9, }; enum sas_protocol { SAS_PROTOCOL_NONE = 0, SAS_PROTOCOL_SATA = 0x01, SAS_PROTOCOL_SMP = 0x02, SAS_PROTOCOL_STP = 0x04, SAS_PROTOCOL_SSP = 0x08, SAS_PROTOCOL_ALL = 0x0E, SAS_PROTOCOL_STP_ALL = SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA, }; /* From the spec; local phys only */ enum phy_func { PHY_FUNC_NOP, PHY_FUNC_LINK_RESET, /* Enables the phy */ PHY_FUNC_HARD_RESET, PHY_FUNC_DISABLE, PHY_FUNC_CLEAR_ERROR_LOG = 5, PHY_FUNC_CLEAR_AFFIL, PHY_FUNC_TX_SATA_PS_SIGNAL, PHY_FUNC_RELEASE_SPINUP_HOLD = 0x10, /* LOCAL PORT ONLY! */ PHY_FUNC_SET_LINK_RATE, PHY_FUNC_GET_EVENTS, }; /* SAS LLDD would need to report only _very_few_ of those, like BROADCAST. * Most of those are here for completeness. */ enum sas_prim { SAS_PRIM_AIP_NORMAL = 1, SAS_PRIM_AIP_R0 = 2, SAS_PRIM_AIP_R1 = 3, SAS_PRIM_AIP_R2 = 4, SAS_PRIM_AIP_WC = 5, SAS_PRIM_AIP_WD = 6, SAS_PRIM_AIP_WP = 7, SAS_PRIM_AIP_RWP = 8, SAS_PRIM_BC_CH = 9, SAS_PRIM_BC_RCH0 = 10, SAS_PRIM_BC_RCH1 = 11, SAS_PRIM_BC_R0 = 12, SAS_PRIM_BC_R1 = 13, SAS_PRIM_BC_R2 = 14, SAS_PRIM_BC_R3 = 15, SAS_PRIM_BC_R4 = 16, SAS_PRIM_NOTIFY_ENSP= 17, SAS_PRIM_NOTIFY_R0 = 18, SAS_PRIM_NOTIFY_R1 = 19, SAS_PRIM_NOTIFY_R2 = 20, SAS_PRIM_CLOSE_CLAF = 21, SAS_PRIM_CLOSE_NORM = 22, SAS_PRIM_CLOSE_R0 = 23, SAS_PRIM_CLOSE_R1 = 24, SAS_PRIM_OPEN_RTRY = 25, SAS_PRIM_OPEN_RJCT = 26, SAS_PRIM_OPEN_ACPT = 27, SAS_PRIM_DONE = 28, SAS_PRIM_BREAK = 29, SATA_PRIM_DMAT = 33, SATA_PRIM_PMNAK = 34, SATA_PRIM_PMACK = 35, SATA_PRIM_PMREQ_S = 36, SATA_PRIM_PMREQ_P = 37, SATA_SATA_R_ERR = 38, }; enum sas_open_rej_reason { /* Abandon open */ SAS_OREJ_UNKNOWN = 0, SAS_OREJ_BAD_DEST = 1, SAS_OREJ_CONN_RATE = 2, SAS_OREJ_EPROTO = 3, SAS_OREJ_RESV_AB0 = 4, SAS_OREJ_RESV_AB1 = 5, SAS_OREJ_RESV_AB2 = 6, SAS_OREJ_RESV_AB3 = 7, SAS_OREJ_WRONG_DEST= 8, SAS_OREJ_STP_NORES = 9, /* Retry open */ SAS_OREJ_NO_DEST = 10, SAS_OREJ_PATH_BLOCKED = 11, SAS_OREJ_RSVD_CONT0 = 12, SAS_OREJ_RSVD_CONT1 = 13, SAS_OREJ_RSVD_INIT0 = 14, SAS_OREJ_RSVD_INIT1 = 15, SAS_OREJ_RSVD_STOP0 = 16, SAS_OREJ_RSVD_STOP1 = 17, SAS_OREJ_RSVD_RETRY = 18, }; enum sas_gpio_reg_type { SAS_GPIO_REG_CFG = 0, SAS_GPIO_REG_RX = 1, SAS_GPIO_REG_RX_GP = 2, SAS_GPIO_REG_TX = 3, SAS_GPIO_REG_TX_GP = 4, }; struct dev_to_host_fis { u8 fis_type; /* 0x34 */ u8 flags; u8 status; u8 error; u8 lbal; union { u8 lbam; u8 byte_count_low; }; union { u8 lbah; u8 byte_count_high; }; u8 device; u8 lbal_exp; u8 lbam_exp; u8 lbah_exp; u8 _r_a; union { u8 sector_count; u8 interrupt_reason; }; u8 sector_count_exp; u8 _r_b; u8 _r_c; u32 _r_d; } __attribute__ ((packed)); struct host_to_dev_fis { u8 fis_type; /* 0x27 */ u8 flags; u8 command; u8 features; u8 lbal; union { u8 lbam; u8 byte_count_low; }; union { u8 lbah; u8 byte_count_high; }; u8 device; u8 lbal_exp; u8 lbam_exp; u8 lbah_exp; u8 features_exp; union { u8 sector_count; u8 interrupt_reason; }; u8 sector_count_exp; u8 _r_a; u8 control; u32 _r_b; } __attribute__ ((packed)); /* Prefer to have code clarity over header file clarity. */ #ifdef __LITTLE_ENDIAN_BITFIELD struct sas_identify_frame { /* Byte 0 */ u8 frame_type:4; u8 dev_type:3; u8 _un0:1; /* Byte 1 */ u8 _un1; /* Byte 2 */ union { struct { u8 _un20:1; u8 smp_iport:1; u8 stp_iport:1; u8 ssp_iport:1; u8 _un247:4; }; u8 initiator_bits; }; /* Byte 3 */ union { struct { u8 _un30:1; u8 smp_tport:1; u8 stp_tport:1; u8 ssp_tport:1; u8 _un347:4; }; u8 target_bits; }; /* Byte 4 - 11 */ u8 _un4_11[8]; /* Byte 12 - 19 */ u8 sas_addr[SAS_ADDR_SIZE]; /* Byte 20 */ u8 phy_id; u8 _un21_27[7]; __be32 crc; } __attribute__ ((packed)); struct ssp_frame_hdr { u8 frame_type; u8 hashed_dest_addr[HASHED_SAS_ADDR_SIZE]; u8 _r_a; u8 hashed_src_addr[HASHED_SAS_ADDR_SIZE]; __be16 _r_b; u8 changing_data_ptr:1; u8 retransmit:1; u8 retry_data_frames:1; u8 _r_c:5; u8 num_fill_bytes:2; u8 _r_d:6; u32 _r_e; __be16 tag; __be16 tptt; __be32 data_offs; } __attribute__ ((packed)); struct ssp_response_iu { u8 _r_a[10]; u8 datapres:2; u8 _r_b:6; u8 status; u32 _r_c; __be32 sense_data_len; __be32 response_data_len; u8 resp_data[0]; u8 sense_data[0]; } __attribute__ ((packed)); struct ssp_command_iu { u8 lun[8]; u8 _r_a; union { struct { u8 attr:3; u8 prio:4; u8 efb:1; }; u8 efb_prio_attr; }; u8 _r_b; u8 _r_c:2; u8 add_cdb_len:6; u8 cdb[16]; u8 add_cdb[0]; } __attribute__ ((packed)); struct xfer_rdy_iu { __be32 requested_offset; __be32 write_data_len; __be32 _r_a; } __attribute__ ((packed)); struct ssp_tmf_iu { u8 lun[8]; u16 _r_a; u8 tmf; u8 _r_b; __be16 tag; u8 _r_c[14]; } __attribute__ ((packed)); /* ---------- SMP ---------- */ struct report_general_resp { __be16 change_count; __be16 route_indexes; u8 _r_a; u8 num_phys; u8 conf_route_table:1; u8 configuring:1; u8 config_others:1; u8 orej_retry_supp:1; u8 stp_cont_awt:1; u8 self_config:1; u8 zone_config:1; u8 t2t_supp:1; u8 _r_c; u8 enclosure_logical_id[8]; u8 _r_d[12]; } __attribute__ ((packed)); struct discover_resp { u8 _r_a[5]; u8 phy_id; __be16 _r_b; u8 _r_c:4; u8 attached_dev_type:3; u8 _r_d:1; u8 linkrate:4; u8 _r_e:4; u8 attached_sata_host:1; u8 iproto:3; u8 _r_f:4; u8 attached_sata_dev:1; u8 tproto:3; u8 _r_g:3; u8 attached_sata_ps:1; u8 sas_addr[8]; u8 attached_sas_addr[8]; u8 attached_phy_id; u8 _r_h[7]; u8 hmin_linkrate:4; u8 pmin_linkrate:4; u8 hmax_linkrate:4; u8 pmax_linkrate:4; u8 change_count; u8 pptv:4; u8 _r_i:3; u8 virtual:1; u8 routing_attr:4; u8 _r_j:4; u8 conn_type; u8 conn_el_index; u8 conn_phy_link; u8 _r_k[8]; } __attribute__ ((packed)); struct report_phy_sata_resp { u8 _r_a[5]; u8 phy_id; u8 _r_b; u8 affil_valid:1; u8 affil_supp:1; u8 _r_c:6; u32 _r_d; u8 stp_sas_addr[8]; struct dev_to_host_fis fis; u32 _r_e; u8 affil_stp_ini_addr[8]; __be32 crc; } __attribute__ ((packed)); struct smp_resp { u8 frame_type; u8 function; u8 result; u8 reserved; union { struct report_general_resp rg; struct discover_resp disc; struct report_phy_sata_resp rps; }; } __attribute__ ((packed)); #elif defined(__BIG_ENDIAN_BITFIELD) struct sas_identify_frame { /* Byte 0 */ u8 _un0:1; u8 dev_type:3; u8 frame_type:4; /* Byte 1 */ u8 _un1; /* Byte 2 */ union { struct { u8 _un247:4; u8 ssp_iport:1; u8 stp_iport:1; u8 smp_iport:1; u8 _un20:1; }; u8 initiator_bits; }; /* Byte 3 */ union { struct { u8 _un347:4; u8 ssp_tport:1; u8 stp_tport:1; u8 smp_tport:1; u8 _un30:1; }; u8 target_bits; }; /* Byte 4 - 11 */ u8 _un4_11[8]; /* Byte 12 - 19 */ u8 sas_addr[SAS_ADDR_SIZE]; /* Byte 20 */ u8 phy_id; u8 _un21_27[7]; __be32 crc; } __attribute__ ((packed)); struct ssp_frame_hdr { u8 frame_type; u8 hashed_dest_addr[HASHED_SAS_ADDR_SIZE]; u8 _r_a; u8 hashed_src_addr[HASHED_SAS_ADDR_SIZE]; __be16 _r_b; u8 _r_c:5; u8 retry_data_frames:1; u8 retransmit:1; u8 changing_data_ptr:1; u8 _r_d:6; u8 num_fill_bytes:2; u32 _r_e; __be16 tag; __be16 tptt; __be32 data_offs; } __attribute__ ((packed)); struct ssp_response_iu { u8 _r_a[10]; u8 _r_b:6; u8 datapres:2; u8 status; u32 _r_c; __be32 sense_data_len; __be32 response_data_len; u8 resp_data[0]; u8 sense_data[0]; } __attribute__ ((packed)); struct ssp_command_iu { u8 lun[8]; u8 _r_a; union { struct { u8 efb:1; u8 prio:4; u8 attr:3; }; u8 efb_prio_attr; }; u8 _r_b; u8 add_cdb_len:6; u8 _r_c:2; u8 cdb[16]; u8 add_cdb[0]; } __attribute__ ((packed)); struct xfer_rdy_iu { __be32 requested_offset; __be32 write_data_len; __be32 _r_a; } __attribute__ ((packed)); struct ssp_tmf_iu { u8 lun[8]; u16 _r_a; u8 tmf; u8 _r_b; __be16 tag; u8 _r_c[14]; } __attribute__ ((packed)); /* ---------- SMP ---------- */ struct report_general_resp { __be16 change_count; __be16 route_indexes; u8 _r_a; u8 num_phys; u8 t2t_supp:1; u8 zone_config:1; u8 self_config:1; u8 stp_cont_awt:1; u8 orej_retry_supp:1; u8 config_others:1; u8 configuring:1; u8 conf_route_table:1; u8 _r_c; u8 enclosure_logical_id[8]; u8 _r_d[12]; } __attribute__ ((packed)); struct discover_resp { u8 _r_a[5]; u8 phy_id; __be16 _r_b; u8 _r_d:1; u8 attached_dev_type:3; u8 _r_c:4; u8 _r_e:4; u8 linkrate:4; u8 _r_f:4; u8 iproto:3; u8 attached_sata_host:1; u8 attached_sata_ps:1; u8 _r_g:3; u8 tproto:3; u8 attached_sata_dev:1; u8 sas_addr[8]; u8 attached_sas_addr[8]; u8 attached_phy_id; u8 _r_h[7]; u8 pmin_linkrate:4; u8 hmin_linkrate:4; u8 pmax_linkrate:4; u8 hmax_linkrate:4; u8 change_count; u8 virtual:1; u8 _r_i:3; u8 pptv:4; u8 _r_j:4; u8 routing_attr:4; u8 conn_type; u8 conn_el_index; u8 conn_phy_link; u8 _r_k[8]; } __attribute__ ((packed)); struct report_phy_sata_resp { u8 _r_a[5]; u8 phy_id; u8 _r_b; u8 _r_c:6; u8 affil_supp:1; u8 affil_valid:1; u32 _r_d; u8 stp_sas_addr[8]; struct dev_to_host_fis fis; u32 _r_e; u8 affil_stp_ini_addr[8]; __be32 crc; } __attribute__ ((packed)); struct smp_resp { u8 frame_type; u8 function; u8 result; u8 reserved; union { struct report_general_resp rg; struct discover_resp disc; struct report_phy_sata_resp rps; }; } __attribute__ ((packed)); #else #error "Bitfield order not defined!" #endif #endif /* _SAS_H_ */