1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2aaf4363eSJerin Jacob * Copyright(c) 2017 Cavium, Inc 34d027880SJerin Jacob */ 44d027880SJerin Jacob 54d027880SJerin Jacob #include <string.h> 64d027880SJerin Jacob 74d027880SJerin Jacob #include "octeontx_bgx.h" 84d027880SJerin Jacob 94d027880SJerin Jacob int 104d027880SJerin Jacob octeontx_bgx_port_open(int port, octeontx_mbox_bgx_port_conf_t *conf) 114d027880SJerin Jacob { 124d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 134d027880SJerin Jacob octeontx_mbox_bgx_port_conf_t bgx_conf; 144d027880SJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_conf_t); 154d027880SJerin Jacob int res; 164d027880SJerin Jacob 174d027880SJerin Jacob memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t)); 184d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 194d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_OPEN; 204d027880SJerin Jacob hdr.vfid = port; 214d027880SJerin Jacob 22d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len); 234d027880SJerin Jacob if (res < 0) 244d027880SJerin Jacob return -EACCES; 254d027880SJerin Jacob 264d027880SJerin Jacob conf->enable = bgx_conf.enable; 274d027880SJerin Jacob conf->promisc = bgx_conf.promisc; 284d027880SJerin Jacob conf->bpen = bgx_conf.bpen; 294d027880SJerin Jacob conf->node = bgx_conf.node; 304d027880SJerin Jacob conf->base_chan = bgx_conf.base_chan; 314d027880SJerin Jacob conf->num_chans = bgx_conf.num_chans; 324d027880SJerin Jacob conf->mtu = bgx_conf.mtu; 334d027880SJerin Jacob conf->bgx = bgx_conf.bgx; 344d027880SJerin Jacob conf->lmac = bgx_conf.lmac; 354d027880SJerin Jacob conf->mode = bgx_conf.mode; 364d027880SJerin Jacob conf->pkind = bgx_conf.pkind; 374d027880SJerin Jacob memcpy(conf->macaddr, bgx_conf.macaddr, 6); 384d027880SJerin Jacob 394d027880SJerin Jacob return res; 404d027880SJerin Jacob } 414d027880SJerin Jacob 424d027880SJerin Jacob int 434d027880SJerin Jacob octeontx_bgx_port_close(int port) 444d027880SJerin Jacob { 454d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 464d027880SJerin Jacob int res; 474d027880SJerin Jacob 484d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 494d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_CLOSE; 504d027880SJerin Jacob hdr.vfid = port; 514d027880SJerin Jacob 52d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 534d027880SJerin Jacob if (res < 0) 544d027880SJerin Jacob return -EACCES; 554d027880SJerin Jacob 564d027880SJerin Jacob return res; 574d027880SJerin Jacob } 584d027880SJerin Jacob 594d027880SJerin Jacob int 604d027880SJerin Jacob octeontx_bgx_port_start(int port) 614d027880SJerin Jacob { 624d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 634d027880SJerin Jacob int res; 644d027880SJerin Jacob 654d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 664d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_START; 674d027880SJerin Jacob hdr.vfid = port; 684d027880SJerin Jacob 69d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 704d027880SJerin Jacob if (res < 0) 714d027880SJerin Jacob return -EACCES; 724d027880SJerin Jacob 734d027880SJerin Jacob return res; 744d027880SJerin Jacob } 754d027880SJerin Jacob 764d027880SJerin Jacob int 774d027880SJerin Jacob octeontx_bgx_port_stop(int port) 784d027880SJerin Jacob { 794d027880SJerin Jacob struct octeontx_mbox_hdr hdr; 804d027880SJerin Jacob int res; 814d027880SJerin Jacob 824d027880SJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 834d027880SJerin Jacob hdr.msg = MBOX_BGX_PORT_STOP; 844d027880SJerin Jacob hdr.vfid = port; 854d027880SJerin Jacob 86d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 874d027880SJerin Jacob if (res < 0) 884d027880SJerin Jacob return -EACCES; 894d027880SJerin Jacob 904d027880SJerin Jacob return res; 914d027880SJerin Jacob } 92e242dd1cSJerin Jacob 93e242dd1cSJerin Jacob int 94e242dd1cSJerin Jacob octeontx_bgx_port_get_config(int port, octeontx_mbox_bgx_port_conf_t *conf) 95e242dd1cSJerin Jacob { 96e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 97e242dd1cSJerin Jacob octeontx_mbox_bgx_port_conf_t bgx_conf; 98e242dd1cSJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_conf_t); 99e242dd1cSJerin Jacob int res; 100e242dd1cSJerin Jacob 101e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 102e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_CONFIG; 103e242dd1cSJerin Jacob hdr.vfid = port; 104e242dd1cSJerin Jacob 105e242dd1cSJerin Jacob memset(&bgx_conf, 0, sizeof(octeontx_mbox_bgx_port_conf_t)); 106d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_conf, len); 107e242dd1cSJerin Jacob if (res < 0) 108e242dd1cSJerin Jacob return -EACCES; 109e242dd1cSJerin Jacob 110e242dd1cSJerin Jacob conf->enable = bgx_conf.enable; 111e242dd1cSJerin Jacob conf->promisc = bgx_conf.promisc; 112e242dd1cSJerin Jacob conf->bpen = bgx_conf.bpen; 113e242dd1cSJerin Jacob conf->node = bgx_conf.node; 114e242dd1cSJerin Jacob conf->base_chan = bgx_conf.base_chan; 115e242dd1cSJerin Jacob conf->num_chans = bgx_conf.num_chans; 116e242dd1cSJerin Jacob conf->mtu = bgx_conf.mtu; 117e242dd1cSJerin Jacob conf->bgx = bgx_conf.bgx; 118e242dd1cSJerin Jacob conf->lmac = bgx_conf.lmac; 119e242dd1cSJerin Jacob conf->mode = bgx_conf.mode; 120e242dd1cSJerin Jacob conf->pkind = bgx_conf.pkind; 121e242dd1cSJerin Jacob memcpy(conf->macaddr, bgx_conf.macaddr, 6); 122e242dd1cSJerin Jacob 123e242dd1cSJerin Jacob return res; 124e242dd1cSJerin Jacob } 125e242dd1cSJerin Jacob 126e242dd1cSJerin Jacob int 127e242dd1cSJerin Jacob octeontx_bgx_port_status(int port, octeontx_mbox_bgx_port_status_t *stat) 128e242dd1cSJerin Jacob { 129e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 130e242dd1cSJerin Jacob octeontx_mbox_bgx_port_status_t bgx_stat; 131e242dd1cSJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_status_t); 132e242dd1cSJerin Jacob int res; 133e242dd1cSJerin Jacob 134e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 135e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_STATUS; 136e242dd1cSJerin Jacob hdr.vfid = port; 137e242dd1cSJerin Jacob 138d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stat, len); 139e242dd1cSJerin Jacob if (res < 0) 140e242dd1cSJerin Jacob return -EACCES; 141e242dd1cSJerin Jacob 142e242dd1cSJerin Jacob stat->link_up = bgx_stat.link_up; 143e242dd1cSJerin Jacob 144e242dd1cSJerin Jacob return res; 145e242dd1cSJerin Jacob } 146e242dd1cSJerin Jacob 147e242dd1cSJerin Jacob int 148e242dd1cSJerin Jacob octeontx_bgx_port_stats(int port, octeontx_mbox_bgx_port_stats_t *stats) 149e242dd1cSJerin Jacob { 150e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 151e242dd1cSJerin Jacob octeontx_mbox_bgx_port_stats_t bgx_stats; 152e242dd1cSJerin Jacob int len = sizeof(octeontx_mbox_bgx_port_stats_t); 153e242dd1cSJerin Jacob int res; 154e242dd1cSJerin Jacob 155e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 156e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_STATS; 157e242dd1cSJerin Jacob hdr.vfid = port; 158e242dd1cSJerin Jacob 159d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &bgx_stats, len); 160e242dd1cSJerin Jacob if (res < 0) 161e242dd1cSJerin Jacob return -EACCES; 162e242dd1cSJerin Jacob 163e242dd1cSJerin Jacob stats->rx_packets = bgx_stats.rx_packets; 164e242dd1cSJerin Jacob stats->rx_bytes = bgx_stats.rx_bytes; 165e242dd1cSJerin Jacob stats->rx_dropped = bgx_stats.rx_dropped; 166e242dd1cSJerin Jacob stats->rx_errors = bgx_stats.rx_errors; 167e242dd1cSJerin Jacob stats->tx_packets = bgx_stats.tx_packets; 168e242dd1cSJerin Jacob stats->tx_bytes = bgx_stats.tx_bytes; 169e242dd1cSJerin Jacob stats->tx_dropped = bgx_stats.tx_dropped; 170e242dd1cSJerin Jacob stats->tx_errors = bgx_stats.tx_errors; 171e242dd1cSJerin Jacob return res; 172e242dd1cSJerin Jacob } 173e242dd1cSJerin Jacob 174e242dd1cSJerin Jacob int 175e242dd1cSJerin Jacob octeontx_bgx_port_stats_clr(int port) 176e242dd1cSJerin Jacob { 177e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 178e242dd1cSJerin Jacob int res; 179e242dd1cSJerin Jacob 180e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 181e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_CLR_STATS; 182e242dd1cSJerin Jacob hdr.vfid = port; 183e242dd1cSJerin Jacob 184d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, NULL, 0); 185e242dd1cSJerin Jacob if (res < 0) 186e242dd1cSJerin Jacob return -EACCES; 187e242dd1cSJerin Jacob 188e242dd1cSJerin Jacob return res; 189e242dd1cSJerin Jacob } 190e242dd1cSJerin Jacob 191e242dd1cSJerin Jacob int 192e242dd1cSJerin Jacob octeontx_bgx_port_link_status(int port) 193e242dd1cSJerin Jacob { 194e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 195e242dd1cSJerin Jacob uint8_t link; 196e242dd1cSJerin Jacob int len = sizeof(uint8_t); 197e242dd1cSJerin Jacob int res; 198e242dd1cSJerin Jacob 199e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 200e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_GET_LINK_STATUS; 201e242dd1cSJerin Jacob hdr.vfid = port; 202e242dd1cSJerin Jacob 203d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, NULL, 0, &link, len); 204e242dd1cSJerin Jacob if (res < 0) 205e242dd1cSJerin Jacob return -EACCES; 206e242dd1cSJerin Jacob 207e242dd1cSJerin Jacob return link; 208e242dd1cSJerin Jacob } 209e242dd1cSJerin Jacob 210e242dd1cSJerin Jacob int 211*8b42b07eSHarman Kalra octeontx_bgx_port_set_link_state(int port, bool enable) 212*8b42b07eSHarman Kalra { 213*8b42b07eSHarman Kalra struct octeontx_mbox_hdr hdr; 214*8b42b07eSHarman Kalra 215*8b42b07eSHarman Kalra hdr.coproc = OCTEONTX_BGX_COPROC; 216*8b42b07eSHarman Kalra hdr.msg = MBOX_BGX_PORT_SET_LINK_STATE; 217*8b42b07eSHarman Kalra hdr.vfid = port; 218*8b42b07eSHarman Kalra 219*8b42b07eSHarman Kalra return octeontx_mbox_send(&hdr, &enable, sizeof(bool), NULL, 0); 220*8b42b07eSHarman Kalra } 221*8b42b07eSHarman Kalra 222*8b42b07eSHarman Kalra int 223e242dd1cSJerin Jacob octeontx_bgx_port_promisc_set(int port, int en) 224e242dd1cSJerin Jacob { 225e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 226e242dd1cSJerin Jacob uint8_t prom; 227e242dd1cSJerin Jacob int res; 228e242dd1cSJerin Jacob 229e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 230e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_SET_PROMISC; 231e242dd1cSJerin Jacob hdr.vfid = port; 232e242dd1cSJerin Jacob prom = en ? 1 : 0; 233e242dd1cSJerin Jacob 234d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &prom, sizeof(prom), NULL, 0); 235e242dd1cSJerin Jacob if (res < 0) 236e242dd1cSJerin Jacob return -EACCES; 237e242dd1cSJerin Jacob 238e242dd1cSJerin Jacob return res; 239e242dd1cSJerin Jacob } 240e242dd1cSJerin Jacob 241e242dd1cSJerin Jacob int 2423151e6a6SHarman Kalra octeontx_bgx_port_mtu_set(int port, int mtu) 2433151e6a6SHarman Kalra { 2443151e6a6SHarman Kalra struct octeontx_mbox_hdr hdr; 2453151e6a6SHarman Kalra int res; 2463151e6a6SHarman Kalra 2473151e6a6SHarman Kalra hdr.coproc = OCTEONTX_BGX_COPROC; 2483151e6a6SHarman Kalra hdr.msg = MBOX_BGX_PORT_SET_MTU; 2493151e6a6SHarman Kalra hdr.vfid = port; 2503151e6a6SHarman Kalra 2513151e6a6SHarman Kalra res = octeontx_mbox_send(&hdr, &mtu, sizeof(mtu), NULL, 0); 2523151e6a6SHarman Kalra if (res < 0) 2533151e6a6SHarman Kalra return -EACCES; 2543151e6a6SHarman Kalra 2553151e6a6SHarman Kalra return res; 2563151e6a6SHarman Kalra } 2573151e6a6SHarman Kalra 2583151e6a6SHarman Kalra int 259e242dd1cSJerin Jacob octeontx_bgx_port_mac_set(int port, uint8_t *mac_addr) 260e242dd1cSJerin Jacob { 261e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 262e242dd1cSJerin Jacob int len = 6; 263e242dd1cSJerin Jacob int res = 0; 264e242dd1cSJerin Jacob 265e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 266e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_SET_MACADDR; 267e242dd1cSJerin Jacob hdr.vfid = port; 268e242dd1cSJerin Jacob 269d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, mac_addr, len, NULL, 0); 270e242dd1cSJerin Jacob if (res < 0) 271e242dd1cSJerin Jacob return -EACCES; 272e242dd1cSJerin Jacob 273e242dd1cSJerin Jacob return res; 274e242dd1cSJerin Jacob } 275e4373bf1SSunil Kumar Kori 276e4373bf1SSunil Kumar Kori int 2779614459bSSunil Kumar Kori octeontx_bgx_port_mac_add(int port, uint8_t *mac_addr, int index) 278e4373bf1SSunil Kumar Kori { 2799614459bSSunil Kumar Kori struct octeontx_mbox_bgx_port_mac_filter filter; 280e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 281e4373bf1SSunil Kumar Kori int len = 6; 282e4373bf1SSunil Kumar Kori 283e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 284e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_ADD_MACADDR; 285e4373bf1SSunil Kumar Kori hdr.vfid = port; 286e4373bf1SSunil Kumar Kori 2879614459bSSunil Kumar Kori memcpy(filter.mac_addr, mac_addr, len); 2889614459bSSunil Kumar Kori filter.index = index; 2899614459bSSunil Kumar Kori len = sizeof(struct octeontx_mbox_bgx_port_mac_filter); 290e4373bf1SSunil Kumar Kori 2919614459bSSunil Kumar Kori return octeontx_mbox_send(&hdr, &filter, len, NULL, 0); 292e4373bf1SSunil Kumar Kori } 293e4373bf1SSunil Kumar Kori 294e4373bf1SSunil Kumar Kori int 295e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_del(int port, uint32_t index) 296e4373bf1SSunil Kumar Kori { 297e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 298e4373bf1SSunil Kumar Kori int len = sizeof(uint32_t); 299e4373bf1SSunil Kumar Kori int res = 0; 300e4373bf1SSunil Kumar Kori 301e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 302e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_DEL_MACADDR; 303e4373bf1SSunil Kumar Kori hdr.vfid = port; 304e4373bf1SSunil Kumar Kori 305e4373bf1SSunil Kumar Kori res = octeontx_mbox_send(&hdr, &index, len, NULL, 0); 306e4373bf1SSunil Kumar Kori if (res < 0) 307e4373bf1SSunil Kumar Kori return -EACCES; 308e4373bf1SSunil Kumar Kori 309e4373bf1SSunil Kumar Kori return res; 310e4373bf1SSunil Kumar Kori } 311e4373bf1SSunil Kumar Kori 312e4373bf1SSunil Kumar Kori int 313e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_entries_get(int port) 314e4373bf1SSunil Kumar Kori { 315e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 316e4373bf1SSunil Kumar Kori int resp = 6; 317e4373bf1SSunil Kumar Kori int res = 0; 318e4373bf1SSunil Kumar Kori 319e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 320e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_GET_MACADDR_ENTRIES; 321e4373bf1SSunil Kumar Kori hdr.vfid = port; 322e4373bf1SSunil Kumar Kori 323e4373bf1SSunil Kumar Kori res = octeontx_mbox_send(&hdr, NULL, 0, &resp, sizeof(int)); 324e4373bf1SSunil Kumar Kori if (res < 0) 325e4373bf1SSunil Kumar Kori return -EACCES; 326e4373bf1SSunil Kumar Kori 327e4373bf1SSunil Kumar Kori return resp; 328e4373bf1SSunil Kumar Kori } 329