因为cavium ssl加速卡的驱动指定的系统是Fedora,而我们的系统是Ubuntu,所以肯定要移植了,看一下Release_Notes.txt里面的Supported Features:

 Supported Features==================System architecture-------------------- 32/64 bit Intel/AMD platforms- Little Endian- SMP and Non-SMPOperating System and Kernel versions------------------------------------OS:- Fedora Core 12Kernel Versions:- v2.6.31- v2.6.32- v2.6.34

可见这个驱动只在v2.6.31、32、34这几个版本的内核上测试过,想在3.0以上版本内核上编译,肯定也要修改一下代码。果不其然,拿它的源码在Ubuntu上make一下报了很多错,这里就不贴编译错误的图了,下面是所做的修改:

1、源码

需要修改的文件有cavium_proc.c、linux_main.c、linux_sysdep.h、Makefile、Makefile.Linux,用Beyond Compare比较如下:

其中cavium_proc.c主要是proc文件系统的修改,因为Linux在3.10内核版本之后对proc文件系统的使用方式和接口有了点变动,所以需要修改,在3.9之前,proc文件系统是这个用的:

static int
proc_write_timeout(struct file *file, const char *buffer,unsigned long count, void *data)
{char str[count+1], *strend;Uint32 timeout;CAVIUM_MOD_INC_USE_COUNT;if(cavium_copy_in(str, buffer, count)){cavium_error("cavium_copy_out failed\n");return -EFAULT;}str[count] = '\0';timeout = simple_strtoul(str, &strend, 0);if (timeout > (2*60*60)){cavium_error("Timeout too high. The maximum value is 7200\n");return -EFAULT;}cavium_command_timeout = timeout*HZ;CAVIUM_MOD_DEC_USE_COUNT;return count;
}static int
proc_read_timeout(char *page, char **start, off_t off, int count,int *eof, void *data)
{int len = 0;CAVIUM_MOD_INC_USE_COUNT;len = sprintf(page + len, "%d\n", (cavium_command_timeout/HZ));CAVIUM_MOD_DEC_USE_COUNT;return len;
}int cavium_init_proc(void)
{int rv = 0;/* create directory /proc/cavium */cavium_dir = proc_mkdir("cavium", NULL);if(cavium_dir == NULL) {rv = -ENOMEM;goto out;}#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,30)cavium_dir->owner = THIS_MODULE;
#endif/* create timeout file */timeout_file = create_proc_entry("command_timeout", 0644, cavium_dir);if(timeout_file == NULL){rv = -ENOMEM;goto out;}timeout_file->data = &cavium_command_timeout;timeout_file->read_proc = proc_read_timeout;timeout_file->write_proc = proc_write_timeout;#if LINUX_VERSION_CODE < KERNEL_VERSION (2,6,30)timeout_file->owner = THIS_MODULE;#endif……
}

而在3.10以及3.10之后的内核版本proc文件系统是这么用的:

static ssize_t proc_write_timeout(struct file *file, const char __user *buffer,size_t count, loff_t *ppos)
{Uint32 timeout;unsigned long val;int err;CAVIUM_MOD_INC_USE_COUNT;err = kstrtoul_from_user(buffer, count, 0, &val);if (err)return err;timeout = val;if (timeout > (2*60*60)) {cavium_error("Timeout too high. The maximum value is 7200\n");return -EFAULT;}cavium_command_timeout = timeout*HZ;CAVIUM_MOD_DEC_USE_COUNT;return count;
}static int proc_read_timeout(struct seq_file *m, void *v)
{int len = 0;CAVIUM_MOD_INC_USE_COUNT;len = seq_printf(m, "%d\n", (cavium_command_timeout/HZ));CAVIUM_MOD_DEC_USE_COUNT;return len;
}static struct file_operations cavium_proc_timeout_operations = {.open = open_proc_timeout,.read = seq_read,.llseek = seq_lseek,.write = proc_write_timeout,
};int cavium_init_proc(void)
{int rv = 0;/* create directory /proc/cavium */cavium_dir = proc_mkdir("cavium", NULL);if(cavium_dir == NULL) {rv = -ENOMEM;goto out;}timeout_file = proc_create("command_timeout", 0644, cavium_dir, &cavium_proc_timeout_operations);if(timeout_file == NULL){rv = -ENOMEM;goto out;}……
}

