IOFireWireSBP2LSIWorkaroundDescriptor
Это - подкласс IOGeneralMemoryDescriptor. Это разработано для работы вокруг аппаратной проблемы в общей цели SBP2. Это берет дескриптор памяти в качестве параметра. Это сохраняет этот дескриптор и возвращает новый с повторно сегментированными физическими сегментами и потенциально некоторыми «незакрепляемыми» сегментами, дважды буферизованными. Если передача заставит данные быть отправленными от Mac, syncBuffersForOutput нужно вызвать перед передачей. Если передача заставит данные быть, получают Mac, syncBuffersForInput нужно вызвать после передачи. Этот класс вычисляет новую сегментацию только один раз, когда это создается. Любые изменения в структуре исходного дескриптора памяти представят этого бесполезного. Это должно быть выпущено, и может быть создан новый IOFireWireSBP2LSIWorkaroundDescriptor. Алгоритм Обходного решения Моста LSI DetailsGoals:1. избегите Логики LSI» <16-байтовая» ошибка - предотвращает любой пакет данных, меньший, чем 16 байтов 2. Минимизируйте двойную буферизацию 3. Поддерживайте не многократный из 512-байтовых устройств, например, CD AudioSolution: Запишите таблицу страниц, таким образом, что мост будет, ни использовать пакеты, меньшие, чем 16 байтов. Другими словами, перестройте дескриптор памяти, чтобы избежать ошибки и сделать это таким образом, что уровень SBP-2 не разобьет сегмент (du ro предел 64k-1) и повторно представляет problemSBP-2, определяет kFWSBP2MaxPageClusterSize константу. Мы просто удостоверяемся, что ни один из наших сегментов не больше, чем этот размер и SBP-2 не разобьют их, когда это запишет таблицу страниц SBP-2. Примечания: - некоторая двойная буферизация неизбежна. Несмежные страницы могут привести к фрагментам страницы в запуске или конце буфера (или оба с буферами non-512x). решение использует меньше чем 33 байта двойного буфера на сегмент в исходном дескрипторе памяти. - Если драйвер должен разбить IO для встречи предела ATA 255 (250?) блоки, предположите, что драйвер делает это в более высоком уровне (перед применением обходного решения). - Ожидается, что исходный дескриптор памяти был подготовлен (соединенный проводом)
Наследование
Не применимый
Соответствует
Не применимый
Оператор импорта
Не применимый
Objective C
@import Kernel;
Доступность
Доступный в OS X v10.0 через OS X v10.6.
-
Инициализируйте IOFireWireSBP2LSIWorkaroundDescriptor с данным дескриптором.
Объявление
C++
virtual bool initWithDescriptor( IOMemoryDescriptor *
desc
, IOByteCount offset = 0, IOByteCount len = 0, IODirection direction =kIODirectionOutIn
);Параметры
desc
Исходный дескриптор памяти.
offset
Смещение данных для «фиксирования» в байтах с начала дескриптора.
len
Длина данных в байтах для «фиксирования»
direction
IODirection передачи данных.
Возвращаемое значение
Если инициализация была успешна, возвращает true.
Обсуждение
Инициализируйте дескриптор обходного решения с данным дескриптором.
-
Синхронизируйте буферы для ввода.
Объявление
C++
virtual IOReturn syncBuffersForInput(
void
);Возвращаемое значение
Возвраты kIOReturnSuccess, если синхронизация была успешна.
Обсуждение
Так как двойная буферизация может быть invovled в обходном решении. Когда эти буферы должны синхронизироваться с исходным дескриптором, драйвер должен указать. Для данных, которые будут введены, syncBuffersForOutput нужно вызвать после получения состояния завершения для ORB.
-
Синхронизируйте буферы для вывода.
Объявление
C++
virtual IOReturn syncBuffersForOutput(
void
);Возвращаемое значение
Возвраты kIOReturnSuccess, если синхронизация была успешна.
Обсуждение
Так как двойная буферизация может быть invovled в обходном решении. Когда эти буферы должны синхронизироваться с исходным дескриптором, драйвер должен указать. Для данных, которые будут выведены, syncBuffersForOutput нужно вызвать прежде, чем представить ORB.
-
Создайте новый дескриптор с возможно постоянной способностью.
Объявление
C++
static IOFireWireSBP2LSIWorkaroundDescriptor * withCapacity ( UInt32
permanentRanges
, IOByteCountpermanentBufferSpace
, boolfixedCapacity
);Параметры
permanentRanges
Количество постоянных диапазонов.
permanentBufferSpace
Количество байта постоянных буферов.
fixedCapacity
указание bool, если могут быть сделаны динамические выделения.
Возвращаемое значение
Если инициализация была успешна, возвращает true.
Обсуждение
Создайте и IOFireWireSBP2LSIWorkaroundDescriptor с постоянной фиксированной способностью. Необходимо вызвать initWithDescriptor позже. permanentRanges является числом диапазонов для хранения постоянно выделенным для использования алгоритмом. Если fixedCapacity является ложными дополнительными диапазонами, может быть выделен и освобожден dyanmicly в случае необходимости. Алгоритм может потребовать более или менее диапазонов, чем или исходный дескриптор или фиксированный финал могут decriptor содержать. permanentBufferSpace является числом байтов постоянного буфера для хранения вокруг. Если fixedCapacity является ложным дополнительным пространством буфера, может быть выделен и освобожден динамично. permanentBufferSpace должен обычно устанавливаться в 32 * максимальное количество диапазонов. fixedCapacity является флагом, указывающим, позволяются ли динамические выделения. Если fixedCapcity является ложью, когда принятие решений о максимальной сумме пространства буфера для имения в наличии нужно отметить tha максимальное количество диапазонов, возможно отличающихся от permanentRanges.
-
Создает новый IOFireWireSBP2LSIWorkaroundDescriptor.
Объявление
C++
static IOFireWireSBP2LSIWorkaroundDescriptor * withDescriptor ( IOMemoryDescriptor *
desc
, IOByteCount offset = 0, IOByteCount len = 0, IODirection direction =kIODirectionOutIn
);Параметры
desc
Исходный дескриптор памяти.
offset
Смещение данных для «фиксирования» в байтах с начала дескриптора.
len
Длина данных в байтах для «фиксирования»
direction
IODirection передачи данных.
Возвращаемое значение
Возвращает новый IOFireWireSBP2LSIWorkaroundDescriptor в случае успеха.
Обсуждение
Создайте IOFireWireSBP2LSIWorkaroundDescriptor без постоянной способности тогда inits это данный дескриптор. Это - basicly короткий путь для вызова withCapacity (0, 0, ложь) и initWithDescriptor ()