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 211e242dd1cSJerin Jacob octeontx_bgx_port_promisc_set(int port, int en) 212e242dd1cSJerin Jacob { 213e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 214e242dd1cSJerin Jacob uint8_t prom; 215e242dd1cSJerin Jacob int res; 216e242dd1cSJerin Jacob 217e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 218e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_SET_PROMISC; 219e242dd1cSJerin Jacob hdr.vfid = port; 220e242dd1cSJerin Jacob prom = en ? 1 : 0; 221e242dd1cSJerin Jacob 222d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &prom, sizeof(prom), NULL, 0); 223e242dd1cSJerin Jacob if (res < 0) 224e242dd1cSJerin Jacob return -EACCES; 225e242dd1cSJerin Jacob 226e242dd1cSJerin Jacob return res; 227e242dd1cSJerin Jacob } 228e242dd1cSJerin Jacob 229e242dd1cSJerin Jacob int 230e242dd1cSJerin Jacob octeontx_bgx_port_mac_set(int port, uint8_t *mac_addr) 231e242dd1cSJerin Jacob { 232e242dd1cSJerin Jacob struct octeontx_mbox_hdr hdr; 233e242dd1cSJerin Jacob int len = 6; 234e242dd1cSJerin Jacob int res = 0; 235e242dd1cSJerin Jacob 236e242dd1cSJerin Jacob hdr.coproc = OCTEONTX_BGX_COPROC; 237e242dd1cSJerin Jacob hdr.msg = MBOX_BGX_PORT_SET_MACADDR; 238e242dd1cSJerin Jacob hdr.vfid = port; 239e242dd1cSJerin Jacob 240d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, mac_addr, len, NULL, 0); 241e242dd1cSJerin Jacob if (res < 0) 242e242dd1cSJerin Jacob return -EACCES; 243e242dd1cSJerin Jacob 244e242dd1cSJerin Jacob return res; 245e242dd1cSJerin Jacob } 246*e4373bf1SSunil Kumar Kori 247*e4373bf1SSunil Kumar Kori int 248*e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_add(int port, uint8_t *mac_addr) 249*e4373bf1SSunil Kumar Kori { 250*e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 251*e4373bf1SSunil Kumar Kori int resp = 0; 252*e4373bf1SSunil Kumar Kori int len = 6; 253*e4373bf1SSunil Kumar Kori int res = 0; 254*e4373bf1SSunil Kumar Kori 255*e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 256*e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_ADD_MACADDR; 257*e4373bf1SSunil Kumar Kori hdr.vfid = port; 258*e4373bf1SSunil Kumar Kori 259*e4373bf1SSunil Kumar Kori res = octeontx_mbox_send(&hdr, mac_addr, len, &resp, sizeof(int)); 260*e4373bf1SSunil Kumar Kori if (res < 0) 261*e4373bf1SSunil Kumar Kori return -EACCES; 262*e4373bf1SSunil Kumar Kori 263*e4373bf1SSunil Kumar Kori return res; 264*e4373bf1SSunil Kumar Kori } 265*e4373bf1SSunil Kumar Kori 266*e4373bf1SSunil Kumar Kori int 267*e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_del(int port, uint32_t index) 268*e4373bf1SSunil Kumar Kori { 269*e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 270*e4373bf1SSunil Kumar Kori int len = sizeof(uint32_t); 271*e4373bf1SSunil Kumar Kori int res = 0; 272*e4373bf1SSunil Kumar Kori 273*e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 274*e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_DEL_MACADDR; 275*e4373bf1SSunil Kumar Kori hdr.vfid = port; 276*e4373bf1SSunil Kumar Kori 277*e4373bf1SSunil Kumar Kori res = octeontx_mbox_send(&hdr, &index, len, NULL, 0); 278*e4373bf1SSunil Kumar Kori if (res < 0) 279*e4373bf1SSunil Kumar Kori return -EACCES; 280*e4373bf1SSunil Kumar Kori 281*e4373bf1SSunil Kumar Kori return res; 282*e4373bf1SSunil Kumar Kori } 283*e4373bf1SSunil Kumar Kori 284*e4373bf1SSunil Kumar Kori int 285*e4373bf1SSunil Kumar Kori octeontx_bgx_port_mac_entries_get(int port) 286*e4373bf1SSunil Kumar Kori { 287*e4373bf1SSunil Kumar Kori struct octeontx_mbox_hdr hdr; 288*e4373bf1SSunil Kumar Kori int resp = 6; 289*e4373bf1SSunil Kumar Kori int res = 0; 290*e4373bf1SSunil Kumar Kori 291*e4373bf1SSunil Kumar Kori hdr.coproc = OCTEONTX_BGX_COPROC; 292*e4373bf1SSunil Kumar Kori hdr.msg = MBOX_BGX_PORT_GET_MACADDR_ENTRIES; 293*e4373bf1SSunil Kumar Kori hdr.vfid = port; 294*e4373bf1SSunil Kumar Kori 295*e4373bf1SSunil Kumar Kori res = octeontx_mbox_send(&hdr, NULL, 0, &resp, sizeof(int)); 296*e4373bf1SSunil Kumar Kori if (res < 0) 297*e4373bf1SSunil Kumar Kori return -EACCES; 298*e4373bf1SSunil Kumar Kori 299*e4373bf1SSunil Kumar Kori return resp; 300*e4373bf1SSunil Kumar Kori } 301