对比一下就会发现接口名变了,参数也变了,所以在cavium_proc.c文件中要做相应的修改,这个文件里面修改的行数还挺多,基本都是修改proc文件系统的使用接口,参考上面的例子就可以了。

文件linux_main.c改得不多,主要是加几个宏定义就可以了,这是因为在内核版本3.7.0之后内核去掉了devinit、devinitdata、devexit_p这几个宏,我们加上这几个宏的定义就可以了:

#if LINUX_VERSION_CODE  > KERNEL_VERSION (3,7,0)
#define __devinit
#define __devinitdata
#define __devexit_p(x) x
#endif

文件linux_sysdep.h改得也不多,主要是几个头文件的问题:

文件driver\linux\Makefile做了只能在2.6内核上编译的限制,要在新版Ubuntu(内核版本3.13)上编译,肯定要去掉这个限制:

文件Makefile.Linux也做了一些修改:

2、编译

经过上面源码的修改,再看看linux_install_driver_pf.txt基本上make clean和make一下就可以了,如果还出错那就再根据出错信息去做相应的修改就可以了。编译还是很简单的。

3、加载

编译成功了的话,在编译目录的bin底下应该有驱动模块:

root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK# ls -l bin/
total 0
lrwxrwxrwx 1 root root 69 Apr 14 14:29 csp1_init -> /root/work/cavium/Cavium_Networks/NITROX-SDK/utils/csp1_init*
lrwxrwxrwx 1 root root 71 Apr 14 14:29 init_nitrox -> /root/work/cavium/Cavium_Networks/NITROX-SDK/utils/init_nitrox*
lrwxrwxrwx 1 root root 77 Apr 14 14:29 pkp_drv.ko -> /root/work/cavium/Cavium_Networks/NITROX-SDK/driver/linux/pkp_drv.ko然后在bin目录底下执行命令:./init_nitrox ssl就可以加载驱动模块了,如果不出意外,基本上就完事了,但在Ubuntu一些版本上总是出现硬件无法分配资源以及驱动初始化失败的问题:
root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# lspci -vvv -s 05:00.0
05:00.0 Network and computing encryption device: Cavium Networks Device 0011 (rev 01)Subsystem: Cavium Networks Device 0011Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0, Cache Line Size: 64 bytesInterrupt: pin A routed to IRQ 48Region 0: Memory at <ignored> (64-bit, prefetchable)Capabilities: [40] Power Management version 3Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+Address: 0000000000000000  Data: 0000Masking: 00000000  Pending: 00000000Capabilities: [70] Express (v2) Endpoint, MSI 00DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <1us, L1 <8usExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+DevCtl: Report errors: Correctable- Non-Fatal+ Fatal+ Unsupported+RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-MaxPayload 256 bytes, MaxReadReq 512 bytesDevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-LnkCap: Port #0, Speed 5GT/s, Width x16, ASPM L0s L1, Exit Latency L0s <1us, L1 <64usClockPM- Surprise- LLActRep- BwNot-LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-DevCap2: Completion Timeout: Not Supported, TimeoutDis+, LTR-, OBFF Not SupportedDevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis+, LTR-, OBFF DisabledLnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-Compliance De-emphasis: -6dBLnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete-, EqualizationPhase1-EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-Capabilities: [b0] MSI-X: Enable- Count=19 Masked-Vector table: BAR=0 offset=00001000PBA: BAR=0 offset=00002000Capabilities: [100 v2] Advanced Error ReportingUESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt+ UnxCmplt+ RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-UESvrt: DLP+ SDES+ TLP+ FCP+ CmpltTO+ CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC+ UnsupReq- ACSViol-CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr-CEMsk:  RxErr+ BadTLP+ BadDLLP+ Rollover+ Timeout+ NonFatalErr+AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-Capabilities: [140 v1] Alternative Routing-ID Interpretation (ARI)ARICap: MFVC- ACS-, Next Function: 0ARICtl: MFVC- ACS-, Function Group: 0Capabilities: [150 v1] Single Root I/O Virtualization (SR-IOV)IOVCap: Migration-, Interrupt Message Number: 000IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+IOVSta: Migration-Initial VFs: 64, Total VFs: 64, Number of VFs: 0, Function Dependency Link: 00VF offset: 1, stride: 1, Device ID: 0011Supported Page Size: 00000553, System Page Size: 00000001Region 0: Memory at 0000000000000000 (64-bit, prefetchable)VF Migration: offset: 00000000, BIR: 0root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# dmesg
[  239.840522] VFCOUNT 0
[  239.840604]  requested mem region for bar 0 cannot be allocated
[  239.840610]  Cavium Init failed for device
[  239.840644] pkp: probe of 0000:05:00.0 failed with error -12
[  239.840697]  requested mem region for bar 0 cannot be allocated
[  239.840702]  Cavium Init failed for device
[  239.840719] pkp: probe of 0000:43:00.0 failed with error -12
root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# 

