StarTech ST10GSPEXNB(Tehuti TN4010) 벤더 드라이버가 Debian 11, 커널 5.10에서 빌드 안 됨
백업 서버에 10G SFP+ 포트를 하나 달아주려고 StarTech ST10GSPEXNB를 샀어요, Linux 드라이버가 딸려 나오는 카드니까 최신 배포판에서도 빌드되겠거니 하고요. 그게 너무 순진한 생각이었어요.
- StarTech ST10GSPEXNB, Tehuti TN4010 칩
- Debian 11, 커널 5.10.0-13-amd64, 맞는 헤더 설치됨
- 카드에 딸려온 그대로의 벤더 드라이버 패키지
- 케이지에는 범용 10G SFP+ 모듈, 카드가 그걸 신경 쓸 단계까지 가지도 못했지만요
make가 한참 잘 가다가 전송 경로에서 나가떨어져요:
$ make
...
tn40.c:3644: error: assignment to 'struct skb_frag_struct *' from incompatible pointer type
tn40.c:3648: error: invalid use of undefined type 'struct skb_frag_struct'
tn40.c:3651: error: invalid use of undefined type 'struct skb_frag_struct'
뒤의 두 줄은 DMA 매핑 호출 쪽이에요.
이미 해본 것:
- chmod +x mvidtoh.sh, 이게 없어서 빌드가 permission denied로 먼저 멈추고 PHY 헤더를 못 만들었었는데, 이 부분은 해결됨
- uname -r을 설치된 헤더와 대조함, 일치함
- 벤더가 배포하는 것보다 더 새 패키지가 있는지 찾아봤는데 아예 없음
이거 최근 나온 커널에서 돌리고 계신 분 있나요, 있다면 어떻게 하셨나요?
Comments 6
정확히 어느 드라이버 패키지인가요 - tarball에 버전이 찍혀 있나요, readme는 어떤 커널 범위를 지원한다고 하나요? 제가 다뤄본 Tehuti 기반 카드는 전부 readme에 지원 커널을 명시한 소스 트리로 나왔는데, 보통 지금 돌리시는 커널보다 한참 뒤처져 있어요.
어느 트리를 빌드하고 계신지도 말씀해주시면 좋아요. 카드에 딸려온 벤더 배포판이 있고, 커뮤니티 tn40xx 트리들이 있는데 - tn40xx-006, tn40xx-003에 linux-6.6, linux-6.7 브랜치까지 - 이력상 전혀 같은 지점이 아니에요. 사람들이 서로 다른 코드 얘기하는 줄도 모르고 이것저것 섞어서 의견을 비교하는 경우가 흔해요.
마지막으로: 3644가 로그에서 진짜 첫 에러인가요, 아니면 그 위에 노이즈라고 넘기신 뭔가가 있나요? 그 세 줄은 API 변경 하나 때문인 것처럼 보이는데, 빌드가 더 앞에서 깨진 거라면 나머지는 그냥 그 여파일 뿐이에요.
커뮤니티 트리는 처음 듣는 얘기예요 - 저는 박스에 들어있던 tarball만 써봤고, 여기 있는 건 전부 그걸 받은 그대로 풀어서 빌드한 거예요. 그 브랜치들이 다음으로 읽어볼 거리네요. tarball이나 makefile 어디에도 버전은 없었어요, 참고로요.
readme는 말씀하신 그대로예요. 3.x 커널 얘기를 하다가 4.14 라인에서 끝나요. 저는 그걸 하드 리밋이라기보다 테스트해본 범위에 대한 메모로 읽었는데, 지금 보니 순진한 생각이었네요.
그리고 네, 3644가 첫 에러 맞아요. 그 위에는 경고밖에 없어요 - 안 쓰는 변수, 암묵적 선언, 그 트리가 원래 으레 뿜어내는 그런 것들이요 - 빌드는 그걸 전부 무난히 통과하다가 전송 경로에서 딱 멈춰요. 매번 같은 세 줄, 3644, 3648, 3651이 같은 순서로 나와요.
readme가 무슨 뜻으로 그렇게 썼든 이건 하드 리밋이고, 올려주신 에러가 이유를 정확히 말해주고 있어요.
커널이 skb 프래그먼트를 표현하는 방식을 바꿨어요. 5.4부터 skb_frag_t는 bio_vec이고, struct skb_frag_struct는 아예 존재하지 않아요. struct skb_frag_struct *에 대입하는 소스는 정확히 3644번 줄 에러를 받고, 그걸 역참조해서 page와 offset을 DMA 매핑 호출에 넘기는 코드는 3648, 3651의 undefined type 에러를 받아요. 더 이상 존재하지 않는 타입은 헤더도, 플래그도, 구형 컴파일러도 우회시켜줄 수 없어요.
그러니 5.10에서는 그 트리를 설정이 아니라 수정해야 해요. 전송 경로의 프래그먼트 처리를 현재 접근자 기준으로 다시 써야 하고, 그 DMA 매핑도 같이 모양이 바뀌기 때문에 한 줄짜리 수정이 아니라 진짜 패치가 필요해요.
저는 이 카드를 직접 갖고 있지는 않아서, 이건 진단이지 약속은 아니에요. 빌드가 왜 실패하는지, 소스 쪽 문제라는 건 말씀드릴 수 있어요. 다만 그 뒤에 드라이버가 링크를 올려주는지는 말씀 못 드려요.
그 패치에 주말을 갈아넣기 전에, 그 너머에 뭐가 기다리고 있는지 한번 보세요.
저는 여기 StarTech PEX10000SFP가 있어요, TN9510 변종이고 PCI 1fc9:4025, 서브시스템 1fc9:3015예요. out-of-tree tn40xx 드라이버가 여기서는 빌드도 되고 로드도 되고, dmesg도 아주 희망적이에요:
그런데 그다음 인터페이스가 NO-CARRIER 상태로, 모듈에는 빨간불이 켜진 채로 영원히 멈춰 있어요. 같은 카드, 같은 케이지, 같은 광모듈을 StarTech Windows 드라이버로 돌리면 바로 링크가 돼요. 그러니 하드웨어는 멀쩡하고 PHY 펌웨어도 로드되는데, 그 드라이버 포트의 링크 단계가 끝까지 일을 못 끝내는 거예요.
Ubuntu 22.04랑 Rocky Linux 8.10, 커널 4.18, 5.15, 6.5, 6.9, 그리고 tn40xx-006, tn40xx-003, linux-6.6, linux-6.7 브랜치까지 다 돌아봤어요. 단 하나도 캐리어를 안 줬어요. 솔직히 컴파일되게 만드는 건 쉬운 절반이에요.
그게 주말 대신 돈을 쓰라는 논거인데, 평소에는 저도 주말 쪽을 즐기는 사람으로서 드리는 말씀이에요. 중고 Intel이나 Mellanox 10G 카드는 반나절 품보다 싸고, 드라이버는 지금 부팅하시는 커널에 이미 들어있어요.
Intel 쪽으로 가서 서드파티 광모듈을 꽂을 거면 알아두실 게 하나 있어요. X520은 "unsupported SFP+ module type was detected"로 모듈을 아예 거부해버려서 인터페이스 자체가 없는 상태가 돼요. 해결책은 모듈 옵션이에요:
듀얼포트 카드는 거기 1,1을 넣어야 해요. 그다음 그냥 모듈을 내렸다 올리지 말고 update-initramfs -u에 콜드부트를 하세요, 그 비활성화 상태가 펌웨어에 눌러앉아서 웜 리로드로는 잘 안 풀리거든요. 이건 82599와 X520에만 해당돼요, 거기는 검사가 드라이버에 있어서요. X710은 검사가 펌웨어에 있어서 이 옵션으로는 못 구해요.
조언은 맞는데 문제가 다른 얘기예요, 한 문장 안에서. allow_unsupported_sfp는 드라이버의 광모듈 화이트리스트 얘기인데, 이 스레드의 카드는 컴파일 자체가 안 되고 있어요 - 여기 계신 분 누구도 광모듈이 거부당하는 단계 근처에도 못 갔어요. 나중에 알아두면 유용하겠지만 지금 답은 아니에요.
다만 중고도 괜찮으시면, 그냥 되는 다른 카드로 HP NC523SFP가 있어요, OEM으로는 QLogic QLE3242고 HP 부품번호 593715-001이에요. 커널 내장 qlcnic 드라이버로 돌아가서 빌드할 게 아예 없어요 - 제가 여기 갖고 있는 건 qlcnic 5.3.66에 어댑터 펌웨어 4.8.20으로 나오는데, 꽂은 뒤로 손댈 일이 없었어요.
주의할 점 두 가지. 발열이 있어요, 유휴 상태에서 16~17W 정도라 조용한 방에서는 느껴져요. 그리고 SR-IOV는 제가 물어본 누구도 된다 안 된다 확실히 말 못 하는 애매한 부분이에요. SR-IOV가 필요하시면 NC552SFP가 더 나은 선택이에요, bnx2x를 쓰고 제대로 지원하는데, 그 앞단에서 ARI forwarding을 켜야 카드가 나타나요.