diff --git a/ebpfcat/ebpfcat.py b/ebpfcat/ebpfcat.py
index dbcdbed651f68d49e541b6d3f18016fd2fd465fc..e6e2b0fbb0180649fad7c45167ea221866113827 100644
--- a/ebpfcat/ebpfcat.py
+++ b/ebpfcat/ebpfcat.py
@@ -223,8 +223,10 @@ class EBPFTerminal(Terminal):
                 f"Incompatible Terminal: {self.vendorId}:{self.productCode}")
         await self.to_operational(2)
         self.pdos = {}
-        if self.has_mailbox():
-            await self.parse_pdos()
+        outbits, inbits = await self.parse_pdos()
+        self.pdo_out_sz = int((outbits + 7) // 8)
+        self.pdo_in_sz = int((inbits + 7) // 8)
+        await self.write_pdo_sm()
 
     def allocate(self, packet, readonly):
         """allocate space in packet for the pdos of this terminal
diff --git a/ebpfcat/ethercat.py b/ebpfcat/ethercat.py
index a316104268745cab47b8db140d5ff1c23228d3e4..d0deba9ea6dc4bbdb9b122ab7a13ec2dda8d2bf1 100644
--- a/ebpfcat/ethercat.py
+++ b/ebpfcat/ethercat.py
@@ -450,6 +450,16 @@ class Terminal:
             elif mode == 6:
                 self.mbx_out_off = offset
                 self.mbx_out_sz = size
+            else:
+                print("wrong mode")
+
+    async def write_pdo_sm(self):
+        await self.write(0x816, "B", 0)
+        await self.write(0x812, "H", self.pdo_out_sz)
+        await self.write(0x816, "B", self.pdo_out_sz > 0)
+        await self.write(0x81E, "B", 0)
+        await self.write(0x81A, "H", self.pdo_in_sz)
+        await self.write(0x81E, "B", self.pdo_in_sz > 0)
 
     async def parse_pdos(self):
         async def parse_eeprom(s):
@@ -490,16 +500,18 @@ class Terminal:
                         (sm, bitpos // 8,
                          {8: "B", 16: "H", 32: "I", 64: "Q"}[bits])
                 bitpos += bits
+            return bitpos
 
         self.pdos = {}
         if self.has_mailbox():
-            await parse(parse_sdo(0x1c12, 2))
-            await parse(parse_sdo(0x1c13, 3))
+            return (await parse(parse_sdo(0x1c12, 2)),
+                    await parse(parse_sdo(0x1c13, 3)))
         else:
-            if 50 in self.eeprom:
+            return (
                 await parse(parse_eeprom(self.eeprom[50]))
-            if 51 in self.eeprom:
+                if 50 in self.eeprom else 0,
                 await parse(parse_eeprom(self.eeprom[51]))
+                if 51 in self.eeprom else 0)
 
     async def parse_pdo(self, index, sm):
         assignment = await self.sdo_read(index)