static int init_mask_data_array(struct mc5 *mc5, u32 mask_array_base, u32 data_array_base, u32 write_cmd, int addr_shift) { unsigned int i; adapter_t *adap = mc5->adapter; /* * We need the size of the TCAM data and mask arrays in terms of * 72-bit entries. */ unsigned int size72 = mc5->tcam_size; unsigned int server_base = t3_read_reg(adap, A_MC5_DB_SERVER_INDEX); if (mc5->mode == MC5_MODE_144_BIT) { size72 *= 2; /* 1 144-bit entry is 2 72-bit entries */ server_base *= 2; } /* Clear the data array */ dbgi_wr_data3(adap, 0, 0, 0); for (i = 0; i < size72; i++) if (mc5_write(adap, data_array_base + (i << addr_shift), write_cmd)) return -1; /* Initialize the mask array. */ for (i = 0; i < server_base; i++) { dbgi_wr_data3(adap, 0x3fffffff, 0xfff80000, 0xff); if (mc5_write(adap, mask_array_base + (i << addr_shift), write_cmd)) return -1; i++; dbgi_wr_data3(adap, 0xffffffff, 0xffffffff, 0xff); if (mc5_write(adap, mask_array_base + (i << addr_shift), write_cmd)) return -1; } dbgi_wr_data3(adap, mc5->mode == MC5_MODE_144_BIT ? 0xfffffff9 : 0xfffffffd, 0xffffffff, 0xff); for (; i < size72; i++) if (mc5_write(adap, mask_array_base + (i << addr_shift), write_cmd)) return -1; return 0; }
static int init_idt43102(struct mc5 *mc5) { int i; adapter_t *adap = mc5->adapter; t3_write_reg(adap, A_MC5_DB_RSP_LATENCY, adap->params.rev == 0 ? V_RDLAT(0xd) | V_SRCHLAT(0x11) : V_RDLAT(0xd) | V_SRCHLAT(0x12)); /* * Use GMRs 24-25 for ELOOKUP, GMRs 20-21 for SYN lookups, and no mask * for ACK- and AOPEN searches. */ t3_write_reg(adap, A_MC5_DB_POPEN_DATA_WR_CMD, IDT4_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_POPEN_MASK_WR_CMD, IDT4_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_AOPEN_SRCH_CMD, IDT4_CMD_SEARCH144 | 0x3800); t3_write_reg(adap, A_MC5_DB_SYN_SRCH_CMD, IDT4_CMD_SEARCH144); t3_write_reg(adap, A_MC5_DB_ACK_SRCH_CMD, IDT4_CMD_SEARCH144 | 0x3800); t3_write_reg(adap, A_MC5_DB_ILOOKUP_CMD, IDT4_CMD_SEARCH144 | 0x3800); t3_write_reg(adap, A_MC5_DB_ELOOKUP_CMD, IDT4_CMD_SEARCH144 | 0x800); t3_write_reg(adap, A_MC5_DB_DATA_WRITE_CMD, IDT4_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_DATA_READ_CMD, IDT4_CMD_READ); t3_write_reg(adap, A_MC5_DB_PART_ID_INDEX, 3); /* Set DBGI command mode for IDT TCAM. */ t3_write_reg(adap, A_MC5_DB_DBGI_CONFIG, DBGI_MODE_IDT52100); /* Set up GMRs */ dbgi_wr_data3(adap, 0xffffffff, 0xffffffff, 0xff); for (i = 0; i < 7; ++i) if (mc5_write(adap, IDT4_GMR_BASE0 + i, IDT4_CMD_WRITE)) goto err; for (i = 0; i < 4; ++i) if (mc5_write(adap, IDT4_GMR_BASE2 + i, IDT4_CMD_WRITE)) goto err; dbgi_wr_data3(adap, 0xfffffff9, 0xffffffff, 0xff); if (mc5_write(adap, IDT4_GMR_BASE1, IDT4_CMD_WRITE) || mc5_write(adap, IDT4_GMR_BASE1 + 1, IDT4_CMD_WRITE) || mc5_write(adap, IDT4_GMR_BASE1 + 4, IDT4_CMD_WRITE)) goto err; dbgi_wr_data3(adap, 0xfffffff9, 0xffff8007, 0xff); if (mc5_write(adap, IDT4_GMR_BASE1 + 5, IDT4_CMD_WRITE)) goto err; /* Set up SCR */ dbgi_wr_data3(adap, 0xf0000000, 0, 0); if (mc5_write(adap, IDT4_SCR_ADR0, IDT4_CMD_WRITE)) goto err; return init_mask_data_array(mc5, IDT4_MSKARY_BASE_ADR0, IDT4_DATARY_BASE_ADR0, IDT4_CMD_WRITE, 1); err: return -EIO; }
static int init_mask_data_array(struct mc5 *mc5, u32 mask_array_base, u32 data_array_base, u32 write_cmd, int addr_shift) { unsigned int i; struct adapter *adap = mc5->adapter; /* */ unsigned int size72 = mc5->tcam_size; unsigned int server_base = t3_read_reg(adap, A_MC5_DB_SERVER_INDEX); if (mc5->mode == MC5_MODE_144_BIT) { size72 *= 2; /* */ server_base *= 2; } /* */ dbgi_wr_data3(adap, 0, 0, 0); for (i = 0; i < size72; i++) if (mc5_write(adap, data_array_base + (i << addr_shift), write_cmd)) return -1; /* */ dbgi_wr_data3(adap, 0xffffffff, 0xffffffff, 0xff); for (i = 0; i < size72; i++) { if (i == server_base) /* */ t3_write_reg(adap, A_MC5_DB_DBGI_REQ_DATA0, mc5->mode == MC5_MODE_144_BIT ? 0xfffffff9 : 0xfffffffd); if (mc5_write(adap, mask_array_base + (i << addr_shift), write_cmd)) return -1; } return 0; }
static int init_idt52100(struct mc5 *mc5) { int i; adapter_t *adap = mc5->adapter; t3_write_reg(adap, A_MC5_DB_RSP_LATENCY, V_RDLAT(0x15) | V_LRNLAT(0x15) | V_SRCHLAT(0x15)); t3_write_reg(adap, A_MC5_DB_PART_ID_INDEX, 2); /* * Use GMRs 14-15 for ELOOKUP, GMRs 12-13 for SYN lookups, and * GMRs 8-9 for ACK- and AOPEN searches. */ t3_write_reg(adap, A_MC5_DB_POPEN_DATA_WR_CMD, IDT_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_POPEN_MASK_WR_CMD, IDT_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_AOPEN_SRCH_CMD, IDT_CMD_SEARCH); t3_write_reg(adap, A_MC5_DB_AOPEN_LRN_CMD, IDT_CMD_LEARN); t3_write_reg(adap, A_MC5_DB_SYN_SRCH_CMD, IDT_CMD_SEARCH | 0x6000); t3_write_reg(adap, A_MC5_DB_SYN_LRN_CMD, IDT_CMD_LEARN); t3_write_reg(adap, A_MC5_DB_ACK_SRCH_CMD, IDT_CMD_SEARCH); t3_write_reg(adap, A_MC5_DB_ACK_LRN_CMD, IDT_CMD_LEARN); t3_write_reg(adap, A_MC5_DB_ILOOKUP_CMD, IDT_CMD_SEARCH); t3_write_reg(adap, A_MC5_DB_ELOOKUP_CMD, IDT_CMD_SEARCH | 0x7000); t3_write_reg(adap, A_MC5_DB_DATA_WRITE_CMD, IDT_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_DATA_READ_CMD, IDT_CMD_READ); /* Set DBGI command mode for IDT TCAM. */ t3_write_reg(adap, A_MC5_DB_DBGI_CONFIG, DBGI_MODE_IDT52100); /* Set up LAR */ dbgi_wr_data3(adap, IDT_LAR_MODE144, 0, 0); if (mc5_write(adap, IDT_LAR_ADR0, IDT_CMD_WRITE)) goto err; /* Set up SSRs */ dbgi_wr_data3(adap, 0xffffffff, 0xffffffff, 0); if (mc5_write(adap, IDT_SSR0_ADR0, IDT_CMD_WRITE) || mc5_write(adap, IDT_SSR1_ADR0, IDT_CMD_WRITE)) goto err; /* Set up GMRs */ for (i = 0; i < 32; ++i) { if (i >= 12 && i < 15) dbgi_wr_data3(adap, 0xfffffff9, 0xffffffff, 0xff); else if (i == 15) dbgi_wr_data3(adap, 0xfffffff9, 0xffff8007, 0xff); else dbgi_wr_data3(adap, 0xffffffff, 0xffffffff, 0xff); if (mc5_write(adap, IDT_GMR_BASE_ADR0 + i, IDT_CMD_WRITE)) goto err; } /* Set up SCR */ dbgi_wr_data3(adap, 1, 0, 0); if (mc5_write(adap, IDT_SCR_ADR0, IDT_CMD_WRITE)) goto err; return init_mask_data_array(mc5, IDT_MSKARY_BASE_ADR0, IDT_DATARY_BASE_ADR0, IDT_CMD_WRITE, 0); err: return -EIO; }
static int init_idt52100(struct mc5 *mc5) { int i; struct adapter *adap = mc5->adapter; t3_write_reg(adap, A_MC5_DB_RSP_LATENCY, V_RDLAT(0x15) | V_LRNLAT(0x15) | V_SRCHLAT(0x15)); t3_write_reg(adap, A_MC5_DB_PART_ID_INDEX, 2); /* */ t3_write_reg(adap, A_MC5_DB_POPEN_DATA_WR_CMD, IDT_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_POPEN_MASK_WR_CMD, IDT_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_AOPEN_SRCH_CMD, IDT_CMD_SEARCH); t3_write_reg(adap, A_MC5_DB_AOPEN_LRN_CMD, IDT_CMD_LEARN); t3_write_reg(adap, A_MC5_DB_SYN_SRCH_CMD, IDT_CMD_SEARCH | 0x6000); t3_write_reg(adap, A_MC5_DB_SYN_LRN_CMD, IDT_CMD_LEARN); t3_write_reg(adap, A_MC5_DB_ACK_SRCH_CMD, IDT_CMD_SEARCH); t3_write_reg(adap, A_MC5_DB_ACK_LRN_CMD, IDT_CMD_LEARN); t3_write_reg(adap, A_MC5_DB_ILOOKUP_CMD, IDT_CMD_SEARCH); t3_write_reg(adap, A_MC5_DB_ELOOKUP_CMD, IDT_CMD_SEARCH | 0x7000); t3_write_reg(adap, A_MC5_DB_DATA_WRITE_CMD, IDT_CMD_WRITE); t3_write_reg(adap, A_MC5_DB_DATA_READ_CMD, IDT_CMD_READ); /* */ t3_write_reg(adap, A_MC5_DB_DBGI_CONFIG, DBGI_MODE_IDT52100); /* */ dbgi_wr_data3(adap, IDT_LAR_MODE144, 0, 0); if (mc5_write(adap, IDT_LAR_ADR0, IDT_CMD_WRITE)) goto err; /* */ dbgi_wr_data3(adap, 0xffffffff, 0xffffffff, 0); if (mc5_write(adap, IDT_SSR0_ADR0, IDT_CMD_WRITE) || mc5_write(adap, IDT_SSR1_ADR0, IDT_CMD_WRITE)) goto err; /* */ for (i = 0; i < 32; ++i) { if (i >= 12 && i < 15) dbgi_wr_data3(adap, 0xfffffff9, 0xffffffff, 0xff); else if (i == 15) dbgi_wr_data3(adap, 0xfffffff9, 0xffff8007, 0xff); else dbgi_wr_data3(adap, 0xffffffff, 0xffffffff, 0xff); if (mc5_write(adap, IDT_GMR_BASE_ADR0 + i, IDT_CMD_WRITE)) goto err; } /* */ dbgi_wr_data3(adap, 1, 0, 0); if (mc5_write(adap, IDT_SCR_ADR0, IDT_CMD_WRITE)) goto err; return init_mask_data_array(mc5, IDT_MSKARY_BASE_ADR0, IDT_DATARY_BASE_ADR0, IDT_CMD_WRITE, 0); err: return -EIO; }