Igbe: Newer kernels seem to allow TSO headers and packet data to be in one desc
authorAli Saidi <Ali.Saidi@ARM.com>
Fri, 7 Sep 2012 19:20:53 +0000 (14:20 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Fri, 7 Sep 2012 19:20:53 +0000 (14:20 -0500)
Implement some code we used to panic on as it actually does happen with the
e1000 driver in Linux 3.3+. We used to assume that a TSO header would never
be part of a larger payload, however it appears as though it now can be.

src/dev/i8254xGBe.cc

index 71b88377d93dc5249dae707ec07293a5b365f74b..d2b7c0f7576a927d705590ee1ec19db19c576b28 100644 (file)
@@ -1650,11 +1650,9 @@ IGbE::TxDescCache::headerComplete()
         unusedCache.pop_front();
         usedCache.push_back(desc);
     } else {
-        // I don't think this case happens, I think the headrer is always
-        // it's own packet, if it wasn't it might be as simple as just
-        // incrementing descBytesUsed by the header length, but I'm not
-        // completely sure
-        panic("TSO header part of bigger packet, not implemented\n");
+        DPRINTF(EthernetDesc, "TSO: header part of larger payload\n");
+        tsoDescBytesUsed = tsoHeaderLen;
+        tsoLoadedHeader = true;
     }
     enableSm();
     igbe->checkDrain();