openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

ism.c (20147B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  *
      7  * The part of PCID that simulates the ism
      8  *
      9  * Requires:
     10  *
     11  * Provides:
     12  */
     13 
     14 #include <shared/bsl.h>
     15 
     16 #include <unistd.h>
     17 #include <stdlib.h>
     18 #include <soc/drv.h>
     19 #include <sys/types.h>
     20 #include <sys/time.h>
     21 #include <soc/mem.h>
     22 #include <soc/hash.h>
     23 #include <soc/ism.h>
     24 #include <soc/ism_hash.h>
     25 #include <soc/cmic.h>
     26 #include <soc/debug.h>
     27 #include <sal/appl/io.h>
     28 #include <soc/mcm/driver.h>
     29 #include <bde/pli/verinet.h>
     30 
     31 #include "pcid.h"
     32 #include "mem.h"
     33 #include "ism.h"
     34 #include "cmicsim.h"
     35 #include "dma.h"
     36 
     37 #ifdef BCM_ISM_SUPPORT
     38 
     39 uint8 ism_init = 0;
     40 
     41 extern uint32 soc_crc32b(uint8 *data, int data_nbits);
     42 extern uint16 soc_crc16b(uint8 *data, int data_nbits);
     43 extern soc_field_t _ism_table_bank_cfg_fld[];
     44 extern soc_reg_t _ism_stage_hash_cfg_reg[];
     45 extern soc_field_t _ism_stage_hash_cfg_fld[];
     46 
     47 extern _soc_ism_t _soc_ism_info[SOC_MAX_NUM_DEVICES];
     48 extern _soc_ism_hash_t _soc_ism_hash_info[SOC_MAX_NUM_DEVICES];
     49 extern uint32 _soc_ism_bank_raw_sizes[];
     50 /*
     51  * Macro used by memory accessor functions to fix order
     52  */
     53 #define FIX_MEM_ORDER_E(v,m) (((m)->flags & SOC_MEM_FLAG_BE) ? \
     54                                 BYTES2WORDS((m)->bytes)-1-(v) : \
     55                                 (v))
     56 
     57 static soc_reg_t _ism_table_bank_cfg_reg[] = {
     58     TABLE0_BANK_CONFIGr, TABLE1_BANK_CONFIGr,
     59     TABLE2_BANK_CONFIGr, TABLE3_BANK_CONFIGr,
     60     TABLE4_BANK_CONFIGr
     61 };
     62 
     63 void 
     64 soc_internal_init_hash_state(pcid_info_t *pcid_info)
     65 {
     66     int         t, s, b;
     67     uint32      rval, banks;
     68     uint32      data[SOC_MAX_MEM_WORDS];
     69     soc_block_t blk;
     70     uint8       at;
     71 
     72     /* Assign everything to ESM to begin with */
     73     for (b = 0; b < _SOC_ISM_MAX_BANKS; b++) {
     74         _soc_ism_bank_avail[pcid_info->unit][b] = SOC_ISM_MEM_ESM_L2;
     75     }
     76     for (t = 0; t < _SOC_ISM_MAX_TABLES; t++) {
     77         soc_internal_extended_read_reg(pcid_info, blk, at,
     78             soc_reg_addr_get(pcid_info->unit, _ism_table_bank_cfg_reg[t],
     79                              REG_PORT_ANY, 0,
     80                              SOC_REG_ADDR_OPTION_NONE, &blk, &at), data);
     81         rval = data[0];
     82         LOG_VERBOSE(BSL_LS_SOC_COMMON,
     83                     (BSL_META("Table: %d = %x\n"), t, rval));
     84         for (s = 0; s < _SOC_ISM_MAX_STAGES; s++) {
     85             banks = soc_reg_field_get(pcid_info->unit, _ism_table_bank_cfg_reg[t],
     86                                      rval, _ism_table_bank_cfg_fld[s]);
     87             for (b = 0; b < _SOC_ISM_BANKS_PER_STAGE; b++) { 
     88                 if (banks & (1 << b)) {
     89                     LOG_VERBOSE(BSL_LS_SOC_COMMON,
     90                                 (BSL_META("Bank[%d] = mem[%d]\n"), (s * _SOC_ISM_BANKS_PER_STAGE) + b, t+1));
     91                     _soc_ism_bank_avail[pcid_info->unit][(s * _SOC_ISM_BANKS_PER_STAGE) + b] = t+1;
     92                 }
     93             } 
     94         }
     95     }
     96 } 
     97 
     98 STATIC void
     99 soc_internal_generic_hash_init(pcid_info_t *pcid_info)
    100 {
    101     int chip, unit = pcid_info->unit;
    102     uint16 dev_id;
    103     
    104     SOC_ISM_INFO(unit) = &_soc_ism_info[unit];
    105     SOC_ISM_HASH_INFO(unit) = &_soc_ism_hash_info[unit];
    106 
    107     chip = soc_chip_type_to_index(pcid_info->opt_chip);
    108     if (pcid_info->opt_override_devid) {
    109         dev_id = pcid_info->opt_override_devid;
    110     } else {
    111         dev_id = soc_base_driver_table[chip]->pci_device;
    112     }
    113 
    114     switch (dev_id) {
    115     case BCM56648_DEVICE_ID:
    116     case BCM56649_DEVICE_ID:
    117     case BCM56540_DEVICE_ID:
    118     case BCM56541_DEVICE_ID:
    119     case BCM56542_DEVICE_ID:
    120     case BCM56544_DEVICE_ID:
    121     case BCM56545_DEVICE_ID:
    122     case BCM56546_DEVICE_ID:
    123         SOC_ISM_INFO(unit)->ism_mode = _ISM_SIZE_MODE_176;
    124         break;
    125     case BCM56543_DEVICE_ID:
    126         SOC_ISM_INFO(unit)->ism_mode = _ISM_SIZE_MODE_256;
    127         break;
    128     case BCM56548_DEVICE_ID:
    129     case BCM56547_DEVICE_ID:
    130     case BCM56346_DEVICE_ID:
    131     case BCM56345_DEVICE_ID:
    132     case BCM56344_DEVICE_ID:
    133     case BCM56342_DEVICE_ID:
    134     case BCM56340_DEVICE_ID:
    135     case BCM56049_DEVICE_ID:
    136     case BCM56048_DEVICE_ID:
    137     case BCM56047_DEVICE_ID:
    138     case BCM56042_DEVICE_ID:
    139     case BCM56041_DEVICE_ID:
    140     case BCM56040_DEVICE_ID:
    141         SOC_ISM_INFO(unit)->ism_mode = _ISM_SIZE_MODE_96;
    142         break;
    143     case BCM56640_DEVICE_ID:
    144     case BCM56643_DEVICE_ID:
    145     case BCM56644_DEVICE_ID:
    146     default:
    147         SOC_ISM_INFO(unit)->ism_mode = _ISM_SIZE_MODE_512;
    148         break;
    149     }
    150     
    151     switch (SOC_ISM_INFO(unit)->ism_mode) {
    152     case _ISM_SIZE_MODE_256:
    153         SOC_ISM_INFO(unit)->bank_raw_sizes = _soc_ism_bank_raw_sizes_256;
    154         SOC_ISM_INFO(unit)->banks_per_stage = _SOC_ISM_BANKS_PER_STAGE;
    155         SOC_ISM_INFO(unit)->max_banks = _SOC_ISM_MAX_BANKS;
    156         SOC_ISM_INFO(unit)->total_banks = _SOC_ISM_TOTAL_BANKS;
    157         SOC_ISM_INFO(unit)->total_entries = _SOC_ISM_ENTRIES_PER_BKT *
    158                                             _soc_ism_bank_total(unit);
    159         SOC_ISM_INFO(unit)->max_raw_banks = _SOC_ISM_MAX_RAW_BANKS;
    160         SOC_ISM_INFO(unit)->real_bank_map = _soc_ism_real_bank_map;
    161         break;
    162     case _ISM_SIZE_MODE_176:
    163         SOC_ISM_INFO(unit)->bank_raw_sizes = _soc_ism_bank_raw_sizes_256_176;
    164         SOC_ISM_INFO(unit)->banks_per_stage = _SOC_ISM_BANKS_PER_STAGE_176;
    165         SOC_ISM_INFO(unit)->max_banks = _SOC_ISM_MAX_BANKS_176;
    166         SOC_ISM_INFO(unit)->total_banks = _SOC_ISM_TOTAL_BANKS_176;
    167         SOC_ISM_INFO(unit)->total_entries = _SOC_ISM_ENTRIES_PER_BKT *
    168                                             _soc_ism_bank_total(unit);
    169         SOC_ISM_INFO(unit)->max_raw_banks = _SOC_ISM_MAX_RAW_BANKS;
    170         SOC_ISM_INFO(unit)->real_bank_map = _soc_ism_real_bank_map_176;
    171         break;
    172     case _ISM_SIZE_MODE_96:
    173         SOC_ISM_INFO(unit)->bank_raw_sizes = _soc_ism_bank_raw_sizes_256_96;
    174         SOC_ISM_INFO(unit)->banks_per_stage = _SOC_ISM_BANKS_PER_STAGE_96;
    175         SOC_ISM_INFO(unit)->max_banks = _SOC_ISM_MAX_BANKS_96;
    176         SOC_ISM_INFO(unit)->total_banks = _SOC_ISM_TOTAL_BANKS_96;
    177         SOC_ISM_INFO(unit)->total_entries = _SOC_ISM_ENTRIES_PER_BKT *
    178                                             _soc_ism_bank_total(unit);
    179         SOC_ISM_INFO(unit)->max_raw_banks = _SOC_ISM_MAX_RAW_BANKS;
    180         SOC_ISM_INFO(unit)->real_bank_map = _soc_ism_real_bank_map_96;
    181         break;
    182     case _ISM_SIZE_MODE_512:
    183     default:
    184         SOC_ISM_INFO(unit)->bank_raw_sizes = _soc_ism_bank_raw_sizes;
    185         SOC_ISM_INFO(unit)->banks_per_stage = _SOC_ISM_BANKS_PER_STAGE;
    186         SOC_ISM_INFO(unit)->max_banks = _SOC_ISM_MAX_BANKS;
    187         SOC_ISM_INFO(unit)->total_banks = _SOC_ISM_TOTAL_BANKS;
    188         SOC_ISM_INFO(unit)->total_entries = _SOC_ISM_ENTRIES_PER_BKT *
    189                                             _soc_ism_bank_total(unit);
    190         SOC_ISM_INFO(unit)->max_raw_banks = _SOC_ISM_MAX_RAW_BANKS;
    191         SOC_ISM_INFO(unit)->real_bank_map = _soc_ism_real_bank_map;
    192         break;
    193     }
    194 
    195 
    196     /* Attach the hash info structures based upon chip type */
    197     _SOC_ISM_BANKS(unit) = _soc_ism_shb[unit];
    198     _SOC_ISM_SETS(unit) = _soc_ism_shms;
    199     _SOC_ISM_MEMS(unit) = _soc_ism_shm;
    200     _SOC_ISM_VIEWS(unit) = _soc_ism_shmv;
    201     _SOC_ISM_KEYS(unit) = _soc_ism_shk;
    202     
    203     soc_internal_init_hash_state(pcid_info);
    204     soc_ism_hash_init(unit);
    205     ism_init = 1;
    206 }
    207 
    208 static int
    209 soc_internal_generic_hash(pcid_info_t *pcid_info, soc_mem_t mem, void *entry, 
    210                           int banks, uint8 op, uint32 *index, uint32 *result)
    211 {
    212     int blk, unit = pcid_info->unit;
    213     uint8 found = 0, key[32], tmp_key[32], crc_key[32];
    214     uint8 at, idxinc = 1, num_flds, num_banks = 0;
    215     uint16 lsb, midx, num_bits;
    216     int32 bits, memidx, bucket = 0;
    217     uint32 tmp_hs[SOC_MAX_MEM_WORDS];
    218     uint32 idx, bidx = 0, zero_lsb, offset, mask;
    219     soc_block_t sblk;
    220     soc_hash_bank_t *shbank;
    221     _soc_ism_sbo_t sbo[_SOC_ISM_MAX_BANKS]; /* Dynamically created bank info based upon
    222                                                requested banks used for final
    223                                                bucket/index calculation */
    224     soc_field_t keyflds[MAX_FIELDS], lsbfld, vf = VALIDf;
    225 
    226     if (!ism_init) {
    227          soc_internal_generic_hash_init(pcid_info);
    228     }
    229 
    230     memidx = soc_ism_get_hash_mem_idx(unit, mem);
    231     if ((mem == INVALIDm) || (memidx < 0)) {
    232         LOG_ERROR(BSL_LS_SOC_COMMON,
    233                   (BSL_META("Invalid hash memory !!\n")));
    234         return SOC_E_PARAM;
    235     }
    236     if (!_SOC_ISM_MEMS(unit)[memidx].shms->num_banks) {
    237         return SOC_E_PARAM;
    238     }
    239     if (soc_generic_get_hash_key(unit, mem, entry, keyflds, &lsbfld, 
    240                                  &num_flds) == SOC_E_NONE) {
    241         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    242                     (BSL_META("Key field(s): ")));
    243         for (idx = 0; idx < num_flds; idx++) {
    244             LOG_VERBOSE(BSL_LS_SOC_COMMON,
    245                         (BSL_META("%d, "), keyflds[idx]));
    246         }
    247         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    248                     (BSL_META("\nLsb field: %d\n"), lsbfld));
    249         sal_memset(key, 0, sizeof(key));
    250         sal_memset(crc_key, 0, sizeof(crc_key));
    251         soc_ism_gen_key_from_keyfields(unit, mem, entry, keyflds, key, num_flds);
    252         num_bits = _SOC_ISM_MEMS(unit)[memidx].shms->max_key_bits;
    253         soc_ism_gen_crc_key_from_keyfields(unit, mem, entry, keyflds, crc_key, 
    254                                            num_flds, &num_bits);
    255         lsb = soc_mem_field32_get(unit, mem, entry, lsbfld);
    256     } else {
    257         LOG_CLI((BSL_META("Key field not found !!\n")));
    258         return -1;
    259     } 
    260     blk = SOC_MEM_BLOCK_ANY(unit, mem);
    261     sblk = SOC_BLOCK2SCH(unit, blk);
    262     shbank = _SOC_ISM_MEMS(unit)[memidx].shms->shb;
    263     bits = soc_mem_entry_bits(unit, mem);
    264     if (bits > (_SOC_ISM_ENTRY_BITS * 2)) {
    265         idxinc = 4;
    266     } else if (bits > _SOC_ISM_ENTRY_BITS) {
    267         idxinc = 2;
    268     }
    269 
    270     soc_internal_extended_read_reg(pcid_info, sblk, at, soc_reg_addr_get(unit, 
    271                                    _ism_table_bank_cfg_reg[0], REG_PORT_ANY, 0, 
    272                                    SOC_REG_ADDR_OPTION_NONE, &sblk, &at),
    273                                    tmp_hs);
    274     zero_lsb = soc_reg_field_get(unit, _ism_table_bank_cfg_reg[0],
    275                                  tmp_hs[0], HASH_ZERO_OR_LSBf);
    276     sal_memset(sbo, 0, sizeof(sbo));
    277     for (idx = 0; idx < _SOC_ISM_MEMS(unit)[memidx].shms->num_banks; idx++) {
    278         if (banks != -1) {
    279             /* only use the indicated bank */
    280             if (!((((int32)1) << shbank[idx].my_id) & banks)) {
    281                 continue;
    282             }
    283             num_banks++;
    284         } else {
    285             num_banks++;
    286         }
    287         sbo[bidx].mode = -1;
    288         sbo[bidx].bidx = bidx;
    289         mask = soc_ism_get_hash_bucket_mask(shbank[idx].num_bkts);
    290         soc_internal_extended_read_reg(pcid_info, sblk, at,
    291                                        soc_reg_addr_get(unit, 
    292                                        _ism_stage_hash_cfg_reg[shbank[idx].my_id/_SOC_ISM_BANKS_PER_STAGE],
    293                                        REG_PORT_ANY, 0,
    294                                        SOC_REG_ADDR_OPTION_NONE, &sblk, &at),
    295                                        tmp_hs);
    296         offset = soc_reg_field_get(unit, _ism_stage_hash_cfg_reg[0],
    297                                    tmp_hs[0], 
    298                                    _ism_stage_hash_cfg_fld[shbank[idx].my_id%_SOC_ISM_BANKS_PER_STAGE]);
    299         bucket = soc_generic_gen_hash(unit, zero_lsb, num_bits, offset, 
    300                                       mask, crc_key, lsb);
    301         sbo[bidx].index = bucket;
    302         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    303                     (BSL_META("Bank[%d]: bucket:%d\n"), bidx, bucket));
    304         sbo[bidx].index = (shbank[idx].base_entry/idxinc) + 
    305                          (sbo[bidx].index * (shbank[idx].bkt_size/idxinc));
    306         for (midx = 0; midx < shbank[idx].bkt_size/idxinc; midx++) {
    307             soc_internal_extended_read_mem(pcid_info, sblk, at,
    308                                            soc_mem_addr_get(unit, mem, 0, blk,
    309                                            sbo[idx].index+midx, &at), tmp_hs);
    310             if (!soc_mem_field_valid(unit, mem, VALIDf)) {
    311                 vf = VALID_0f; 
    312             }
    313             if (soc_mem_field32_get(unit, mem, tmp_hs, vf)) {
    314                 sal_memset(tmp_key, 0, sizeof(tmp_key));
    315                 /* compare key */
    316                 soc_ism_gen_key_from_keyfields(unit, mem, tmp_hs, keyflds, tmp_key, num_flds);
    317                 if (!sal_memcmp(key, tmp_key, sizeof(key))) {
    318                     found++;
    319                     sbo[bidx].entry = midx;
    320                     sbo[bidx].stage = shbank[idx].my_id / _SOC_ISM_BANKS_PER_STAGE;
    321                     sbo[bidx].bank = shbank[idx].my_id % _SOC_ISM_BANKS_PER_STAGE;
    322                     sbo[bidx].mode = 1;
    323                     LOG_VERBOSE(BSL_LS_SOC_COMMON,
    324                                 (BSL_META("Existing mem index: %d\n"), sbo[bidx].index+sbo[bidx].entry));
    325                     if (op != TABLE_INSERT_CMD_MSG) {
    326                         *index = sbo[bidx].index + midx;
    327                         if (op == TABLE_LOOKUP_CMD_MSG) { 
    328                             *result = SCHAN_GEN_RESP_TYPE_FOUND;
    329                         } else {
    330                             *result = SCHAN_GEN_RESP_TYPE_DELETED;
    331                         }
    332                         return SOC_E_NONE;
    333                     }
    334                     break;
    335                 }
    336             } else if (op == TABLE_INSERT_CMD_MSG) {
    337                 found++;
    338                 sbo[bidx].entry = midx;
    339                 sbo[bidx].stage = shbank[idx].my_id / _SOC_ISM_BANKS_PER_STAGE;
    340                 sbo[bidx].bank = shbank[idx].my_id % _SOC_ISM_BANKS_PER_STAGE;
    341                 sbo[bidx].mode = 0;
    342                 LOG_VERBOSE(BSL_LS_SOC_COMMON,
    343                             (BSL_META("New mem index: %d\n"), sbo[bidx].index+sbo[bidx].entry));
    344                 break;
    345             }
    346         }
    347         bidx++;
    348     }
    349     if (!found) {
    350         if (op == TABLE_INSERT_CMD_MSG) {
    351             *result = SCHAN_GEN_RESP_TYPE_FULL;
    352         } else {
    353             *result = SCHAN_GEN_RESP_TYPE_NOT_FOUND;
    354             return SOC_E_NONE;
    355         }
    356     } 
    357     /* Get the lowest valid/empty index of the lowest bank-id of the lowest stage-id */
    358     if (found > 1) {
    359         soc_ism_resolve_entry_index(sbo, num_banks); 
    360     }
    361     for (idx = 0; idx < num_banks; idx++) {
    362         if (sbo[idx].mode >= 0) {
    363             *index = sbo[idx].index + sbo[idx].entry;
    364             if (sbo[idx].mode) {
    365                 *result = SCHAN_GEN_RESP_TYPE_REPLACED;
    366             } else {
    367                 *result = SCHAN_GEN_RESP_TYPE_INSERTED;
    368             }
    369             break;
    370         }
    371     }
    372     return SOC_E_NONE;
    373 }
    374 
    375 int 
    376 soc_internal_generic_hash_insert(pcid_info_t *pcid_info, soc_mem_t mem, int32 banks, 
    377                                  void *entry, uint32 *result)
    378 {   
    379     int rc,     blk;             
    380     soc_block_t sblk;
    381     uint8       at;
    382     uint32      index, opres;
    383     int         unit = pcid_info->unit; 
    384     schan_genresp_v2_t *genresp = (schan_genresp_v2_t *) result;
    385 
    386     LOG_VERBOSE(BSL_LS_SOC_COMMON,
    387                 (BSL_META_U(unit,
    388                             "Mem: %d\n"), mem));
    389     rc = soc_internal_generic_hash(pcid_info, mem, entry, banks, TABLE_INSERT_CMD_MSG,
    390                                    &index, &opres);
    391     
    392     genresp->err_info = 0;
    393     if (rc) {
    394         genresp->type = SCHAN_GEN_RESP_TYPE_ERROR;
    395         genresp->index = -1;
    396     } else {
    397         genresp->type = opres;
    398         if (opres == SCHAN_GEN_RESP_TYPE_FULL) {
    399             genresp->index = -1;
    400             LOG_VERBOSE(BSL_LS_SOC_COMMON,
    401                         (BSL_META_U(unit,
    402                                     "Full\n")));
    403         } else {
    404             blk = SOC_MEM_BLOCK_ANY(unit, mem);
    405             sblk = SOC_BLOCK2SCH(unit, blk);
    406             genresp->index = index;
    407             soc_internal_extended_write_mem(pcid_info, sblk, at,
    408                                             soc_mem_addr_get(unit, mem, 0,
    409                                             blk, index, &at), (uint32 *)entry);
    410             if (opres == SCHAN_GEN_RESP_TYPE_REPLACED) {
    411                 LOG_VERBOSE(BSL_LS_SOC_COMMON,
    412                             (BSL_META_U(unit,
    413                                         "Replace ")));
    414             } else {
    415                 LOG_VERBOSE(BSL_LS_SOC_COMMON,
    416                             (BSL_META_U(unit,
    417                                         "Insert ")));
    418             }
    419             LOG_VERBOSE(BSL_LS_SOC_COMMON,
    420                         (BSL_META_U(unit,
    421                                     "Index: %d\n"), index));
    422         }
    423     }
    424     return SOC_E_NONE;
    425 }
    426 
    427 int 
    428 soc_internal_generic_hash_lookup(pcid_info_t *pcid_info, soc_mem_t mem, int banks, 
    429                                  void *entry, uint32 *result)
    430 {
    431     int rc;
    432     uint32 index;
    433     schan_genresp_v2_t *genresp = (schan_genresp_v2_t *) result;
    434     uint32 opres;
    435 
    436     LOG_VERBOSE(BSL_LS_SOC_COMMON,
    437                 (BSL_META("Mem: %d\n"), mem));
    438     rc = soc_internal_generic_hash(pcid_info, mem, entry, banks, TABLE_LOOKUP_CMD_MSG,
    439                                    &index, &opres);
    440     
    441     genresp->err_info = 0;
    442     if (rc) {
    443         genresp->type = SCHAN_GEN_RESP_TYPE_ERROR;
    444         genresp->index = -1;
    445     } else if (opres == SCHAN_GEN_RESP_TYPE_NOT_FOUND) {
    446         genresp->type = opres;
    447         genresp->index = -1;
    448         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    449                     (BSL_META("Not found\n")));
    450     } else {
    451         genresp->type = opres;
    452         genresp->index = index;
    453         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    454                     (BSL_META("Found Index: %d\n"), index));
    455     }
    456     return SOC_E_NONE;
    457 }
    458 
    459 int 
    460 soc_internal_generic_hash_delete(pcid_info_t *pcid_info, soc_mem_t mem, int banks, 
    461                                  void *entry, uint32 *result)
    462 {
    463     int         rc, blk;             
    464     soc_block_t sblk;
    465     uint8       at;
    466     uint32      index, opres, tmp[SOC_MAX_MEM_WORDS];
    467     int         unit = pcid_info->unit; 
    468     schan_genresp_v2_t *genresp = (schan_genresp_v2_t *) result;
    469 
    470     LOG_VERBOSE(BSL_LS_SOC_COMMON,
    471                 (BSL_META_U(unit,
    472                             "Mem: %d\n"), mem));
    473     rc = soc_internal_generic_hash(pcid_info, mem, entry, banks, TABLE_DELETE_CMD_MSG,
    474                                    &index, &opres);
    475     
    476     genresp->err_info = 0;
    477     if (rc) {
    478         genresp->type = SCHAN_GEN_RESP_TYPE_ERROR;
    479         genresp->index = -1;
    480     } else if (opres == SCHAN_GEN_RESP_TYPE_NOT_FOUND) {
    481         genresp->type = opres;
    482         genresp->index = -1;
    483         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    484                     (BSL_META_U(unit,
    485                                 "Not found\n")));
    486     } else {
    487         genresp->type = opres;
    488         genresp->index = index;
    489         blk = SOC_MEM_BLOCK_ANY(unit, mem);
    490         sblk = SOC_BLOCK2SCH(unit, blk);
    491         soc_internal_extended_read_mem(pcid_info, sblk, at,
    492                                         soc_mem_addr_get(unit, mem, 0,
    493                                         blk, index, &at), (uint32 *)entry);
    494         if (soc_mem_field_valid(unit, mem, VALIDf)) {
    495             soc_mem_field32_set(unit, mem, tmp, VALIDf, 0);
    496         } else {
    497             soc_mem_field32_set(unit, mem, tmp, VALID_0f, 0);
    498             if (soc_mem_field_valid(unit, mem, VALID_1f)) {
    499                 soc_mem_field32_set(unit, mem, tmp, VALID_1f, 0);
    500             }
    501             if (soc_mem_field_valid(unit, mem, VALID_2f)) {
    502                 soc_mem_field32_set(unit, mem, tmp, VALID_2f, 0);
    503             }
    504             if (soc_mem_field_valid(unit, mem, VALID_3f)) {
    505                 soc_mem_field32_set(unit, mem, tmp, VALID_3f, 0);
    506             }
    507         }  
    508         soc_internal_extended_write_mem(pcid_info, sblk, at,
    509                                         soc_mem_addr_get(unit, mem, 0,
    510                                         blk, index, &at), (uint32 *)tmp);
    511         LOG_VERBOSE(BSL_LS_SOC_COMMON,
    512                     (BSL_META_U(unit,
    513                                 "Deleted Index: %d\n"), index));
    514     }
    515     return SOC_E_NONE;
    516 }
    517 
    518 #endif
    519