这个问题困扰我很长时间,看内核pci驱动初始化代码也没找出是啥问题,后来峰哥在​https://bugzilla.kernel.org/show_bug.cgi?id=10461上看到人家只要加一个内核参数就能解决问题了,在我们系统试了一下果然也能解决掉这个问题,加的内核启动参数是pci=nocrs,这个参数对应到代码是在arch/x86/pci/common.c和arch/x86/pci/acpi.c文件中有用到,最后体现在acpi.c的函数pci_acpi_scan_root中:

如果加了内核启动参数pci=nocrs的话,应该执行的是上图else分支,看样子是先释放一些资源再添加一些资源,具体原因就没有往更深层次去挖掘了,因为这个需要熟悉pci一整套流程和玩法才好理解,这个还是比较复杂的,目前功力尚未达到这个境界,先这么着吧。添加内核启动参数只需要在/boot/grub/grub.cfg加一下就可以了:

修改完重启之后加载驱动:

root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# ./init_nitrox ssl
insmod ./pkp_drv.ko ssl=0
./csp1_init ssl=0
File: ../microcode/boot_mc2_n3.outVersion = CN35x-MC-Boot-0001Code length = 14060     Data length = 200
0: name=../microcode/boot_mc2_n3.out, index=0, core=0
File: ../microcode/main_ssl2_n3.outVersion = CNN35x-MC-SSL-0008Code length = 59620     Data length = 320
1: name=../microcode/main_ssl2_n3.out, index=1, core=0
Microcode Load Succeed
root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# dmesg
[ 4151.317917] VFCOUNT 0
[ 4151.318649] Nitrox3 found at Bus 5 Slot 0
[ 4151.318827] Using memory-mapped bar for device 0x177D:0x11
[ 4151.320505] bar 0: d9200000
[ 4151.331446] SERDES_TUNING register value is already set: 0x458cc58
[ 4151.334542] detect_n3_sku: Invalid zip mask 0x0000000f
[ 4151.431688] part number=CNN35XX has 16 cores
[ 4151.431691] Finished Initializing this device
[ 4151.431693] Total Number of Nitrox Devices: 1
[ 4151.432981] Loaded Cavium Driver --- 5.03-
[ 4152.456226] got boot microcode
[ 4152.456243] Code type = 02, code size = 36ec, data size = c8
[ 4152.456246] got mainline microcode
[ 4152.456269] Code type = 01, code size = e8e4, data size = 140
[ 4152.812956] UEN = 0xffff
[ 4152.812960] Final Core Mask = 0x0000ffff
[ 4152.812962] Loaded Boot microcode
[ 4154.315289] Loaded Main microcode
[ 4154.350374] Loading of Microcodes successful
[ 4154.370396]
[ 4154.370396] Core Frequency 500 MHz
root@BJDEVR720:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# 

