]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/mellanox/mlxsw/item.h
Merge remote-tracking branch 'ipsec/master'
[karo-tx-linux.git] / drivers / net / ethernet / mellanox / mlxsw / item.h
index 5a5e737d52bf9e91a8b6cd9692c4d733976d9a0b..a94dbda6590b36ee8a59a90c36f1ede510a2ae14 100644 (file)
@@ -171,15 +171,21 @@ static inline void __mlxsw_item_set64(char *buf, struct mlxsw_item *item,
 }
 
 static inline void __mlxsw_item_memcpy_from(char *buf, char *dst,
-                                           struct mlxsw_item *item)
+                                           struct mlxsw_item *item,
+                                           unsigned short index)
 {
-       memcpy(dst, &buf[item->offset], item->size.bytes);
+       unsigned int offset = __mlxsw_item_offset(item, index, sizeof(char));
+
+       memcpy(dst, &buf[offset], item->size.bytes);
 }
 
 static inline void __mlxsw_item_memcpy_to(char *buf, const char *src,
-                                         struct mlxsw_item *item)
+                                         struct mlxsw_item *item,
+                                         unsigned short index)
 {
-       memcpy(&buf[item->offset], src, item->size.bytes);
+       unsigned int offset = __mlxsw_item_offset(item, index, sizeof(char));
+
+       memcpy(&buf[offset], src, item->size.bytes);
 }
 
 static inline u16
@@ -187,6 +193,7 @@ __mlxsw_item_bit_array_offset(struct mlxsw_item *item, u16 index, u8 *shift)
 {
        u16 max_index, be_index;
        u16 offset;             /* byte offset inside the array */
+       u8 in_byte_index;
 
        BUG_ON(index && !item->element_size);
        if (item->offset % sizeof(u32) != 0 ||
@@ -199,7 +206,8 @@ __mlxsw_item_bit_array_offset(struct mlxsw_item *item, u16 index, u8 *shift)
        max_index = (item->size.bytes << 3) / item->element_size - 1;
        be_index = max_index - index;
        offset = be_index * item->element_size >> 3;
-       *shift = index % (BITS_PER_BYTE / item->element_size) << 1;
+       in_byte_index  = index % (BITS_PER_BYTE / item->element_size);
+       *shift = in_byte_index * item->element_size;
 
        return item->offset + offset;
 }
@@ -371,12 +379,40 @@ static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = {                   \
 static inline void                                                             \
 mlxsw_##_type##_##_cname##_##_iname##_memcpy_from(char *buf, char *dst)                \
 {                                                                              \
-       __mlxsw_item_memcpy_from(buf, dst, &__ITEM_NAME(_type, _cname, _iname));\
+       __mlxsw_item_memcpy_from(buf, dst,                                      \
+                                &__ITEM_NAME(_type, _cname, _iname), 0);       \
 }                                                                              \
 static inline void                                                             \
 mlxsw_##_type##_##_cname##_##_iname##_memcpy_to(char *buf, const char *src)    \
 {                                                                              \
-       __mlxsw_item_memcpy_to(buf, src, &__ITEM_NAME(_type, _cname, _iname));  \
+       __mlxsw_item_memcpy_to(buf, src,                                        \
+                              &__ITEM_NAME(_type, _cname, _iname), 0);         \
+}
+
+#define MLXSW_ITEM_BUF_INDEXED(_type, _cname, _iname, _offset, _sizebytes,     \
+                              _step, _instepoffset)                            \
+static struct mlxsw_item __ITEM_NAME(_type, _cname, _iname) = {                        \
+       .offset = _offset,                                                      \
+       .step = _step,                                                          \
+       .in_step_offset = _instepoffset,                                        \
+       .size = {.bytes = _sizebytes,},                                         \
+       .name = #_type "_" #_cname "_" #_iname,                                 \
+};                                                                             \
+static inline void                                                             \
+mlxsw_##_type##_##_cname##_##_iname##_memcpy_from(char *buf,                   \
+                                                 unsigned short index,         \
+                                                 char *dst)                    \
+{                                                                              \
+       __mlxsw_item_memcpy_from(buf, dst,                                      \
+                                &__ITEM_NAME(_type, _cname, _iname), index);   \
+}                                                                              \
+static inline void                                                             \
+mlxsw_##_type##_##_cname##_##_iname##_memcpy_to(char *buf,                     \
+                                               unsigned short index,           \
+                                               const char *src)                \
+{                                                                              \
+       __mlxsw_item_memcpy_to(buf, src,                                        \
+                              &__ITEM_NAME(_type, _cname, _iname), index);     \
 }
 
 #define MLXSW_ITEM_BIT_ARRAY(_type, _cname, _iname, _offset, _sizebytes,       \