command = get_unaligned_le32(&mgmt_ethhdr->command);
        cmd = FIELD_GET(QCA_HDR_MGMT_CMD, command);
+
        len = FIELD_GET(QCA_HDR_MGMT_LENGTH, command);
+       /* Special case for len of 15 as this is the max value for len and needs to
+        * be increased before converting it from word to dword.
+        */
+       if (len == 15)
+               len++;
+
+       /* We can ignore odd value, we always round up them in the alloc function. */
+       len *= sizeof(u16);
 
        /* Make sure the seq match the requested packet */
        if (get_unaligned_le32(&mgmt_ethhdr->seq) == mgmt_eth_data->seq)
        if (!skb)
                return NULL;
 
-       /* Max value for len reg is 15 (0xf) but the switch actually return 16 byte
-        * Actually for some reason the steps are:
-        * 0: nothing
-        * 1-4: first 4 byte
-        * 5-6: first 12 byte
-        * 7-15: all 16 byte
+       /* Hdr mgmt length value is in step of word size.
+        * As an example to process 4 byte of data the correct length to set is 2.
+        * To process 8 byte 4, 12 byte 6, 16 byte 8...
+        *
+        * Odd values will always return the next size on the ack packet.
+        * (length of 3 (6 byte) will always return 8 bytes of data)
+        *
+        * This means that a value of 15 (0xf) actually means reading/writing 32 bytes
+        * of data.
+        *
+        * To correctly calculate the length we devide the requested len by word and
+        * round up.
+        * On the ack function we can skip the odd check as we already handle the
+        * case here.
+        */
+       real_len = DIV_ROUND_UP(len, sizeof(u16));
+
+       /* We check if the result len is odd and we round up another time to
+        * the next size. (length of 3 will be increased to 4 as switch will always
+        * return 8 bytes)
         */
-       if (len == 16)
-               real_len = 15;
-       else
-               real_len = len;
+       if (real_len % sizeof(u16) != 0)
+               real_len++;
+
+       /* Max reg value is 0xf(15) but switch will always return the next size (32 byte) */
+       if (real_len == 16)
+               real_len--;
 
        skb_reset_mac_header(skb);
        skb_set_network_header(skb, skb->len);