从加载结果和dmesg调试信息可见已经正常加载驱动了,再lspci一下看看:

root@rdserver5:~/work/cavium/Cavium_Networks/NITROX-SDK/bin# lspci -vvv -s 05:00.0
05:00.0 Network and computing encryption device: Cavium Networks Device 0011 (rev 01)Subsystem: Cavium Networks Device 0011Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Latency: 0, Cache Line Size: 64 bytesInterrupt: pin A routed to IRQ 48Region 0: Memory at d9200000 (64-bit, prefetchable) [size=1M]Capabilities: [40] Power Management version 3Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+Address: 0000000000000000  Data: 0000Masking: 00000000  Pending: 00000000Capabilities: [70] Express (v2) Endpoint, MSI 00DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <1us, L1 <8usExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+DevCtl: Report errors: Correctable- Non-Fatal+ Fatal+ Unsupported+RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset-MaxPayload 256 bytes, MaxReadReq 2048 bytesDevSta: CorrErr- UncorrErr- FatalErr- UnsuppReq- AuxPwr- TransPend-LnkCap: Port #0, Speed 5GT/s, Width x16, ASPM L0s L1, Latency L0 <1us, L1 <64usClockPM- Surprise- LLActRep- BwNot-LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk+ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-LnkSta: Speed 5GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-DevCap2: Completion Timeout: Not Supported, TimeoutDis+DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis+LnkCtl2: Target Link Speed: 5GT/s, EnterCompliance- SpeedDis-, Selectable De-emphasis: -6dBTransmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-Compliance De-emphasis: -6dBLnkSta2: Current De-emphasis Level: -6dBCapabilities: [b0] MSI-X: Enable- Count=19 Masked-Vector table: BAR=0 offset=00001000PBA: BAR=0 offset=00002000Capabilities: [100 v2] Advanced Error ReportingUESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt+ UnxCmplt+ RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-UESvrt: DLP+ SDES+ TLP+ FCP+ CmpltTO+ CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC+ UnsupReq- ACSViol-CESta:  RxErr+ BadTLP- BadDLLP- Rollover+ Timeout+ NonFatalErr-CEMsk:  RxErr+ BadTLP+ BadDLLP+ Rollover+ Timeout+ NonFatalErr+AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-Capabilities: [140 v1] Alternative Routing-ID Interpretation (ARI)ARICap: MFVC- ACS-, Next Function: 0ARICtl: MFVC- ACS-, Function Group: 0Capabilities: [150 v1] Single Root I/O Virtualization (SR-IOV)IOVCap: Migration-, Interrupt Message Number: 000IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+IOVSta: Migration-Initial VFs: 64, Total VFs: 64, Number of VFs: 0, Function Dependency Link: 00VF offset: 1, stride: 1, Device ID: 0011Supported Page Size: 00000553, System Page Size: 00000001Region 0: Memory at 00000000c0000000 (64-bit, prefetchable)VF Migration: offset: 00000000, BIR: 0Kernel driver in use: pkp

可以看出两个Region所在行是正常值而不是ignored了。

整个移植过程完成。

