реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Отправка пакетов через свитч RTL8305, Linux на SoC + Eth. switch RTL8305
shev77
сообщение Jul 29 2008, 12:59
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 19-11-07
Из: Харьков
Пользователь №: 32 451



Есть SoC под Linux со встроенным Ethernet портом, и кроме того, по интерфейсу MII, подключен свитч RTL8305.
Открывается сокет SOCK_RAW или SOCK_DGRAM и через него отправляются пакеты.
256 пакетов - пауза, 256 пакетов - пауза и т. д.

Со встроенным портом - нет проблем, я вижу все отправляемые пакеты.
С того который через свитч идут пакеты с номерами:
с 00 по 09,
с 41 по 4A,
с 82 по 8B,
с C3 по CC.
Т. е. десять пакетов проходят потом 50 не проходят.
sendto - ошибок не возвращает.
Подскажите куда копать? Спасибо.

int eth_Open()
{
int result = -1;

ether_fd = socket (AF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL));

ether_haddr.sll_family = AF_PACKET;
ether_haddr.sll_protocol = htons(ETH_P_ALL);
ether_haddr.sll_ifindex = ethatpifc_fd;

ether_haddr.sll_addr[0] = 0x00;
ether_haddr.sll_addr[1] = 0x10;
ether_haddr.sll_addr[2] = 0xC6;
ether_haddr.sll_addr[3] = 0xA5;
ether_haddr.sll_addr[4] = 0xEB;
ether_haddr.sll_addr[5] = 0x68;
ether_haddr.sll_halen = 6;

result = 0;
return result;
}

int eth_Send(unsigned char *buffer, int len)
{
int result = -1;

if ((ether_fd != -1) && (buffer != NULL) && (len > 0))
{
result = sendto(ether_fd, buffer, len, 0, (struct sockaddr *)&ether_haddr, sizeof(ether_haddr));
}
if (result == -1)
{
printf("eth_Send.c/sendto() ERR returns %d (%d/%s)\r\n", result, errno, strerror(errno));
}
else result = 0;

return result;
}
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 30 2008, 11:58
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Давайте схему и процедуру конфигурирования RTL через MDI (если есть). Будем смотреть, похоже, что что-то не так c Flow Control


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
shev77
сообщение Jul 30 2008, 13:19
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 19-11-07
Из: Харьков
Пользователь №: 32 451



О! Спасибо, что не молчите!!!

Значит так я делаю вот что:
for (phy = 0; phy <= 4; phy++) {
ethatp_IfcReadExtPhyReg(phy, MII_BMCR, &reg_val);
reg_val &= (~(EPHY_AUTONEGOTIATE | EPHY_100MBIT | EPHY_FULLDUPLEX));
reg_val |= EPHY_FULLDUPLEX;
ethatp_IfcWriteExtPhyReg(phy, MII_BMCR, reg_val);
}
отключаю AUTONEGOTIATE для всех портов, ставлю скорость 10.

ethatp_IfcWriteExtPhyReg(6, 22, 0x8F3F);

и кроме того пишу волшебное число 0x8F3F (это было еще до меня) в регистр 22 для PHY 6 это как я понимаю для того порта, куда подключен процессор.
даташит я прикрепил (на самом деле RTL8306).
Схему вышлю чуть позже.
Прикрепленные файлы
Прикрепленный файл  RTL8306SD_M__Datasheet_1.1.pdf ( 1.29 мегабайт ) Кол-во скачиваний: 189
 
Go to the top of the page
 
+Quote Post
shev77
сообщение Jul 30 2008, 14:28
Сообщение #4





Группа: Новичок
Сообщений: 7
Регистрация: 19-11-07
Из: Харьков
Пользователь №: 32 451



Цитата(Rst7 @ Jul 30 2008, 14:58) *
Давайте схему и процедуру конфигурирования RTL через MDI (если есть). Будем смотреть, похоже, что что-то не так c Flow Control

Спасибо, уважаемый Rst7 за ценное замечание, все заработало!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 12:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01392 секунд с 7
ELECTRONIX ©2004-2016