Шина IEEE 1394 — FireWire

Протоколы повторов при занятости

Для организации повторов из-за занятости используется один из двух протоколов, который выбирает целевое (занятое) устройство: однофазный или двухфазный. Первая попытка посылки пакета (запроса или ответа) выполняется всегда одинаково: в заголовке пакета поле rt = 00. Если на этот пакет приходит квитанция с одним из кодов, означающим занятость — 4 (ack_busy_x), 5 (ack_busy_A) или 6 (ack_busy_B), то узел организует последующие попытки передачи этого пакета, устанавливая в поле rt значение: 01 (Retry_x), 10 (Retry_A) или 11 (Retry_B) соответственно. Попытки повторов выполняются с обычным (справедливым) арбитражем, «предел терпения» определяется в зависимости от используемого протокола повторов.

Протокол однофазных повторов (Single Phase Retry) использует только код квитирования 4 (ack_busy_x), в ответ на который повторные попытки передачи делаются с кодом rt = 01 (Retry_x). Максимальное число повторов одного пакета ограничено 4-битным полем retry_limit регистра BUSY_TIMEOUT (смещение 210h в пространстве регистров CSR, см. рисунок). По достижении этого лимита повторные попытки прекращаются, и уровень транзакций сообщает драйверу о невозможности посылки данного пакета из-за занятости адресуемого узла.

Протокол двухфазных повторов (Dual Phase Retry) позволяет несколько упорядочить обслуживание занятым (перегруженным) узлом пакетов разных транзакций. Для этого вводится чередование двух фаз — фазы A и фазы B. Если занятый узел получает пакет первой попытки (rt = 00), он на него отвечает кодом квитирования 5 (ack_busy_A) и ожидает его повторного прихода с кодом rt = 10 (Retry_A). Теперь этот узел находится в фазе A и будет пытаться обслуживать только пакеты с rt = 10. На все первые попытки других транзакций узел будет отвечать кодом квитирования 6 (ack_busy_B), что заставит узлы, их посылающие, делать попытки повторов с rt = 11 (Retry_B), в данной фазе не обслуживаемые. Только после того, как наш узел сумеет обслужить пакет с rt = 10 и в течение четырех подряд интервалов справедливости не будет получать другие пакеты с rt = 10 (Retry_A), он перейдет в фазу B и начнет обслуживать пакеты с rt = 11 (Retry_B). При этом на новые первичные пакеты он будет отвечать кодом квитирования 5 (ack_busy_A). После обслуживания пакетов фазы B узел снова перейдет в фазу A — получается подобие игры в пинг-понг. Предел «терпения» узла, посылающего повторные пакеты по двухфазному протоколу, определяется уже по времени: ограничивается время, отсчитываемое от момента первой попытки передачи. Это время не должно превышать значение, заданное полями seconds_limit и cycle_limit в том же регистре BUSY_TIMEOUT. 13-битный счетчик, соответствующий полю cycle_limit, считает по модулю 8000 (полный оборот за 1 секунду).

Яндекс.Метрика