参考

Atheros QCA8337交换芯片驱动开发
Linux虚拟网络设备之bridge(桥)
phy 驱动与 switch 驱动
ALinux网桥的实现分析与使用
DSA switch configuration from userspace

源码分析

基于xilinx petalinux2015.2.1,kernel3.19,QCA8337驱动开发。
设备树初始化,关注dsa,mii-busdsa,ethernetreg三个节点,

//*\net\dsa\dsa.c line570
static int dsa_of_probe(struct platform_device *pdev)
{struct device_node *np = pdev->dev.of_node;struct device_node *child, *mdio, *ethernet, *port, *link;struct mii_bus *mdio_bus;struct platform_device *ethernet_dev;struct dsa_platform_data *pd;struct dsa_chip_data *cd;const char *port_name;int chip_index, port_index;const unsigned int *sw_addr, *port_reg;u32 eeprom_len;int ret;mdio = of_parse_phandle(np, "dsa,mii-bus", 0);if (!mdio)return -EINVAL;mdio_bus = of_mdio_find_bus(mdio);if (!mdio_bus)return -EINVAL;ethernet = of_parse_phandle(np, "dsa,ethernet", 0);if (!ethernet)return -EINVAL;ethernet_dev = of_find_device_by_node(ethernet);if (!ethernet_dev)return -ENODEV;
...chip_index = -1;for_each_available_child_of_node(np, child) {chip_index++;cd = &pd->chip[chip_index];cd->of_node = child;cd->host_dev = &mdio_bus->dev;sw_addr = of_get_property(child, "reg", NULL);if (!sw_addr)continue;
...
}

设备初始化,

//*\net\dsa\dsa.c line702
static int dsa_probe(struct platform_device *pdev)
{struct dsa_platform_data *pd = pdev->dev.platform_data;struct net_device *dev;struct dsa_switch_tree *dst;int i, ret;
...if (pdev->dev.of_node) {ret = dsa_of_probe(pdev);if (ret)return ret;pd = pdev->dev.platform_data;}
...for (i = 0; i < pd->nr_chips; i++) {struct dsa_switch *ds;ds = dsa_switch_setup(dst, i, &pdev->dev, pd->chip[i].host_dev);if (IS_ERR(ds)) {netdev_err(dev, "[%d]: couldn't create dsa switch instance (error %ld)\n",i, PTR_ERR(ds));continue;}dst->ds[i] = ds;if (ds->drv->poll_link != NULL)dst->link_poll_needed = 1;}
...if (dst->link_poll_needed) {INIT_WORK(&dst->link_poll_work, dsa_link_poll_work);init_timer(&dst->link_poll_timer);dst->link_poll_timer.data = (unsigned long)dst;dst->link_poll_timer.function = dsa_link_poll_timer;dst->link_poll_timer.expires = round_jiffies(jiffies + HZ);add_timer(&dst->link_poll_timer);}return 0;out:dsa_of_remove(pdev);return ret;
}

重点函数dsa_switch_setup,需要在*\net\dsa目录下添加qca的CONFIG_NET_DSA_TAG_QCA的实现,这一层实现的原因是,交换芯片会给接收和发送的包打上或者去除一个包头header,用来控制包转发packet forwardingdsa_switch_setup也调用了很多驱动的接口函数probesetupset_addr,实现这几个函数,则qca8377的驱动就开发出来了,

//*\net\dsa\dsa.c line178
static struct dsa_switch *
dsa_switch_setup(struct dsa_switch_tree *dst, int index,struct device *parent, struct device *host_dev)
{struct dsa_chip_data *pd = dst->pd->chip + index;struct dsa_switch_driver *drv;struct dsa_switch *ds;int ret;char *name;int i;bool valid_name_found = false;
...drv = dsa_switch_probe(host_dev, pd->sw_addr, &name);
...for (i = 0; i < DSA_MAX_PORTS; i++) {char *name;name = pd->port_names[i];if (name == NULL)continue;if (!strcmp(name, "cpu")) {if (dst->cpu_switch != -1) {netdev_err(dst->master_netdev,"multiple cpu ports?!\n");ret = -EINVAL;goto out;}dst->cpu_switch = index;dst->cpu_port = i;} else if (!strcmp(name, "dsa")) {ds->dsa_port_mask |= 1 << i;} else {ds->phys_port_mask |= 1 << i;}valid_name_found = true;}if (!valid_name_found && i == DSA_MAX_PORTS) {ret = -EINVAL;goto out;}/* Make the built-in MII bus mask match the number of ports,* switch drivers can override this later*/ds->phys_mii_mask = ds->phys_port_mask;/** If the CPU connects to this switch, set the switch tree* tagging protocol to the preferred tagging format of this* switch.*/if (dst->cpu_switch == index) {switch (drv->tag_protocol) {#ifdef CONFIG_NET_DSA_TAG_DSAcase DSA_TAG_PROTO_DSA:dst->rcv = dsa_netdev_ops.rcv;break;
#endif
#ifdef CONFIG_NET_DSA_TAG_EDSAcase DSA_TAG_PROTO_EDSA:dst->rcv = edsa_netdev_ops.rcv;break;
#endif
#ifdef CONFIG_NET_DSA_TAG_TRAILERcase DSA_TAG_PROTO_TRAILER:dst->rcv = trailer_netdev_ops.rcv;break;
#endif
#ifdef CONFIG_NET_DSA_TAG_BRCMcase DSA_TAG_PROTO_BRCM:dst->rcv = brcm_netdev_ops.rcv;break;
#endif
#ifdef CONFIG_NET_DSA_TAG_QCA /*add by xxx*/case DSA_TAG_PROTO_QCA:dst->rcv = qca_netdev_ops.rcv;break;
#endifcase DSA_TAG_PROTO_NONE:break;default:ret = -ENOPROTOOPT;goto out;}dst->tag_protocol = drv->tag_protocol;}/** Do basic register setup.*/ret = drv->setup(ds);if (ret < 0)goto out;ret = drv->set_addr(ds, dst->master_netdev->dev_addr);if (ret < 0)goto out;ds->slave_mii_bus = mdiobus_alloc();if (ds->slave_mii_bus == NULL) {ret = -ENOMEM;goto out;}dsa_slave_mii_bus_init(ds);ret = mdiobus_register(ds->slave_mii_bus);if (ret < 0)goto out_free;/** Create network devices for physical switch ports.*/for (i = 0; i < DSA_MAX_PORTS; i++) {struct net_device *slave_dev;if (!(ds->phys_port_mask & (1 << i)))continue;slave_dev = dsa_slave_create(ds, parent, i, pd->port_names[i]);if (slave_dev == NULL) {netdev_err(dst->master_netdev, "[%d]: can't create dsa slave device for port %d(%s)\n",index, i, pd->port_names[i]);continue;}ds->ports[i] = slave_dev;}
...
}

dsa_slave_create函数,其中dsa_slave_phy_setup配置phy。

struct net_device *
dsa_slave_create(struct dsa_switch *ds, struct device *parent,int port, char *name)
{...ret = dsa_slave_phy_setup(p, slave_dev);if (ret) {free_netdev(slave_dev);return NULL;}ret = register_netdev(slave_dev);if (ret) {netdev_err(master, "error %d registering interface %s\n",ret, slave_dev->name);phy_disconnect(p->phy);free_netdev(slave_dev);return NULL;}netif_carrier_off(slave_dev);if (p->phy != NULL) {if (ds->drv->get_phy_flags)p->phy->dev_flags |= ds->drv->get_phy_flags(ds, port);phy_attach(slave_dev, dev_name(&p->phy->dev),PHY_INTERFACE_MODE_GMII);p->phy->autoneg = AUTONEG_ENABLE;p->phy->speed = 0;p->phy->duplex = 0;p->phy->advertising = p->phy->supported | ADVERTISED_Autoneg;}return slave_dev;
}

需要升级以下文件,

*/net/dsa/dsa.c
*/net/dsa/tag_qca.c
*/net/dsa/Kconfig
*/net/dsa/Makefile
*/include/net/dsa.h
*/drivers/net/dsa/qca8k.c
*/drivers/net/dsa/qca8k.h
*/drivers/net/dsa/Kconfig
*/drivers/net/dsa/Makefile

使用

Configuration with tagging support

The tagging based configuration is desired and supported by the majority of DSA switches. These switches are capable to tag incoming and outgoing traffic without using a VLAN based configuration.

single port

# configure each interface
ip addr add 192.0.2.1/30 dev lan1
ip addr add 192.0.2.5/30 dev lan2
ip addr add 192.0.2.9/30 dev lan3# The master interface needs to be brought up before the slave ports.
ip link set eth0 up# bring up the slave interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up

bridge

# The master interface needs to be brought up before the slave ports.
ip link set eth0 up# bring up the slave interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up# create bridge
ip link add name br0 type bridge# add ports to bridge
ip link set dev lan1 master br0
ip link set dev lan2 master br0
ip link set dev lan3 master br0# configure the bridge
ip addr add 192.0.2.129/25 dev br0# bring up the bridge
ip link set dev br0 up

gateway

# The master interface needs to be brought up before the slave ports.
ip link set eth0 up# bring up the slave interfaces
ip link set wan up
ip link set lan1 up
ip link set lan2 up# configure the upstream port
ip addr add 192.0.2.1/30 dev wan# create bridge
ip link add name br0 type bridge# add ports to bridge
ip link set dev lan1 master br0
ip link set dev lan2 master br0# configure the bridge
ip addr add 192.0.2.129/25 dev br0# bring up the bridge
ip link set dev br0 up

Configuration without tagging support

A minority of switches are not capable to use a taging protocol (DSA_TAG_PROTO_NONE). These switches can be configured by a VLAN based configuration.

single port

The configuration can only be set up via VLAN tagging and bridge setup.

# tag traffic on CPU port
ip link add link eth0 name eth0.1 type vlan id 1
ip link add link eth0 name eth0.2 type vlan id 2
ip link add link eth0 name eth0.3 type vlan id 3# The master interface needs to be brought up before the slave ports.
ip link set eth0 up
ip link set eth0.1 up
ip link set eth0.2 up
ip link set eth0.3 up# bring up the slave interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up# create bridge
ip link add name br0 type bridge# activate VLAN filtering
ip link set dev br0 type bridge vlan_filtering 1# add ports to bridges
ip link set dev lan1 master br0
ip link set dev lan2 master br0
ip link set dev lan3 master br0# tag traffic on ports
bridge vlan add dev lan1 vid 1 pvid untagged
bridge vlan add dev lan2 vid 2 pvid untagged
bridge vlan add dev lan3 vid 3 pvid untagged# configure the VLANs
ip addr add 192.0.2.1/30 dev eth0.1
ip addr add 192.0.2.5/30 dev eth0.2
ip addr add 192.0.2.9/30 dev eth0.3# bring up the bridge devices
ip link set br0 up

bridge

# tag traffic on CPU port
ip link add link eth0 name eth0.1 type vlan id 1# The master interface needs to be brought up before the slave ports.
ip link set eth0 up
ip link set eth0.1 up# bring up the slave interfaces
ip link set lan1 up
ip link set lan2 up
ip link set lan3 up# create bridge
ip link add name br0 type bridge# activate VLAN filtering
ip link set dev br0 type bridge vlan_filtering 1# add ports to bridge
ip link set dev lan1 master br0
ip link set dev lan2 master br0
ip link set dev lan3 master br0
ip link set eth0.1 master br0# tag traffic on ports
bridge vlan add dev lan1 vid 1 pvid untagged
bridge vlan add dev lan2 vid 1 pvid untagged
bridge vlan add dev lan3 vid 1 pvid untagged# configure the bridge
ip addr add 192.0.2.129/25 dev br0# bring up the bridge
ip link set dev br0 up

gateway

# tag traffic on CPU port
ip link add link eth0 name eth0.1 type vlan id 1
ip link add link eth0 name eth0.2 type vlan id 2# The master interface needs to be brought up before the slave ports.
ip link set eth0 up
ip link set eth0.1 up
ip link set eth0.2 up# bring up the slave interfaces
ip link set wan up
ip link set lan1 up
ip link set lan2 up# create bridge
ip link add name br0 type bridge# activate VLAN filtering
ip link set dev br0 type bridge vlan_filtering 1# add ports to bridges
ip link set dev wan master br0
ip link set eth0.1 master br0
ip link set dev lan1 master br0
ip link set dev lan2 master br0# tag traffic on ports
bridge vlan add dev lan1 vid 1 pvid untagged
bridge vlan add dev lan2 vid 1 pvid untagged
bridge vlan add dev wan vid 2 pvid untagged# configure the VLANs
ip addr add 192.0.2.1/30 dev eth0.2
ip addr add 192.0.2.129/25 dev br0# bring up the bridge devices
ip link set br0 up

Linux DSA Net Switch驱动开发相关推荐

  1. Linux下LED设备驱动开发(LED灯实现闪烁)

    文章目录 一.配置连接说明 二.更新设备树 (1)将led灯引脚添加到pinctrl子系统 (2)设备树中添加LDE灯的设备树节点 (3)编译更新设备树 三.驱动开发与测试 (1)编写设备驱动代码 ( ...

  2. 嵌入式linux ASoC架构声卡驱动开发

    嵌入式linux ASoC架构声卡驱动开发 文章目录 嵌入式linux ASoC架构声卡驱动开发 需求分析 ASoC架构下声卡驱动代码结构 codec驱动 snd_soc_register_codec ...

  3. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)

    哈喽,我是老吴,继续记录我的学习心得. 一.保持专注的几个技巧 将最重要的事放在早上做. 待在无干扰环境下,比如图书馆. 意识到刚坐下开始投入工作前,有点负面小情绪是特别正常的现象. 让"开 ...

  4. pcDuino的linux移植五GPIO驱动开发

    2019独角兽企业重金招聘Python工程师标准>>> 为首的亮,灭.同时如果你GPIO4,GPIO5接个LED,也会跟着亮,灭. 开发环境: 系统:Ubuntu的 一,硬件介绍 仔 ...

  5. 实时linux下的PCI驱动开发(上)

    第一篇博客,忆苦思甜下先,当然,我尽量长话短说,但说来话长倒也无妨......这是我研究生阶段写的第一个Linux驱动,一入Linux深似海,从此Windows是路人.那是2009年冬天的第一场雪,王 ...

  6. Linux下按键设备驱动开发以及对中断的上半部分和下半部分详细介绍

    文章目录 一.编写并且加载设备树插件 (1)检测管脚是否占用 (2)添加设备树插件 (3)加载设备树插件 二.中断相关函数 (1)request_irq中断注册函数 (2)free_irq中断注销函数 ...

  7. linux can总线接收数据串口打包上传_使用Zedboard开发板学习Linux的移植及驱动开发...

    本文是昨天发的文章<龙芯杯CPU设计竞赛与ZYNQ设计流程介绍>接续部分.重点介绍传统方式的Linux移植和Xilinx的Petalinux的快速移植开发两种. 部分硬件设计中需要CPU完 ...

  8. Linux SD卡/SDIO驱动开发0-基本知识

    文章目录 Linux驱动子系统-sdio子系统 sdio系统概述 判断sd卡是否识别 判断sdio wifi是否识别 sd协议 SD BUS SPI BUS 硬件接口: 调试的问题 sdmmc接口使用 ...

  9. Linux SD卡/SDIO驱动开发-dw_mci_probe

    以瑞芯微(rk)平台的代码解析,其他平台也类似,供其他同学参考学习. 参考:http://blog.chinaunix.net/uid-25445243-id-3885164.html int dw_ ...

最新文章

  1. c++中报错预处理器指令后有意外标记 - 应输入换行符
  2. 片上网络NoC(一)—— 概述
  3. 关于Fiori应用sandbox JavaScript的两个疑问
  4. 【粉丝需求】如何把一个前端网页都搞下来?
  5. Android快速开发框架XUtils
  6. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-演示使用报表构建UI-入库业务查询模块...
  7. java secondtotime_Java中的LocalTime toSecondOfDay()方法
  8. springboot整合视图层之freemarker
  9. 特征工程系列之自动化特征提取器
  10. 将下图的nfa确定化为dfa_想要确定一个宝石矿物种,必须要确定这两大因素
  11. strnpy函数的用法
  12. 使用Node.JS,如何将JSON文件读入(服务器)内存?
  13. 计算机2010ppt试题,计算机Office2010 PPT试题.doc
  14. 【转】nodejs 压缩文件 zip-local
  15. linux下运行vasp,VASP5.3.5 并行版本+VTST从头编译教程(完整版)
  16. 浪曦_Struts2应用开发系列_第1讲.Struts2入门与配置--出现的问题笔记
  17. 开心网刷分程序详解以及web游戏破解思路分析(一)
  18. 京东EB级全域大数据平台的演进与治理历程
  19. python名片管理系统_用python实现名片管理系统
  20. 不同坐标系下角速度_悠悠球的物理学原理(下)

热门文章

  1. ggplot2-标度、坐标轴和图例4
  2. 江苏省成人高考报名流程及免冠证件照电子版制作教程
  3. 分析:很多小程序微商城系统为什么敢永久免费使用
  4. 用python转换PDF/Word/Excel/PPT等!
  5. Linux设备驱动-platform虚拟总线dya01
  6. python除法保留小数_python中的除法_python中除法_python 除法_python 除法保留小数
  7. Windows10 通过隧道进行远程桌面连接
  8. java button click事件_java处理按钮点击事件的方法
  9. APP漏洞导致移动支付隐患重重,未来之路如何走?
  10. wow Onyxia