*/
        int ptpegr_ts_bytes;
        int num_cbs_shapers;
+       int max_frame_mem;
        const struct sja1105_dynamic_table_ops *dyn_ops;
        const struct sja1105_table_ops *static_ops;
        const struct sja1105_regs *regs;
 
 
 static int sja1105_init_l2_forwarding_params(struct sja1105_private *priv)
 {
-       struct sja1105_l2_forwarding_params_entry default_l2fwd_params = {
-               /* Disallow dynamic reconfiguration of vlan_pmap */
-               .max_dynp = 0,
-               /* Use a single memory partition for all ingress queues */
-               .part_spc = { SJA1105_MAX_FRAME_MEMORY, 0, 0, 0, 0, 0, 0, 0 },
-       };
+       struct sja1105_l2_forwarding_params_entry *l2fwd_params;
        struct sja1105_table *table;
 
        table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS];
        table->entry_count = table->ops->max_entry_count;
 
        /* This table only has a single entry */
-       ((struct sja1105_l2_forwarding_params_entry *)table->entries)[0] =
-                               default_l2fwd_params;
+       l2fwd_params = table->entries;
+
+       /* Disallow dynamic reconfiguration of vlan_pmap */
+       l2fwd_params->max_dynp = 0;
+       /* Use a single memory partition for all ingress queues */
+       l2fwd_params->part_spc[0] = priv->info->max_frame_mem;
 
        return 0;
 }
 {
        struct sja1105_l2_forwarding_params_entry *l2_fwd_params;
        struct sja1105_vl_forwarding_params_entry *vl_fwd_params;
+       int max_mem = priv->info->max_frame_mem;
        struct sja1105_table *table;
-       int max_mem;
 
        /* VLAN retagging is implemented using a loopback port that consumes
         * frame buffers. That leaves less for us.
         */
        if (priv->vlan_state == SJA1105_VLAN_BEST_EFFORT)
-               max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING;
-       else
-               max_mem = SJA1105_MAX_FRAME_MEMORY;
+               max_mem -= SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD;
 
        table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS];
        l2_fwd_params = table->entries;
 
        char *final_header_ptr;
        int crc_len;
 
-       valid = sja1105_static_config_check_valid(config);
+       valid = sja1105_static_config_check_valid(config,
+                                                 priv->info->max_frame_mem);
        if (valid != SJA1105_CONFIG_OK) {
                dev_err(&priv->spidev->dev,
                        sja1105_static_config_error_msg[valid]);
        .can_limit_mcast_flood  = false,
        .ptp_ts_bits            = 24,
        .ptpegr_ts_bytes        = 4,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105ET_MAX_CBS_COUNT,
        .reset_cmd              = sja1105et_reset_cmd,
        .fdb_add_cmd            = sja1105et_fdb_add,
        .can_limit_mcast_flood  = false,
        .ptp_ts_bits            = 24,
        .ptpegr_ts_bytes        = 4,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105ET_MAX_CBS_COUNT,
        .reset_cmd              = sja1105et_reset_cmd,
        .fdb_add_cmd            = sja1105et_fdb_add,
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
 
 };
 
 static sja1105_config_valid_t
-static_config_check_memory_size(const struct sja1105_table *tables)
+static_config_check_memory_size(const struct sja1105_table *tables, int max_mem)
 {
        const struct sja1105_l2_forwarding_params_entry *l2_fwd_params;
        const struct sja1105_vl_forwarding_params_entry *vl_fwd_params;
-       int i, max_mem, mem = 0;
+       int i, mem = 0;
 
        l2_fwd_params = tables[BLK_IDX_L2_FORWARDING_PARAMS].entries;
 
        }
 
        if (tables[BLK_IDX_RETAGGING].entry_count)
-               max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING;
-       else
-               max_mem = SJA1105_MAX_FRAME_MEMORY;
+               max_mem -= SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD;
 
        if (mem > max_mem)
                return SJA1105_OVERCOMMITTED_FRAME_MEMORY;
 }
 
 sja1105_config_valid_t
-sja1105_static_config_check_valid(const struct sja1105_static_config *config)
+sja1105_static_config_check_valid(const struct sja1105_static_config *config,
+                                 int max_mem)
 {
        const struct sja1105_table *tables = config->tables;
 #define IS_FULL(blk_idx) \
        if (!IS_FULL(BLK_IDX_XMII_PARAMS))
                return SJA1105_MISSING_XMII_TABLE;
 
-       return static_config_check_memory_size(tables);
+       return static_config_check_memory_size(tables, max_mem);
 #undef IS_FULL
 }
 
 
 #define SJA1105PQRS_MAX_CBS_COUNT                      16
 
 #define SJA1105_MAX_FRAME_MEMORY                       929
-#define SJA1105_MAX_FRAME_MEMORY_RETAGGING             910
+#define SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD                19
 #define SJA1105_VL_FRAME_MEMORY                                100
 
 #define SJA1105E_DEVICE_ID                             0x9C00000Cull
 extern const char *sja1105_static_config_error_msg[];
 
 sja1105_config_valid_t
-sja1105_static_config_check_valid(const struct sja1105_static_config *config);
+sja1105_static_config_check_valid(const struct sja1105_static_config *config,
+                                 int max_mem);
 void
 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
 int sja1105_static_config_init(struct sja1105_static_config *config,