From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [BUG] mt76x0u: Probing issues on Raspberry Pi 3 B+ From: Lorenzo Bianconi Message-Id: <20190220132206.GF2626@localhost.localdomain> Date: Wed, 20 Feb 2019 14:22:08 +0100 To: Stanislaw Gruszka Cc: Felix Fietkau , Stefan Wahren , Alan Stern , Doug Anderson , Minas Harutyunyan , USB list , linux-wireless List-ID: PiBPbiBUdWUsIEZlYiAxOSwgMjAxOSBhdCAwMToxOToyNlBNICswMTAwLCBGZWxpeCBGaWV0a2F1 IHdyb3RlOgo+ID4gPj4gPj4gVGhlIHdheSBJIHNlZSBpdCwgd2UgaGF2ZSB0d28gY2hvaWNlcy4K PiA+ID4+ID4+IDEuIEZpeCBkd2MyIHRvIGRvIGl0cyBhbGlnbm1lbnQgcXVpcmsgZm9yIHRoZSB1 cmItPnNnICE9IE5VTEwgY2FzZQo+ID4gPj4gPj4gMi4gUmVseSBvbiB1cmItPnRyYW5zZmVyX2J1 ZmZlciBhbmQga2VlcCB1cmItPnNnIE5VTEwKPiA+ID4+ID4gCj4gPiA+PiA+IEkgYWdyZWUsIGlm IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIGR3YzIuIFRob3VnaCBJIHdvdWxkIGludmVzdGlnYXRl Cj4gPiA+PiA+IGlmIHRoaXMgaXMgbm90IGEgYnVnIG9uIG90aGVyIHBsYXRmb3JtcyBhcyB3ZWxs Lgo+ID4gPj4gPkZyb20gd2hhdCBJIGNhbiBzZWUsIHVzaW5nIExvcmVuem8ncyBwYXRjaGVzIHNl ZW1zIHRvIGJlIHRoZSBiZXR0ZXIKPiA+ID4+IHNvbHV0aW9uLCBzaW5jZSB0aGV5IGF2b2lkIHRo ZXNlIGNvcm5lciBjYXNlcyBpbiBkd2MyIChhbmQgbWF5YmUgb3RoZXIKPiA+ID4+IGRyaXZlcnMg YXMgd2VsbCkuIEkgd2lsbCBhcHBseSB0aGVtIGFuZCB0aGVuIHdlJ2xsIHNlZSBpZiB3ZSBuZWVk IHRvIGRvCj4gPiA+PiBhbnkgZnVydGhlciBpbXByb3ZlbWVudHMgbGF0ZXIgb24uCj4gPiA+IAo+ ID4gPiBUaGV5IHdvcmsgb24gcnBpIGR3YzIsIGJ1dCB0aGV5IGRvIG5vdCBhZGRyZXNzIHJvb3Qg b2YgdGhlIHByb2JsZW0uCj4gPiA+IFRoZXJlIGlzIGNsZWFybHkgc29tZXRoaW5nIHdyb25nIGhv dyBtdDc2dXNiIGhhbmRsZSBTRywgd2hhdCBpcyBub3QKPiA+ID4gZml4ZWQuIEFuZCBhZGRpbmcg ZGlzYWJsZV91c2Jfc2cgbW9kdWxlIHBhcmFtZXRlciBmb3IgaGNkJ3Mgc3VwcG9ydGluZwo+ID4g PiBTRyBzaG91bGQgYmUgcmVkIGZsYWcuCj4gPiBJIHRoaW5rIHdlJ3JlIHNpbXBseSBkZWFsaW5n IHdpdGggbXVsdGlwbGUgaXNzdWVzIGhlcmUsIG9ubHkgc29tZSBvZgo+ID4gd2hpY2ggYXJlIGZp eGVkIGJ5IExvcmVuem8ncyBwYXRjaGVzLgo+ID4gSSdtIHByZXR0eSBzdXJlIGl0J3Mgc3RpbGwg d3JvbmcgZm9yIG10NzYgdG8gdHJ5IHRvIGFsaWduIGl0cyBidWZmZXJzLAo+ID4gc2luY2UgdGhl IExpbnV4IFVTQiBBUEkgc3VwcG9ydHMgbm9uLWFsaWduZWQgdHJhbnNmZXIgYnVmZmVycyBhbmQg aXQKPiA+IHNob3VsZCBiZSB1cCB0byB0aGUgY29udHJvbGxlciBkcml2ZXIgdG8gZGVhbCB3aXRo IHRoYXQuCj4gCj4gQWdyZWUuCj4gCj4gPiBkd2MyIHRyaWVzIHRvIGRvIHRoYXQsIGJ1dCB0aGF0 IGhhcyBsaW1pdGF0aW9ucyB3aGljaCBJIGFscmVhZHkgcG9pbnRlZAo+ID4gb3V0IGFuZCB3aGlj aCBhcmUgcHJvcGVybHkgZGVhbHQgd2l0aCBieSBMb3JlbnpvJ3MgcGF0Y2hlcy4KPiAKPiBJIHBs YW5lZCB0byBqdXN0IGFjY2VwdCBjdXJyZW50IHNvbHV0aW9uLCBidXQgSSBzdGFydGVkIHRvIHdv cmsgb24gcGF0Y2gKPiB0aGF0IHJlbW92ZSBsZW4sIHNnbGVuIGFyZ3VtZW50cyBmcm9tIG10NzZ1 X2J1Zl9hbGxvYygpIGFuZCB1c2UKPiBxLT5idWZfc2l6ZSBhbmQgU0tCX1dJVEhfT1ZFUkhFQUQo cS0+YnVmX3NpemUpIGRpcmVjdGx5IGFuZCByZWFsaXplZCBob3cKPiByZWxhdGVkIGNvZGUgaXMg bm93IHRhbmdsZWQuCj4gCj4gV291bGQgYmUgb2sgdG8gc2VuZCB0aGlzIHBhdGNoIHdpdGggcHJv cGVyIGNoYW5nZWxvZyBhcyBmaXggZm9yIFJQSQo+IGFnYWluc3Qgd2lyZWxlc3MtZHJpdmVycyBh bmQgY2M6c3RhYmxlIChhc3N1bWluZyBpdCB3b3JrcyBhbmQgcmVhbGx5Cj4gZml4IHRoaW5ncyBv biBSUEkpIGFuZCByZXZlcnQgTG9yZW56bydzIHBhdGNoZXMgaW4gLW5leHQgPwoKSGkgU3Rhbmlz bGF3LAoKd2hhdCBpcyB0aGUgYWR2YW50YWdlIG9mIGRvaW5nIHNvPyBZb3UgaGF2ZSBkdXBsaWNh dGVkIG1vc3Qgb2YgdGhlIGZpZWxkcyB0aGF0IGFyZQphbHJlYWR5IGluIHRoZSB1cmIgZGF0YSBz dHJ1Y3R1cmUgYW5kIHlvdSB1c2UgdHJhbnNmZXJfYnVmZmVyIChubyBTRyBJL08pLgpNb3Jlb3Zl ciBJIGhhdmUgcmVhZHkgYSBzZXJpZXMgdGhhdCByZW1vdmVzIDk5JSBvZiB0aGUgZHVhbCBhbGxv Y2F0aW9uIGNvZGUgYW5kCm1haW50YWluIGl0IGluIHRoZSBjb250cm9sIHBhdGggKGluc3RlYWQg b2YgdGhlIGRhdGFwYXRoIG9uZSkuCkkgbmVlZCBqdXN0IHRvIHJlYmFzZSBpdCBvbnRvcCBvZiB5 b3VyIHNlcmllcy4gSSB3aWxsIHBvc3QgaXQgc29vbi4KClJlZ2FyZHMsCkxvcmVuem8KCj4gCj4g U3RhbmlzbGF3Cj4gCj4gRnJvbSA0ZjhkN2QzZjQwMzFiMGE5N2IzYmIxNDdjYjdlNTI1MzM4ODZl N2NjIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQo+IEZyb206IFN0YW5pc2xhdyBHcnVzemthIDxz Z3J1c3prYUByZWRoYXQuY29tPgo+IERhdGU6IFdlZCwgMjAgRmViIDIwMTkgMTM6Mjk6NDIgKzAx MDAKPiBTdWJqZWN0OiBbUEFUQ0hdIG10NzZ1c2I6IHVzZSB1cmIgdHJhbnNmZXJfYnVmZmVyIGZv ciBvbmUgc2VnbWVudAo+IAo+IFNpZ25lZC1vZmYtYnk6IFN0YW5pc2xhdyBHcnVzemthIDxzZ3J1 c3prYUByZWRoYXQuY29tPgo+IC0tLQo+ICBkcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9t dDc2L210NzYuaCAgICAgfCAgMiArCj4gIC4uLi93aXJlbGVzcy9tZWRpYXRlay9tdDc2L210NzZ4 MDJfdXNiX21jdS5jICB8ICA0ICstCj4gIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210 NzYvdXNiLmMgICAgICB8IDc1ICsrKysrKysrKysrLS0tLS0tLS0KPiAgMyBmaWxlcyBjaGFuZ2Vk LCA0NiBpbnNlcnRpb25zKCspLCAzNSBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3Ni9tdDc2LmggYi9kcml2ZXJzL25ldC93aXJl bGVzcy9tZWRpYXRlay9tdDc2L210NzYuaAo+IGluZGV4IDJlNWJjYjNmZGZmNy4uN2UwNjgwZGFl ZWU2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYvbXQ3 Ni5oCj4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3Ni9tdDc2LmgKPiBA QCAtODYsNiArODYsOCBAQCBzdHJ1Y3QgbXQ3Nl9xdWV1ZV9idWYgewo+ICBzdHJ1Y3QgbXQ3NnVf YnVmIHsKPiAgCXN0cnVjdCBtdDc2X2RldiAqZGV2Owo+ICAJc3RydWN0IHVyYiAqdXJiOwo+ICsJ c3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKPiArCWludCBudW1fc2dzOwo+ICAJc2l6ZV90IGxlbjsK PiAgCWJvb2wgZG9uZTsKPiAgfTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mv bWVkaWF0ZWsvbXQ3Ni9tdDc2eDAyX3VzYl9tY3UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21l ZGlhdGVrL210NzYvbXQ3NngwMl91c2JfbWN1LmMKPiBpbmRleCBkYTI5OWI4YTEzMzQuLjc1NTYx OTEwZDYzMCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2 L210NzZ4MDJfdXNiX21jdS5jCj4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsv bXQ3Ni9tdDc2eDAyX3VzYl9tY3UuYwo+IEBAIC05MCw3ICs5MCw3IEBAIHN0YXRpYyBpbnQgbXQ3 NngwMnVfbWN1X3dhaXRfcmVzcChzdHJ1Y3QgbXQ3Nl9kZXYgKmRldiwgdTggc2VxKQo+ICAJCWlm ICh1cmItPnN0YXR1cykKPiAgCQkJcmV0dXJuIC1FSU87Cj4gIAo+IC0JCWRhdGEgPSBzZ192aXJ0 KCZ1cmItPnNnWzBdKTsKPiArCQlkYXRhID0gc2dfdmlydCgmYnVmLT5zZ1swXSk7Cj4gIAkJaWYg KHVzYi0+bWN1LnJwKQo+ICAJCQltdDc2eDAydV9tdWx0aXBsZV9tY3VfcmVhZHMoZGV2LCBkYXRh ICsgNCwKPiAgCQkJCQkJICAgIHVyYi0+YWN0dWFsX2xlbmd0aCAtIDgpOwo+IEBAIC0yNjYsNyAr MjY2LDcgQEAgc3RhdGljIGludAo+ICBfX210NzZ4MDJ1X21jdV9md19zZW5kX2RhdGEoc3RydWN0 IG10NzZ4MDJfZGV2ICpkZXYsIHN0cnVjdCBtdDc2dV9idWYgKmJ1ZiwKPiAgCQkJICAgIGNvbnN0 IHZvaWQgKmZ3X2RhdGEsIGludCBsZW4sIHUzMiBkc3RfYWRkcikKPiAgewo+IC0JdTggKmRhdGEg PSBzZ192aXJ0KCZidWYtPnVyYi0+c2dbMF0pOwo+ICsJdTggKmRhdGEgPSBzZ192aXJ0KCZidWYt PnNnWzBdKTsKPiAgCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKGNtcGwpOwo+ICAJX19sZTMy IGluZm87Cj4gIAl1MzIgdmFsOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9t ZWRpYXRlay9tdDc2L3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3Ni91 c2IuYwo+IGluZGV4IGExODExYzM5NDE1ZS4uNTdiYjE2ZWFmZjA2IDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYvdXNiLmMKPiArKysgYi9kcml2ZXJzL25l dC93aXJlbGVzcy9tZWRpYXRlay9tdDc2L3VzYi5jCj4gQEAgLTI3Nyw3ICsyNzcsNiBAQCBtdDc2 dV9maWxsX3J4X3NnKHN0cnVjdCBtdDc2X2RldiAqZGV2LCBzdHJ1Y3QgbXQ3NnVfYnVmICpidWYs Cj4gIAkJIGludCBuc2dzLCBpbnQgbGVuLCBpbnQgc2dsZW4pCj4gIHsKPiAgCXN0cnVjdCBtdDc2 X3F1ZXVlICpxID0gJmRldi0+cV9yeFtNVF9SWFFfTUFJTl07Cj4gLQlzdHJ1Y3QgdXJiICp1cmIg PSBidWYtPnVyYjsKPiAgCWludCBpOwo+ICAKPiAgCXNwaW5fbG9ja19iaCgmcS0+cnhfcGFnZV9s b2NrKTsKPiBAQCAtMjkyLDIxICsyOTEsMjEgQEAgbXQ3NnVfZmlsbF9yeF9zZyhzdHJ1Y3QgbXQ3 Nl9kZXYgKmRldiwgc3RydWN0IG10NzZ1X2J1ZiAqYnVmLAo+ICAKPiAgCQlwYWdlID0gdmlydF90 b19oZWFkX3BhZ2UoZGF0YSk7Cj4gIAkJb2Zmc2V0ID0gZGF0YSAtIHBhZ2VfYWRkcmVzcyhwYWdl KTsKPiAtCQlzZ19zZXRfcGFnZSgmdXJiLT5zZ1tpXSwgcGFnZSwgc2dsZW4sIG9mZnNldCk7Cj4g KwkJc2dfc2V0X3BhZ2UoJmJ1Zi0+c2dbaV0sIHBhZ2UsIHNnbGVuLCBvZmZzZXQpOwo+ICAJfQo+ ICAJc3Bpbl91bmxvY2tfYmgoJnEtPnJ4X3BhZ2VfbG9jayk7Cj4gIAo+ICAJaWYgKGkgPCBuc2dz KSB7Cj4gIAkJaW50IGo7Cj4gIAo+IC0JCWZvciAoaiA9IG5zZ3M7IGogPCB1cmItPm51bV9zZ3M7 IGorKykKPiAtCQkJc2tiX2ZyZWVfZnJhZyhzZ192aXJ0KCZ1cmItPnNnW2pdKSk7Cj4gLQkJdXJi LT5udW1fc2dzID0gaTsKPiArCQlmb3IgKGogPSBuc2dzOyBqIDwgYnVmLT5udW1fc2dzOyBqKysp Cj4gKwkJCXNrYl9mcmVlX2ZyYWcoc2dfdmlydCgmYnVmLT5zZ1tqXSkpOwo+ICsJCWJ1Zi0+bnVt X3NncyA9IGk7Cj4gIAl9Cj4gIAo+IC0JdXJiLT5udW1fc2dzID0gbWF4X3QoaW50LCBpLCB1cmIt Pm51bV9zZ3MpOwo+IC0JYnVmLT5sZW4gPSB1cmItPm51bV9zZ3MgKiBzZ2xlbiwKPiAtCXNnX2lu aXRfbWFya2VyKHVyYi0+c2csIHVyYi0+bnVtX3Nncyk7Cj4gKwlidWYtPm51bV9zZ3MgPSBtYXhf dChpbnQsIGksIGJ1Zi0+bnVtX3Nncyk7Cj4gKwlidWYtPmxlbiA9IGJ1Zi0+bnVtX3NncyAqIHNn bGVuLAo+ICsJc2dfaW5pdF9tYXJrZXIoYnVmLT5zZywgYnVmLT5udW1fc2dzKTsKPiAgCj4gIAly ZXR1cm4gaSA/IDogLUVOT01FTTsKPiAgfQo+IEBAIC0zMTgsMTMgKzMxNywxNCBAQCBpbnQgbXQ3 NnVfYnVmX2FsbG9jKHN0cnVjdCBtdDc2X2RldiAqZGV2LCBzdHJ1Y3QgbXQ3NnVfYnVmICpidWYs Cj4gIAlpZiAoIWJ1Zi0+dXJiKQo+ICAJCXJldHVybiAtRU5PTUVNOwo+ICAKPiAtCWJ1Zi0+dXJi LT5zZyA9IGRldm1fa2NhbGxvYyhkZXYtPmRldiwgbnNncywgc2l6ZW9mKCpidWYtPnVyYi0+c2cp LAo+ICsJYnVmLT5zZyA9IGRldm1fa2NhbGxvYyhkZXYtPmRldiwgbnNncywgc2l6ZW9mKCpidWYt PnNnKSwKPiAgCQkJCSAgICBnZnApOwo+IC0JaWYgKCFidWYtPnVyYi0+c2cpCj4gKwlpZiAoIWJ1 Zi0+c2cpCj4gIAkJcmV0dXJuIC1FTk9NRU07Cj4gIAo+IC0Jc2dfaW5pdF90YWJsZShidWYtPnVy Yi0+c2csIG5zZ3MpOwo+ICsJc2dfaW5pdF90YWJsZShidWYtPnNnLCBuc2dzKTsKPiAgCWJ1Zi0+ ZGV2ID0gZGV2Owo+ICsJYnVmLT5udW1fc2dzID0gbnNnczsKPiAgCj4gIAlyZXR1cm4gbXQ3NnVf ZmlsbF9yeF9zZyhkZXYsIGJ1ZiwgbnNncywgbGVuLCBzZ2xlbik7Cj4gIH0KPiBAQCAtMzMyLDEy ICszMzIsMTEgQEAgRVhQT1JUX1NZTUJPTF9HUEwobXQ3NnVfYnVmX2FsbG9jKTsKPiAgCj4gIHZv aWQgbXQ3NnVfYnVmX2ZyZWUoc3RydWN0IG10NzZ1X2J1ZiAqYnVmKQo+ICB7Cj4gLQlzdHJ1Y3Qg dXJiICp1cmIgPSBidWYtPnVyYjsKPiAgCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Cj4gIAlpbnQg aTsKPiAgCj4gLQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1fc2dzOyBpKyspIHsKPiAtCQlzZyA9 ICZ1cmItPnNnW2ldOwo+ICsJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bnVtX3NnczsgaSsrKSB7Cj4g KwkJc2cgPSAmYnVmLT5zZ1tpXTsKPiAgCQlpZiAoIXNnKQo+ICAJCQljb250aW51ZTsKPiAgCj4g QEAgLTM0Nyw5ICszNDYsMTAgQEAgdm9pZCBtdDc2dV9idWZfZnJlZShzdHJ1Y3QgbXQ3NnVfYnVm ICpidWYpCj4gIH0KPiAgRVhQT1JUX1NZTUJPTF9HUEwobXQ3NnVfYnVmX2ZyZWUpOwo+ICAKPiAt aW50IG10NzZ1X3N1Ym1pdF9idWYoc3RydWN0IG10NzZfZGV2ICpkZXYsIGludCBkaXIsIGludCBp bmRleCwKPiAtCQkgICAgIHN0cnVjdCBtdDc2dV9idWYgKmJ1ZiwgZ2ZwX3QgZ2ZwLAo+IC0JCSAg ICAgdXNiX2NvbXBsZXRlX3QgY29tcGxldGVfZm4sIHZvaWQgKmNvbnRleHQpCj4gK3N0YXRpYyB2 b2lkCj4gK210NzZ1X2ZpbGxfYnVsa191cmIoc3RydWN0IG10NzZfZGV2ICpkZXYsIGludCBkaXIs IGludCBpbmRleCwKPiArCQkgICAgc3RydWN0IG10NzZ1X2J1ZiAqYnVmLCB1c2JfY29tcGxldGVf dCBjb21wbGV0ZV9mbiwKPiArCQkgICAgdm9pZCAqY29udGV4dCkKPiAgewo+ICAJc3RydWN0IHVz Yl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldi0+ZGV2KTsKPiAgCXN0cnVj dCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKPiBAQCAtMzYw LDkgKzM2MCwyMiBAQCBpbnQgbXQ3NnVfc3VibWl0X2J1ZihzdHJ1Y3QgbXQ3Nl9kZXYgKmRldiwg aW50IGRpciwgaW50IGluZGV4LAo+ICAJZWxzZQo+ICAJCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUo dWRldiwgZGV2LT51c2Iub3V0X2VwW2luZGV4XSk7Cj4gIAo+IC0JdXNiX2ZpbGxfYnVsa191cmIo YnVmLT51cmIsIHVkZXYsIHBpcGUsIE5VTEwsIGJ1Zi0+bGVuLAo+IC0JCQkgIGNvbXBsZXRlX2Zu LCBjb250ZXh0KTsKPiArCXVzYl9maWxsX2J1bGtfdXJiKGJ1Zi0+dXJiLCB1ZGV2LCBwaXBlLCBO VUxMLCBidWYtPmxlbiwgY29tcGxldGVfZm4sCj4gKwkJCSAgY29udGV4dCk7Cj4gKwo+ICsJaWYg KGJ1Zi0+bnVtX3NncyA+IDEpIHsKPiArCQlidWYtPnVyYi0+bnVtX3NncyA9IGJ1Zi0+bnVtX3Nn czsKPiArCQlidWYtPnVyYi0+c2cgPSBidWYtPnNnOwo+ICsJfSBlbHNlIHsKPiArCQlidWYtPnVy Yi0+dHJhbnNmZXJfYnVmZmVyID0gc2dfdmlydChidWYtPnNnKTsKPiArCX0KPiArfQo+ICAKPiAr aW50IG10NzZ1X3N1Ym1pdF9idWYoc3RydWN0IG10NzZfZGV2ICpkZXYsIGludCBkaXIsIGludCBp bmRleCwKPiArCQkgICAgIHN0cnVjdCBtdDc2dV9idWYgKmJ1ZiwgZ2ZwX3QgZ2ZwLAo+ICsJCSAg ICAgdXNiX2NvbXBsZXRlX3QgY29tcGxldGVfZm4sIHZvaWQgKmNvbnRleHQpCj4gK3sKPiArCW10 NzZ1X2ZpbGxfYnVsa191cmIoZGV2LCBkaXIsIGluZGV4LCBidWYsIGNvbXBsZXRlX2ZuLCBjb250 ZXh0KTsKPiAgCXJldHVybiB1c2Jfc3VibWl0X3VyYihidWYtPnVyYiwgZ2ZwKTsKPiAgfQo+ICBF WFBPUlRfU1lNQk9MX0dQTChtdDc2dV9zdWJtaXRfYnVmKTsKPiBAQCAtNjcyLDcgKzY4NSw3IEBA IHN0YXRpYyB2b2lkIG10NzZ1X2NvbXBsZXRlX3R4KHN0cnVjdCB1cmIgKnVyYikKPiAgfQo+ICAK PiAgc3RhdGljIGludAo+IC1tdDc2dV90eF9idWlsZF9zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBz dHJ1Y3QgdXJiICp1cmIpCj4gK210NzZ1X3R4X2J1aWxkX3NnKHN0cnVjdCBza19idWZmICpza2Is IHN0cnVjdCBtdDc2dV9idWYgKmJ1ZikKPiAgewo+ICAJaW50IG5zZ3MgPSAxICsgc2tiX3NoaW5m byhza2IpLT5ucl9mcmFnczsKPiAgCXN0cnVjdCBza19idWZmICppdGVyOwo+IEBAIC02ODAsMTMg KzY5MywxNCBAQCBtdDc2dV90eF9idWlsZF9zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qg dXJiICp1cmIpCj4gIAlza2Jfd2Fsa19mcmFncyhza2IsIGl0ZXIpCj4gIAkJbnNncyArPSAxICsg c2tiX3NoaW5mbyhpdGVyKS0+bnJfZnJhZ3M7Cj4gIAo+IC0JbWVtc2V0KHVyYi0+c2csIDAsIHNp emVvZigqdXJiLT5zZykgKiBNVF9TR19NQVhfU0laRSk7Cj4gKwltZW1zZXQoYnVmLT5zZywgMCwg c2l6ZW9mKCpidWYtPnNnKSAqIE1UX1NHX01BWF9TSVpFKTsKPiAgCj4gIAluc2dzID0gbWluX3Qo aW50LCBNVF9TR19NQVhfU0laRSwgbnNncyk7Cj4gLQlzZ19pbml0X21hcmtlcih1cmItPnNnLCBu c2dzKTsKPiAtCXVyYi0+bnVtX3NncyA9IG5zZ3M7Cj4gKwlzZ19pbml0X21hcmtlcihidWYtPnNn LCBuc2dzKTsKPiArCWJ1Zi0+bnVtX3NncyA9IG5zZ3M7Cj4gKwlidWYtPmxlbiA9IHNrYi0+bGVu Owo+ICAKPiAtCXJldHVybiBza2JfdG9fc2d2ZWNfbm9tYXJrKHNrYiwgdXJiLT5zZywgMCwgc2ti LT5sZW4pOwo+ICsJcmV0dXJuIHNrYl90b19zZ3ZlY19ub21hcmsoc2tiLCBidWYtPnNnLCAwLCBz a2ItPmxlbik7Cj4gIH0KPiAgCj4gIHN0YXRpYyBpbnQKPiBAQCAtNjk0LDEyICs3MDgsOSBAQCBt dDc2dV90eF9xdWV1ZV9za2Ioc3RydWN0IG10NzZfZGV2ICpkZXYsIHN0cnVjdCBtdDc2X3F1ZXVl ICpxLAo+ICAJCSAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBtdDc2X3djaWQgKndjaWQs Cj4gIAkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKPiAgewo+IC0Jc3RydWN0IHVzYl9p bnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldi0+ZGV2KTsKPiAtCXN0cnVjdCB1 c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKPiAgCXU4IGVwID0g cTJlcChxLT5od19pZHgpOwo+ICAJc3RydWN0IG10NzZ1X2J1ZiAqYnVmOwo+ICAJdTE2IGlkeCA9 IHEtPnRhaWw7Cj4gLQl1bnNpZ25lZCBpbnQgcGlwZTsKPiAgCWludCBlcnI7Cj4gIAo+ICAJaWYg KHEtPnF1ZXVlZCA9PSBxLT5uZGVzYykKPiBAQCAtNzEyLDEzICs3MjMsMTEgQEAgbXQ3NnVfdHhf cXVldWVfc2tiKHN0cnVjdCBtdDc2X2RldiAqZGV2LCBzdHJ1Y3QgbXQ3Nl9xdWV1ZSAqcSwKPiAg CWJ1ZiA9ICZxLT5lbnRyeVtpZHhdLnVidWY7Cj4gIAlidWYtPmRvbmUgPSBmYWxzZTsKPiAgCj4g LQllcnIgPSBtdDc2dV90eF9idWlsZF9zZyhza2IsIGJ1Zi0+dXJiKTsKPiArCWVyciA9IG10NzZ1 X3R4X2J1aWxkX3NnKHNrYiwgYnVmKTsKPiAgCWlmIChlcnIgPCAwKQo+ICAJCXJldHVybiBlcnI7 Cj4gIAo+IC0JcGlwZSA9IHVzYl9zbmRidWxrcGlwZSh1ZGV2LCBkZXYtPnVzYi5vdXRfZXBbZXBd KTsKPiAtCXVzYl9maWxsX2J1bGtfdXJiKGJ1Zi0+dXJiLCB1ZGV2LCBwaXBlLCBOVUxMLCBza2It PmxlbiwKPiAtCQkJICBtdDc2dV9jb21wbGV0ZV90eCwgYnVmKTsKPiArCW10NzZ1X2ZpbGxfYnVs a191cmIoZGV2LCBVU0JfRElSX09VVCwgZXAsIGJ1ZiwgbXQ3NnVfY29tcGxldGVfdHgsIGJ1Zik7 Cj4gIAo+ICAJcS0+dGFpbCA9IChxLT50YWlsICsgMSkgJSBxLT5uZGVzYzsKPiAgCXEtPmVudHJ5 W2lkeF0uc2tiID0gc2tiOwo+IEBAIC03NzYsOCArNzg1LDggQEAgc3RhdGljIGludCBtdDc2dV9h bGxvY190eChzdHJ1Y3QgbXQ3Nl9kZXYgKmRldikKPiAgCQkJaWYgKCFidWYtPnVyYikKPiAgCQkJ CXJldHVybiAtRU5PTUVNOwo+ICAKPiAtCQkJYnVmLT51cmItPnNnID0gZGV2bV9remFsbG9jKGRl di0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKPiAtCQkJaWYgKCFidWYtPnVyYi0+c2cpCj4gKwkJ CWJ1Zi0+c2cgPSBkZXZtX2t6YWxsb2MoZGV2LT5kZXYsIHNpemUsIEdGUF9LRVJORUwpOwo+ICsJ CQlpZiAoIWJ1Zi0+c2cpCj4gIAkJCQlyZXR1cm4gLUVOT01FTTsKPiAgCQl9Cj4gIAl9Cj4gLS0g Cj4gMi4yMC4xCj4K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E03C1C43381 for ; Wed, 20 Feb 2019 13:22:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9989B2086C for ; Wed, 20 Feb 2019 13:22:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726805AbfBTNWO (ORCPT ); Wed, 20 Feb 2019 08:22:14 -0500 Received: from mail-wm1-f67.google.com ([209.85.128.67]:50601 "EHLO mail-wm1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726516AbfBTNWO (ORCPT ); Wed, 20 Feb 2019 08:22:14 -0500 Received: by mail-wm1-f67.google.com with SMTP id x7so6594528wmj.0 for ; Wed, 20 Feb 2019 05:22:12 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=QXo0txz4yAAOPSANBFn/jzPSAgBKX9c6bvK73J5W00g=; b=K07KQ5P2jOCB8U2SpyyhtMh/4s5pA6b2RE1gXWfqSmZ5Yy9q3qujrToHnKPSEcuGVg X58Mmbh8oV9lnwgObHrcYqMGMy93QgX4XH+yC8i6l8m/Auvow/2RWPh+K+/d+m9OoSof L3L/m2075TB6bRpQpTzmyA26cl4y0wfg1vG2muhByiLyzQtQevwmFKW0kMdlbDLGneGd c5NXzFf+xgQwuXgA2mk24tZcJpDUQsiuf9p+zKNxrIDZVO3osjRPjHO06iuKy7UdORzm 6Xjh5IOc5zNjZTStaxc9Ffa4crE8uMfsWaO4WR1X4/qS0DxuyvHuHdFapnQd0ytqBiZn ej1A== X-Gm-Message-State: AHQUAuZrFWrp3+NKD3jYfKiSdb/XqHET/hB3kYsPkkPDpL4qUF2DLnIt Zigu5suL1FgokCoa+h1UppfueA== X-Google-Smtp-Source: AHgI3IaPAwserX6ahqUf8krZkD8i8J5/ZjqAdzhA9xZh8hCv+j+VDlV7a9NcxoxNRTonW8fyFz5y+Q== X-Received: by 2002:a1c:4006:: with SMTP id n6mr6946648wma.137.1550668931177; Wed, 20 Feb 2019 05:22:11 -0800 (PST) Received: from localhost.localdomain (nat-pool-mxp-t.redhat.com. [149.6.153.186]) by smtp.gmail.com with ESMTPSA id y185sm6165446wmg.34.2019.02.20.05.22.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 20 Feb 2019 05:22:10 -0800 (PST) Date: Wed, 20 Feb 2019 14:22:08 +0100 From: Lorenzo Bianconi To: Stanislaw Gruszka Cc: Felix Fietkau , Stefan Wahren , Alan Stern , Doug Anderson , Minas Harutyunyan , USB list , linux-wireless Subject: Re: [BUG] mt76x0u: Probing issues on Raspberry Pi 3 B+ Message-ID: <20190220132206.GF2626@localhost.localdomain> References: <1411983628.668277.1550315118443@email.ionos.de> <20190216140739.GA2236@redhat.com> <2009016263.528260.1550344627996@email.ionos.de> <20190218135247.GA9602@redhat.com> <0e29e99a-6ed4-40fe-1f38-30f1b5530a16@nbd.name> <20190218150303.GD9602@redhat.com> <20190219104208.GA22999@redhat.com> <58097bb1-d726-c48e-2a40-2e12098dfb15@nbd.name> <20190220130009.GA2377@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190220130009.GA2377@redhat.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org > On Tue, Feb 19, 2019 at 01:19:26PM +0100, Felix Fietkau wrote: > > >> >> The way I see it, we have two choices. > > >> >> 1. Fix dwc2 to do its alignment quirk for the urb->sg != NULL case > > >> >> 2. Rely on urb->transfer_buffer and keep urb->sg NULL > > >> > > > >> > I agree, if this is only needed for dwc2. Though I would investigate > > >> > if this is not a bug on other platforms as well. > > >> >From what I can see, using Lorenzo's patches seems to be the better > > >> solution, since they avoid these corner cases in dwc2 (and maybe other > > >> drivers as well). I will apply them and then we'll see if we need to do > > >> any further improvements later on. > > > > > > They work on rpi dwc2, but they do not address root of the problem. > > > There is clearly something wrong how mt76usb handle SG, what is not > > > fixed. And adding disable_usb_sg module parameter for hcd's supporting > > > SG should be red flag. > > I think we're simply dealing with multiple issues here, only some of > > which are fixed by Lorenzo's patches. > > I'm pretty sure it's still wrong for mt76 to try to align its buffers, > > since the Linux USB API supports non-aligned transfer buffers and it > > should be up to the controller driver to deal with that. > > Agree. > > > dwc2 tries to do that, but that has limitations which I already pointed > > out and which are properly dealt with by Lorenzo's patches. > > I planed to just accept current solution, but I started to work on patch > that remove len, sglen arguments from mt76u_buf_alloc() and use > q->buf_size and SKB_WITH_OVERHEAD(q->buf_size) directly and realized how > related code is now tangled. > > Would be ok to send this patch with proper changelog as fix for RPI > against wireless-drivers and cc:stable (assuming it works and really > fix things on RPI) and revert Lorenzo's patches in -next ? Hi Stanislaw, what is the advantage of doing so? You have duplicated most of the fields that are already in the urb data structure and you use transfer_buffer (no SG I/O). Moreover I have ready a series that removes 99% of the dual allocation code and maintain it in the control path (instead of the datapath one). I need just to rebase it ontop of your series. I will post it soon. Regards, Lorenzo > > Stanislaw > > From 4f8d7d3f4031b0a97b3bb147cb7e52533886e7cc Mon Sep 17 00:00:00 2001 > From: Stanislaw Gruszka > Date: Wed, 20 Feb 2019 13:29:42 +0100 > Subject: [PATCH] mt76usb: use urb transfer_buffer for one segment > > Signed-off-by: Stanislaw Gruszka > --- > drivers/net/wireless/mediatek/mt76/mt76.h | 2 + > .../wireless/mediatek/mt76/mt76x02_usb_mcu.c | 4 +- > drivers/net/wireless/mediatek/mt76/usb.c | 75 +++++++++++-------- > 3 files changed, 46 insertions(+), 35 deletions(-) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h > index 2e5bcb3fdff7..7e0680daeee6 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76.h > +++ b/drivers/net/wireless/mediatek/mt76/mt76.h > @@ -86,6 +86,8 @@ struct mt76_queue_buf { > struct mt76u_buf { > struct mt76_dev *dev; > struct urb *urb; > + struct scatterlist *sg; > + int num_sgs; > size_t len; > bool done; > }; > diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c > index da299b8a1334..75561910d630 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_usb_mcu.c > @@ -90,7 +90,7 @@ static int mt76x02u_mcu_wait_resp(struct mt76_dev *dev, u8 seq) > if (urb->status) > return -EIO; > > - data = sg_virt(&urb->sg[0]); > + data = sg_virt(&buf->sg[0]); > if (usb->mcu.rp) > mt76x02u_multiple_mcu_reads(dev, data + 4, > urb->actual_length - 8); > @@ -266,7 +266,7 @@ static int > __mt76x02u_mcu_fw_send_data(struct mt76x02_dev *dev, struct mt76u_buf *buf, > const void *fw_data, int len, u32 dst_addr) > { > - u8 *data = sg_virt(&buf->urb->sg[0]); > + u8 *data = sg_virt(&buf->sg[0]); > DECLARE_COMPLETION_ONSTACK(cmpl); > __le32 info; > u32 val; > diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c > index a1811c39415e..57bb16eaff06 100644 > --- a/drivers/net/wireless/mediatek/mt76/usb.c > +++ b/drivers/net/wireless/mediatek/mt76/usb.c > @@ -277,7 +277,6 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76u_buf *buf, > int nsgs, int len, int sglen) > { > struct mt76_queue *q = &dev->q_rx[MT_RXQ_MAIN]; > - struct urb *urb = buf->urb; > int i; > > spin_lock_bh(&q->rx_page_lock); > @@ -292,21 +291,21 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76u_buf *buf, > > page = virt_to_head_page(data); > offset = data - page_address(page); > - sg_set_page(&urb->sg[i], page, sglen, offset); > + sg_set_page(&buf->sg[i], page, sglen, offset); > } > spin_unlock_bh(&q->rx_page_lock); > > if (i < nsgs) { > int j; > > - for (j = nsgs; j < urb->num_sgs; j++) > - skb_free_frag(sg_virt(&urb->sg[j])); > - urb->num_sgs = i; > + for (j = nsgs; j < buf->num_sgs; j++) > + skb_free_frag(sg_virt(&buf->sg[j])); > + buf->num_sgs = i; > } > > - urb->num_sgs = max_t(int, i, urb->num_sgs); > - buf->len = urb->num_sgs * sglen, > - sg_init_marker(urb->sg, urb->num_sgs); > + buf->num_sgs = max_t(int, i, buf->num_sgs); > + buf->len = buf->num_sgs * sglen, > + sg_init_marker(buf->sg, buf->num_sgs); > > return i ? : -ENOMEM; > } > @@ -318,13 +317,14 @@ int mt76u_buf_alloc(struct mt76_dev *dev, struct mt76u_buf *buf, > if (!buf->urb) > return -ENOMEM; > > - buf->urb->sg = devm_kcalloc(dev->dev, nsgs, sizeof(*buf->urb->sg), > + buf->sg = devm_kcalloc(dev->dev, nsgs, sizeof(*buf->sg), > gfp); > - if (!buf->urb->sg) > + if (!buf->sg) > return -ENOMEM; > > - sg_init_table(buf->urb->sg, nsgs); > + sg_init_table(buf->sg, nsgs); > buf->dev = dev; > + buf->num_sgs = nsgs; > > return mt76u_fill_rx_sg(dev, buf, nsgs, len, sglen); > } > @@ -332,12 +332,11 @@ EXPORT_SYMBOL_GPL(mt76u_buf_alloc); > > void mt76u_buf_free(struct mt76u_buf *buf) > { > - struct urb *urb = buf->urb; > struct scatterlist *sg; > int i; > > - for (i = 0; i < urb->num_sgs; i++) { > - sg = &urb->sg[i]; > + for (i = 0; i < buf->num_sgs; i++) { > + sg = &buf->sg[i]; > if (!sg) > continue; > > @@ -347,9 +346,10 @@ void mt76u_buf_free(struct mt76u_buf *buf) > } > EXPORT_SYMBOL_GPL(mt76u_buf_free); > > -int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index, > - struct mt76u_buf *buf, gfp_t gfp, > - usb_complete_t complete_fn, void *context) > +static void > +mt76u_fill_bulk_urb(struct mt76_dev *dev, int dir, int index, > + struct mt76u_buf *buf, usb_complete_t complete_fn, > + void *context) > { > struct usb_interface *intf = to_usb_interface(dev->dev); > struct usb_device *udev = interface_to_usbdev(intf); > @@ -360,9 +360,22 @@ int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index, > else > pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[index]); > > - usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, buf->len, > - complete_fn, context); > + usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, buf->len, complete_fn, > + context); > + > + if (buf->num_sgs > 1) { > + buf->urb->num_sgs = buf->num_sgs; > + buf->urb->sg = buf->sg; > + } else { > + buf->urb->transfer_buffer = sg_virt(buf->sg); > + } > +} > > +int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index, > + struct mt76u_buf *buf, gfp_t gfp, > + usb_complete_t complete_fn, void *context) > +{ > + mt76u_fill_bulk_urb(dev, dir, index, buf, complete_fn, context); > return usb_submit_urb(buf->urb, gfp); > } > EXPORT_SYMBOL_GPL(mt76u_submit_buf); > @@ -672,7 +685,7 @@ static void mt76u_complete_tx(struct urb *urb) > } > > static int > -mt76u_tx_build_sg(struct sk_buff *skb, struct urb *urb) > +mt76u_tx_build_sg(struct sk_buff *skb, struct mt76u_buf *buf) > { > int nsgs = 1 + skb_shinfo(skb)->nr_frags; > struct sk_buff *iter; > @@ -680,13 +693,14 @@ mt76u_tx_build_sg(struct sk_buff *skb, struct urb *urb) > skb_walk_frags(skb, iter) > nsgs += 1 + skb_shinfo(iter)->nr_frags; > > - memset(urb->sg, 0, sizeof(*urb->sg) * MT_SG_MAX_SIZE); > + memset(buf->sg, 0, sizeof(*buf->sg) * MT_SG_MAX_SIZE); > > nsgs = min_t(int, MT_SG_MAX_SIZE, nsgs); > - sg_init_marker(urb->sg, nsgs); > - urb->num_sgs = nsgs; > + sg_init_marker(buf->sg, nsgs); > + buf->num_sgs = nsgs; > + buf->len = skb->len; > > - return skb_to_sgvec_nomark(skb, urb->sg, 0, skb->len); > + return skb_to_sgvec_nomark(skb, buf->sg, 0, skb->len); > } > > static int > @@ -694,12 +708,9 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, > struct sk_buff *skb, struct mt76_wcid *wcid, > struct ieee80211_sta *sta) > { > - struct usb_interface *intf = to_usb_interface(dev->dev); > - struct usb_device *udev = interface_to_usbdev(intf); > u8 ep = q2ep(q->hw_idx); > struct mt76u_buf *buf; > u16 idx = q->tail; > - unsigned int pipe; > int err; > > if (q->queued == q->ndesc) > @@ -712,13 +723,11 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, > buf = &q->entry[idx].ubuf; > buf->done = false; > > - err = mt76u_tx_build_sg(skb, buf->urb); > + err = mt76u_tx_build_sg(skb, buf); > if (err < 0) > return err; > > - pipe = usb_sndbulkpipe(udev, dev->usb.out_ep[ep]); > - usb_fill_bulk_urb(buf->urb, udev, pipe, NULL, skb->len, > - mt76u_complete_tx, buf); > + mt76u_fill_bulk_urb(dev, USB_DIR_OUT, ep, buf, mt76u_complete_tx, buf); > > q->tail = (q->tail + 1) % q->ndesc; > q->entry[idx].skb = skb; > @@ -776,8 +785,8 @@ static int mt76u_alloc_tx(struct mt76_dev *dev) > if (!buf->urb) > return -ENOMEM; > > - buf->urb->sg = devm_kzalloc(dev->dev, size, GFP_KERNEL); > - if (!buf->urb->sg) > + buf->sg = devm_kzalloc(dev->dev, size, GFP_KERNEL); > + if (!buf->sg) > return -ENOMEM; > } > } > -- > 2.20.1 >