Cavium SSL加速卡驱动移植到Ubuntu相关推荐

  1. (转载)TL-WN725N V3无线网卡驱动移植与wireless工具wpa_supplicant-2.6

    感谢以及转载于: TL-WN725N V3无线网卡驱动移植与wireless工具wpa_supplicant-2.6 目录: 一.TL-WN725N V3无线网卡驱动移植 下载源码 解压源码 编译 二 ...

  2. linux 下wn725无线网卡驱动,TL-WN725N V3无线网卡驱动移植与wireless工具wpa_supplicant-2.6...

    TL-WN725N V3无线网卡驱动移植与wireless工具wpa_supplicant-2.6 TL-WN725N V3无线网卡驱动移植与wireless工具wpa_supplicant-2.6 ...

  3. 瑞萨linux编译环境,瑞萨RZ/A2M Linux4.19系统构建与驱动移植纪实之一:BSP环境搭建...

    瑞萨RZ/A2M Linux4.19系统构建与驱动移植纪实之一:BSP环境搭建 我的系统信息 下载RZ/A Linux-4.19 BSP 编译安装带有SSL模块的Python 2.7 我的系统信息 下 ...

  4. TL-WN725N V3无线网卡驱动移植与wireless工具wpa_supplicant-2.6

    一.TL-WN725N V3无线网卡驱动移植 1.下载源码 网址:https://www.tp-link.com/en/download/TL-WN725N.html#Driver 有两种型号,根据自 ...

  5. Linux WIFI模块驱动移植

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 请问有知道atheros ...

  6. I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之声卡驱动移植

    经过前面的移植,tqimx6q已经可以正常驱动触摸屏了,本文我们来移植声卡驱动. DTS编写 由于tqimx6q搭载的声卡是sgtl5000芯片,因此,参考dts目录下其它开发板的相应信息,我们可以在 ...

  7. Linux---wifi驱动移植及调试(SSV6x5x)

    一.背景说明及驱动移植 本文主要简述南方硅谷ssv6x5x wifi驱动的移植及调试,官方实际是有一份南方硅谷ssv6x5x 驱动移植用户指南,需要的话可以下载,官方指南对于移植过程描述的很清楚. 移 ...

  8. Linux驱动移植USB网卡r8156驱动(详细)总结

    目录 一.简介 二.驱动移植 2.1 驱动源码解压 2.2 驱动Kconfig和Makefile配置 2.2.1 驱动上层目录识别驱动文件 2.2.2 驱动目录新建驱动Kconfig和Makefile ...

  9. imperva ssl加速卡查询

    安装ssl加速卡后,请按照以下步骤,根据您的硬件平台,确定ssl加速器卡是否已正确安装并由th识别. e系统. 对于使用Broadcom SSL卡的X 1000.X 2000.X 2500.X 450 ...

最新文章

  1. 重磅!公开课|四旋翼飞行器:算法与实战
  2. android通话记录列表apk,android打电话,发短信,获取通讯录、通话记录、短信记录...
  3. SSH框架整合——基于注解
  4. JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别?
  5. Ubuntu ufw防火墙常见命令
  6. unity, StartCoroutine and StopCoroutine
  7. Microsoft caffe(caffe-windows) cifar实例编译之model的使用
  8. html制作清明上河图
  9. 1分钟教会你如何截图文字识别,建议收藏备用
  10. json数组转json对象(利用map()函数)
  11. 4chan php,4chan
  12. 三国演义人物出场次数
  13. markdown如何设置图片大小_cnblogs文章/MarkDown内如何调整图片的宽度?
  14. 计算机关机慢怎么解决方法,电脑关机很慢,详细教您win7电脑关机很慢的解决方法...
  15. 回忆--上海滩奋斗的日子
  16. failed to push some refs to 'git@github.com怎么办
  17. IEEE754浮点数格式详解
  18. 远远被大家低估了的实用智能家居设备——窗帘电机
  19. 动物模型系列之常见肿瘤动物模型
  20. 电脑弹窗消息=springboot瘦包+PC消息提醒

热门文章

  1. html tel://协议,关于html:可点击tel协议是firefox中的标签
  2. 宝贵数据集——用于数据挖掘、机器学习、文本挖掘
  3. 比pigz性能更好的pzstd
  4. Windows Sever 2008 备份与恢复
  5. IntelliJ IDEA 2020.2后版本复制文本出现NBSP解决方案
  6. xbeta精心荐精品之免费软件列表
  7. 什么是硬盘?什么是分区?
  8. 新浪微博开放平台研究-实现微博自动评论(下)
  9. Google最强模型BERT出炉,NLP还有哪些值得期待的发展?
  10. 约瑟夫环问题(圆桌问题)