📄 adm_procfs.c
字号:
fake_table.data = buf; fake_table.maxlen = sizeof(buf); ret = proc_dostring(&fake_table, write, filp, buffer, lenp); if (ret == 0 && write) { int i; for (i=0; i<sizeof (bandwidth_map)/sizeof(char*); ++i) if (! strcmp(buf, bandwidth_map[i])) break; if (i>8) return -EINVAL; if (i>7) i=-1; port_cfg[port].bandwidth = i; if (port <= 3) { val = ((port_cfg[0].bandwidth & 7) << 0) | ((port_cfg[0].count_recv ? 0 : 1) << 3) | ((port_cfg[1].bandwidth & 7) << 4) | ((port_cfg[1].count_recv ? 0 : 1) << 7) | ((port_cfg[2].bandwidth & 7) << 8) | ((port_cfg[2].count_recv ? 0 : 1) << 11) | ((port_cfg[3].bandwidth & 7) << 12) | ((port_cfg[3].count_recv ? 0 : 1) << 15); adm_wreg (einfo, 0x31, val); } else { val = ((port_cfg[4].bandwidth & 7) << 0) | ((port_cfg[4].count_recv ? 0 : 1) << 3) | ((port_cfg[5].bandwidth & 7) << 4) | ((port_cfg[5].count_recv ? 0 : 1) << 7); adm_wreg (einfo, 0x32, val); } val = ((port_cfg[0].bandwidth==-1?0:1)<<0) | ((port_cfg[1].bandwidth==-1?0:1)<<2) | ((port_cfg[2].bandwidth==-1?0:1)<<4) | ((port_cfg[3].bandwidth==-1?0:1)<<6) | ((port_cfg[4].bandwidth==-1?0:1)<<7) | ((port_cfg[5].bandwidth==-1?0:1)<<8); adm_wreg (einfo, 0x33, val); } return 0;}static ctl_table vlan_table[] = { { 70, "0", vlan_groups[0], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 71, "1", vlan_groups[1], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 72, "2", vlan_groups[2], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 73, "3", vlan_groups[3], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 74, "4", vlan_groups[4], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 75, "5", vlan_groups[5], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 76, "6", vlan_groups[6], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 77, "7", vlan_groups[7], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 78, "8", vlan_groups[8], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 79, "9", vlan_groups[9], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 80, "10", vlan_groups[10], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 81, "11", vlan_groups[11], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 82, "12", vlan_groups[12], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 83, "13", vlan_groups[13], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 84, "14", vlan_groups[14], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 85, "15", vlan_groups[15], 6*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 0, }};static ctl_table port0_table[] = { { 100, "enable", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 101, "speed", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 102, "bandwidth", NULL, sizeof(int), 0644, NULL, &adm_sysctl_bandwidth, NULL, }, { 103, "count-recv", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 104, "tagging", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 105, "auto-negotiating", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 106, "duplex", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 107, "port-prio", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 108, "vlan-group-mask", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 109, "crossover", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 110, "tos-over-vlan-prio", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 111, "fx-mode", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 112, "mac-lock", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 113, "flow", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 114, "vlan-group", NULL, sizeof(int), 0444, NULL, &proc_dointvec, NULL, }, { 115, "port-prio-enable", NULL, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 0, }};static ctl_table port1_table[sizeof(port0_table) / sizeof(ctl_table)];static ctl_table port2_table[sizeof(port0_table) / sizeof(ctl_table)];static ctl_table port3_table[sizeof(port0_table) / sizeof(ctl_table)];static ctl_table port4_table[sizeof(port0_table) / sizeof(ctl_table)];static ctl_table port5_table[sizeof(port0_table) / sizeof(ctl_table)]; static ctl_table adm_table[] = { { 50, "vlan-groups", NULL, 0, 0555, vlan_table, }, { 51, "port0", NULL, 0, 0555, port0_table, }, { 52, "port1", NULL, 0, 0555, port1_table, }, { 53, "port2", NULL, 0, 0555, port2_table, }, { 54, "port3", NULL, 0, 0555, port3_table, }, { 55, "port4", NULL, 0, 0555, port4_table, }, { 56, "port5", NULL, 0, 0555, port5_table, }, { 1, "drop-scheme", &drop, 4*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 2, "crc", &xcrc, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 3, "aging", &aging, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 4, "far-end-fault", &far_end_fault, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 5, "trunk", &trunk, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 6, "ipg-bits", &ipg_bits, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 7, "replace-vid01-with-pvid", &replace_vid_pvid, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 8, "drop-on-collisions", &drop_on_collisions, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 9, "storming", &storming, 2*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 10, "vlan-mode", &vlan_mode, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 11, "mac-clone-reg11h", &mac_clone_11, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 12, "mac-clone-reg30h", &mac_clone_30, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 13, "mii-speed-double", &mii_speed, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 14, "speed-led", &speed_led, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 15, "port-led", &port_led, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 16, "tag-shift", &tag_shift, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 17, "fwd-management-mac-1", &fwd_management_mac1, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 18, "fwd-management-mac-2", &fwd_management_mac2, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 19, "fwd-management-mac-3", &fwd_management_mac3, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 20, "fwd-management-mac-4", &fwd_management_mac4, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 21, "smart-squelch", &smart_squelch, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 22, "vlan-prio", &vlan_prio, 8*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 23, "tos-prio", &tos_prio, 8*sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 24, "polarity-error", &polarity_error, sizeof(int), 0444, NULL, &adm_sysctl_handler, NULL, }, { 25, "reg_10_bit_3", ®_10_bit_3, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 26, "reg_2c_bit_11", ®_2c_bit_11, sizeof(int), 0644, NULL, &adm_sysctl_handler, NULL, }, { 0, }};static ctl_table adm_root[] = { { 1, "adm6996", NULL, 0, 0555, adm_table, }, { 0, }};static ctl_table dev_root[] = { { CTL_DEV, "dev", NULL, 0, 0555, adm_root, }, { 0, }};static struct ctl_table_header *sysctl_header;int __init init_sysctl(void){ int i, k; ctl_table* tbl[6] = { port0_table, port1_table, port2_table, port3_table, port4_table, port5_table }; static struct adm_gen_config cfg; port_cfg = kmalloc(6 * sizeof(struct _port_cfg), GFP_KERNEL); for (k=1; k<6; ++k) { for (i=0; i<sizeof(port0_table) / sizeof(ctl_table); ++i) { tbl[k][i] = port0_table[i]; } } for (k=0; k<6; ++k) { for (i=0; i<(sizeof port0_table/sizeof(ctl_table))-1; ++i) tbl[k][i].ctl_name = (k+1)*100+i; tbl[k][0].data = & port_cfg[k].enabled; tbl[k][1].data = & port_cfg[k].speed; tbl[k][2].data = & port_cfg[k].bandwidth; tbl[k][3].data = & port_cfg[k].count_recv; tbl[k][4].data = & port_cfg[k].tagging; tbl[k][5].data = & port_cfg[k].autoneg; tbl[k][6].data = & port_cfg[k].duplex; tbl[k][7].data = & port_cfg[k].port_prio; tbl[k][8].data = & port_cfg[k].pvid; tbl[k][9].data = & port_cfg[k].crossover; tbl[k][10].data = & port_cfg[k].use_tos; tbl[k][11].data = & port_cfg[k].fx; tbl[k][12].data = & port_cfg[k].mac_lock; tbl[k][13].data = & port_cfg[k].flow; tbl[k][14].data = & port_cfg[k].vlan; tbl[k][15].data = & port_cfg[k].use_prio; } adm_get_gen_config (&cfg); for (k=0; k<6; ++k) { port_cfg[k].count_recv = cfg.port[k].count_recv ? 0 : 1; port_cfg[k].enabled = cfg.port[k].disabled ? 0 : 1; port_cfg[k].autoneg = cfg.port[k].autoneg ? 1 : 0; port_cfg[k].speed = cfg.port[k].speed ? 100 : 10; port_cfg[k].bandwidth = (cfg.port[k].thrs_ena ? cfg.port[k].threshold : -1); port_cfg[k].tagging = cfg.port[k].tagging ? 1 : 0; port_cfg[k].duplex = cfg.port[k].duplex; port_cfg[k].fx = cfg.port[k].fx; port_cfg[k].crossover = cfg.port[k].crossover; port_cfg[k].flow = cfg.port[k].flow; port_cfg[k].use_tos = cfg.port[k].tos; port_cfg[k].port_prio = cfg.port[k].port_prio; port_cfg[k].use_prio = cfg.port[k].use_prio; port_cfg[k].mac_lock = cfg.port[k].mac_lock; port_cfg[k].pvid = cfg.port[k].pvid_0_3 | (cfg.port[1].pvid_4_11<<4); port_cfg[k].vlan = (port_cfg[k].pvid>>cfg.tag_shift) & 0xf; for (i=0; i<16; ++i) { int j; for (j=0; j<6; ++j) vlan_groups[i][j] = (cfg.vlan_groups[i] & BIT(j)) ? 1 : 0; } } drop_on_collisions = cfg.drop_on_collisions; replace_vid_pvid = cfg.replace_vid_pvid; ipg_bits = cfg.ipg92 ? 92 : 96; trunk = cfg.trunk; far_end_fault = cfg.far_end_fault; xcrc = cfg.xcrc; aging = cfg.aging; polarity_error = cfg.polarity_error; reg_10_bit_3 = cfg.reg_10_bit_3; reg_2c_bit_11 = cfg.reg_2c_bit_11; drop[0] = cfg.drop_q0; drop[1] = cfg.drop_q1; drop[2] = cfg.drop_q2; drop[3] = cfg.drop_q3; storming[0] = cfg.storming; storming[1] = cfg.storm_threshold; mac_clone_11 = cfg.mac_clone_11; vlan_mode = cfg.vlan_mode; mac_clone_30 = cfg.mac_clone_30; mii_speed = cfg.mii_speed; speed_led = cfg.speed_led; port_led = cfg.port_led; tag_shift = cfg.tag_shift; fwd_management_mac1 = cfg.fwd_management_mac1; fwd_management_mac2 = cfg.fwd_management_mac2; fwd_management_mac3 = cfg.fwd_management_mac3; fwd_management_mac4 = cfg.fwd_management_mac4; smart_squelch = cfg.smart_squelch; for (i=0; i<8; ++i) { vlan_prio[i] = (cfg.vlan_prio>>(i*2)) & 3; tos_prio[i] = (cfg.tos_prio>>(i*2)) & 3; } sysctl_header = register_sysctl_table(dev_root, 0); return 0;}void __exit cleanup_sysctl(void){ unregister_sysctl_table(sysctl_header); kfree (port_cfg);}#endif /* CONFIG_PROC_FS */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -