25 #define SPBC_ROUTE_CFG_DESTID 0x10070
26 #define SPBC_ROUTE_CFG_PORT 0x10074
29 #define SPP_ROUTE_CFG_DESTID(n) (0x11070 + 0x100*n)
30 #define SPP_ROUTE_CFG_PORT(n) (0x11074 + 0x100*n)
32 #define TSI578_SP_MODE(n) (0x11004 + n*0x100)
33 #define TSI578_SP_MODE_GLBL 0x10004
34 #define TSI578_SP_MODE_PW_DIS 0x08000000
35 #define TSI578_SP_MODE_LUT_512 0x01000000
37 #define TSI578_SP_CTL_INDEP(n) (0x13004 + n*0x100)
38 #define TSI578_SP_LUT_PEINF(n) (0x13010 + n*0x100)
39 #define TSI578_SP_CS_TX(n) (0x13014 + n*0x100)
40 #define TSI578_SP_INT_STATUS(n) (0x13018 + n*0x100)
42 #define TSI578_GLBL_ROUTE_BASE 0x10078
45 tsi57x_route_add_entry(
struct rio_mport *mport,
u16 destid,
u8 hopcount,
66 tsi57x_route_get_entry(
struct rio_mport *mport,
u16 destid,
u8 hopcount,
85 *route_port = (
u8)result;
93 tsi57x_route_clr_table(
struct rio_mport *mport,
u16 destid,
u8 hopcount,
99 lut_size = (mport->
sys_size) ? 0x1ff : 0xff;
104 for (route_idx = 0; route_idx <= lut_size; route_idx++)
111 for (route_idx = 0; route_idx <= lut_size; route_idx++)
120 tsi57x_set_domain(
struct rio_mport *mport,
u16 destid,
u8 hopcount,
137 (
u32)(sw_domain << 24));
142 tsi57x_get_domain(
struct rio_mport *mport,
u16 destid,
u8 hopcount,
153 *sw_domain = (
u8)(regval >> 24);
169 rio_read_config_32(rdev,
171 rio_write_config_32(rdev,
176 rio_read_config_32(rdev,
180 rio_write_config_32(rdev,
183 regval & 0x07120214);
185 rio_read_config_32(rdev,
187 rio_write_config_32(rdev,
189 regval & 0x000700bd);
192 rio_read_config_32(rdev,
194 rio_write_config_32(rdev,
196 regval | 0x000b0000);
199 rio_read_config_32(rdev,
207 rio_write_config_32(rdev,
214 tsi57x_em_handler(
struct rio_dev *rdev,
u8 portnum)
217 u32 intstat, err_status;
218 int sendcount, checkcount;
222 rio_read_config_32(rdev,
230 rio_read_config_32(rdev,
234 rio_write_config_32(rdev,
236 regval | RIO_PORT_N_CTL_LOCKOUT);
238 rio_write_config_32(rdev,
246 rio_read_config_32(rdev,
255 rio_write_config_32(rdev,
258 while (checkcount--) {
260 rio_read_config_32(rdev,
275 pr_debug(
"TSI578[%x:%x] SP%d_INT_STATUS=0x%08x\n",
278 if (intstat & 0x10000) {
279 rio_read_config_32(rdev,
281 regval = (mport->
sys_size) ? (regval >> 16) : (regval >> 24);
283 pr_debug(
"RIO: TSI578[%s] P%d LUT Parity Error (destID=%d)\n",
284 rio_name(rdev), portnum, regval);
290 intstat & 0x000700bd);
295 static int tsi57x_switch_init(
struct rio_dev *rdev,
int do_enum)
297 pr_debug(
"RIO: %s for %s\n", __func__, rio_name(rdev));
298 rdev->
rswitch->add_entry = tsi57x_route_add_entry;
299 rdev->
rswitch->get_entry = tsi57x_route_get_entry;
300 rdev->
rswitch->clr_table = tsi57x_route_clr_table;
301 rdev->
rswitch->set_domain = tsi57x_set_domain;
302 rdev->
rswitch->get_domain = tsi57x_get_domain;
303 rdev->
rswitch->em_init = tsi57x_em_init;
304 rdev->
rswitch->em_handle = tsi57x_em_handler;